Back to index

glibc  2.9
Functions
indigitswc.h File Reference
#include <assert.h>
#include <langinfo.h>

Go to the source code of this file.

Functions

static int indigitwc_value (wchar_t wc, int *decided)

Function Documentation

static int indigitwc_value ( wchar_t  wc,
int decided 
) [inline, static]

Definition at line 29 of file indigitswc.h.

{
  int from_level;
  int to_level;
  const wchar_t *wcdigits[10];
  int n;

  if (*decided != -1)
    from_level = to_level = *decided;
  else
    {
      from_level = 0;
      to_level = _NL_CURRENT_WORD (LC_CTYPE, _NL_CTYPE_INDIGITS_WC_LEN) - 1;
      assert (from_level <= to_level);
    }

  /* In this round we get the pointer to the digit strings and also perform
     the first round of comparisons.  */
  for (n = 0; n < 10; ++n)
    {
      /* Get the string for the digits with value N.  */
      wcdigits[n] = _NL_CURRENT (LC_CTYPE, _NL_CTYPE_INDIGITS0_WC + n);
      wcdigits[n] += from_level;

      if (wc == *wcdigits[n])
       {
         /* Found it.  */
         if (*decided == -1)
           *decided = 0;
         return n;
       }

      /* Advance the pointer to the next string.  */
      ++wcdigits[n];
    }

  /* Now perform the remaining tests.  */
  while (++from_level <= to_level)
    {
      /* Search all ten digits of this level.  */
      for (n = 0; n < 10; ++n)
       {
         if (wc == *wcdigits[n])
           {
             /* Found it.  */
             if (*decided == -1)
              *decided = from_level;
             return n;
           }

         /* Advance the pointer to the next string.  */
         ++wcdigits[n];
       }
    }

  /* If we reach this point no matching digit was found.  */
  return -1;
}