53 DH, |
53 DH, |
54 DHGDI, |
54 DHGDI, |
55 DDEFAULT, |
55 DDEFAULT, |
56 }; |
56 }; |
57 |
57 |
58 static inline int isset(const uint32_t bitset[], char c) |
58 static inline int inset(const uint32_t bitset[], char c) |
59 { |
59 { |
60 return bitset[((uint8_t)c) >> 5] & (1 << (((uint8_t)c) & 31)); |
60 return bitset[((uint8_t)c) >> 5] & (1 << (((uint8_t)c) & 31)); |
61 } |
61 } |
62 |
62 |
63 static inline void charcopy(char *dest, Py_ssize_t *destlen, size_t destsize, |
63 static inline void charcopy(char *dest, Py_ssize_t *destlen, size_t destsize, |
417 charcopy(dest, &destlen, destsize, ' '); |
417 charcopy(dest, &destlen, destsize, ' '); |
418 break; |
418 break; |
419 } |
419 } |
420 break; |
420 break; |
421 case DEFAULT: |
421 case DEFAULT: |
422 while (isset(onebyte, src[i])) { |
422 while (inset(onebyte, src[i])) { |
423 charcopy(dest, &destlen, destsize, src[i++]); |
423 charcopy(dest, &destlen, destsize, src[i++]); |
424 if (i == len) |
424 if (i == len) |
425 goto done; |
425 goto done; |
426 } |
426 } |
427 switch (src[i]) { |
427 switch (src[i]) { |
437 state = START; |
437 state = START; |
438 charcopy(dest, &destlen, destsize, '/'); |
438 charcopy(dest, &destlen, destsize, '/'); |
439 i++; |
439 i++; |
440 break; |
440 break; |
441 default: |
441 default: |
442 if (isset(onebyte, src[i])) { |
442 if (inset(onebyte, src[i])) { |
443 do { |
443 do { |
444 charcopy(dest, &destlen, |
444 charcopy(dest, &destlen, |
445 destsize, src[i++]); |
445 destsize, src[i++]); |
446 } while (i < len && |
446 } while (i < len && |
447 isset(onebyte, src[i])); |
447 inset(onebyte, src[i])); |
448 } |
448 } |
449 else if (isset(twobytes, src[i])) { |
449 else if (inset(twobytes, src[i])) { |
450 char c = src[i++]; |
450 char c = src[i++]; |
451 charcopy(dest, &destlen, destsize, '_'); |
451 charcopy(dest, &destlen, destsize, '_'); |
452 charcopy(dest, &destlen, destsize, |
452 charcopy(dest, &destlen, destsize, |
453 c == '_' ? '_' : c + 32); |
453 c == '_' ? '_' : c + 32); |
454 } |
454 } |