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

VxWorks

开发平台:

C/C++

  1. /* ansiString.c - ANSI `string' documentation */
  2. /* Copyright 1992-1995 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01f,11jul97,dgp  doc: SPR 7651 need list of non-reentrant functions
  7. 01e,23oct95,jdi  doc: incorporated changes for strtok() & strtok_r() (SPR 4874).
  8. 01d,11feb95,jdi  fixed size parameter name in doc for memset().
  9. 01c,25feb93,jdi  documentation cleanup for 5.1.
  10. 01b,30nov92,jdi  fixed doc for strerror() - SPR 1825.
  11. 01a,24oct92,smb  written
  12. */
  13. /*
  14. DESCRIPTION
  15. This library includes several standard ANSI routines.  Note that where
  16. there is a pair of routines, such as div() and div_r(), only the routine
  17. xxx_r() is reentrant.  The xxx() routine is not reentrant.
  18.  
  19. The header string.h declares one type and several functions, and defines one
  20. macro useful for manipulating arrays of character type and other objects
  21. treated as array of character type.  The type is `size_t' and the macro NULL.
  22. Various methods are used for determining the lengths of the arrays, but in
  23. all cases a `char *' or `void *' argument points to the initial (lowest
  24. addressed) character of the array.  If an array is accessed beyond the end
  25. of an object, the behavior is undefined.
  26. SEE ALSO: American National Standard X3.159-1989
  27. INTERNAL
  28. This documentation module is built by appending the following files:
  29.     memchr.c
  30.     memcmp.c
  31.     memcpy.c
  32.     memmove.c
  33.     memset.c
  34.     strcat.c
  35.     strchr.c
  36.     strcmp.c
  37.     strcoll.c
  38.     strcpy.c
  39.     strcspn.c
  40.     strerror.c
  41.     strlen.c
  42.     strncat.c
  43.     strncmp.c
  44.     strncpy.c
  45.     strpbrk.c
  46.     strrchr.c
  47.     strspn.c
  48.     strstr.c
  49.     strtok.c
  50.     strtok_r.c
  51.     strxfrm.c
  52. */
  53. /* memchr.c - search memory for a character, string */
  54. /* Copyright 1992-1993 Wind River Systems, Inc. */
  55. /*
  56. modification history
  57. --------------------
  58. 01c,25feb93,jdi  documentation cleanup for 5.1.
  59. 01b,20sep92,smb  documentation additions
  60. 01a,08jul92,smb  written and documented.
  61. */
  62. /*
  63. DESCRIPTION
  64. INCLUDE FILES: string.h
  65. SEE ALSO: American National Standard X3.159-1989
  66. NOMANUAL
  67. */
  68. #include "vxWorks.h"
  69. #include "string.h"
  70. /*******************************************************************************
  71. *
  72. * memchr - search a block of memory for a character (ANSI)
  73. *
  74. * This routine searches for the first element of an array of `unsigned char',
  75. * beginning at the address <m> with size <n>, that equals <c> converted to
  76. * an `unsigned char'.
  77. *
  78. * INCLUDE FILES: string.h
  79. *
  80. * RETURNS: If successful, it returns the address of the matching element;
  81. * otherwise, it returns a null pointer.
  82. */
  83. void * memchr
  84.     (
  85.     const void * m, /* block of memory */
  86.     int   c, /* character to search for */
  87.     size_t   n /* size of memory to search */
  88.     )
  89.     {
  90.     uchar_t *p = (uchar_t *) CHAR_FROM_CONST(m);
  91.     if (n != 0)
  92. do 
  93.     {
  94.     if (*p++ == (unsigned char) c)
  95. return (VOID_FROM_CONST(p - 1));
  96.     } while (--n != 0);
  97.     return (NULL);
  98.     }
  99. /* memcmp.c - memory compare file for string */
  100. /* Copyright 1992-1993 Wind River Systems, Inc. */
  101. /*
  102. modification history
  103. --------------------
  104. 01c,25feb93,jdi  documentation cleanup for 5.1.
  105. 01b,20sep92,smb  documentation additions
  106. 01a,08jul92,smb  written and documented.
  107. */
  108. /*
  109. DESCRIPTION
  110. INCLUDE FILE: string.h
  111. SEE ALSO: American National Standard X3.159-1989
  112. NOMANUAL
  113. */
  114. #include "vxWorks.h"
  115. #include "string.h"
  116. /*******************************************************************************
  117. *
  118. * memcmp - compare two blocks of memory (ANSI)
  119. *
  120. * This routine compares successive elements from two arrays of `unsigned char',
  121. * beginning at the addresses <s1> and <s2> (both of size <n>), until it finds
  122. * elements that are not equal.
  123. *
  124. * INCLUDE FILES: string.h
  125. *
  126. * RETURNS:
  127. * If all elements are equal, zero.  If elements differ and the differing
  128. * element from <s1> is greater than the element from <s2>, the routine
  129. * returns a positive number; otherwise, it returns a negative number.
  130. */
  131. int memcmp
  132.     (
  133.     const void * s1, /* array 1 */
  134.     const void * s2, /* array 2 */
  135.     size_t       n /* size of memory to compare */
  136.     )
  137.     {
  138.     const unsigned char *p1;
  139.     const unsigned char *p2;
  140.     /* size of memory is zero */
  141.     if (n == 0)
  142. return (0);
  143.     /* compare array 2 into array 1 */
  144.     p1 = s1;
  145.     p2 = s2;
  146.     while (*p1++ == *p2++)
  147. {
  148. if (--n == 0)
  149.     return (0);
  150.         }
  151.     return ((*--p1) - (*--p2));
  152.     }
  153. /* memcpy.c - memory copy file for string */
  154. /* Copyright 1992-1993 Wind River Systems, Inc. */
  155. /*
  156. modification history
  157. --------------------
  158. 01g,25feb93,jdi  documentation cleanup for 5.1.
  159. 01f,20sep92,smb  documentation additions
  160. 01e,14sep92,smb  memcpy again uses bcopy
  161. 01d,07sep92,smb  changed so that memcpy is seperate from bcopy.
  162. 01c,30jul92,smb  changed to use bcopy.
  163. 01b,12jul92,smb  changed post decrements to pre decrements.
  164. 01a,08jul92,smb  written and documented.
  165.            +rrr
  166. */
  167. /*
  168. DESCRIPTION
  169. INCLUDE FILES: string.h
  170. SEE ALSO: American National Standard X3.159-1989
  171. NOMANUAL
  172. */
  173. #include "vxWorks.h"
  174. #include "string.h"
  175. /*******************************************************************************
  176. *
  177. * memcpy - copy memory from one location to another (ANSI)
  178. *
  179. * This routine copies <size> characters from the object pointed
  180. * to by <source> into the object pointed to by <destination>. If copying
  181. * takes place between objects that overlap, the behavior is undefined.
  182. *
  183. * INCLUDE FILES: string.h
  184. *
  185. * RETURNS: A pointer to <destination>.
  186. */
  187. void * memcpy
  188.     (
  189.     void *       destination,   /* destination of copy */
  190.     const void * source,        /* source of copy */
  191.     size_t       size           /* size of memory to copy */
  192.     )
  193.     {
  194.     bcopy ((char *) source, (char *) destination, (size_t) size);
  195.     return (destination);
  196.     }
  197. /* memmove.c - memory move file for string */
  198. /* Copyright 1992-1993 Wind River Systems, Inc. */
  199. /*
  200. modification history
  201. --------------------
  202. 01c,25feb93,jdi  documentation cleanup for 5.1.
  203. 01b,20sep92,smb  documentation additions
  204. 01a,08jul92,smb  written and documented.
  205. */
  206. /*
  207. DESCRIPTION
  208. INCLUDE FILES: string.h
  209. SEE ALSO: American National Standard X3.159-1989
  210. NOMANUAL
  211. */
  212. #include "vxWorks.h"
  213. #include "string.h"
  214. /*******************************************************************************
  215. *
  216. * memmove - copy memory from one location to another (ANSI)
  217. *
  218. * This routine copies <size> characters from the memory location <source> to
  219. * the location <destination>.  It ensures that the memory is not corrupted
  220. * even if <source> and <destination> overlap.
  221. *
  222. * INCLUDE FILES: string.h
  223. *
  224. * RETURNS: A pointer to <destination>.
  225. */
  226. void * memmove
  227.     (
  228.     void *  destination, /* destination of copy */
  229.     const void * source, /* source of copy */
  230.     size_t   size /* size of memory to copy */
  231.     )
  232.     {
  233.     char * dest;
  234.     const char *src;
  235.     dest = destination;
  236.     src = source;
  237.     if ((src < dest) && (dest < (src + size)))
  238. {
  239. for (dest += size, src += size; size > 0; --size)
  240.     *--dest = *--src;
  241.         }
  242.     else 
  243. {
  244. while (size > 0)
  245.     {
  246.     size--;
  247.     *dest++ = *src++;
  248.     }
  249.         }
  250.     return (destination);
  251.     }
  252. /* memset.c - set a block of memory, string */
  253. /* Copyright 1992-1995 Wind River Systems, Inc. */
  254. /*
  255. modification history
  256. --------------------
  257. 01g,11feb95,jdi  fixed size parameter name in doc.
  258. 01f,25feb93,jdi  documentation cleanup for 5.1.
  259. 01e,20sep92,smb  documentation additions
  260. 01d,14sep92,smb  changes back to use bfill.
  261. 01c,07sep92,smb  changed so that memset is seperate from bfill
  262. 01b,30jul92,smb  changes to use bfill.
  263. 01a,08jul92,smb  written and documented.
  264.            +rrr
  265. */
  266. /*
  267. DESCRIPTION
  268. INCLUDE FILES: string.h
  269. SEE ALSO: American National Standard X3.159-1989
  270. NOMANUAL
  271. */
  272. #include "vxWorks.h"
  273. #include "string.h"
  274. /*******************************************************************************
  275. *
  276. * memset - set a block of memory (ANSI)
  277. *
  278. * This routine stores <c> converted to an `unsigned char' in each of the
  279. * elements of the array of `unsigned char' beginning at <m>, with size <size>.
  280. *
  281. * INCLUDE FILES: string.h
  282. *
  283. * RETURNS: A pointer to <m>.
  284. */
  285. void * memset
  286.     (
  287.     void * m,                   /* block of memory */
  288.     int    c,                   /* character to store */
  289.     size_t size                 /* size of memory */
  290.     )
  291.     {
  292.     bfill ((char *) m, (int) size, c);
  293.     return (m);
  294.     }
  295. /* strcat.c - concatenate one string to another, string */
  296. /* Copyright 1992-1993 Wind River Systems, Inc. */
  297. /*
  298. modification history
  299. --------------------
  300. 01c,25feb93,jdi  documentation cleanup for 5.1.
  301. 01b,20sep92,smb  documentation additions
  302. 01a,08jul92,smb  written and documented.
  303. */
  304. /*
  305. DESCRIPTION
  306. INCLUDE FILES: string.h
  307. SEE ALSO: American National Standard X3.159-1989
  308. NOMANUAL
  309. */
  310. #include "vxWorks.h"
  311. #include "string.h"
  312. /*******************************************************************************
  313. *
  314. * strcat - concatenate one string to another (ANSI)
  315. *
  316. * This routine appends a copy of string <append> to the end of string 
  317. * <destination>.  The resulting string is null-terminated.
  318. *
  319. * INCLUDE FILES: string.h
  320. *
  321. * RETURNS: A pointer to <destination>.
  322. */
  323. char * strcat
  324.     (
  325.     char *       destination, /* string to be appended to */
  326.     const char * append       /* string to append to <destination> */
  327.     )
  328.     {
  329.     char *save = destination;
  330.     while (*destination++ != '') /* find end of string */
  331.         ;
  332.     destination--;
  333.     while ((*destination++ = *append++) != '')
  334. ;
  335.     return (save);
  336.     }
  337. /* strchr.c - search string for character, string */
  338. /* Copyright 1992-1993 Wind River Systems, Inc. */
  339. /*
  340. modification history
  341. --------------------
  342. 01c,25feb93,jdi  documentation cleanup for 5.1.
  343. 01b,20sep92,smb  documentation additions
  344. 01a,08jul92,smb  written and documented.
  345. */
  346. /*
  347. DESCRIPTION
  348. INCLUDE FILES: string.h
  349. SEE ALSO: American National Standard X3.159-1989
  350. NOMANUAL
  351. */
  352. #include "vxWorks.h"
  353. #include "string.h"
  354. /******************************************************************************
  355. *
  356. * strchr - find the first occurrence of a character in a string (ANSI)
  357. *
  358. * This routine finds the first occurrence of character <c>
  359. * in string <s>.  The terminating null is considered to be part of the string.
  360. *
  361. * INCLUDE FILES: string.h
  362. *
  363. * RETURNS:
  364. * The address of the located character, or NULL if the character is not found.
  365. */
  366. char * strchr
  367.     (
  368.     const char * s,         /* string in which to search */
  369.     int   c          /* character to find in string */
  370.     )
  371.     {
  372.     char *r = CHAR_FROM_CONST(s); 
  373.     while (*r != (char) c) /* search loop */
  374. {
  375. if (*r++ == EOS) /* end of string */
  376.     return (NULL);
  377.         }
  378.     return (r);
  379.     }
  380. /* strcmp.c - compare two strings, string */
  381. /* Copyright 1992-1993 Wind River Systems, Inc. */
  382. /*
  383. modification history
  384. --------------------
  385. 01c,25feb93,jdi  documentation cleanup for 5.1.
  386. 01b,20sep92,smb  documentation additions
  387. 01a,08jul92,smb  written and documented.
  388. */
  389. /*
  390. DESCRIPTION
  391. INCLUDE FILES: string.h
  392. SEE ALSO: American National Standard X3.159-1989
  393. NOMANUAL
  394. */
  395. #include "vxWorks.h"
  396. #include "string.h"
  397. /*******************************************************************************
  398. *
  399. * strcmp - compare two strings lexicographically (ANSI)
  400. *
  401. * This routine compares string <s1> to string <s2> lexicographically.
  402. *
  403. * INCLUDE FILES: string.h
  404. *
  405. * RETURNS: An integer greater than, equal to, or less than 0,
  406. * according to whether <s1> is lexicographically
  407. * greater than, equal to, or less than <s2>, respectively.
  408. */
  409. int strcmp
  410.     (
  411.     const char * s1,   /* string to compare */
  412.     const char * s2    /* string to compare <s1> to */
  413.     )
  414.     {
  415.     while (*s1++ == *s2++)
  416. if (s1 [-1] == EOS)
  417.     return (0);
  418.     return ((s1 [-1]) - (s2 [-1]));
  419.     }
  420. /* strcoll.c - string collate, string */
  421. /* Copyright 1992-1993 Wind River Systems, Inc. */
  422. /*
  423. modification history
  424. --------------------
  425. 01c,25feb93,jdi  documentation cleanup for 5.1.
  426. 01b,20sep92,smb  documentation additions
  427. 01a,08jul92,smb  written and documented.
  428. */
  429. /*
  430. DESCRIPTION
  431. INCLUDE FILES: string.h
  432. SEE ALSO: American National Standard X3.159-1989
  433. NOMANUAL
  434. */
  435. #include "vxWorks.h"
  436. #include "private/strxfrmP.h"
  437. /* The __sctl type describes a data object that holds the information 
  438.  * needed to process each source string. The internal function getxfrm
  439.  * calls __strxfrm to update an sctl data object.
  440.  */
  441. typedef struct 
  442.     {
  443.     char     buf[32];
  444.     const uchar_t *s1;
  445.     const uchar_t *s2;
  446.     const uchar_t *sout;
  447.     __cosave       state;
  448.     } __sct1;
  449. /***************************************************************************
  450. *
  451. * getxfrm - get transformed characters
  452. *
  453. * A conparison loop within strcoll calls getxfrm for each source string that
  454. * has no mapped characters in its sctl buffer. This ensures that each source
  455. * string is represented by at least one mapped character, if any such
  456. * character remains to be generated.
  457. *
  458. * RETURNS: the size of the transformed string
  459. * NOMANUAL
  460. */
  461. LOCAL size_t getxfrm
  462.     (
  463.     __sct1 *p /* information needed to process each source string */
  464.     )
  465.     {
  466.     size_t sz;
  467.     /* loop until chars delivered */
  468.     do  
  469. {
  470.         p->sout = (const uchar_t *) p->buf;
  471.         sz = __strxfrm (p->buf, &p->s1, sizeof (p->buf), &p->state);
  472.         if ((sz > 0) && (p->buf [sz - 1] == EOS))
  473.          return (sz - 1);
  474.         if (*p->s1 == EOS)
  475.      p->s1 = p->s2; /* rescan */
  476.         } while (sz == 0);
  477.     return (sz);
  478.     }
  479. /***************************************************************************
  480. *
  481. * strcoll - compare two strings as appropriate to LC_COLLATE  (ANSI)
  482. *
  483. * This routine compares two strings, both interpreted as appropriate to the
  484. * LC_COLLATE category of the current locale.
  485. *
  486. * INCLUDE FILES: string.h
  487. *
  488. * RETURNS:
  489. * An integer greater than, equal to, or less than zero, according to whether
  490. * string <s1> is greater than, equal to, or less than string <s2> when both
  491. * are interpreted as appropriate to the current locale.
  492. */
  493. int strcoll
  494.     (
  495.     const char * s1, /* string 1 */
  496.     const char * s2 /* string 2 */
  497.     )
  498.     {
  499.     size_t n1 = 0; /* size of string 1 */
  500.     size_t n2 = 0; /* size of string 2 */
  501.     __sct1 st1; /* transform structure for string 1 */
  502.     __sct1 st2;   /* transform structure for string 2 */
  503.     static const __cosave initial = 
  504. {
  505. 0
  506. };
  507.     /* compare s1[], s2[] using locale-dependant rules */
  508.     st1.s1 = (const uchar_t *)s1; /* string transformation 1 */
  509.     st1.s2 = (const uchar_t *)s1;
  510.     st1.state = initial;
  511.     st2.s1 = (const uchar_t *)s2; /* string transformation 2 */
  512.     st2.s2 = (const uchar_t *)s2;
  513.     st2.state = initial;
  514.     FOREVER /* compare transformed characters */
  515.      {
  516.      int ans;
  517.      size_t sz;
  518.      if (n1 == 0)
  519.          n1 = getxfrm (&st1); /* string 1 */
  520.      if (n2 == 0)
  521.          n2 = getxfrm (&st2); /* string 2 */
  522.      sz = (n1 < n2) ? n1 : n2;
  523.      if (sz == 0)
  524.     {
  525.          if (n1 == n2) 
  526. return (0); 
  527.     if (n2 > 0) 
  528. return (-1);
  529.     return (1);
  530.             }
  531.      if ((ans = memcmp (st1.sout, st2.sout, sz)) != 0)
  532.          return (ans);
  533.      st1.sout += sz;
  534.      st2.sout += sz;
  535.      n1   -= sz;
  536.      n2   -= sz;
  537.      }
  538.     }
  539. /* strcpy.c - string copy, string */
  540. /* Copyright 1992-1993 Wind River Systems, Inc. */
  541. /*
  542. modification history
  543. --------------------
  544. 01c,25feb93,jdi  documentation cleanup for 5.1.
  545. 01b,20sep92,smb  documentation additions
  546. 01a,08jul92,smb  written and documented.
  547. */
  548. /*
  549. DESCRIPTION
  550. INCLUDE FILES: string.h
  551. SEE ALSO: American National Standard X3.159-1989
  552. NOMANUAL
  553. */
  554. #include "vxWorks.h"
  555. #include "string.h"
  556. /*******************************************************************************
  557. *
  558. * strcpy - copy one string to another (ANSI)
  559. *
  560. * This routine copies string <s2> (including EOS) to string <s1>.
  561. *
  562. * INCLUDE FILES: string.h
  563. *
  564. * RETURNS: A pointer to <s1>.
  565. */
  566. char * strcpy
  567.     (
  568.     char *       s1, /* string to copy to */
  569.     const char * s2 /* string to copy from */
  570.     )
  571.     {
  572.     char *save = s1;
  573.     while ((*s1++ = *s2++) != EOS)
  574. ;
  575.     return (save);
  576.     }
  577. /* strcspn.c - search string for character, string */
  578. /* Copyright 1992-1993 Wind River Systems, Inc. */
  579. /*
  580. modification history
  581. --------------------
  582. 01c,25feb93,jdi  documentation cleanup for 5.1.
  583. 01b,20sep92,smb  documentation additions
  584. 01a,08jul92,smb  written and documented.
  585. */
  586. /*
  587. DESCRIPTION
  588. INCLUDE FILES: string.h
  589. SEE ALSO: American National Standard X3.159-1989
  590. NOMANUAL
  591. */
  592. #include "vxWorks.h"
  593. #include "string.h"
  594. /*******************************************************************************
  595. *
  596. * strcspn - return the string length up to the first character from a given set (ANSI)
  597. *
  598. * This routine computes the length of the maximum initial segment of string
  599. * <s1> that consists entirely of characters not included in string <s2>.
  600. *
  601. * INCLUDE FILES: string.h
  602. *
  603. * RETURNS:
  604. * The length of the string segment.
  605. *
  606. * SEE ALSO: strpbrk(), strspn()
  607. */
  608.  
  609. size_t strcspn   
  610.     (
  611.     const char * s1, /* string to search */
  612.     const char * s2 /* set of characters to look for in <s1> */
  613.     )
  614.     {
  615.     const char *save;
  616.     const char *p;
  617.     char  c1;
  618.     char  c2;
  619.     for (save = s1 + 1; (c1 = *s1++) != EOS; ) /* search for EOS */
  620. for (p = s2; (c2 = *p++) != EOS; ) /* search for first occurance */
  621.     {
  622.     if (c1 == c2)
  623. return (s1 - save);        /* return index of substring */
  624.             }
  625.     return (s1 - save);
  626.     }
  627. /* strerror.c - string error, string */
  628. /* Copyright 1992-1993 Wind River Systems, Inc. */
  629. /*
  630. modification history
  631. --------------------
  632. 01d,25feb93,jdi  documentation cleanup for 5.1.
  633. 01c,30nov92,jdi  fixed doc for strerror() - SPR 1825.
  634. 01b,20sep92,smb  documentation additions
  635. 01a,08jul92,smb  written and documented.
  636. */
  637. /*
  638. DESCRIPTION
  639. INCLUDE FILES: string.h
  640. SEE ALSO: American National Standard X3.159-1989
  641. NOMANUAL
  642. */
  643. #include "vxWorks.h"
  644. #include "string.h"
  645. #include "errno.h"
  646. #include "symLib.h"
  647. #include "limits.h"
  648. #include "stdio.h"
  649. #include "sysSymTbl.h"
  650. #include "private/funcBindP.h"
  651. /* forward declarations */
  652. LOCAL STATUS strerrorIf (int errcode, char *buf);
  653. /*******************************************************************************
  654. *
  655. * strerror_r - map an error number to an error string (POSIX)
  656. *
  657. * This routine maps the error number in <errcode> to an error message string.
  658. * It stores the error string in <buffer>.
  659. *
  660. * This routine is the POSIX reentrant version of strerror().
  661. *
  662. * INCLUDE FILES: string.h
  663. *
  664. * RETURNS: OK or ERROR.
  665. *
  666. * SEE ALSO: strerror()
  667. */
  668. STATUS strerror_r 
  669.     (
  670.     int    errcode, /* error code */
  671.     char * buffer /* string buffer */
  672.     )
  673.     {
  674.     return (strerrorIf (errcode, buffer));
  675.     }
  676. /*******************************************************************************
  677. *
  678. * strerror - map an error number to an error string (ANSI)
  679. *
  680. * This routine maps the error number in <errcode> to an error message string.
  681. * It returns a pointer to a static buffer that holds the error string.
  682. *
  683. * This routine is not reentrant.  For a reentrant version, see strerror_r().
  684. *
  685. * INCLUDE: string.h
  686. *
  687. * RETURNS: A pointer to the buffer that holds the error string.
  688. *
  689. * SEE ALSO: strerror_r()
  690. */
  691. char * strerror
  692.     (
  693.     int errcode /* error code */
  694.     )
  695.     {
  696.     static char buffer [NAME_MAX];
  697.     (void) strerror_r (errcode, buffer);
  698.     return (buffer);
  699.     }
  700. /*******************************************************************************
  701. *
  702. * strerrorIf - interface from libc to VxWorks for strerror_r
  703. *
  704. * RETURNS: OK, or ERROR if <buf> is null.
  705. * NOMANUAL
  706. */
  707. LOCAL STATUS strerrorIf 
  708.     (
  709.     int   errcode, /* error code */
  710.     char *buf /* string buffer */
  711.     )
  712.     {
  713.     int value;
  714.     SYM_TYPE type;
  715.     char statName [NAME_MAX];
  716.     if (buf == NULL)
  717. return (ERROR);
  718.     if (errcode == 0)
  719. {
  720.         strcpy (buf, "OK");
  721. return (OK);
  722. }
  723.     if ((_func_symFindByValueAndType != (FUNCPTR) NULL) && (statSymTbl != NULL))
  724. {
  725. (* _func_symFindByValueAndType) (statSymTbl, errcode, statName, &value,
  726.  &type, SYM_MASK_NONE, SYM_MASK_NONE);
  727. if (value == errcode)
  728.     {
  729.     strcpy (buf, statName);
  730.     return (OK);
  731.     }
  732. }
  733.     sprintf (buf, "errno = %#x", errcode);
  734.     return (OK);
  735.     }
  736. /* strlen.c - file for string */
  737. /* Copyright 1992-1993 Wind River Systems, Inc. */
  738. /*
  739. modification history
  740. --------------------
  741. 01c,25feb93,jdi  documentation cleanup for 5.1.
  742. 01b,20sep92,smb  documentation additions
  743. 01a,08jul92,smb  written and documented.
  744. */
  745. /*
  746. DESCRIPTION
  747. INCLUDE FILES: string.h
  748. SEE ALSO: American National Standard X3.159-1989
  749. NOMANUAL
  750. */
  751. #include "vxWorks.h"
  752. #include "string.h"
  753. /*******************************************************************************
  754. *
  755. * strlen - determine the length of a string (ANSI)
  756. *
  757. * This routine returns the number of characters in <s>, not including EOS.
  758. *
  759. * INCLUDE FILES: string.h
  760. *
  761. * RETURNS: The number of non-null characters in the string.
  762. */
  763. size_t strlen
  764.     (
  765.     const char * s        /* string */
  766.     )
  767.     {
  768.     const char *save = s + 1;
  769.     while (*s++ != EOS)
  770. ;
  771.     return (s - save);
  772.     }
  773. /* strncat.c - file for string */
  774. /* Copyright 1992-1993 Wind River Systems, Inc. */
  775. /*
  776. modification history
  777. --------------------
  778. 01c,25feb93,jdi  documentation cleanup for 5.1.
  779. 01b,20sep92,smb  documentation additions
  780. 01a,08jul92,smb  written and documented.
  781. */
  782. /*
  783. DESCRIPTION
  784. INCLUDE FILES: string.h
  785. SEE ALSO: American National Standard X3.159-1989
  786. NOMANUAL
  787. */
  788. #include "vxWorks.h"
  789. #include "string.h"
  790. /*******************************************************************************
  791. *
  792. * strncat - concatenate characters from one string to another (ANSI)
  793. *
  794. * This routine appends up to <n> characters from string <src> to the
  795. * end of string <dst>.
  796. *
  797. * INCLUDE FILES: string.h
  798. *
  799. * RETURNS: A pointer to the null-terminated string <s1>.
  800. */
  801. char * strncat
  802.     (
  803.     char *  dst,   /* string to append to */
  804.     const char * src,   /* string to append */
  805.     size_t  n      /* max no. of characters to append */
  806.     )
  807.     {
  808.     if (n != 0)
  809. {
  810. char *d = dst;
  811. while (*d++ != EOS) /* find end of string */
  812.     ;
  813. d--; /* rewind back of EOS */
  814. while (((*d++ = *src++) != EOS) && (--n > 0))
  815.     ;
  816. if (n == 0)
  817.     *d = EOS; /* NULL terminate string */
  818. }
  819.     return (dst);
  820.     }
  821. /* strncmp.c - string compare, string */
  822. /* Copyright 1992-1993 Wind River Systems, Inc. */
  823. /*
  824. modification history
  825. --------------------
  826. 01c,25feb93,jdi  documentation cleanup for 5.1.
  827. 01b,20sep92,smb  documentation additions
  828. 01a,08jul92,smb  written and documented.
  829. */
  830. /*
  831. DESCRIPTION
  832. INCLUDE FILES: string.h
  833. SEE ALSO: American National Standard X3.159-1989
  834. NOMANUAL
  835. */
  836. #include "vxWorks.h"
  837. #include "string.h"
  838. /*******************************************************************************
  839. *
  840. * strncmp - compare the first <n> characters of two strings (ANSI)
  841. *
  842. * This routine compares up to <n> characters of string <s1> to string <s2>
  843. * lexicographically.
  844. *
  845. * INCLUDE FILES: string.h
  846. *
  847. * RETURNS:
  848. * An integer greater than, equal to, or less than 0, according to whether
  849. * <s1> is lexicographically greater than, equal to, or less than <s2>,
  850. * respectively.
  851. */
  852. int strncmp
  853.     (
  854.     const char * s1,            /* string to compare */
  855.     const char * s2,            /* string to compare <s1> to */
  856.     size_t       n              /* max no. of characters to compare */
  857.     )
  858.     {
  859.     if (n == 0)
  860. return (0);
  861.     while (*s1++ == *s2++)
  862. {
  863. if ((s1 [-1] == EOS) || (--n == 0))
  864.     return (0);
  865.         }
  866.     return ((s1 [-1]) - (s2 [-1]));
  867.     }
  868. /* strncpy.c - string copy, string */
  869. /* Copyright 1992-1993 Wind River Systems, Inc. */
  870. /*
  871. modification history
  872. --------------------
  873. 01c,25feb93,jdi  documentation cleanup for 5.1.
  874. 01b,20sep92,smb  documentation additions
  875. 01a,08jul92,smb  written and documented.
  876. */
  877. /*
  878. DESCRIPTION
  879. INCLUDE FILES: string.h
  880. SEE ALSO: American National Standard X3.159-1989
  881. NOMANUAL
  882. */
  883. #include "vxWorks.h"
  884. #include "string.h"
  885. /*******************************************************************************
  886. *
  887. * strncpy - copy characters from one string to another (ANSI)
  888. *
  889. * This routine copies <n> characters from string <s2> to string <s1>.
  890. * If <n> is greater than the length of <s2>, nulls are added to <s1>.
  891. * If <n> is less than or equal to the length of <s2>, the target
  892. * string will not be null-terminated.
  893. *
  894. * INCLUDE FILES: string.h
  895. *
  896. * RETURNS: A pointer to <s1>.
  897. */
  898. char *strncpy
  899.     (
  900.     char *      s1,    /* string to copy to */
  901.     const char *s2,    /* string to copy from */
  902.     size_t      n       /* max no. of characters to copy */
  903.     )
  904.     {
  905.     FAST char *d = s1;
  906.     if (n != 0)
  907. {
  908. while ((*d++ = *s2++) != 0) /* copy <s2>, checking size <n> */
  909.     {
  910.     if (--n == 0)
  911. return (s1);
  912.             }
  913. while (--n > 0)
  914.     *d++ = EOS; /* NULL terminate string */
  915. }
  916.     return (s1);
  917.     }
  918. /* strpbrk.c - string search, string */
  919. /* Copyright 1992-1993 Wind River Systems, Inc. */
  920. /*
  921. modification history
  922. --------------------
  923. 01c,25feb93,jdi  documentation cleanup for 5.1.
  924. 01b,20sep92,smb  documentation additions
  925. 01a,08jul92,smb  written and documented.
  926. */
  927. /*
  928. DESCRIPTION
  929. INCLUDE FILES: string.h
  930. SEE ALSO: American National Standard X3.159-1989
  931. NOMANUAL
  932. */
  933. #include "vxWorks.h"
  934. #include "string.h"
  935. /*******************************************************************************
  936. *
  937. * strpbrk - find the first occurrence in a string of a character from a given set (ANSI)
  938. *
  939. * This routine locates the first occurrence in string <s1> of any character
  940. * from string <s2>.
  941. *
  942. * INCLUDE FILES: string.h
  943. *
  944. * RETURNS:
  945. * A pointer to the character found in <s1>, or
  946. * NULL if no character from <s2> occurs in <s1>.
  947. *
  948. * SEE ALSO: strcspn()
  949. */
  950. char * strpbrk
  951.     (
  952.     const char * s1,       /* string to search */
  953.     const char * s2        /* set of characters to look for in <s1> */
  954.     )
  955.     {
  956.     char *scanp;
  957.     int   c;
  958.     int   sc;
  959.     while ((c = *s1++) != 0) /* wait until end of string */
  960. {
  961. /* loop, searching for character */
  962. for (scanp = CHAR_FROM_CONST(s2); (sc = *scanp++) != 0;)
  963.     {
  964.     if (sc == c)
  965. return (CHAR_FROM_CONST(s1 - 1));
  966.     }
  967. }
  968.     return (NULL);
  969.     }
  970. /* strrchr.c - string search, string */
  971. /* Copyright 1992-1993 Wind River Systems, Inc. */
  972. /*
  973. modification history
  974. --------------------
  975. 01c,25feb93,jdi  documentation cleanup for 5.1.
  976. 01b,20sep92,smb  documentation additions
  977. 01a,08jul92,smb  written and documented.
  978. */
  979. /*
  980. DESCRIPTION
  981. INCLUDE FILES: string.h
  982. SEE ALSO: American National Standard X3.159-1989
  983. NOMANUAL
  984. */
  985. #include "vxWorks.h"
  986. #include "string.h"
  987. /******************************************************************************
  988. *
  989. * strrchr - find the last occurrence of a character in a string (ANSI)
  990. *
  991. * This routine locates the last occurrence of <c> in the string pointed
  992. * to by <s>.  The terminating null is considered to be part of the string.
  993. *
  994. * INCLUDE FILES: string.h
  995. *
  996. * RETURNS:
  997. * A pointer to the last occurrence of the character, or
  998. * NULL if the character is not found.
  999. */
  1000. char * strrchr
  1001.     (
  1002.     const char * s,         /* string to search */
  1003.     int          c          /* character to look for */
  1004.     )
  1005.     {
  1006.     char *save = NULL;
  1007.     do /* loop, searching for character */
  1008. {
  1009. if (*s == (char) c)
  1010.     save = CHAR_FROM_CONST (s);
  1011.         } while (*s++ != EOS);
  1012.     return (CHAR_FROM_CONST(save));
  1013.     }
  1014. /* strspn.c - string search, string */
  1015. /* Copyright 1992-1993 Wind River Systems, Inc. */
  1016. /*
  1017. modification history
  1018. --------------------
  1019. 01c,25feb93,jdi  documentation cleanup for 5.1.
  1020. 01b,20sep92,smb  documentation additions
  1021. 01a,08jul92,smb  written and documented.
  1022. */
  1023. /*
  1024. DESCRIPTION
  1025. INCLUDE FILES: string.h
  1026. SEE ALSO: American National Standard X3.159-1989
  1027. NOMANUAL
  1028. */
  1029. #include "vxWorks.h"
  1030. #include "string.h"
  1031. /******************************************************************************
  1032. *
  1033. * strspn - return the string length up to the first character not in a given set (ANSI)
  1034. *
  1035. * This routine computes the length of the maximum initial segment of
  1036. * string <s> that consists entirely of characters from the string <sep>.
  1037. *
  1038. * INCLUDE FILES: string.h
  1039. *
  1040. * RETURNS:
  1041. * The length of the string segment.
  1042. *
  1043. * SEE ALSO: strcspn()
  1044. */
  1045.  
  1046. size_t strspn
  1047.     (
  1048.     const char * s,             /* string to search */
  1049.     const char * sep            /* set of characters to look for in <s> */
  1050.     )
  1051.     {
  1052.     const char *save;
  1053.     const char *p;
  1054.     char c1;
  1055.     char c2;
  1056.     for (save = s + 1; (c1 = *s++) != EOS; )
  1057. for (p = sep; (c2 = *p++) != c1; )
  1058.     {
  1059.     if (c2 == EOS)
  1060. return (s - save);
  1061.             }
  1062.     return (s - save);
  1063.     }
  1064. /* strstr.c - file for string */
  1065. /* Copyright 1992-1993 Wind River Systems, Inc. */
  1066. /*
  1067. modification history
  1068. --------------------
  1069. 01c,25feb93,jdi  documentation cleanup for 5.1.
  1070. 01b,20sep92,smb  documentation additions
  1071. 01a,08jul92,smb  written and documented.
  1072. */
  1073. /*
  1074. DESCRIPTION
  1075. INCLUDE FILES: string.h
  1076. SEE ALSO: American National Standard X3.159-1989
  1077. NOMANUAL
  1078. */
  1079. #include "vxWorks.h"
  1080. #include "string.h"
  1081. /******************************************************************************
  1082. *
  1083. * strstr - find the first occurrence of a substring in a string (ANSI)
  1084. *
  1085. * This routine locates the first occurrence in string <s>
  1086. * of the sequence of characters (excluding the terminating null character)
  1087. * in the string <find>.
  1088. *
  1089. * INCLUDE FILES: string.h
  1090. *
  1091. * RETURNS:
  1092. * A pointer to the located substring, or <s> if <find> points to a
  1093. * zero-length string, or NULL if the string is not found.
  1094. */
  1095. char * strstr
  1096.     (
  1097.     const char * s,        /* string to search */
  1098.     const char * find      /* substring to look for */
  1099.     )
  1100.     {
  1101.     char *t1;
  1102.     char *t2;
  1103.     char c;
  1104.     char c2;
  1105.     if ((c = *find++) == EOS) /* <find> an empty string */
  1106. return (CHAR_FROM_CONST(s));
  1107.     FOREVER
  1108. {
  1109. while (((c2 = *s++) != EOS) && (c2 != c))
  1110.     ;
  1111. if (c2 == EOS)
  1112.     return (NULL);
  1113. t1 = CHAR_FROM_CONST(s);
  1114. t2 = CHAR_FROM_CONST(find); 
  1115. while (((c2 = *t2++) != 0) && (*t1++ == c2))
  1116.     ;
  1117. if (c2 == EOS)
  1118.     return (CHAR_FROM_CONST(s - 1));
  1119. }
  1120.     }
  1121. /* strtok.c - file for string */
  1122. /* Copyright 1992-1995 Wind River Systems, Inc. */
  1123. /*
  1124. modification history
  1125. --------------------
  1126. 01d,23oct95,jdi  doc: added comment that input string will be
  1127.     changed (SPR 4874).
  1128. 01c,25feb93,jdi  documentation cleanup for 5.1.
  1129. 01b,20sep92,smb  documentation additions
  1130. 01a,08jul92,smb  written and documented.
  1131. */
  1132. /*
  1133. DESCRIPTION
  1134. INCLUDE FILES: string.h
  1135. SEE ALSO: American National Standard X3.159-1989
  1136. NOMANUAL
  1137. */
  1138. #include "vxWorks.h"
  1139. #include "string.h"
  1140. /******************************************************************************
  1141. *
  1142. * strtok - break down a string into tokens (ANSI)
  1143. *
  1144. * A sequence of calls to this routine breaks the string <string> into a
  1145. * sequence of tokens, each of which is delimited by a character from the
  1146. * string <separator>.  The first call in the sequence has <string> as its
  1147. * first argument, and is followed by calls with a null pointer as their
  1148. * first argument.  The separator string may be different from call to call.
  1149. * The first call in the sequence searches <string> for the first character
  1150. * that is not contained in the current separator string.  If the character
  1151. * is not found, there are no tokens in <string> and strtok() returns a
  1152. * null pointer.  If the character is found, it is the start of the first
  1153. * token.
  1154. * strtok() then searches from there for a character that is contained in the
  1155. * current separator string.  If the character is not found, the current
  1156. * token expands to the end of the string pointed to by <string>, and
  1157. * subsequent searches for a token will return a null pointer.  If the
  1158. * character is found, it is overwritten by a null character, which
  1159. * terminates the current token.  strtok() saves a pointer to the following
  1160. * character, from which the next search for a token will start.
  1161. * (Note that because the separator character is overwritten by a null
  1162. * character, the input string is modified as a result of this call.)
  1163. * Each subsequent call, with a null pointer as the value of the first
  1164. * argument, starts searching from the saved pointer and behaves as
  1165. * described above.
  1166. * The implementation behaves as if strtok() is called by no library functions.
  1167. *
  1168. * REENTRANCY
  1169. * This routine is not reentrant; the reentrant form is strtok_r().
  1170. *
  1171. * INCLUDE FILES: string.h
  1172. * RETURNS
  1173. * A pointer to the first character of a token, or a NULL pointer if there is
  1174. * no token.
  1175. *
  1176. * SEE ALSO: strtok_r()
  1177. */ 
  1178. char * strtok
  1179.     (
  1180.     char *       string, /* string */
  1181.     const char * separator /* separator indicator */
  1182.     )
  1183.     {
  1184.     static char *last = NULL;
  1185.     return (strtok_r (string, separator, &last));
  1186.     }
  1187. /* strtok_r.c - file for string */
  1188. /* Copyright 1992-1995 Wind River Systems, Inc. */
  1189. /*
  1190. modification history
  1191. --------------------
  1192. 01d,23oct95,jdi  doc: added comment that input string will be
  1193.     changed (SPR 4874).
  1194. 01c,25feb93,jdi  documentation cleanup for 5.1.
  1195. 01b,20sep92,smb  documentation additions
  1196. 01a,08jul92,smb  written and documented.
  1197. */
  1198. /*
  1199. DESCRIPTION
  1200. INCLUDE FILES: string.h
  1201. SEE ALSO: American National Standard X3.159-1989
  1202. NOMANUAL
  1203. */
  1204. #include "vxWorks.h"
  1205. #include "string.h"
  1206. /*****************************************************************************
  1207. *
  1208. * strtok_r - break down a string into tokens (reentrant) (POSIX)
  1209. *
  1210. * This routine considers the null-terminated string <string> as a sequence
  1211. * of zero or more text tokens separated by spans of one or more characters
  1212. * from the separator string <separators>.  The argument <ppLast> points to a
  1213. * user-provided pointer which in turn points to the position within <string>
  1214. * at which scanning should begin.
  1215. *
  1216. * In the first call to this routine, <string> points to a null-terminated
  1217. * string; <separators> points to a null-terminated string of separator
  1218. * characters; and <ppLast> points to a NULL pointer.  The function returns a
  1219. * pointer to the first character of the first token, writes a null character
  1220. * into <string> immediately following the returned token, and updates the
  1221. * pointer to which <ppLast> points so that it points to the first character
  1222. * following the null written into <string>.  (Note that because the
  1223. * separator character is overwritten by a null character, the input string
  1224. * is modified as a result of this call.)
  1225. *
  1226. * In subsequent calls <string> must be a NULL pointer and <ppLast> must
  1227. * be unchanged so that subsequent calls will move through the string <string>,
  1228. * returning successive tokens until no tokens remain.  The separator
  1229. * string <separators> may be different from call to call.  When no token
  1230. * remains in <string>, a NULL pointer is returned.
  1231. *
  1232. * INCLUDE FILES: string.h
  1233. * RETURNS
  1234. * A pointer to the first character of a token,
  1235. * or a NULL pointer if there is no token.
  1236. *
  1237. * SEE ALSO: strtok()
  1238. */
  1239. char * strtok_r
  1240.     (
  1241.     char *       string, /* string to break into tokens */
  1242.     const char * separators, /* the separators */
  1243.     char **      ppLast /* pointer to serve as string index */
  1244.     )
  1245.     {
  1246.     if ((string == NULL) && ((string = *ppLast) == NULL))
  1247. return (NULL);
  1248.     if (*(string += strspn (string, separators)) == EOS)
  1249. return (*ppLast = NULL);
  1250.     if ((*ppLast = strpbrk (string, separators)) != NULL)
  1251. *(*ppLast)++ = EOS;
  1252.     return (string);
  1253.     }
  1254. /* strxfrm.c - file for string */
  1255. /* Copyright 1992-1993 Wind River Systems, Inc. */
  1256. /*
  1257. modification history
  1258. --------------------
  1259. 01d,25feb93,jdi  documentation cleanup for 5.1.
  1260. 01c,20sep92,smb  documentation additions
  1261. 01b,13jul92,smb  changed __cosave initialisation for MIPS.
  1262. 01a,08jul92,smb  written and documented.
  1263. */
  1264. /*
  1265. DESCRIPTION
  1266. INCLUDE FILES: string.h
  1267. SEE ALSO: American National Standard X3.159-1989
  1268. NOMANUAL
  1269. */
  1270. #include "vxWorks.h"
  1271. #include "limits.h"
  1272. #include "private/strxfrmP.h"
  1273. /*******************************************************************************
  1274. *
  1275. * strxfrm - transform up to <n> characters of <s2> into <s1> (ANSI)
  1276. *
  1277. * This routine transforms string <s2> and places the resulting string in <s1>.
  1278. * The transformation is such that if strcmp() is applied to two transformed
  1279. * strings, it returns a value greater than, equal to, or less than zero,
  1280. * corresponding to the result of the strcoll() function applied to the same
  1281. * two original strings.  No more than <n> characters are placed into the
  1282. * resulting <s1>, including the terminating null character.  If <n> is zero,
  1283. * <s1> is permitted to be a NULL pointer.  If copying takes place between
  1284. * objects that overlap, the behavior is undefined.
  1285. *
  1286. * INCLUDE FILES: string.h
  1287. *
  1288. * RETURNS:
  1289. * The length of the transformed string, not including the terminating null
  1290. * character.  If the value is <n> or more, the contents of <s1> are
  1291. * indeterminate.
  1292. *
  1293. * SEE ALSO: strcmp(), strcoll()
  1294. */
  1295. size_t strxfrm
  1296.     (
  1297.     char *  s1, /* string out */
  1298.     const char * s2, /* string in */
  1299.     size_t    n /* size of buffer */
  1300.     )
  1301.     {
  1302.     size_t    i;
  1303.     size_t    nx = 0;
  1304.     const uchar_t *s = (const uchar_t *)s2;
  1305.     char    buf[32];
  1306.     __cosave     state;
  1307.     /* stores state information */
  1308.     state.__state = EOS;
  1309.     state.__wchar = 0;
  1310.     while (nx < n) /* translate and deliver */
  1311.      {
  1312.      i = __strxfrm (s1, &s, nx - n, &state);
  1313.      s1 += i; 
  1314. nx += i;
  1315.      if ((i > 0) && (s1[-1] == EOS))
  1316.     return (nx - 1);
  1317.      if (*s == EOS)
  1318.     s = (const uchar_t *) s2;
  1319.      }
  1320.     FOREVER /* translate the rest */ 
  1321.      {
  1322.      i = __strxfrm (buf, &s, sizeof (buf), &state);
  1323.      nx += i;
  1324.      if ((i > 0) && (buf [i - 1] == EOS))
  1325.     return (nx - 1);
  1326.      if (*s == EOS)
  1327.     s = (const uchar_t *) s2;
  1328.      }
  1329.     }
  1330. /*******************************************************************************
  1331. *
  1332. *  __strxfrm - translates string into an easier form for strxfrm() and strcoll()
  1333. *
  1334. * This routine performs the mapping as a finite state machine executing
  1335. * the table __wcstate defined in xstate.h.
  1336. *
  1337. * NOMANUAL
  1338. */
  1339. size_t __strxfrm
  1340.     (
  1341.     char *    sout, /* out string */
  1342.     const uchar_t ** ppsin, /* pointer to character within string */
  1343.     size_t  size, /* size of string */
  1344.     __cosave * ps /* state information */
  1345.     )
  1346.     {
  1347.     const ushort_t * stab;
  1348.     ushort_t   code;
  1349.     char  state = ps->__state; /* initial state */
  1350.     BOOL  leave = FALSE;
  1351.     int  limit = 0;
  1352.     int  nout = 0;
  1353.     const uchar_t * sin = *ppsin; /* in string */
  1354.     ushort_t wc = ps->__wchar;
  1355.     FOREVER /* do state transformation */
  1356.      {
  1357.      if ((_NSTATE <= state) ||
  1358.          ((stab = __costate.__table [state]) == NULL) ||
  1359.          ((code = stab [*sin]) == 0))
  1360.          break; /* error */
  1361.      state = (code & ST_STATE) >> ST_STOFF;
  1362.      if ( code & ST_FOLD)
  1363.      wc = wc & ~UCHAR_MAX | code & ST_CH;
  1364.      if ( code & ST_ROTATE)
  1365.      wc = wc >> CHAR_BIT & UCHAR_MAX | wc << CHAR_BIT;
  1366.      if ((code & ST_OUTPUT) &&
  1367.          (((sout[nout++] = code & ST_CH ? code : wc) == EOS) ||
  1368.          (size <= nout)))
  1369.      leave = TRUE;
  1370.      if (code & ST_INPUT)
  1371.          if (*sin != EOS)
  1372.         {
  1373.              ++sin; 
  1374.         limit = 0;
  1375.         }
  1376.          else
  1377.           leave = TRUE;
  1378.      if (leave)
  1379.          { /* save state and return */
  1380.          *ppsin = sin;
  1381.          ps->__state = state;
  1382.          ps->__wchar = wc;
  1383.          return (nout);
  1384.          }
  1385.      }
  1386.     sout[nout++] = EOS; /* error */
  1387.     *ppsin = sin;
  1388.     ps->__state = _NSTATE;
  1389.     return (nout);
  1390.     }