home *** CD-ROM | disk | FTP | other *** search
/ Unix System Administration Handbook 1997 October / usah_oct97.iso / news / cnews.tar / libfake / strtok.c < prev    next >
C/C++ Source or Header  |  1989-05-27  |  1KB  |  63 lines

  1. /*
  2.  * Get next token from string s (NULL on 2nd, 3rd, etc. calls),
  3.  * where tokens are nonempty strings separated by runs of
  4.  * chars from delim.  Writes NULs into s to end tokens.  delim need not
  5.  * remain constant from call to call.
  6.  */
  7.  
  8. #define    NULL    0
  9.  
  10. static char *scanpoint = NULL;
  11.  
  12. char *                /* NULL if no token left */
  13. strtok(s, delim)
  14. char *s;
  15. register  char *delim;
  16. {
  17.     register char *scan;
  18.     char *tok;
  19.     register  char *dscan;
  20.  
  21.     if (s == NULL && scanpoint == NULL)
  22.         return(NULL);
  23.     if (s != NULL)
  24.         scan = s;
  25.     else
  26.         scan = scanpoint;
  27.  
  28.     /*
  29.      * Scan leading delimiters.
  30.      */
  31.     for (; *scan != '\0'; scan++) {
  32.         for (dscan = delim; *dscan != '\0'; dscan++)
  33.             if (*scan == *dscan)
  34.                 break;
  35.         if (*dscan == '\0')
  36.             break;
  37.     }
  38.     if (*scan == '\0') {
  39.         scanpoint = NULL;
  40.         return(NULL);
  41.     }
  42.  
  43.     tok = scan;
  44.  
  45.     /*
  46.      * Scan token.
  47.      */
  48.     for (; *scan != '\0'; scan++) {
  49.         for (dscan = delim; *dscan != '\0';)    /* ++ moved down. */
  50.             if (*scan == *dscan++) {
  51.                 scanpoint = scan+1;
  52.                 *scan = '\0';
  53.                 return(tok);
  54.             }
  55.     }
  56.  
  57.     /*
  58.      * Reached end of string.
  59.      */
  60.     scanpoint = NULL;
  61.     return(tok);
  62. }
  63.