コード例 #1
0
ファイル: ktb_list.c プロジェクト: Feechka/UOBP
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);
}
コード例 #2
0
ファイル: ktb_list.c プロジェクト: Feechka/UOBP
static int
putCharacter (ListGenerationData *lgd, wchar_t character) {
  return putCharacters(lgd, &character, 1);
}
コード例 #3
0
ファイル: ktb_list.c プロジェクト: Feechka/UOBP
static int
putCharacterString (ListGenerationData *lgd, const wchar_t *string) {
  return putCharacters(lgd, string, wcslen(string));
}
コード例 #4
0
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
	      (&currentRule->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
		  (&currentRule->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 */