1 // Copyright (C) 2001-2005 Open Source Telecom Corporation.
2 // Copyright (C) 2006-2010 David Sugar, Tycho Softworks.
3 //
4 // This program is free software; you can redistribute it and/or modify
5 // it under the terms of the GNU General Public License as published by
6 // the Free Software Foundation; either version 2 of the License, or
7 // (at your option) any later version.
8 //
9 // This program 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
12 // GNU General Public License for more details.
13 //
14 // You should have received a copy of the GNU General Public License
15 // along with this program; if not, write to the Free Software
16 // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
17 //
18 // As a special exception, you may use this file as part of a free software
19 // library without restriction.  Specifically, if other files instantiate
20 // templates or use macros or inline functions from this file, or you compile
21 // this file and link it with other files to produce an executable, this
22 // file does not by itself cause the resulting executable to be covered by
23 // the GNU General Public License.  This exception does not however
24 // invalidate any other reasons why the executable file might be covered by
25 // the GNU General Public License.
26 //
27 // This exception applies only to the code released under the name GNU
28 // Common C++.  If you copy code from other releases into a copy of GNU
29 // Common C++, as the General Public License permits, the exception does
30 // not apply to the code that you add in this way.  To avoid misleading
31 // anyone as to the status of such modified files, you must delete
32 // this exception notice from them.
33 //
34 // If you write modifications of your own for GNU Common C++, it is your choice
35 // whether to permit this exception to apply to your modifications.
36 // If you do not wish that, delete this exception notice.
37 //
38 
39 #include <cc++/config.h>
40 #include <cc++/export.h>
41 #include <cc++/missing.h>
42 #include <cc++/strchar.h>
43 
44 #include <cstdio>
45 #include <cstdlib>
46 #include <cstring>
47 
48 #ifdef  WIN32
49 #include <malloc.h>
50 //#define   alloca(x)   _alloca(x)
51 #endif
52 
53 #ifdef  CCXX_NAMESPACES
54 namespace ost {
55 using namespace std;
56 #endif
57 
find(const char * cs,char * str,size_t len)58 char *find(const char *cs, char *str, size_t len)
59 {
60     unsigned pos = 0;
61 
62     if(!len)
63         len = strlen(str);
64 
65     while(pos < len) {
66         if(strchr(cs, str[pos]))
67             return str + pos;
68         ++pos;
69     }
70     if(!str[pos])
71         return str + pos;
72     return NULL;
73 }
74 
rfind(const char * cs,char * str,size_t len)75 char *rfind(const char *cs, char *str, size_t len)
76 {
77     if(!len)
78         len = strlen(str);
79 
80     while(len--) {
81         if(strchr(cs, str[len]))
82             return str + len;
83     }
84     return str;
85 }
86 
ifind(const char * cs,char * str,size_t len)87 char *ifind(const char *cs, char *str, size_t len)
88 {
89     unsigned pos = 0;
90 
91     if(!len)
92         len = strlen(str);
93 
94     while(pos < len) {
95         if(!strchr(cs, str[pos]))
96             return str + pos;
97         ++pos;
98     }
99     if(!str[pos])
100         return str + pos;
101     return NULL;
102 }
103 
strip(const char * chars,char * str,size_t len)104 char *strip(const char *chars, char *str, size_t len)
105 {
106     len = strtrim(chars, str, len);
107 
108     if(!len)
109         return str;
110 
111     return ifind(chars, str, len);
112 }
113 
strtrim(const char * cs,char * str,size_t len)114 size_t strtrim(const char *cs, char *str, size_t len)
115 {
116     if(!str)
117         return 0;
118 
119     if(!len)
120         len = strlen(str);
121 
122     if(!len)
123         return 0;
124 
125     while(len--) {
126         if(!strchr(cs, str[len]))
127             return ++len;
128 
129         str[len] = 0;
130     }
131     return 0;
132 }
133 
strchop(const char * cs,char * str,size_t len)134 size_t strchop(const char *cs, char *str, size_t len)
135 {
136     unsigned pos = 0;
137 
138     if(!str)
139         return 0;
140 
141     if(!len)
142         len = strlen(str);
143 
144     if(!len)
145         return 0;
146 
147     while(pos < len) {
148         if(!strchr(cs, str[pos]))
149             break;
150         ++pos;
151     }
152 
153     if(pos == len) {
154         *str = 0;
155         return 0;
156     }
157     memmove(str, str + pos, len - pos + 1);
158     return len - pos;
159 }
160 
rsetField(char * dest,size_t size,const char * src,const char fill)161 char *rsetField(char *dest, size_t size, const char *src, const char fill)
162 {
163     size_t len = 0;
164 
165     if(src)
166         len = strlen(src);
167 
168     if(len > size)
169         len = size;
170 
171     if(len)
172         memmove(dest + size - len, (void *)src, len);
173 
174     if(len < size && fill)
175         memset(dest, fill, size - len);
176 
177     return dest;
178 }
179 
lsetField(char * dest,size_t size,const char * src,const char fill)180 char *lsetField(char *dest, size_t size, const char *src, const char fill)
181 {
182     size_t len = 0;
183 
184     if(src)
185         len = strlen(src);
186 
187     if(len > size)
188         len = size;
189 
190     if(len)
191         memmove(dest, src, len);
192 
193     if(len < size && fill)
194         memset(dest + len, fill, size - len);
195 
196     return dest;
197 }
198 
setUpper(char * string,size_t size)199 char *setUpper(char *string, size_t size)
200 {
201     char *ret = string;
202 
203     if(!size)
204         size = strlen(string);
205 
206     while(size && *string) {
207         *string = toupper(*string);
208         ++string;
209         --size;
210     }
211 
212     return ret;
213 }
214 
setLower(char * string,size_t size)215 char *setLower(char *string, size_t size)
216 {
217     char *ret = string;
218 
219     if(!size)
220         size = strlen(string);
221 
222     while(size && *string) {
223         *string = tolower(*string);
224         ++string;
225         --size;
226     }
227 
228     return ret;
229 }
230 
setString(char * dest,size_t size,const char * src)231 char *setString(char *dest, size_t size, const char *src)
232 {
233     size_t len = strlen(src);
234 
235     if(size == 1)
236         *dest = 0;
237 
238     if(size < 2)
239         return dest;
240 
241     if(len >= size)
242         len = size - 1;
243 
244     if(!len) {
245         dest[0] = 0;
246         return dest;
247     }
248 
249     memcpy(dest, src, len);
250     dest[len] = 0;
251     return dest;
252 }
253 
addString(char * dest,size_t size,const char * src)254 char *addString(char *dest, size_t size, const char *src)
255 {
256     size_t len = strlen(dest);
257 
258     if(len < size)
259         setString(dest + len, size - len, src);
260     return dest;
261 }
262 
newString(const char * src,size_t size)263 char *newString(const char *src, size_t size)
264 {
265     char *dest;
266 
267     if(!size)
268         size = strlen(src) + 1;
269 
270     dest = new char[size];
271     return setString(dest, size, src);
272 }
273 
delString(char * str)274 void delString(char *str)
275 {
276     delete[] str;
277 }
278 
279 #ifdef  CCXX_NAMESPACES
280 }
281 #endif
282