static int putUtf8String (ListGenerationData *lgd, const char *string) { size_t size = strlen(string) + 1; wchar_t characters[size]; wchar_t *character = characters; convertUtf8ToWchars(&string, &character, size); return putCharacters(lgd, characters, character-characters); }
static int putCharacter (ListGenerationData *lgd, wchar_t character) { return putCharacters(lgd, &character, 1); }
static int putCharacterString (ListGenerationData *lgd, const wchar_t *string) { return putCharacters(lgd, string, wcslen(string)); }
static int backTranslateString () { /*Back translation */ int srcword = 0; int destword = 0; /* last word translated */ translation_direction = 0; nextUpper = allUpper = allUpperPhrase = itsANumber = itsALetter = itsCompbrl = 0; previousOpcode = CTO_None; src = dest = 0; while (src < srcmax) { /*the main translation loop */ back_setBefore (); back_selectRule (); if (appliedRules != NULL && appliedRulesCount < maxAppliedRules) appliedRules[appliedRulesCount++] = currentRule; /* processing before replacement */ switch (currentOpcode) { case CTO_Hyphen: itsANumber = 0; break; case CTO_LargeSign: if (previousOpcode == CTO_LargeSign) if (!insertSpace ()) goto failure; break; case CTO_CapsLetterRule: nextUpper = 1; src += currentDotslen; continue; break; case CTO_BegCapsWordRule: allUpper = 1; src += currentDotslen; continue; break; case CTO_BegCapsRule: allUpperPhrase = 1; src += currentDotslen; continue; break; case CTO_EndCapsWordRule: allUpper = 0; src += currentDotslen; continue; break; case CTO_EndCapsRule: allUpperPhrase = 0; src += currentDotslen; continue; break; case CTO_LetterRule: itsALetter = 1; itsANumber = 0; src += currentDotslen; continue; break; case CTO_NumberRule: itsANumber = 1; src += currentDotslen; continue; break; case CTO_BegEmph1Rule: currentTypeform = italic; src += currentDotslen; continue; break; case CTO_BegEmph2Rule: currentTypeform = underline; src += currentDotslen; continue; break; case CTO_BegEmph3Rule: currentTypeform = bold; src += currentDotslen; continue; break; case CTO_EndEmph1Rule: case CTO_EndEmph2Rule: case CTO_EndEmph3Rule: currentTypeform = plain_text; src += currentDotslen; continue; break; case CTO_BegCompRule: itsCompbrl = 1; currentTypeform = computer_braille; src += currentDotslen; continue; break; case CTO_EndCompRule: itsCompbrl = 0; currentTypeform = plain_text; src += currentDotslen; continue; break; default: break; } /* replacement processing */ switch (currentOpcode) { case CTO_Replace: src += currentDotslen; if (!putCharacters (¤tRule->charsdots[0], currentRule->charslen)) goto failure; break; case CTO_None: if (!undefinedDots (currentInput[src])) goto failure; src++; break; case CTO_BegNum: itsANumber = 1; goto insertChars; case CTO_EndNum: itsANumber = 0; goto insertChars; case CTO_Space: itsALetter = itsANumber = allUpper = nextUpper = 0; default: insertChars: if (currentRule->charslen) { if (!back_updatePositions (¤tRule->charsdots[0], currentRule->dotslen, currentRule->charslen)) goto failure; src += currentDotslen; } else { int srclim = src + currentDotslen; while (1) { if (!putCharacter (currentInput[src])) goto failure; if (++src == srclim) break; } } } /* processing after replacement */ switch (currentOpcode) { case CTO_JoinNum: case CTO_JoinableWord: if (!insertSpace ()) goto failure; break; default: break; } if (((src > 0) && checkAttr (currentInput[src - 1], CTC_Space, 1) && (currentOpcode != CTO_JoinableWord))) { srcword = src; destword = dest; } if ((currentOpcode >= CTO_Always && currentOpcode <= CTO_None) || (currentOpcode >= CTO_Digit && currentOpcode <= CTO_LitDigit)) previousOpcode = currentOpcode; } /*end of translation loop */ failure: if (destword != 0 && src < srcmax && !checkAttr (currentInput[src], CTC_Space, 1)) { src = srcword; dest = destword; } if (src < srcmax) { while (checkAttr (currentInput[src], CTC_Space, 1)) if (++src == srcmax) break; } return 1; } /*translation completed */