strxfrm.c
上传用户:nvosite88
上传日期:2007-01-17
资源大小:4983k
文件大小:4k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* strxfrm.c - file for string */
  2. /* Copyright 1992-1993 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01d,25feb93,jdi  documentation cleanup for 5.1.
  7. 01c,20sep92,smb  documentation additions
  8. 01b,13jul92,smb  changed __cosave initialisation for MIPS.
  9. 01a,08jul92,smb  written and documented.
  10. */
  11. /*
  12. DESCRIPTION
  13. INCLUDE FILES: string.h
  14. SEE ALSO: American National Standard X3.159-1989
  15. NOMANUAL
  16. */
  17. #include "vxWorks.h"
  18. #include "limits.h"
  19. #include "private/strxfrmP.h"
  20. /*******************************************************************************
  21. *
  22. * strxfrm - transform up to <n> characters of <s2> into <s1> (ANSI)
  23. *
  24. * This routine transforms string <s2> and places the resulting string in <s1>.
  25. * The transformation is such that if strcmp() is applied to two transformed
  26. * strings, it returns a value greater than, equal to, or less than zero,
  27. * corresponding to the result of the strcoll() function applied to the same
  28. * two original strings.  No more than <n> characters are placed into the
  29. * resulting <s1>, including the terminating null character.  If <n> is zero,
  30. * <s1> is permitted to be a NULL pointer.  If copying takes place between
  31. * objects that overlap, the behavior is undefined.
  32. *
  33. * INCLUDE FILES: string.h
  34. *
  35. * RETURNS:
  36. * The length of the transformed string, not including the terminating null
  37. * character.  If the value is <n> or more, the contents of <s1> are
  38. * indeterminate.
  39. *
  40. * SEE ALSO: strcmp(), strcoll()
  41. */
  42. size_t strxfrm
  43.     (
  44.     char *  s1, /* string out */
  45.     const char * s2, /* string in */
  46.     size_t    n /* size of buffer */
  47.     )
  48.     {
  49.     size_t    i;
  50.     size_t    nx = 0;
  51.     const uchar_t *s = (const uchar_t *)s2;
  52.     char    buf[32];
  53.     __cosave     state;
  54.     /* stores state information */
  55.     state.__state = EOS;
  56.     state.__wchar = 0;
  57.     while (nx < n) /* translate and deliver */
  58.      {
  59.      i = __strxfrm (s1, &s, nx - n, &state);
  60.      s1 += i; 
  61. nx += i;
  62.      if ((i > 0) && (s1[-1] == EOS))
  63.     return (nx - 1);
  64.      if (*s == EOS)
  65.     s = (const uchar_t *) s2;
  66.      }
  67.     FOREVER /* translate the rest */ 
  68.      {
  69.      i = __strxfrm (buf, &s, sizeof (buf), &state);
  70.      nx += i;
  71.      if ((i > 0) && (buf [i - 1] == EOS))
  72.     return (nx - 1);
  73.      if (*s == EOS)
  74.     s = (const uchar_t *) s2;
  75.      }
  76.     }
  77. /*******************************************************************************
  78. *
  79. *  __strxfrm - translates string into an easier form for strxfrm() and strcoll()
  80. *
  81. * This routine performs the mapping as a finite state machine executing
  82. * the table __wcstate defined in xstate.h.
  83. *
  84. * NOMANUAL
  85. */
  86. size_t __strxfrm
  87.     (
  88.     char *    sout, /* out string */
  89.     const uchar_t ** ppsin, /* pointer to character within string */
  90.     size_t  size, /* size of string */
  91.     __cosave * ps /* state information */
  92.     )
  93.     {
  94.     const ushort_t * stab;
  95.     ushort_t   code;
  96.     char  state = ps->__state; /* initial state */
  97.     BOOL  leave = FALSE;
  98.     int  limit = 0;
  99.     int  nout = 0;
  100.     const uchar_t * sin = *ppsin; /* in string */
  101.     ushort_t wc = ps->__wchar;
  102.     FOREVER /* do state transformation */
  103.      {
  104.      if ((_NSTATE <= state) ||
  105.          ((stab = __costate.__table [state]) == NULL) ||
  106.          ((code = stab [*sin]) == 0))
  107.          break; /* error */
  108.      state = (code & ST_STATE) >> ST_STOFF;
  109.      if ( code & ST_FOLD)
  110.      wc = wc & ~UCHAR_MAX | code & ST_CH;
  111.      if ( code & ST_ROTATE)
  112.      wc = wc >> CHAR_BIT & UCHAR_MAX | wc << CHAR_BIT;
  113.      if ((code & ST_OUTPUT) &&
  114.          (((sout[nout++] = code & ST_CH ? code : wc) == EOS) ||
  115.          (size <= nout)))
  116.      leave = TRUE;
  117.      if (code & ST_INPUT)
  118.          if (*sin != EOS)
  119.         {
  120.              ++sin; 
  121.         limit = 0;
  122.         }
  123.          else
  124.           leave = TRUE;
  125.      if (leave)
  126.          { /* save state and return */
  127.          *ppsin = sin;
  128.          ps->__state = state;
  129.          ps->__wchar = wc;
  130.          return (nout);
  131.          }
  132.      }
  133.     sout[nout++] = EOS; /* error */
  134.     *ppsin = sin;
  135.     ps->__state = _NSTATE;
  136.     return (nout);
  137.     }