From 316c8d81942498ac281320e6db585cc3972d3501 Mon Sep 17 00:00:00 2001 From: wb2osz Date: Mon, 14 Oct 2019 19:08:49 -0400 Subject: [PATCH] Replace defective strsep. --- misc/README-dire-wolf.txt | 23 ++++------- misc/strsep.c | 80 +++++++++++++++++++++++++++++++-------- 2 files changed, 73 insertions(+), 30 deletions(-) diff --git a/misc/README-dire-wolf.txt b/misc/README-dire-wolf.txt index 140f960..f69c05a 100644 --- a/misc/README-dire-wolf.txt +++ b/misc/README-dire-wolf.txt @@ -4,31 +4,24 @@ Files in this directory fill in the gaps missing for some operating systems. -------------------------------------- -These are part of the standard C library for Linux and similar operating systems. -For the Windows version we need to include our own copy. +These are part of the standard C library for Linux, BSD Unix, and similar operating systems. +They are not present for MS Windows so we need to supply our own copy. -They were copied from Cygwin source. -/usr/src/cygwin-1.7.10-1/newlib/libc/string/... +From http://ftp.netbsd.org/pub/pkgsrc/current/pkgsrc/net/tnftp/files/libnetbsd/strsep.c +and other BSD locations. strsep.c + strcasestr.c strtok_r.c -------------------------------------- -This was also missing on Windows but available everywhere else. - strcasestr.c - --------------------------------------- - - -The are used for the Linux and Windows versions. +These are needed for the Linux and Windows versions. They should be part of the standard C library for OpenBSD, FreeBSD, Mac OS X. -These are from OpenBSD. + http://ftp.netbsd.org/pub/pkgsrc/current/pkgsrc/net/tnftp/files/libnetbsd/strlcpy.c http://ftp.netbsd.org/pub/pkgsrc/current/pkgsrc/net/tnftp/files/libnetbsd/strlcat.c - strlcpy.c - strlcat.c - \ No newline at end of file + strlcat.c \ No newline at end of file diff --git a/misc/strsep.c b/misc/strsep.c index 7d764d0..a333815 100644 --- a/misc/strsep.c +++ b/misc/strsep.c @@ -1,22 +1,72 @@ -/* BSD strsep function */ +/* $NetBSD: strsep.c,v 1.5 2014/10/31 18:59:32 spz Exp $ */ +/* from NetBSD: strsep.c,v 1.14 2003/08/07 16:43:52 agc Exp */ -/* Copyright 2002, Red Hat Inc. */ +/*- + * 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 + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ -/* undef STRICT_ANSI so that strsep prototype will be defined */ -#undef __STRICT_ANSI__ +//#include "tnftp.h" #include -//#include <_ansi.h> -//#include - -#define _DEFUN(name,arglist,args) name(args) -#define _AND , - -extern char *__strtok_r (char *, const char *, char **, int); +/* + * 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. + * delim need not remain constant from call to call. + * 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, strsep returns NULL. + */ char * -_DEFUN (strsep, (source_ptr, delim), - register char **source_ptr _AND - register const char *delim) +strsep(char **stringp, const char *delim) { - return __strtok_r (*source_ptr, delim, source_ptr, 0); + char *s; + const char *spanp; + int c, sc; + char *tok; + + if ((s = *stringp) == NULL) + return (NULL); + for (tok = s;;) { + c = *s++; + spanp = delim; + do { + if ((sc = *spanp++) == c) { + if (c == 0) + s = NULL; + else + s[-1] = 0; + *stringp = s; + return (tok); + } + } while (sc != 0); + } + /* NOTREACHED */ }