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

  1. #include <limits.h>
  2. #include "xstrxfrm.h"
  3.  
  4. size_t _Strxfrm(char *sout, const unsigned char **psin,
  5.     size_t size, _Cosave *ps)
  6.     {    /* translate string to collatable form */
  7.     char state = ps->_State;
  8.     int leave = 0;
  9.     int limit = 0;
  10.     int nout = 0;
  11.     const unsigned char *sin = *psin;
  12.     unsigned short wc = ps->_Wchar;
  13.  
  14.     for (; ; )
  15.         {    /* perform a state transformation */
  16.         unsigned short code;
  17.         const unsigned short *stab;
  18.  
  19.         if (_NSTATE <= state
  20.             || (stab = _Costate._Tab[state]) == NULL
  21.             || (_NSTATE*UCHAR_MAX) <= ++limit
  22.             || (code = stab[*sin]) == 0)
  23.             break;
  24.         state = (code & ST_STATE) >> ST_STOFF;
  25.         if (code & ST_FOLD)
  26.             wc = wc & ~UCHAR_MAX | code & ST_CH;
  27.         if (code & ST_ROTATE)
  28.             wc = wc >> CHAR_BIT & UCHAR_MAX | wc << CHAR_BIT;
  29.         if (code & ST_OUTPUT && ((sout[nout++]
  30.             = code & ST_CH ? code : wc) == '\0'
  31.             || size <= nout))
  32.             leave = 1;
  33.         if (code & ST_INPUT)
  34.             if (*sin != '\0')
  35.                 ++sin, limit = 0;
  36.             else
  37.                 leave = 1;
  38.         if (leave)
  39.             {    /* return for now */
  40.             *psin = sin;
  41.             ps->_State = state;
  42.             ps->_Wchar = wc;
  43.             return (nout);
  44.             }
  45.         }
  46.     sout[nout++] = '\0';    /* error return */
  47.     *psin = sin;
  48.     ps->_State = _NSTATE;
  49.     return (nout);
  50.     }
  51.  
  52.