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

VxWorks

开发平台:

C/C++

  1. /* strcoll.c - string collate, string */
  2. /* Copyright 1992-1993 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01d,26jun02,gls  fixed infinite loop in strcoll() (SPR #78357)
  7. 01c,25feb93,jdi  documentation cleanup for 5.1.
  8. 01b,20sep92,smb  documentation additions
  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 "private/strxfrmP.h"
  19. /* The __sctl type describes a data object that holds the information 
  20.  * needed to process each source string. The internal function getxfrm
  21.  * calls __strxfrm to update an sctl data object.
  22.  */
  23. typedef struct 
  24.     {
  25.     char     buf[32];
  26.     const uchar_t *s1;
  27.     const uchar_t *s2;
  28.     const uchar_t *sout;
  29.     __cosave       state;
  30.     } __sct1;
  31. /***************************************************************************
  32. *
  33. * getxfrm - get transformed characters
  34. *
  35. * A conparison loop within strcoll calls getxfrm for each source string that
  36. * has no mapped characters in its sctl buffer. This ensures that each source
  37. * string is represented by at least one mapped character, if any such
  38. * character remains to be generated.
  39. *
  40. * RETURNS: the size of the transformed string
  41. * NOMANUAL
  42. */
  43. LOCAL size_t getxfrm
  44.     (
  45.     __sct1 *p /* information needed to process each source string */
  46.     )
  47.     {
  48.     size_t sz;
  49.     /* loop until chars delivered */
  50.     do  
  51. {
  52.         p->sout = (const uchar_t *) p->buf;
  53.         sz = __strxfrm (p->buf, &p->s1, sizeof (p->buf), &p->state);
  54.         if ((sz > 0) && (p->buf [sz - 1] == EOS))
  55.          return (sz - 1);
  56. /* only reset the scan if the __strxfrm() call returned ERROR. */
  57.         if ((*p->s1 == EOS) && (p->state.__state == _NSTATE))
  58.     {
  59.      p->s1 = p->s2; /* rescan */
  60.     }
  61.         } while (sz == 0);
  62.     return (sz);
  63.     }
  64. /***************************************************************************
  65. *
  66. * strcoll - compare two strings as appropriate to LC_COLLATE  (ANSI)
  67. *
  68. * This routine compares two strings, both interpreted as appropriate to the
  69. * LC_COLLATE category of the current locale.
  70. *
  71. * INCLUDE FILES: string.h
  72. *
  73. * RETURNS:
  74. * An integer greater than, equal to, or less than zero, according to whether
  75. * string <s1> is greater than, equal to, or less than string <s2> when both
  76. * are interpreted as appropriate to the current locale.
  77. */
  78. int strcoll
  79.     (
  80.     const char * s1, /* string 1 */
  81.     const char * s2 /* string 2 */
  82.     )
  83.     {
  84.     size_t n1 = 0; /* size of string 1 */
  85.     size_t n2 = 0; /* size of string 2 */
  86.     __sct1 st1; /* transform structure for string 1 */
  87.     __sct1 st2;   /* transform structure for string 2 */
  88.     static const __cosave initial = 
  89. {
  90. 0
  91. };
  92.     /* compare s1[], s2[] using locale-dependant rules */
  93.     st1.s1 = (const uchar_t *)s1; /* string transformation 1 */
  94.     st1.s2 = (const uchar_t *)s1;
  95.     st1.state = initial;
  96.     st2.s1 = (const uchar_t *)s2; /* string transformation 2 */
  97.     st2.s2 = (const uchar_t *)s2;
  98.     st2.state = initial;
  99.     FOREVER /* compare transformed characters */
  100.      {
  101.      int ans;
  102.      size_t sz;
  103.      if (n1 == 0)
  104.          n1 = getxfrm (&st1); /* string 1 */
  105.      if (n2 == 0)
  106.          n2 = getxfrm (&st2); /* string 2 */
  107.      sz = (n1 < n2) ? n1 : n2;
  108.      if (sz == 0)
  109.     {
  110.          if (n1 == n2) 
  111. return (0); 
  112.     if (n2 > 0) 
  113. return (-1);
  114.     return (1);
  115.             }
  116.      if ((ans = memcmp (st1.sout, st2.sout, sz)) != 0)
  117.          return (ans);
  118.      st1.sout += sz;
  119.      st2.sout += sz;
  120.      n1   -= sz;
  121.      n2   -= sz;
  122.      }
  123.     }