1*418b791dSBob Badour /**
2*418b791dSBob Badour * Copyright (c) 2019, The Linux Foundation. All rights reserved.
3*418b791dSBob Badour *
4*418b791dSBob Badour * Redistribution and use in source and binary forms, with or without
5*418b791dSBob Badour * modification, are permitted provided that the following conditions are
6*418b791dSBob Badour * met:
7*418b791dSBob Badour * * Redistributions of source code must retain the above copyright
8*418b791dSBob Badour * notice, this list of conditions and the following disclaimer.
9*418b791dSBob Badour * * Redistributions in binary form must reproduce the above
10*418b791dSBob Badour * copyright notice, this list of conditions and the following
11*418b791dSBob Badour * disclaimer in the documentation and/or other materials provided
12*418b791dSBob Badour * with the distribution.
13*418b791dSBob Badour * * Neither the name of The Linux Foundation nor the names of its
14*418b791dSBob Badour * contributors may be used to endorse or promote products derived
15*418b791dSBob Badour * from this software without specific prior written permission.
16*418b791dSBob Badour *
17*418b791dSBob Badour * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
18*418b791dSBob Badour * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19*418b791dSBob Badour * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
20*418b791dSBob Badour * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
21*418b791dSBob Badour * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22*418b791dSBob Badour * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23*418b791dSBob Badour * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
24*418b791dSBob Badour * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
25*418b791dSBob Badour * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
26*418b791dSBob Badour * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27*418b791dSBob Badour * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28*418b791dSBob Badour */
29*418b791dSBob Badour
30*418b791dSBob Badour /*
31*418b791dSBob Badour =======================================================================
32*418b791dSBob Badour
33*418b791dSBob Badour FILE: std.c
34*418b791dSBob Badour
35*418b791dSBob Badour SERVICES: apiOne std lib string stuff
36*418b791dSBob Badour
37*418b791dSBob Badour =======================================================================
38*418b791dSBob Badour */
39*418b791dSBob Badour
40*418b791dSBob Badour //
41*418b791dSBob Badour // someday, drop this #include, implement our own memmove()
42*418b791dSBob Badour //
43*418b791dSBob Badour #include <stddef.h>
44*418b791dSBob Badour #include "AEEstd.h"
45*418b791dSBob Badour #include "version.h"
46*418b791dSBob Badour
std_getversion(char * pcDst,int nDestSize)47*418b791dSBob Badour int std_getversion(char *pcDst, int nDestSize)
48*418b791dSBob Badour {
49*418b791dSBob Badour return std_strlcpy(pcDst, VERSION_STRING, nDestSize);
50*418b791dSBob Badour }
51*418b791dSBob Badour
52*418b791dSBob Badour
std_tolower(char c)53*418b791dSBob Badour char std_tolower(char c)
54*418b791dSBob Badour {
55*418b791dSBob Badour if ((c >= 'A') && (c <= 'Z')) {
56*418b791dSBob Badour c |= 32;
57*418b791dSBob Badour }
58*418b791dSBob Badour return c;
59*418b791dSBob Badour }
60*418b791dSBob Badour
std_toupper(char c)61*418b791dSBob Badour char std_toupper(char c)
62*418b791dSBob Badour {
63*418b791dSBob Badour if ((c >= 'a') && (c <= 'z')) {
64*418b791dSBob Badour c &= ~32;
65*418b791dSBob Badour }
66*418b791dSBob Badour return c;
67*418b791dSBob Badour }
68*418b791dSBob Badour
69*418b791dSBob Badour
x_casecmp(unsigned char c1,unsigned char c2)70*418b791dSBob Badour static __inline int x_casecmp(unsigned char c1, unsigned char c2)
71*418b791dSBob Badour {
72*418b791dSBob Badour int diff = c1 - c2;
73*418b791dSBob Badour if (c1 >= 'A' && c1 <= 'Z') {
74*418b791dSBob Badour diff += 32;
75*418b791dSBob Badour }
76*418b791dSBob Badour if (c2 >= 'A' && c2 <= 'Z') {
77*418b791dSBob Badour diff -= 32;
78*418b791dSBob Badour }
79*418b791dSBob Badour return diff;
80*418b791dSBob Badour }
81*418b791dSBob Badour
82*418b791dSBob Badour
std_strncmp(const char * s1,const char * s2,int n)83*418b791dSBob Badour int std_strncmp(const char* s1, const char* s2, int n)
84*418b791dSBob Badour {
85*418b791dSBob Badour if (n > 0) {
86*418b791dSBob Badour int i = 0;
87*418b791dSBob Badour
88*418b791dSBob Badour do {
89*418b791dSBob Badour unsigned char c1 = (unsigned char)s1[i];
90*418b791dSBob Badour unsigned char c2 = (unsigned char)s2[i];
91*418b791dSBob Badour int diff = c1 - c2;
92*418b791dSBob Badour
93*418b791dSBob Badour if (diff) {
94*418b791dSBob Badour return diff;
95*418b791dSBob Badour }
96*418b791dSBob Badour
97*418b791dSBob Badour if ('\0' == c1) {
98*418b791dSBob Badour break;
99*418b791dSBob Badour }
100*418b791dSBob Badour i++;
101*418b791dSBob Badour } while (i < n);
102*418b791dSBob Badour }
103*418b791dSBob Badour
104*418b791dSBob Badour return 0;
105*418b791dSBob Badour }
106*418b791dSBob Badour
std_strcmp(const char * s1,const char * s2)107*418b791dSBob Badour int std_strcmp(const char* s1, const char* s2)
108*418b791dSBob Badour {
109*418b791dSBob Badour return std_strncmp(s1, s2, MAX_INT32);
110*418b791dSBob Badour }
111*418b791dSBob Badour
std_strnicmp(const char * s1,const char * s2,int n)112*418b791dSBob Badour int std_strnicmp(const char* s1, const char* s2, int n)
113*418b791dSBob Badour {
114*418b791dSBob Badour if (n > 0) {
115*418b791dSBob Badour int i = -n;
116*418b791dSBob Badour
117*418b791dSBob Badour s1 += n;
118*418b791dSBob Badour s2 += n;
119*418b791dSBob Badour
120*418b791dSBob Badour do {
121*418b791dSBob Badour unsigned char c1 = (unsigned char)s1[i];
122*418b791dSBob Badour unsigned char c2 = (unsigned char)s2[i];
123*418b791dSBob Badour
124*418b791dSBob Badour int diff = x_casecmp(c1,c2);
125*418b791dSBob Badour if (diff) {
126*418b791dSBob Badour return diff;
127*418b791dSBob Badour }
128*418b791dSBob Badour if ('\0' == c1) {
129*418b791dSBob Badour break;
130*418b791dSBob Badour }
131*418b791dSBob Badour } while (++i);
132*418b791dSBob Badour }
133*418b791dSBob Badour return 0;
134*418b791dSBob Badour }
135*418b791dSBob Badour
std_stricmp(const char * s1,const char * s2)136*418b791dSBob Badour int std_stricmp(const char* s1, const char* s2)
137*418b791dSBob Badour {
138*418b791dSBob Badour return std_strnicmp(s1, s2, MAX_INT32);
139*418b791dSBob Badour }
140*418b791dSBob Badour
std_strlcpy(char * pcDst,const char * cpszSrc,int nDestSize)141*418b791dSBob Badour int std_strlcpy(char* pcDst, const char* cpszSrc, int nDestSize)
142*418b791dSBob Badour {
143*418b791dSBob Badour int nLen = std_strlen(cpszSrc);
144*418b791dSBob Badour
145*418b791dSBob Badour if (0 < nDestSize) {
146*418b791dSBob Badour int n;
147*418b791dSBob Badour
148*418b791dSBob Badour n = STD_MIN(nLen, nDestSize - 1);
149*418b791dSBob Badour (void)std_memmove(pcDst, cpszSrc, n);
150*418b791dSBob Badour
151*418b791dSBob Badour pcDst[n] = 0;
152*418b791dSBob Badour }
153*418b791dSBob Badour
154*418b791dSBob Badour return nLen;
155*418b791dSBob Badour }
156*418b791dSBob Badour
std_strlcat(char * pcDst,const char * cpszSrc,int nDestSize)157*418b791dSBob Badour int std_strlcat(char* pcDst, const char* cpszSrc, int nDestSize)
158*418b791dSBob Badour {
159*418b791dSBob Badour int nLen = 0;
160*418b791dSBob Badour
161*418b791dSBob Badour while ((nLen < nDestSize) && (0 != pcDst[nLen])) {
162*418b791dSBob Badour ++nLen;
163*418b791dSBob Badour }
164*418b791dSBob Badour
165*418b791dSBob Badour return nLen + std_strlcpy(pcDst+nLen, cpszSrc, nDestSize-nLen);
166*418b791dSBob Badour }
167*418b791dSBob Badour
std_strstr(const char * cpszHaystack,const char * cpszNeedle)168*418b791dSBob Badour char* std_strstr(const char* cpszHaystack, const char* cpszNeedle)
169*418b791dSBob Badour {
170*418b791dSBob Badour /* Check the empty needle string as a special case */
171*418b791dSBob Badour if ('\0' == *cpszNeedle ) {
172*418b791dSBob Badour return (char*)cpszHaystack;
173*418b791dSBob Badour }
174*418b791dSBob Badour
175*418b791dSBob Badour while ('\0' != *cpszHaystack) {
176*418b791dSBob Badour /* Find the first character of the needle string in the haystack string */
177*418b791dSBob Badour if (*cpszHaystack == *cpszNeedle) {
178*418b791dSBob Badour /* check if the rest of the string matches */
179*418b791dSBob Badour const char* pHaystack = cpszHaystack;
180*418b791dSBob Badour const char* pNeedle = cpszNeedle;
181*418b791dSBob Badour do {
182*418b791dSBob Badour if ('\0' == *++pNeedle) {
183*418b791dSBob Badour /* Found a match */
184*418b791dSBob Badour return (char*)cpszHaystack;
185*418b791dSBob Badour }
186*418b791dSBob Badour } while (*++pHaystack == *pNeedle);
187*418b791dSBob Badour }
188*418b791dSBob Badour cpszHaystack++;
189*418b791dSBob Badour }
190*418b791dSBob Badour
191*418b791dSBob Badour return 0;
192*418b791dSBob Badour }
193*418b791dSBob Badour
194*418b791dSBob Badour
std_memcmp(const void * p1,const void * p2,int length)195*418b791dSBob Badour int std_memcmp(const void* p1, const void* p2, int length)
196*418b791dSBob Badour {
197*418b791dSBob Badour const unsigned char *cpc1 = p1;
198*418b791dSBob Badour const unsigned char *cpc2 = p2;
199*418b791dSBob Badour
200*418b791dSBob Badour while (length-- > 0) {
201*418b791dSBob Badour int diff = *cpc1++ - *cpc2++;
202*418b791dSBob Badour
203*418b791dSBob Badour if (0 != diff) {
204*418b791dSBob Badour return diff;
205*418b791dSBob Badour }
206*418b791dSBob Badour }
207*418b791dSBob Badour return 0;
208*418b791dSBob Badour }
209*418b791dSBob Badour
std_wstrlen(const AECHAR * s)210*418b791dSBob Badour int std_wstrlen(const AECHAR* s)
211*418b791dSBob Badour {
212*418b791dSBob Badour const AECHAR *sEnd = s;
213*418b791dSBob Badour
214*418b791dSBob Badour if (! *sEnd)
215*418b791dSBob Badour return 0;
216*418b791dSBob Badour
217*418b791dSBob Badour do {
218*418b791dSBob Badour ++sEnd;
219*418b791dSBob Badour } while (*sEnd);
220*418b791dSBob Badour
221*418b791dSBob Badour return sEnd - s;
222*418b791dSBob Badour }
223*418b791dSBob Badour
224*418b791dSBob Badour
std_wstrlcpy(AECHAR * pwcDst,const AECHAR * cpwszSrc,int nDestSize)225*418b791dSBob Badour int std_wstrlcpy(AECHAR* pwcDst, const AECHAR* cpwszSrc, int nDestSize)
226*418b791dSBob Badour {
227*418b791dSBob Badour int nLen = std_wstrlen(cpwszSrc);
228*418b791dSBob Badour
229*418b791dSBob Badour if (0 < nDestSize) {
230*418b791dSBob Badour int n;
231*418b791dSBob Badour
232*418b791dSBob Badour n = STD_MIN(nLen, nDestSize - 1);
233*418b791dSBob Badour /* call memmove, in case n is larger than 1G */
234*418b791dSBob Badour (void)std_memsmove(pwcDst, nDestSize*sizeof(AECHAR),
235*418b791dSBob Badour cpwszSrc, ((size_t)n)*sizeof(AECHAR));
236*418b791dSBob Badour
237*418b791dSBob Badour pwcDst[n] = 0;
238*418b791dSBob Badour }
239*418b791dSBob Badour
240*418b791dSBob Badour return nLen;
241*418b791dSBob Badour }
242*418b791dSBob Badour
std_wstrlcat(AECHAR * pwcDst,const AECHAR * cpwszSrc,int nDestSize)243*418b791dSBob Badour int std_wstrlcat(AECHAR* pwcDst, const AECHAR* cpwszSrc, int nDestSize)
244*418b791dSBob Badour {
245*418b791dSBob Badour int nLen = 0;
246*418b791dSBob Badour
247*418b791dSBob Badour while ((nLen < nDestSize) && (0 != pwcDst[nLen])) {
248*418b791dSBob Badour ++nLen;
249*418b791dSBob Badour }
250*418b791dSBob Badour
251*418b791dSBob Badour return nLen + std_wstrlcpy(pwcDst+nLen, cpwszSrc, nDestSize-nLen);
252*418b791dSBob Badour }
253*418b791dSBob Badour
std_strchrend(const char * cpsz,char c)254*418b791dSBob Badour char* std_strchrend(const char* cpsz, char c)
255*418b791dSBob Badour {
256*418b791dSBob Badour while (*cpsz && *cpsz != c) {
257*418b791dSBob Badour ++cpsz;
258*418b791dSBob Badour }
259*418b791dSBob Badour return (char*)cpsz;
260*418b791dSBob Badour }
261*418b791dSBob Badour
std_strchr(const char * cpszSrch,int c)262*418b791dSBob Badour char* std_strchr(const char* cpszSrch, int c)
263*418b791dSBob Badour {
264*418b791dSBob Badour const char *pc = std_strchrend(cpszSrch, (char)c);
265*418b791dSBob Badour
266*418b791dSBob Badour return (*pc == c ? (char*)pc : 0);
267*418b791dSBob Badour }
268*418b791dSBob Badour
std_memstr(const char * cpHaystack,const char * cpszNeedle,int nHaystackLen)269*418b791dSBob Badour void* std_memstr(const char* cpHaystack, const char* cpszNeedle,
270*418b791dSBob Badour int nHaystackLen)
271*418b791dSBob Badour {
272*418b791dSBob Badour int nLen = 0;
273*418b791dSBob Badour
274*418b791dSBob Badour /* Handle empty needle string as a special case */
275*418b791dSBob Badour if ('\0' == *cpszNeedle ) {
276*418b791dSBob Badour return (char*)cpHaystack;
277*418b791dSBob Badour }
278*418b791dSBob Badour
279*418b791dSBob Badour /* Find the first character of the needle string in the haystack string */
280*418b791dSBob Badour while (nLen < nHaystackLen) {
281*418b791dSBob Badour if (cpHaystack[nLen] == *cpszNeedle) {
282*418b791dSBob Badour /* check if the rest of the string matches */
283*418b791dSBob Badour const char* cpNeedle = cpszNeedle;
284*418b791dSBob Badour int nRetIndex = nLen;
285*418b791dSBob Badour do {
286*418b791dSBob Badour if ('\0' == *++cpNeedle) {
287*418b791dSBob Badour /* Found a match */
288*418b791dSBob Badour return (void*)(cpHaystack + nRetIndex);
289*418b791dSBob Badour }
290*418b791dSBob Badour nLen++;
291*418b791dSBob Badour } while(cpHaystack[nLen] == *cpNeedle);
292*418b791dSBob Badour }
293*418b791dSBob Badour else {
294*418b791dSBob Badour nLen++;
295*418b791dSBob Badour }
296*418b791dSBob Badour }
297*418b791dSBob Badour
298*418b791dSBob Badour return 0;
299*418b791dSBob Badour }
300*418b791dSBob Badour
std_memchrend(const void * p,int c,int nLen)301*418b791dSBob Badour void* std_memchrend(const void* p, int c, int nLen)
302*418b791dSBob Badour {
303*418b791dSBob Badour const char* cpc = (const char*)p + nLen;
304*418b791dSBob Badour int i = -nLen;
305*418b791dSBob Badour
306*418b791dSBob Badour if (nLen > 0) {
307*418b791dSBob Badour do {
308*418b791dSBob Badour if (cpc[i] == c) {
309*418b791dSBob Badour break;
310*418b791dSBob Badour }
311*418b791dSBob Badour } while (++i);
312*418b791dSBob Badour }
313*418b791dSBob Badour return (void*) (cpc + i);
314*418b791dSBob Badour }
315*418b791dSBob Badour
std_memchr(const void * s,int c,int n)316*418b791dSBob Badour void* std_memchr(const void* s, int c, int n)
317*418b791dSBob Badour {
318*418b791dSBob Badour const char *pEnd = (const char*)std_memchrend(s,c,n);
319*418b791dSBob Badour int nEnd = pEnd - (const char*)s;
320*418b791dSBob Badour
321*418b791dSBob Badour if (nEnd < n) {
322*418b791dSBob Badour return (void*)pEnd;
323*418b791dSBob Badour }
324*418b791dSBob Badour return 0;
325*418b791dSBob Badour }
326*418b791dSBob Badour
std_memrchr(const void * p,int c,int nLen)327*418b791dSBob Badour void* std_memrchr(const void* p, int c, int nLen)
328*418b791dSBob Badour {
329*418b791dSBob Badour const char* cpc = (const char*)p - 1;
330*418b791dSBob Badour
331*418b791dSBob Badour if (nLen > 0) {
332*418b791dSBob Badour do {
333*418b791dSBob Badour if (cpc[nLen] == c) {
334*418b791dSBob Badour return (void*) (cpc + nLen);
335*418b791dSBob Badour }
336*418b791dSBob Badour } while (--nLen);
337*418b791dSBob Badour }
338*418b791dSBob Badour
339*418b791dSBob Badour return 0;
340*418b791dSBob Badour }
341*418b791dSBob Badour
342*418b791dSBob Badour
std_strrchr(const char * cpsz,int c)343*418b791dSBob Badour char* std_strrchr(const char* cpsz, int c)
344*418b791dSBob Badour {
345*418b791dSBob Badour return std_memrchr(cpsz, c, std_strlen(cpsz) + 1);
346*418b791dSBob Badour }
347*418b791dSBob Badour
348*418b791dSBob Badour
std_memrchrbegin(const void * p,int c,int n)349*418b791dSBob Badour void* std_memrchrbegin(const void* p, int c, int n)
350*418b791dSBob Badour {
351*418b791dSBob Badour void *pOut = std_memrchr(p, c, n);
352*418b791dSBob Badour
353*418b791dSBob Badour return (pOut ? pOut : (void*)p);
354*418b791dSBob Badour }
355*418b791dSBob Badour
356*418b791dSBob Badour
357*418b791dSBob Badour // x_scanbytes: internal function; WARNING: nLen must be >0
358*418b791dSBob Badour //
359*418b791dSBob Badour // cStop = character at which to stop (in addition to cpszChars[...])
360*418b791dSBob Badour //
361*418b791dSBob Badour // Using a bit mask provides a constant-time check for a terminating
362*418b791dSBob Badour // character: 10 instructions for inner loop on ADS12arm9. Initialization
363*418b791dSBob Badour // overhead is increased, but this is quickly made up for as searching begins.
364*418b791dSBob Badour //
365*418b791dSBob Badour //
x_scanbytes(const char * pcBuf,const char * cpszChars,int nLen,unsigned char cStop,boolean bTestEqual)366*418b791dSBob Badour static char *x_scanbytes(const char *pcBuf, const char* cpszChars,
367*418b791dSBob Badour int nLen, unsigned char cStop, boolean bTestEqual)
368*418b791dSBob Badour {
369*418b791dSBob Badour int n;
370*418b791dSBob Badour unsigned a[8];
371*418b791dSBob Badour
372*418b791dSBob Badour // Initialize bit mask based on the input flag that specifies whether
373*418b791dSBob Badour // we are looking for a character that matches "any" or "none"
374*418b791dSBob Badour // of the characters in the search string
375*418b791dSBob Badour
376*418b791dSBob Badour #define ENTRY(c) a[((c)&7)] // c's bit lives here
377*418b791dSBob Badour #define SHIFT(c) ((c)>>3) // c's bit is shifted by this much
378*418b791dSBob Badour
379*418b791dSBob Badour if (bTestEqual) {
380*418b791dSBob Badour std_memset(a, 0, STD_SIZEOF(a));
381*418b791dSBob Badour do {
382*418b791dSBob Badour ENTRY(cStop) |= (0x80000000U >> SHIFT(cStop));
383*418b791dSBob Badour cStop = (unsigned char)*cpszChars++;
384*418b791dSBob Badour } while (cStop);
385*418b791dSBob Badour }
386*418b791dSBob Badour else {
387*418b791dSBob Badour std_memset(a, 0xFF, STD_SIZEOF(a));
388*418b791dSBob Badour
389*418b791dSBob Badour while (0 != (cStop = (unsigned char)*cpszChars++)) {
390*418b791dSBob Badour ENTRY(cStop) ^= (0x80000000U >> SHIFT(cStop));
391*418b791dSBob Badour }
392*418b791dSBob Badour }
393*418b791dSBob Badour
394*418b791dSBob Badour
395*418b791dSBob Badour // Search buffer
396*418b791dSBob Badour
397*418b791dSBob Badour pcBuf += nLen;
398*418b791dSBob Badour n = -nLen;
399*418b791dSBob Badour do {
400*418b791dSBob Badour unsigned char uc = (unsigned char)pcBuf[n];
401*418b791dSBob Badour // testing for negative after shift is quicker than comparison
402*418b791dSBob Badour if ( (int)(ENTRY(uc) << SHIFT(uc)) < 0) {
403*418b791dSBob Badour break;
404*418b791dSBob Badour }
405*418b791dSBob Badour } while (++n);
406*418b791dSBob Badour
407*418b791dSBob Badour return (char*)(pcBuf+n);
408*418b791dSBob Badour }
409*418b791dSBob Badour
410*418b791dSBob Badour
std_memchrsend(const void * pBuf,const char * cpszChars,int nLen)411*418b791dSBob Badour void* std_memchrsend(const void* pBuf, const char* cpszChars, int nLen)
412*418b791dSBob Badour {
413*418b791dSBob Badour if (nLen <= 0) {
414*418b791dSBob Badour return (void*)pBuf;
415*418b791dSBob Badour }
416*418b791dSBob Badour if ('\0' == *cpszChars) {
417*418b791dSBob Badour return (char*)pBuf + nLen;
418*418b791dSBob Badour }
419*418b791dSBob Badour
420*418b791dSBob Badour return x_scanbytes((const char*)pBuf, cpszChars+1, nLen,
421*418b791dSBob Badour (unsigned char)*cpszChars, TRUE);
422*418b791dSBob Badour }
423*418b791dSBob Badour
424*418b791dSBob Badour
std_strchrsend(const char * cpszSrch,const char * cpszChars)425*418b791dSBob Badour char* std_strchrsend(const char* cpszSrch, const char* cpszChars)
426*418b791dSBob Badour {
427*418b791dSBob Badour return x_scanbytes(cpszSrch, cpszChars, MAX_INT32, '\0', TRUE);
428*418b791dSBob Badour }
429*418b791dSBob Badour
430*418b791dSBob Badour
std_strchrs(const char * cpszSrch,const char * cpszChars)431*418b791dSBob Badour char *std_strchrs(const char* cpszSrch, const char* cpszChars)
432*418b791dSBob Badour {
433*418b791dSBob Badour const char *pc = std_strchrsend(cpszSrch, cpszChars);
434*418b791dSBob Badour
435*418b791dSBob Badour return (*pc ? (char*)pc : 0);
436*418b791dSBob Badour }
437*418b791dSBob Badour
438*418b791dSBob Badour
std_striends(const char * cpsz,const char * cpszSuffix)439*418b791dSBob Badour char* std_striends(const char* cpsz, const char* cpszSuffix)
440*418b791dSBob Badour {
441*418b791dSBob Badour int nOffset = std_strlen(cpsz) - std_strlen(cpszSuffix);
442*418b791dSBob Badour
443*418b791dSBob Badour if ((0 <= nOffset) &&
444*418b791dSBob Badour (0 == std_stricmp(cpsz+nOffset, cpszSuffix))) {
445*418b791dSBob Badour
446*418b791dSBob Badour return (char*)(cpsz+nOffset);
447*418b791dSBob Badour }
448*418b791dSBob Badour
449*418b791dSBob Badour return 0;
450*418b791dSBob Badour }
451*418b791dSBob Badour
452*418b791dSBob Badour
std_strends(const char * cpsz,const char * cpszSuffix)453*418b791dSBob Badour char* std_strends(const char* cpsz, const char* cpszSuffix)
454*418b791dSBob Badour {
455*418b791dSBob Badour int nOffset = std_strlen(cpsz) - std_strlen(cpszSuffix);
456*418b791dSBob Badour
457*418b791dSBob Badour if ((0 <= nOffset) &&
458*418b791dSBob Badour (0 == std_strcmp(cpsz+nOffset, cpszSuffix))) {
459*418b791dSBob Badour
460*418b791dSBob Badour return (char*)(cpsz + nOffset);
461*418b791dSBob Badour }
462*418b791dSBob Badour
463*418b791dSBob Badour return 0;
464*418b791dSBob Badour }
465*418b791dSBob Badour
std_strbegins(const char * cpsz,const char * cpszPrefix)466*418b791dSBob Badour char* std_strbegins(const char* cpsz, const char* cpszPrefix)
467*418b791dSBob Badour {
468*418b791dSBob Badour for (;;) {
469*418b791dSBob Badour if ('\0' == *cpszPrefix) {
470*418b791dSBob Badour return (char*)cpsz;
471*418b791dSBob Badour }
472*418b791dSBob Badour
473*418b791dSBob Badour if (*cpszPrefix != *cpsz) {
474*418b791dSBob Badour return 0;
475*418b791dSBob Badour }
476*418b791dSBob Badour
477*418b791dSBob Badour ++cpszPrefix;
478*418b791dSBob Badour ++cpsz;
479*418b791dSBob Badour }
480*418b791dSBob Badour // not reached
481*418b791dSBob Badour }
482*418b791dSBob Badour
std_stribegins(const char * cpsz,const char * cpszPrefix)483*418b791dSBob Badour char* std_stribegins(const char* cpsz, const char* cpszPrefix)
484*418b791dSBob Badour {
485*418b791dSBob Badour for (;;) {
486*418b791dSBob Badour if ('\0' == *cpszPrefix) {
487*418b791dSBob Badour return (char*)cpsz;
488*418b791dSBob Badour }
489*418b791dSBob Badour
490*418b791dSBob Badour if (x_casecmp((unsigned char)*cpszPrefix, (unsigned char)*cpsz)) {
491*418b791dSBob Badour return 0;
492*418b791dSBob Badour }
493*418b791dSBob Badour
494*418b791dSBob Badour ++cpszPrefix;
495*418b791dSBob Badour ++cpsz;
496*418b791dSBob Badour }
497*418b791dSBob Badour // not reached
498*418b791dSBob Badour }
499*418b791dSBob Badour
std_strcspn(const char * cpszSrch,const char * cpszChars)500*418b791dSBob Badour int std_strcspn(const char* cpszSrch, const char* cpszChars)
501*418b791dSBob Badour {
502*418b791dSBob Badour const char *pc = x_scanbytes(cpszSrch, cpszChars, MAX_INT32, '\0', TRUE);
503*418b791dSBob Badour
504*418b791dSBob Badour return (pc - cpszSrch);
505*418b791dSBob Badour }
506*418b791dSBob Badour
std_strspn(const char * cpszSrch,const char * cpszChars)507*418b791dSBob Badour int std_strspn(const char* cpszSrch, const char* cpszChars)
508*418b791dSBob Badour {
509*418b791dSBob Badour const char *pc = x_scanbytes(cpszSrch, cpszChars, MAX_INT32, '\0', FALSE);
510*418b791dSBob Badour
511*418b791dSBob Badour return (pc - cpszSrch);
512*418b791dSBob Badour }
513*418b791dSBob Badour
std_wstrncmp(const AECHAR * s1,const AECHAR * s2,int nLen)514*418b791dSBob Badour int std_wstrncmp(const AECHAR* s1, const AECHAR* s2, int nLen)
515*418b791dSBob Badour {
516*418b791dSBob Badour if (nLen > 0) {
517*418b791dSBob Badour int i;
518*418b791dSBob Badour
519*418b791dSBob Badour s1 += nLen;
520*418b791dSBob Badour s2 += nLen;
521*418b791dSBob Badour i = -nLen;
522*418b791dSBob Badour do {
523*418b791dSBob Badour AECHAR c1 = s1[i];
524*418b791dSBob Badour AECHAR c2 = s2[i];
525*418b791dSBob Badour int diff = c1 - c2;
526*418b791dSBob Badour
527*418b791dSBob Badour if (diff) {
528*418b791dSBob Badour return diff;
529*418b791dSBob Badour }
530*418b791dSBob Badour
531*418b791dSBob Badour if ('\0' == c1) {
532*418b791dSBob Badour break;
533*418b791dSBob Badour }
534*418b791dSBob Badour } while (++i);
535*418b791dSBob Badour }
536*418b791dSBob Badour
537*418b791dSBob Badour return 0;
538*418b791dSBob Badour }
539*418b791dSBob Badour
std_wstrcmp(const AECHAR * s1,const AECHAR * s2)540*418b791dSBob Badour int std_wstrcmp(const AECHAR* s1, const AECHAR* s2)
541*418b791dSBob Badour {
542*418b791dSBob Badour return std_wstrncmp(s1, s2, MAX_INT32);
543*418b791dSBob Badour }
544*418b791dSBob Badour
std_wstrchr(const AECHAR * cpwszText,AECHAR ch)545*418b791dSBob Badour AECHAR* std_wstrchr(const AECHAR* cpwszText, AECHAR ch)
546*418b791dSBob Badour {
547*418b791dSBob Badour for (; ; cpwszText++) {
548*418b791dSBob Badour AECHAR chn = *cpwszText;
549*418b791dSBob Badour
550*418b791dSBob Badour if (chn == ch) {
551*418b791dSBob Badour return (AECHAR *)cpwszText;
552*418b791dSBob Badour }
553*418b791dSBob Badour else if ( chn == (AECHAR)0 ) {
554*418b791dSBob Badour return 0;
555*418b791dSBob Badour }
556*418b791dSBob Badour }
557*418b791dSBob Badour }
558*418b791dSBob Badour
std_wstrrchr(const AECHAR * cpwszText,AECHAR ch)559*418b791dSBob Badour AECHAR* std_wstrrchr(const AECHAR* cpwszText, AECHAR ch)
560*418b791dSBob Badour {
561*418b791dSBob Badour const AECHAR* p = 0;
562*418b791dSBob Badour
563*418b791dSBob Badour do {
564*418b791dSBob Badour if (*cpwszText == ch) {
565*418b791dSBob Badour p = cpwszText;
566*418b791dSBob Badour }
567*418b791dSBob Badour } while (*cpwszText++ != (AECHAR)0);
568*418b791dSBob Badour
569*418b791dSBob Badour return (AECHAR*)p;
570*418b791dSBob Badour }
571