Line data Source code
1 : /* Copyright (C) 1992, 93, 96, 97, 98, 99, 2004 Free Software Foundation, Inc.
2 : * This file is part of the GNU C Library.
3 : *
4 : * The GNU C Library is free software; you can redistribute it and/or
5 : * modify it under the terms of the GNU Lesser General Public
6 : * License as published by the Free Software Foundation; either
7 : * version 2.1 of the License, or (at your option) any later version.
8 : *
9 : * The GNU C Library is distributed in the hope that it will be useful,
10 : * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 : * Lesser General Public License for more details.
13 : *
14 : * You should have received a copy of the GNU Lesser General Public
15 : * License along with the GNU C Library; if not, write to the Free
16 : * Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
17 : * 02111-1307 USA.
18 : */
19 :
20 : #include <config.h>
21 :
22 : #include <stdarg.h>
23 : #include <stdio.h>
24 :
25 : #if HAVE_STRING_H
26 : #include <string.h>
27 : #endif /* HAVE_STRING_H */
28 :
29 : #include <freetds/replacements.h>
30 :
31 : /* Taken from glibc 2.6.1 */
32 :
33 : char *
34 416 : tds_strsep(char **stringp, const char *delim)
35 : {
36 : char *begin, *end;
37 :
38 416 : begin = *stringp;
39 416 : if (begin == NULL)
40 : return NULL;
41 :
42 : /* A frequent case is when the delimiter string contains only one
43 : * character. Here we don't need to call the expensive `strpbrk'
44 : * function and instead work using `strchr'. */
45 216 : if (delim[0] == '\0') {
46 : end = NULL;
47 200 : } else if (delim[1] == '\0') {
48 104 : char ch = delim[0];
49 :
50 104 : if (*begin == ch)
51 : end = begin;
52 72 : else if (*begin == '\0')
53 : end = NULL;
54 : else
55 56 : end = strchr(begin + 1, ch);
56 : } else {
57 : /* Find the end of the token. */
58 96 : end = strpbrk(begin, delim);
59 : }
60 :
61 184 : if (end) {
62 : /* Terminate the token and set *STRINGP past NUL character. */
63 144 : *end++ = '\0';
64 : } else {
65 : /* No more delimiters; this is the last token. */
66 : }
67 216 : *stringp = end;
68 :
69 216 : return begin;
70 : }
|