xref: /freebsd/crypto/krb5/src/kadmin/dbutil/strtok.c (revision f1c4c3daccbaf3820f0e2224de53df12fc952fcc)
1 /* -*- mode: c; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2 /*
3  * Copyright 1993 OpenVision Technologies, Inc., All Rights Reserved
4  *
5  */
6 
7 /*
8  * Copyright (c) 1988 Regents of the University of California.
9  * All rights reserved.
10  *
11  * Redistribution and use in source and binary forms are permitted
12  * provided that: (1) source distributions retain this entire copyright
13  * notice and comment, and (2) distributions including binaries display
14  * the following acknowledgement:  ``This product includes software
15  * developed by the University of California, Berkeley and its contributors''
16  * in the documentation or other materials provided with the distribution
17  * and in all advertising materials mentioning features or use of this
18  * software. Neither the name of the University nor the names of its
19  * contributors may be used to endorse or promote products derived
20  * from this software without specific prior written permission.
21  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
22  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
23  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
24  */
25 
26 #include <stddef.h>
27 #include <string.h>
28 #include "nstrtok.h"
29 
30 /*
31  * Function: nstrtok
32  *
33  * Purpose: the same as strtok ... just different. does not deal with
34  *          multiple tokens in row.
35  *
36  * Arguments:
37  *      s           (input) string to scan
38  *      delim       (input) list of delimiters
39  *      <return value> string or null on error.
40  *
41  * Requires:
42  *      nuttin
43  *
44  * Effects:
45  *      sets last to string
46  *
47  * Modifies:
48  *      last
49  *
50  */
51 
52 char *
nstrtok(char * s,const char * delim)53 nstrtok(char *s, const char *delim)
54 {
55     const char *spanp;
56     int c, sc;
57     char *tok;
58     static char *last;
59 
60 
61     if (s == NULL && (s = last) == NULL)
62         return (NULL);
63 
64     /*
65      * Skip (span) leading delimiters (s += strspn(s, delim), sort of).
66      */
67 #ifdef OLD
68 cont:
69     c = *s++;
70     for (spanp = delim; (sc = *spanp++) != 0;) {
71         if (c == sc)
72             goto cont;
73     }
74 
75     if (c == 0) {           /* no non-delimiter characters */
76         last = NULL;
77         return (NULL);
78     }
79     tok = s - 1;
80 #else
81     tok = s;
82 #endif
83 
84     /*
85      * Scan token (scan for delimiters: s += strcspn(s, delim), sort of).
86      * Note that delim must have one NUL; we stop if we see that, too.
87      */
88     for (;;) {
89         c = *s++;
90         spanp = delim;
91         do {
92             if ((sc = *spanp++) == c) {
93                 if (c == 0)
94                     s = NULL;
95                 else
96                     s[-1] = 0;
97                 last = s;
98                 return (tok);
99             }
100         } while (sc != 0);
101     }
102     /* NOTREACHED */
103 }
104