Back to index

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

Go to the source code of this file.

Functions

static int indigit_value (const char **s, size_t *len, int *decided)

Function Documentation

static int indigit_value ( const char **  s,
size_t len,
int decided 
) [inline, static]

Definition at line 30 of file indigits.h.

{
  int from_level;
  int to_level;
  const char *mbdigits[10];
  int i;
  int n;

  if (*decided != -1)
    from_level = to_level = *decided;
  else
    {
      from_level = 0;
      to_level = _NL_CURRENT_WORD (LC_CTYPE, _NL_CTYPE_INDIGITS_MB_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)
    {
      size_t dlen;

      /* Get the string for the digits with value N.  */
      mbdigits[n] = _NL_CURRENT (LC_CTYPE, _NL_CTYPE_INDIGITS0_MB + n);
      dlen = strlen (mbdigits[n]);

      if (from_level == 0 && dlen <= *len
         && memcmp (*s, mbdigits[n], dlen) == 0)
       {
         /* Found it.  */
         *s += dlen;
         *len -= dlen;
         if (*decided == -1)
           *decided = 0;
         return n;
       }

      /* Advance the pointer to the next string.  */
      mbdigits[n] += dlen + 1;
    }

  /* Now perform the remaining tests.  */
  for (i = 1; i <= to_level; ++i)
    {
      /* Search all ten digits of this level.  */
      for (n = 0; n < 10; ++n)
       {
         size_t dlen = strlen (mbdigits[n]);

         if (i >= from_level && dlen <= *len
             && memcmp (*s, mbdigits[n], dlen) == 0)
           {
             /* Found it.  */
             *s += dlen;
             *len -= dlen;
             if (*decided == -1)
              *decided = from_level;
             return n;
           }

         /* Advance the pointer to the next string.  */
         mbdigits[n] += dlen + 1;
       }
    }

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

Here is the call graph for this function: