Coverage Report

Created: 2025-10-10 06:20

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/httpd/srclib/apr/strings/apr_strtok.c
Line
Count
Source
1
/* Licensed to the Apache Software Foundation (ASF) under one or more
2
 * contributor license agreements.  See the NOTICE file distributed with
3
 * this work for additional information regarding copyright ownership.
4
 * The ASF licenses this file to You under the Apache License, Version 2.0
5
 * (the "License"); you may not use this file except in compliance with
6
 * the License.  You may obtain a copy of the License at
7
 *
8
 *     http://www.apache.org/licenses/LICENSE-2.0
9
 *
10
 * Unless required by applicable law or agreed to in writing, software
11
 * distributed under the License is distributed on an "AS IS" BASIS,
12
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
 * See the License for the specific language governing permissions and
14
 * limitations under the License.
15
 */
16
17
#ifdef HAVE_STDDEF_H
18
#include <stddef.h>        /* for NULL */
19
#endif
20
21
#include "apr.h"
22
#include "apr_strings.h"
23
24
#define APR_WANT_STRFUNC   /* for strchr() */
25
#include "apr_want.h"
26
27
APR_DECLARE(char *) apr_strtok(char *str, const char *sep, char **last)
28
0
{
29
0
    char *token;
30
31
0
    if (!str)           /* subsequent call */
32
0
        str = *last;    /* start where we left off */
33
34
    /* skip characters in sep (will terminate at '\0') */
35
0
    while (*str && strchr(sep, *str))
36
0
        ++str;
37
38
0
    if (!*str)          /* no more tokens */
39
0
        return NULL;
40
41
0
    token = str;
42
43
    /* skip valid token characters to terminate token and
44
     * prepare for the next call (will terminate at '\0)
45
     */
46
0
    *last = token + 1;
47
0
    while (**last && !strchr(sep, **last))
48
0
        ++*last;
49
50
0
    if (**last) {
51
0
        **last = '\0';
52
0
        ++*last;
53
0
    }
54
55
0
    return token;
56
0
}
57
58
APR_DECLARE(char *) apr_strqtok(char *str, const char *sep, char **last)
59
0
{
60
0
    char *token;
61
0
    apr_size_t rewind = 0;
62
0
    char c, q = 0, s = 0;
63
64
0
    if (!str) {         /* subsequent call */
65
0
        str = *last;    /* start where we left off */
66
0
    }
67
68
    /* skip characters in sep (will terminate at '\0') */
69
0
    while (*str && strchr(sep, *str)) {
70
0
        ++str;
71
0
    }
72
73
0
    if (!*str) {        /* no more tokens */
74
0
        return NULL;
75
0
    }
76
77
0
    token = str;
78
79
    /* skip quoted sections */
80
0
    while ((c = *str)) {
81
82
0
        if (!q) {
83
0
            if ('\'' == c) {
84
0
                q = '\'';
85
0
                rewind++;
86
0
            }
87
0
            else if ('\"' == c) {
88
0
                q = '\"';
89
0
                rewind++;
90
0
            }
91
0
            else if (strchr(sep, c)) {
92
0
                break;
93
0
            }
94
0
            else if (rewind) {
95
0
                str[-rewind] = c;
96
0
            }
97
0
        }
98
0
        else {
99
0
            if (!s) {
100
0
                if ('\\' == c) {
101
0
                    s = c;
102
0
                    rewind++;
103
0
                }
104
0
                else if (!s && q == c) {
105
0
                    rewind++;
106
0
                    q = 0;
107
0
                }
108
0
                else if (rewind) {
109
0
                    str[-rewind] = c;
110
0
                }
111
0
            }
112
0
            else {
113
0
                s = 0;
114
0
                if (rewind) {
115
0
                    str[-rewind] = c;
116
0
                }
117
0
            }
118
0
        }
119
120
0
        str++;
121
0
    }
122
123
0
    if (rewind) {
124
0
        str[-rewind] = '\0';
125
0
    }
126
127
    /* prepare for the next call (will terminate at '\0)
128
     */
129
0
    *last = str;
130
131
0
    if (**last) {
132
0
        **last = '\0';
133
0
        ++*last;
134
0
    }
135
136
0
    return token;
137
0
}
138