1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
|
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
/*
* General purpse string manipulation routines
*/
#include <stdio.h>
#include <_conv.h>
/*
* Implementation of isspace() that does not require <ctype.h>
* or <sys/ctype.h>, appropriate for simple non-localized use.
*/
int
conv_strproc_isspace(int c)
{
return ((c == ' ') || (c == '\t') || (c == '\r') || (c == '\n'));
}
/*
* Remove leading and trailing whitespace from the given string.
*
* entry:
* str - String to be trimmed
*
* exit:
* The pointer to the trimmed string is returned.
*
* note:
* Leading whitespace is trimmed by advancing the given str pointer,
* and not by making a copy or allocing more memory. Hence, the caller
* should retain a copy of the original str pointer if they need to
* free the original memory or otherwise access it.
*
* Trailing whitespace is trimmed by inserting a NULL termination
* in the position at which the first trailing whitespce character
* lies. This routine can therefore modify the memory used by
* the input string.
*/
char *
conv_strproc_trim(char *str)
{
char *tail;
/* Skip leading whitespace */
while (conv_strproc_isspace(*str))
str++;
/* Back up over trailing whitespace */
tail = str + strlen(str);
while ((tail > str) && conv_strproc_isspace(*(tail - 1)))
tail--;
*tail = '\0';
return (str);
}
/*
* Given a debug token of the form:
*
* token=value
*
* extract and return a pointer to the value.
*
* entry:
* str - String to process
* token_len = Length of the token, not counting the '=' character,
* or any whitespace between the token and the '='.
* to_upper - True to convert the returned value to upper case.
* value - Address of pointer to receive the value string.
*
* exit:
* On success, *value is updated to point at the value string,
* and True (1) is returned. On failure, False (0) is returned.
*
* note:
* If CONV_SPEXV_F_UCASE is specified, this routine modifies
* the memory pointed at by str.
*/
Boolean
conv_strproc_extract_value(char *str, size_t token_len, int flags,
const char **value)
{
int trim = (flags & CONV_SPEXV_F_NOTRIM) == 0;
/* Skip the token */
str += token_len;
/*
* If TRIM, skip whitespace between token and '='
*/
if (trim)
while (conv_strproc_isspace(*str))
str++;
/* If there's not a '=' here, this isn't the token we thought it was */
if (*str != '=')
return (FALSE);
str++; /* skip the '=' */
/* if TRIM, skip whitespace following the '=' */
if (trim)
while (conv_strproc_isspace(*str))
str++;
/* Null value and it's not OK? Make it an error. */
if (((flags & CONV_SPEXV_F_NULLOK) == 0) && (*str == '\0'))
return (FALSE);
*value = str;
/* Convert to uppercase on request */
if (flags & CONV_SPEXV_F_UCASE)
for (; *str; str++)
if ((*str >= 'a') && (*str <= 'z'))
*str = *str - ('a' - 'A');
return (TRUE);
}
|