Minix1.5/lib/ansi/strtok.c

#include <lib.h>
/* Get next token from string s (NULL on 2nd, 3rd, etc. calls),
 * where tokens are nonempty strings separated by runs of
 * chars from delim.  Writes NULs into s to end tokens.  delim need not
 * remain constant from call to call.
 */

#include <string.h>

#define C_NULL  (char *) NULL

PRIVATE char *scanpoint = C_NULL;

char *strtok(s, delim)		/* NULL if no token left */
char *s;
register _CONST char *delim;
{
  register char *scan;
  char *tok;
  register _CONST char *dscan;

  if (s == C_NULL && scanpoint == C_NULL) return(C_NULL);
  if (s != C_NULL)
	scan = s;
  else
	scan = scanpoint;

  /* Scan leading delimiters. */
  for (; *scan != '\0'; scan++) {
	for (dscan = delim; *dscan != '\0'; dscan++)
		if (*scan == *dscan) break;
	if (*dscan == '\0') break;
  }
  if (*scan == '\0') {
	scanpoint = C_NULL;
	return(C_NULL);
  }
  tok = scan;

  /* Scan token. */
  for (; *scan != '\0'; scan++) {
	for (dscan = delim; *dscan != '\0';)	/* ++ moved down. */
		if (*scan == *dscan++) {
			scanpoint = scan + 1;
			*scan = '\0';
			return(tok);
		}
  }

  /* Reached end of string. */
  scanpoint = C_NULL;
  return(tok);
}