home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / listings / v_10_07 / 1007016a < prev    next >
Text File  |  1992-05-05  |  1KB  |  59 lines

  1.  
  2. Listing 4 -- xmbtowc.c
  3.  
  4. /* _Mbtowc function */
  5. #include <limits.h>
  6. #include <stdlib.h>
  7. #include "xstate.h"
  8.  
  9. int _Mbtowc(wchar_t *pwc, const char *s, size_t nin,
  10.     _Mbsave *ps)
  11.     {    /* translate multibyte to widechar */
  12.     static const _Mbsave initial = {0};
  13.  
  14.     if (s == NULL)
  15.         {    /* set initial state */
  16.         *ps = initial;
  17.         return (_Mbstate._Tab[0][0] & ST_STATE);
  18.         }
  19.      {    /* run finite state machine */
  20.     char state = ps->_State;
  21.     int limit = 0;
  22.     unsigned char *su = (unsigned char *)s;
  23.     unsigned short wc = ps->_Wchar;
  24.  
  25.     if (MB_CUR_MAX < nin)
  26.         nin = MB_CUR_MAX;
  27.     for (; ; )
  28.         {    /* perform a state transformation */
  29.         unsigned short code;
  30.         const unsigned short *stab;
  31.  
  32.         if (_NSTATE <= state
  33.             || (stab = _Mbstate._Tab[state]) == NULL
  34.             || nin == 0
  35.             || (_NSTATE*UCHAR_MAX) <= ++limit
  36.             || (code = stab[*su]) == 0)
  37.             break;
  38.         state = (code & ST_STATE) >> ST_STOFF;
  39.         if (code & ST_FOLD)
  40.             wc = wc & ~UCHAR_MAX | code & ST_CH;
  41.         if (code & ST_ROTATE)
  42.             wc = wc >> CHAR_BIT & UCHAR_MAX | wc << CHAR_BIT;
  43.         if (code & ST_INPUT && *su != '\0')
  44.             ++su, --nin, limit = 0;
  45.         if (code & ST_OUTPUT)
  46.             {    /* produce an output wchar */
  47.             if (pwc)
  48.                 *pwc = wc;
  49.             ps->_State = state;
  50.             ps->_Wchar = wc;
  51.             return ((const char *)su - s);
  52.             }
  53.         }
  54.     ps->_State = _NSTATE;    /* error return */
  55.     return (-1);
  56.      }
  57.     }
  58.  
  59.