| static void Translator_Russian(Translator *tr); | static void Translator_Russian(Translator *tr); | ||||
| static void PrepareLetters(const char *, char *, int, int); | |||||
| static void ResetLetterBits(Translator *tr, int groups) | static void ResetLetterBits(Translator *tr, int groups) | ||||
| { | { | ||||
| // Clear all the specified groups | // Clear all the specified groups | ||||
| tr->letter_bits[ix] |= bits; | tr->letter_bits[ix] |= bits; | ||||
| } | } | ||||
| static void PrepareLetters(const char *letters, char *codes, int size, int shift) | |||||
| { | |||||
| /* Prepare array of shifted letter codes for letter groups from passed string. | |||||
| * letters: pointer to string of UTF-8 encoded letters (can be space delimited). | |||||
| * codes: pointer to array of letter codes. | |||||
| * size: size of reserved cells in codes array, (last cell in codes should be leaved for null value). | |||||
| * shift: value of downshift, to fit UTF-16 letters into ANSII (char) range. | |||||
| */ | |||||
| const char *p = letters; | |||||
| int bytes = 0; | |||||
| int code = -1; | |||||
| int count = 0; | |||||
| while (code != 0) { | |||||
| bytes = utf8_in(&code, p); | |||||
| if (code > 0x20) { | |||||
| *codes = code - shift; | |||||
| codes++; | |||||
| count++; | |||||
| } | |||||
| p += bytes; | |||||
| } | |||||
| codes++; | |||||
| *codes = 0; | |||||
| if (size != count + 1) | |||||
| fprintf(stderr, | |||||
| "PrepareLetters() error: different sizes of letter arrays reserved: %d, used:%d.\n", | |||||
| size, count + 1); | |||||
| } | |||||
| // ignore these characters | // ignore these characters | ||||
| static const unsigned short chars_ignore_default[] = { | static const unsigned short chars_ignore_default[] = { | ||||
| // U+00AD SOFT HYPHEN | // U+00AD SOFT HYPHEN | ||||
| tr->langopts.numbers = NUM_DECIMAL_COMMA | NUM_OMIT_1_HUNDRED; | tr->langopts.numbers = NUM_DECIMAL_COMMA | NUM_OMIT_1_HUNDRED; | ||||
| tr->langopts.numbers2 = 0x2 + NUM2_THOUSANDS_VAR1; // variant numbers before thousands | tr->langopts.numbers2 = 0x2 + NUM2_THOUSANDS_VAR1; // variant numbers before thousands | ||||
| } | } | ||||
| static void PrepareLetters(const char *letters, char *codes, int size, int shift) | |||||
| { | |||||
| /* Prepare array of shifted letter codes for letter groups from passed string. | |||||
| * letters: pointer to string of UTF-8 encoded letters (can be space delimited). | |||||
| * codes: pointer to array of letter codes. | |||||
| * size: size of reserved cells in codes array, (last cell in codes should be leaved for null value). | |||||
| * shift: value of downshift, to fit UTF-16 letters into ANSII (char) range. | |||||
| */ | |||||
| const char *p = letters; | |||||
| int bytes = 0; | |||||
| int code = -1; | |||||
| int count = 0; | |||||
| while (code != 0) { | |||||
| bytes = utf8_in(&code, p); | |||||
| if (code > 0x20) { | |||||
| *codes = code - shift; | |||||
| codes++; | |||||
| count++; | |||||
| } | |||||
| p += bytes; | |||||
| } | |||||
| codes++; | |||||
| *codes = 0; | |||||
| if (size != count + 1) | |||||
| fprintf(stderr, | |||||
| "PrepareLetters() error: different sizes of letter arrays reserved: %d, used:%d.\n", | |||||
| size, count + 1); | |||||
| } |