home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 11 Util / 11-Util.zip / file39a.zip / src / localsrc / strtok.c < prev    next >
C/C++ Source or Header  |  1993-04-05  |  2KB  |  87 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.  * Copyright (c) Henry Spencer.
  8.  * Written by Henry Spencer.
  9.  *
  10.  * This software is not subject to any license of the American Telephone
  11.  * and Telegraph Company or of the Regents of the University of California.
  12.  *
  13.  * Permission is granted to anyone to use this software for any purpose on
  14.  * any computer system, and to alter it and redistribute it freely, subject
  15.  * to the following restrictions:
  16.  *
  17.  * 1. The author is not responsible for the consequences of use of this
  18.  *    software, no matter how awful, even if they arise from flaws in it.
  19.  *
  20.  * 2. The origin of this software must not be misrepresented, either by
  21.  *    explicit claim or by omission.  Since few users ever read sources,
  22.  *    credits must appear in the documentation.
  23.  *
  24.  * 3. Altered versions must be plainly marked as such, and must not be
  25.  *    misrepresented as being the original software.  Since few users
  26.  *    ever read sources, credits must appear in the documentation.
  27.  *
  28.  * 4. This notice may not be removed or altered.
  29.  */
  30.  
  31. #define    NULL    0
  32. #define CONST
  33.  
  34. static char *scanpoint = NULL;
  35.  
  36. char *                /* NULL if no token left */
  37. strtok(s, delim)
  38. char *s;
  39. register CONST char *delim;
  40. {
  41.     register char *scan;
  42.     char *tok;
  43.     register CONST char *dscan;
  44.  
  45.     if (s == NULL && scanpoint == NULL)
  46.         return(NULL);
  47.     if (s != NULL)
  48.         scan = s;
  49.     else
  50.         scan = scanpoint;
  51.  
  52.     /*
  53.      * Scan leading delimiters.
  54.      */
  55.     for (; *scan != '\0'; scan++) {
  56.         for (dscan = delim; *dscan != '\0'; dscan++)
  57.             if (*scan == *dscan)
  58.                 break;
  59.         if (*dscan == '\0')
  60.             break;
  61.     }
  62.     if (*scan == '\0') {
  63.         scanpoint = NULL;
  64.         return(NULL);
  65.     }
  66.  
  67.     tok = scan;
  68.  
  69.     /*
  70.      * Scan token.
  71.      */
  72.     for (; *scan != '\0'; scan++) {
  73.         for (dscan = delim; *dscan != '\0';)    /* ++ moved down. */
  74.             if (*scan == *dscan++) {
  75.                 scanpoint = scan+1;
  76.                 *scan = '\0';
  77.                 return(tok);
  78.             }
  79.     }
  80.  
  81.     /*
  82.      * Reached end of string.
  83.      */
  84.     scanpoint = NULL;
  85.     return(tok);
  86. }
  87.