56a424cca6b3f91f31bdab72a4626c48c779fe8bmp/*
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp * Copyright 1993 OpenVision Technologies, Inc., All Rights Reserved
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp *
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp */
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp/*
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp * Copyright (c) 1988 Regents of the University of California.
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp * All rights reserved.
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp *
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp * Redistribution and use in source and binary forms are permitted
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp * provided that: (1) source distributions retain this entire copyright
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp * notice and comment, and (2) distributions including binaries display
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp * the following acknowledgement: ``This product includes software
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp * developed by the University of California, Berkeley and its contributors''
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp * in the documentation or other materials provided with the distribution
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp * and in all advertising materials mentioning features or use of this
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp * software. Neither the name of the University nor the names of its
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp * contributors may be used to endorse or promote products derived
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp * from this software without specific prior written permission.
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp */
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp#pragma ident "%Z%%M% %I% %E% SMI"
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp#include <stddef.h>
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp#include <string.h>
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp#include "nstrtok.h"
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp/*
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp * Function: nstrtok
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp *
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp * Purpose: the same as strtok ... just different. does not deal with
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp * multiple tokens in row.
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp *
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp * Arguments:
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp * s (input) string to scan
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp * delim (input) list of delimiters
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp * <return value> string or null on error.
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp *
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp * Requires:
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp * nuttin
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp *
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp * Effects:
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp * sets last to string
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp *
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp * Modifies:
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp * last
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp *
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp */
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp
56a424cca6b3f91f31bdab72a4626c48c779fe8bmpchar *
56a424cca6b3f91f31bdab72a4626c48c779fe8bmpnstrtok(s, delim)
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp register char *s;
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp register const char *delim;
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp{
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp register const char *spanp;
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp register int c, sc;
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp char *tok;
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp static char *last;
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp if (s == NULL && (s = last) == NULL)
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp return (NULL);
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp /*
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp * Skip (span) leading delimiters (s += strspn(s, delim), sort of).
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp */
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp#ifdef OLD
56a424cca6b3f91f31bdab72a4626c48c779fe8bmpcont:
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp c = *s++;
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp for (spanp = delim; (sc = *spanp++) != 0;) {
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp if (c == sc)
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp goto cont;
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp }
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp if (c == 0) { /* no non-delimiter characters */
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp last = NULL;
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp return (NULL);
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp }
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp tok = s - 1;
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp#else
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp tok = s;
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp#endif
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp /*
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp * Scan token (scan for delimiters: s += strcspn(s, delim), sort of).
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp * Note that delim must have one NUL; we stop if we see that, too.
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp */
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp for (;;) {
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp c = *s++;
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp spanp = delim;
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp do {
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp if ((sc = *spanp++) == c) {
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp if (c == 0)
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp s = NULL;
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp else
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp s[-1] = 0;
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp last = s;
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp return (tok);
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp }
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp } while (sc != 0);
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp }
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp /* NOTREACHED */
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp}
56a424cca6b3f91f31bdab72a4626c48c779fe8bmp