From 0adef4bb49e965313c165efe6fb718853bedc7ce Mon Sep 17 00:00:00 2001 From: millert <> Date: Wed, 20 Aug 1997 04:28:14 +0000 Subject: [PATCH] Update from lite2. --- src/lib/libc/string/strsep.3 | 76 ++++++++++++++++++++++-------------- src/lib/libc/string/strsep.c | 21 ++++++---- 2 files changed, 61 insertions(+), 36 deletions(-) diff --git a/src/lib/libc/string/strsep.3 b/src/lib/libc/string/strsep.3 index 0cae3e0f..471e693e 100644 --- a/src/lib/libc/string/strsep.3 +++ b/src/lib/libc/string/strsep.3 @@ -1,8 +1,11 @@ -.\" Copyright (c) 1990, 1991 The Regents of the University of California. -.\" All rights reserved. +.\" $OpenBSD: strsep.3,v 1.3 1997/08/20 04:28:13 millert Exp $ +.\" +.\" Copyright (c) 1990, 1991, 1993 +.\" The Regents of the University of California. All rights reserved. .\" .\" This code is derived from software contributed to Berkeley by .\" Chris Torek. +.\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: @@ -31,9 +34,9 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $OpenBSD: strsep.3,v 1.2 1996/08/19 08:34:24 tholo Exp $ +.\" @(#)strsep.3 8.1 (Berkeley) 6/9/93 .\" -.Dd April 19, 1991 +.Dd June 9, 1993 .Dt STRSEP 3 .Os .Sh NAME @@ -46,23 +49,29 @@ .Sh DESCRIPTION The .Fn strsep -locates in the null-terminated string at -.Fa *stringp -the first occurrence of any character in -.Fa delim -and replaces this with a -.Ql \e0 , -records the location of the immediate following character in +function locates, in the string referenced by .Fa *stringp , -then returns the original value of +the first occurrence of any character in the string +.Fa delim +(or the terminating +.Ql \e0 +character) and replaces it with a +.Ql \e0 . +The location of the next character after the delimiter character +(or NULL, if the end of the string was reached) is stored in .Fa *stringp . -If no delimiter characters are found, -.Fn strsep -sets +The original value of +.Fa *stringp +is returned. +.Pp +An ``empty'' field, i.e. one caused by two adjacent delimiter characters, +can be detected by comparing the location referenced by the pointer returned +in .Fa *stringp to -.Dv NULL ; -if +.Ql \e0 . +.Pp +If .Fa *stringp is initially .Dv NULL , @@ -72,20 +81,29 @@ returns .Sh EXAMPLES The following uses .Fn strsep -to parse strings containing runs of white space, -making up an argument vector: +to parse a string, containing tokens delimited by white space, into an +argument vector: .Bd -literal -offset indent -char inputstring[100]; -char **argv[51], **ap = argv, *p, *val; -/* set up inputstring */ -for (p = inputstring; p != NULL; ) { - while ((val = strsep(&p, " \et")) != NULL && *val == '\e0'); - *ap++ = val; -} -*ap = 0; +char **ap, *argv[10], *inputstring; + +for (ap = argv; (*ap = strsep(&inputstring, " \et")) != NULL;) + if (**ap != '\e0') + ++ap; .Ed .Sh HISTORY The .Fn strsep -function is -.Ud . +function +is intended as a replacement for the +.Fn strtok +function. +While the +.Fn strtok +function should be preferred for portability reasons (it conforms to +.St -ansiC ) +it is unable to handle empty fields, i.e. detect fields delimited by +two adjacent delimiter characters, or to be used for more than a single +string at a time. +The +.Fn strsep +function first appeared in 4.4BSD. diff --git a/src/lib/libc/string/strsep.c b/src/lib/libc/string/strsep.c index 09f187b6..b69b715f 100644 --- a/src/lib/libc/string/strsep.c +++ b/src/lib/libc/string/strsep.c @@ -1,6 +1,8 @@ +/* $OpenBSD: strsep.c,v 1.3 1997/08/20 04:28:14 millert Exp $ */ + /*- - * Copyright (c) 1990 The Regents of the University of California. - * All rights reserved. + * Copyright (c) 1990, 1993 + * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -31,14 +33,19 @@ * SUCH DAMAGE. */ +#include +#include + #if defined(LIBC_SCCS) && !defined(lint) -static char *rcsid = "$OpenBSD: strsep.c,v 1.2 1996/08/19 08:34:24 tholo Exp $"; +#if 0 +static char sccsid[] = "@(#)strsep.c 8.1 (Berkeley) 6/4/93"; +#else +static char *rcsid = "$OpenBSD: strsep.c,v 1.3 1997/08/20 04:28:14 millert Exp $"; +#endif #endif /* LIBC_SCCS and not lint */ -#include - /* - * Get next token from string *stringp, where tokens are nonempty + * Get next token from string *stringp, where tokens are possibly-empty * strings separated by characters from delim. * * Writes NULs into the string at *stringp to end tokens. @@ -46,7 +53,7 @@ static char *rcsid = "$OpenBSD: strsep.c,v 1.2 1996/08/19 08:34:24 tholo Exp $"; * On return, *stringp points past the last NUL written (if there might * be further tokens), or is NULL (if there are definitely no more tokens). * - * If *stringp is NULL, strtoken returns NULL. + * If *stringp is NULL, strsep returns NULL. */ char * strsep(stringp, delim)