1*10465441SEvalZero /*
2*10465441SEvalZero * Copyright (c) 2006-2018, RT-Thread Development Team
3*10465441SEvalZero *
4*10465441SEvalZero * SPDX-License-Identifier: Apache-2.0
5*10465441SEvalZero *
6*10465441SEvalZero * Change Logs:
7*10465441SEvalZero * Date Author Notes
8*10465441SEvalZero * 2008-08-14 Bernard the first version
9*10465441SEvalZero * 2010-02-15 Gary Lee add strlcpy
10*10465441SEvalZero * 2010-03-17 Bernard add strlcpy implementation to this file.
11*10465441SEvalZero * fix strlcpy declaration
12*10465441SEvalZero * 2010-03-24 Bernard add strchr and strtok implementation.
13*10465441SEvalZero */
14*10465441SEvalZero
15*10465441SEvalZero #include <rtthread.h>
16*10465441SEvalZero #include <stdint.h>
17*10465441SEvalZero
18*10465441SEvalZero #if !defined (RT_USING_NEWLIB) && defined (RT_USING_MINILIBC)
19*10465441SEvalZero #include "string.h"
20*10465441SEvalZero
21*10465441SEvalZero /* there is no strcpy and strcmp implementation in RT-Thread */
strcpy(char * dest,const char * src)22*10465441SEvalZero char *strcpy(char *dest, const char *src)
23*10465441SEvalZero {
24*10465441SEvalZero return (char *)rt_strncpy(dest, src, rt_strlen(src) + 1);
25*10465441SEvalZero }
26*10465441SEvalZero
strncpy(char * dest,const char * src,size_t siz)27*10465441SEvalZero char *strncpy(char *dest, const char *src, size_t siz)
28*10465441SEvalZero {
29*10465441SEvalZero return (char *)rt_strncpy(dest, src, siz);
30*10465441SEvalZero }
31*10465441SEvalZero
strlcpy(char * dst,const char * src,size_t siz)32*10465441SEvalZero size_t strlcpy(char *dst, const char *src, size_t siz)
33*10465441SEvalZero {
34*10465441SEvalZero register char *d = dst;
35*10465441SEvalZero register const char *s = src;
36*10465441SEvalZero register size_t n = siz;
37*10465441SEvalZero
38*10465441SEvalZero /* Copy as many bytes as will fit */
39*10465441SEvalZero if (n != 0 && --n != 0)
40*10465441SEvalZero {
41*10465441SEvalZero do
42*10465441SEvalZero {
43*10465441SEvalZero if ((*d++ = *s++) == 0) break;
44*10465441SEvalZero } while (--n != 0);
45*10465441SEvalZero }
46*10465441SEvalZero
47*10465441SEvalZero /* Not enough room in dst, add NUL and traverse rest of src */
48*10465441SEvalZero if (n == 0)
49*10465441SEvalZero {
50*10465441SEvalZero if (siz != 0) *d = '\0'; /* NUL-terminate dst */
51*10465441SEvalZero while (*s++) ;
52*10465441SEvalZero }
53*10465441SEvalZero
54*10465441SEvalZero return(s - src - 1); /* count does not include NUL */
55*10465441SEvalZero }
56*10465441SEvalZero
strcmp(const char * s1,const char * s2)57*10465441SEvalZero int strcmp (const char *s1, const char *s2)
58*10465441SEvalZero {
59*10465441SEvalZero while (*s1 && *s1 == *s2)
60*10465441SEvalZero s1++, s2++;
61*10465441SEvalZero return (*s1 - *s2);
62*10465441SEvalZero }
63*10465441SEvalZero
64*10465441SEvalZero /**
65*10465441SEvalZero * strncmp - Compare two length-limited strings
66*10465441SEvalZero * @cs: One string
67*10465441SEvalZero * @ct: Another string
68*10465441SEvalZero * @count: The maximum number of bytes to compare
69*10465441SEvalZero */
strncmp(const char * cs,const char * ct,size_t count)70*10465441SEvalZero int strncmp(const char *cs,const char *ct, size_t count)
71*10465441SEvalZero {
72*10465441SEvalZero register signed char __res = 0;
73*10465441SEvalZero
74*10465441SEvalZero while (count) {
75*10465441SEvalZero if ((__res = *cs - *ct++) != 0 || !*cs++)
76*10465441SEvalZero break;
77*10465441SEvalZero count--;
78*10465441SEvalZero }
79*10465441SEvalZero
80*10465441SEvalZero return __res;
81*10465441SEvalZero }
82*10465441SEvalZero
strcat(char * dest,const char * src)83*10465441SEvalZero char *strcat(char * dest, const char * src)
84*10465441SEvalZero {
85*10465441SEvalZero char *tmp = dest;
86*10465441SEvalZero
87*10465441SEvalZero while (*dest)
88*10465441SEvalZero dest++;
89*10465441SEvalZero while ((*dest++ = *src++) != '\0')
90*10465441SEvalZero ;
91*10465441SEvalZero
92*10465441SEvalZero return tmp;
93*10465441SEvalZero }
94*10465441SEvalZero
strncat(char * dest,const char * src,size_t count)95*10465441SEvalZero char *strncat(char *dest, const char *src, size_t count)
96*10465441SEvalZero {
97*10465441SEvalZero char *tmp = dest;
98*10465441SEvalZero
99*10465441SEvalZero if (count) {
100*10465441SEvalZero while (*dest)
101*10465441SEvalZero dest++;
102*10465441SEvalZero while ((*dest++ = *src++)) {
103*10465441SEvalZero if (--count == 0) {
104*10465441SEvalZero *dest = '\0';
105*10465441SEvalZero break;
106*10465441SEvalZero }
107*10465441SEvalZero }
108*10465441SEvalZero }
109*10465441SEvalZero
110*10465441SEvalZero return tmp;
111*10465441SEvalZero }
112*10465441SEvalZero
strrchr(const char * t,int c)113*10465441SEvalZero char *strrchr(const char *t, int c)
114*10465441SEvalZero {
115*10465441SEvalZero register char ch;
116*10465441SEvalZero register const char *l=0;
117*10465441SEvalZero
118*10465441SEvalZero ch = c;
119*10465441SEvalZero for (;;)
120*10465441SEvalZero {
121*10465441SEvalZero if (*t == ch) l=t;
122*10465441SEvalZero if (!*t) return (char*)l;
123*10465441SEvalZero ++t;
124*10465441SEvalZero }
125*10465441SEvalZero
126*10465441SEvalZero return (char*)l;
127*10465441SEvalZero }
128*10465441SEvalZero
129*10465441SEvalZero
strncasecmp(const char * s1,const char * s2,size_t len)130*10465441SEvalZero int strncasecmp ( const char* s1, const char* s2, size_t len )
131*10465441SEvalZero {
132*10465441SEvalZero register unsigned int x2;
133*10465441SEvalZero register unsigned int x1;
134*10465441SEvalZero register const char* end = s1 + len;
135*10465441SEvalZero
136*10465441SEvalZero while (1)
137*10465441SEvalZero {
138*10465441SEvalZero if ((s1 >= end) )
139*10465441SEvalZero return 0;
140*10465441SEvalZero
141*10465441SEvalZero x2 = *s2 - 'A'; if ((x2 < 26u)) x2 += 32;
142*10465441SEvalZero x1 = *s1 - 'A'; if ((x1 < 26u)) x1 += 32;
143*10465441SEvalZero s1++; s2++;
144*10465441SEvalZero
145*10465441SEvalZero if (x2 != x1)
146*10465441SEvalZero break;
147*10465441SEvalZero
148*10465441SEvalZero if (x1 == (unsigned int)-'A')
149*10465441SEvalZero break;
150*10465441SEvalZero }
151*10465441SEvalZero
152*10465441SEvalZero return x1 - x2;
153*10465441SEvalZero }
154*10465441SEvalZero
155*10465441SEvalZero /* private function */
156*10465441SEvalZero #define isdigit(c) ((unsigned)((c) - '0') < 10)
157*10465441SEvalZero
divide(int * n,int base)158*10465441SEvalZero rt_inline int divide(int *n, int base)
159*10465441SEvalZero {
160*10465441SEvalZero rt_int32_t res;
161*10465441SEvalZero
162*10465441SEvalZero /* optimized for processor which does not support divide instructions. */
163*10465441SEvalZero if (base == 10)
164*10465441SEvalZero {
165*10465441SEvalZero res = ((int)*n) % 10U;
166*10465441SEvalZero *n = ((int)*n) / 10U;
167*10465441SEvalZero }
168*10465441SEvalZero else
169*10465441SEvalZero {
170*10465441SEvalZero res = ((int)*n) % 16U;
171*10465441SEvalZero *n = ((int)*n) / 16U;
172*10465441SEvalZero }
173*10465441SEvalZero
174*10465441SEvalZero return res;
175*10465441SEvalZero }
176*10465441SEvalZero
skip_atoi(const char ** s)177*10465441SEvalZero rt_inline int skip_atoi(const char **s)
178*10465441SEvalZero {
179*10465441SEvalZero register int i=0;
180*10465441SEvalZero while (isdigit(**s)) i = i*10 + *((*s)++) - '0';
181*10465441SEvalZero
182*10465441SEvalZero return i;
183*10465441SEvalZero }
184*10465441SEvalZero
185*10465441SEvalZero unsigned char _ctype[] = {
186*10465441SEvalZero _C,_C,_C,_C,_C,_C,_C,_C, /* 0-7 */
187*10465441SEvalZero _C,_C|_S,_C|_S,_C|_S,_C|_S,_C|_S,_C,_C, /* 8-15 */
188*10465441SEvalZero _C,_C,_C,_C,_C,_C,_C,_C, /* 16-23 */
189*10465441SEvalZero _C,_C,_C,_C,_C,_C,_C,_C, /* 24-31 */
190*10465441SEvalZero _S|_SP,_P,_P,_P,_P,_P,_P,_P, /* 32-39 */
191*10465441SEvalZero _P,_P,_P,_P,_P,_P,_P,_P, /* 40-47 */
192*10465441SEvalZero _D,_D,_D,_D,_D,_D,_D,_D, /* 48-55 */
193*10465441SEvalZero _D,_D,_P,_P,_P,_P,_P,_P, /* 56-63 */
194*10465441SEvalZero _P,_U|_X,_U|_X,_U|_X,_U|_X,_U|_X,_U|_X,_U, /* 64-71 */
195*10465441SEvalZero _U,_U,_U,_U,_U,_U,_U,_U, /* 72-79 */
196*10465441SEvalZero _U,_U,_U,_U,_U,_U,_U,_U, /* 80-87 */
197*10465441SEvalZero _U,_U,_U,_P,_P,_P,_P,_P, /* 88-95 */
198*10465441SEvalZero _P,_L|_X,_L|_X,_L|_X,_L|_X,_L|_X,_L|_X,_L, /* 96-103 */
199*10465441SEvalZero _L,_L,_L,_L,_L,_L,_L,_L, /* 104-111 */
200*10465441SEvalZero _L,_L,_L,_L,_L,_L,_L,_L, /* 112-119 */
201*10465441SEvalZero _L,_L,_L,_P,_P,_P,_P,_C, /* 120-127 */
202*10465441SEvalZero 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 128-143 */
203*10465441SEvalZero 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 144-159 */
204*10465441SEvalZero _S|_SP,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P, /* 160-175 */
205*10465441SEvalZero _P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P, /* 176-191 */
206*10465441SEvalZero _U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U, /* 192-207 */
207*10465441SEvalZero _U,_U,_U,_U,_U,_U,_U,_P,_U,_U,_U,_U,_U,_U,_U,_L, /* 208-223 */
208*10465441SEvalZero _L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L, /* 224-239 */
209*10465441SEvalZero _L,_L,_L,_L,_L,_L,_L,_P,_L,_L,_L,_L,_L,_L,_L,_L}; /* 240-255 */
210*10465441SEvalZero
211*10465441SEvalZero #define __ismask(x) (_ctype[(int)(unsigned char)(x)])
212*10465441SEvalZero
213*10465441SEvalZero #define isalnum(c) ((__ismask(c)&(_U|_L|_D)) != 0)
214*10465441SEvalZero #define isalpha(c) ((__ismask(c)&(_U|_L)) != 0)
215*10465441SEvalZero #define iscntrl(c) ((__ismask(c)&(_C)) != 0)
216*10465441SEvalZero #define isgraph(c) ((__ismask(c)&(_P|_U|_L|_D)) != 0)
217*10465441SEvalZero #define islower(c) ((__ismask(c)&(_L)) != 0)
218*10465441SEvalZero #define isprint(c) ((__ismask(c)&(_P|_U|_L|_D|_SP)) != 0)
219*10465441SEvalZero #define ispunct(c) ((__ismask(c)&(_P)) != 0)
220*10465441SEvalZero #define isspace(c) ((__ismask(c)&(_S)) != 0)
221*10465441SEvalZero #define isupper(c) ((__ismask(c)&(_U)) != 0)
222*10465441SEvalZero #define isxdigit(c) ((__ismask(c)&(_D|_X)) != 0)
223*10465441SEvalZero
224*10465441SEvalZero #define isascii(c) (((unsigned char)(c))<=0x7f)
225*10465441SEvalZero #define toascii(c) (((unsigned char)(c))&0x7f)
226*10465441SEvalZero
__tolower(unsigned char c)227*10465441SEvalZero static inline unsigned char __tolower(unsigned char c)
228*10465441SEvalZero {
229*10465441SEvalZero if (isupper(c))
230*10465441SEvalZero c -= 'A'-'a';
231*10465441SEvalZero return c;
232*10465441SEvalZero }
233*10465441SEvalZero
__toupper(unsigned char c)234*10465441SEvalZero static inline unsigned char __toupper(unsigned char c)
235*10465441SEvalZero {
236*10465441SEvalZero if (islower(c))
237*10465441SEvalZero c -= 'a'-'A';
238*10465441SEvalZero return c;
239*10465441SEvalZero }
240*10465441SEvalZero
tolower(int c)241*10465441SEvalZero int tolower(int c)
242*10465441SEvalZero {
243*10465441SEvalZero return __tolower(c);
244*10465441SEvalZero }
245*10465441SEvalZero
toupper(int c)246*10465441SEvalZero int toupper(int c)
247*10465441SEvalZero {
248*10465441SEvalZero return __toupper(c);
249*10465441SEvalZero }
250*10465441SEvalZero
251*10465441SEvalZero /**
252*10465441SEvalZero * simple_strtoul - convert a string to an unsigned long
253*10465441SEvalZero * @cp: The start of the string
254*10465441SEvalZero * @endp: A pointer to the end of the parsed string will be placed here
255*10465441SEvalZero * @base: The number base to use
256*10465441SEvalZero */
simple_strtoul(const char * cp,char ** endp,unsigned int base)257*10465441SEvalZero unsigned long simple_strtoul(const char *cp,char **endp,unsigned int base)
258*10465441SEvalZero {
259*10465441SEvalZero unsigned long result = 0,value;
260*10465441SEvalZero
261*10465441SEvalZero if (!base) {
262*10465441SEvalZero base = 10;
263*10465441SEvalZero if (*cp == '0') {
264*10465441SEvalZero base = 8;
265*10465441SEvalZero cp++;
266*10465441SEvalZero if ((toupper(*cp) == 'X') && isxdigit(cp[1])) {
267*10465441SEvalZero cp++;
268*10465441SEvalZero base = 16;
269*10465441SEvalZero }
270*10465441SEvalZero }
271*10465441SEvalZero } else if (base == 16) {
272*10465441SEvalZero if (cp[0] == '0' && toupper(cp[1]) == 'X')
273*10465441SEvalZero cp += 2;
274*10465441SEvalZero }
275*10465441SEvalZero while (isxdigit(*cp) &&
276*10465441SEvalZero (value = isdigit(*cp) ? *cp-'0' : toupper(*cp)-'A'+10) < base) {
277*10465441SEvalZero result = result*base + value;
278*10465441SEvalZero cp++;
279*10465441SEvalZero }
280*10465441SEvalZero if (endp)
281*10465441SEvalZero *endp = (char *)cp;
282*10465441SEvalZero return result;
283*10465441SEvalZero }
284*10465441SEvalZero
285*10465441SEvalZero /**
286*10465441SEvalZero * simple_strtol - convert a string to a signed long
287*10465441SEvalZero * @cp: The start of the string
288*10465441SEvalZero * @endp: A pointer to the end of the parsed string will be placed here
289*10465441SEvalZero * @base: The number base to use
290*10465441SEvalZero */
simple_strtol(const char * cp,char ** endp,unsigned int base)291*10465441SEvalZero long simple_strtol(const char *cp,char **endp,unsigned int base)
292*10465441SEvalZero {
293*10465441SEvalZero if(*cp=='-')
294*10465441SEvalZero return -simple_strtoul(cp+1,endp,base);
295*10465441SEvalZero return simple_strtoul(cp,endp,base);
296*10465441SEvalZero }
297*10465441SEvalZero
298*10465441SEvalZero /**
299*10465441SEvalZero * simple_strtoull - convert a string to an unsigned long long
300*10465441SEvalZero * @cp: The start of the string
301*10465441SEvalZero * @endp: A pointer to the end of the parsed string will be placed here
302*10465441SEvalZero * @base: The number base to use
303*10465441SEvalZero */
simple_strtoull(const char * cp,char ** endp,unsigned int base)304*10465441SEvalZero unsigned long long simple_strtoull(const char *cp,char **endp,unsigned int base)
305*10465441SEvalZero {
306*10465441SEvalZero unsigned long long result = 0, value;
307*10465441SEvalZero
308*10465441SEvalZero if (*cp == '0') {
309*10465441SEvalZero cp++;
310*10465441SEvalZero if ((toupper(*cp) == 'X') && isxdigit (cp[1])) {
311*10465441SEvalZero base = 16;
312*10465441SEvalZero cp++;
313*10465441SEvalZero }
314*10465441SEvalZero if (!base) {
315*10465441SEvalZero base = 8;
316*10465441SEvalZero }
317*10465441SEvalZero }
318*10465441SEvalZero if (!base) {
319*10465441SEvalZero base = 10;
320*10465441SEvalZero }
321*10465441SEvalZero while (isxdigit (*cp) && (value = isdigit (*cp)
322*10465441SEvalZero ? *cp - '0'
323*10465441SEvalZero : (islower (*cp) ? toupper (*cp) : *cp) - 'A' + 10) < base) {
324*10465441SEvalZero result = result * base + value;
325*10465441SEvalZero cp++;
326*10465441SEvalZero }
327*10465441SEvalZero if (endp)
328*10465441SEvalZero *endp = (char *) cp;
329*10465441SEvalZero return result;
330*10465441SEvalZero }
331*10465441SEvalZero
332*10465441SEvalZero /**
333*10465441SEvalZero * simple_strtoll - convert a string to a signed long long
334*10465441SEvalZero * @cp: The start of the string
335*10465441SEvalZero * @endp: A pointer to the end of the parsed string will be placed here
336*10465441SEvalZero * @base: The number base to use
337*10465441SEvalZero */
simple_strtoll(const char * cp,char ** endp,unsigned int base)338*10465441SEvalZero long long simple_strtoll(const char *cp,char **endp,unsigned int base)
339*10465441SEvalZero {
340*10465441SEvalZero if(*cp=='-')
341*10465441SEvalZero return -simple_strtoull(cp+1,endp,base);
342*10465441SEvalZero return simple_strtoull(cp,endp,base);
343*10465441SEvalZero }
344*10465441SEvalZero
345*10465441SEvalZero /**
346*10465441SEvalZero * vsscanf - Unformat a buffer into a list of arguments
347*10465441SEvalZero * @buf: input buffer
348*10465441SEvalZero * @fmt: format of buffer
349*10465441SEvalZero * @args: arguments
350*10465441SEvalZero */
vsscanf(const char * buf,const char * fmt,va_list args)351*10465441SEvalZero int vsscanf(const char * buf, const char * fmt, va_list args)
352*10465441SEvalZero {
353*10465441SEvalZero const char *str = buf;
354*10465441SEvalZero char *next;
355*10465441SEvalZero int num = 0;
356*10465441SEvalZero int qualifier;
357*10465441SEvalZero int base;
358*10465441SEvalZero int field_width = -1;
359*10465441SEvalZero int is_sign = 0;
360*10465441SEvalZero
361*10465441SEvalZero while(*fmt && *str) {
362*10465441SEvalZero /* skip any white space in format */
363*10465441SEvalZero /* white space in format matchs any amount of
364*10465441SEvalZero * white space, including none, in the input.
365*10465441SEvalZero */
366*10465441SEvalZero if (isspace(*fmt)) {
367*10465441SEvalZero while (isspace(*fmt))
368*10465441SEvalZero ++fmt;
369*10465441SEvalZero while (isspace(*str))
370*10465441SEvalZero ++str;
371*10465441SEvalZero }
372*10465441SEvalZero
373*10465441SEvalZero /* anything that is not a conversion must match exactly */
374*10465441SEvalZero if (*fmt != '%' && *fmt) {
375*10465441SEvalZero if (*fmt++ != *str++)
376*10465441SEvalZero break;
377*10465441SEvalZero continue;
378*10465441SEvalZero }
379*10465441SEvalZero
380*10465441SEvalZero if (!*fmt)
381*10465441SEvalZero break;
382*10465441SEvalZero ++fmt;
383*10465441SEvalZero
384*10465441SEvalZero /* skip this conversion.
385*10465441SEvalZero * advance both strings to next white space
386*10465441SEvalZero */
387*10465441SEvalZero if (*fmt == '*') {
388*10465441SEvalZero while (!isspace(*fmt) && *fmt)
389*10465441SEvalZero fmt++;
390*10465441SEvalZero while (!isspace(*str) && *str)
391*10465441SEvalZero str++;
392*10465441SEvalZero continue;
393*10465441SEvalZero }
394*10465441SEvalZero
395*10465441SEvalZero /* get field width */
396*10465441SEvalZero if (isdigit(*fmt))
397*10465441SEvalZero field_width = skip_atoi(&fmt);
398*10465441SEvalZero
399*10465441SEvalZero /* get conversion qualifier */
400*10465441SEvalZero qualifier = -1;
401*10465441SEvalZero if (*fmt == 'h' || *fmt == 'l' || *fmt == 'L' || *fmt == 'Z') {
402*10465441SEvalZero qualifier = *fmt;
403*10465441SEvalZero fmt++;
404*10465441SEvalZero }
405*10465441SEvalZero base = 10;
406*10465441SEvalZero is_sign = 0;
407*10465441SEvalZero
408*10465441SEvalZero if (!*fmt || !*str)
409*10465441SEvalZero break;
410*10465441SEvalZero
411*10465441SEvalZero switch(*fmt++) {
412*10465441SEvalZero case 'c':
413*10465441SEvalZero {
414*10465441SEvalZero char *s = (char *) va_arg(args,char*);
415*10465441SEvalZero if (field_width == -1)
416*10465441SEvalZero field_width = 1;
417*10465441SEvalZero do {
418*10465441SEvalZero *s++ = *str++;
419*10465441SEvalZero } while(field_width-- > 0 && *str);
420*10465441SEvalZero num++;
421*10465441SEvalZero }
422*10465441SEvalZero continue;
423*10465441SEvalZero case 's':
424*10465441SEvalZero {
425*10465441SEvalZero char *s = (char *) va_arg(args, char *);
426*10465441SEvalZero if(field_width == -1)
427*10465441SEvalZero field_width = INT_MAX;
428*10465441SEvalZero /* first, skip leading white space in buffer */
429*10465441SEvalZero while (isspace(*str))
430*10465441SEvalZero str++;
431*10465441SEvalZero
432*10465441SEvalZero /* now copy until next white space */
433*10465441SEvalZero while (*str && !isspace(*str) && field_width--) {
434*10465441SEvalZero *s++ = *str++;
435*10465441SEvalZero }
436*10465441SEvalZero *s = '\0';
437*10465441SEvalZero num++;
438*10465441SEvalZero }
439*10465441SEvalZero continue;
440*10465441SEvalZero case 'n':
441*10465441SEvalZero /* return number of characters read so far */
442*10465441SEvalZero {
443*10465441SEvalZero int *i = (int *)va_arg(args,int*);
444*10465441SEvalZero *i = str - buf;
445*10465441SEvalZero }
446*10465441SEvalZero continue;
447*10465441SEvalZero case 'o':
448*10465441SEvalZero base = 8;
449*10465441SEvalZero break;
450*10465441SEvalZero case 'x':
451*10465441SEvalZero case 'X':
452*10465441SEvalZero base = 16;
453*10465441SEvalZero break;
454*10465441SEvalZero case 'd':
455*10465441SEvalZero case 'i':
456*10465441SEvalZero is_sign = 1;
457*10465441SEvalZero case 'u':
458*10465441SEvalZero break;
459*10465441SEvalZero case '%':
460*10465441SEvalZero /* looking for '%' in str */
461*10465441SEvalZero if (*str++ != '%')
462*10465441SEvalZero return num;
463*10465441SEvalZero continue;
464*10465441SEvalZero default:
465*10465441SEvalZero /* invalid format; stop here */
466*10465441SEvalZero return num;
467*10465441SEvalZero }
468*10465441SEvalZero
469*10465441SEvalZero /* have some sort of integer conversion.
470*10465441SEvalZero * first, skip white space in buffer.
471*10465441SEvalZero */
472*10465441SEvalZero while (isspace(*str))
473*10465441SEvalZero str++;
474*10465441SEvalZero
475*10465441SEvalZero if (!*str || !isdigit(*str))
476*10465441SEvalZero break;
477*10465441SEvalZero
478*10465441SEvalZero switch(qualifier) {
479*10465441SEvalZero case 'h':
480*10465441SEvalZero if (is_sign) {
481*10465441SEvalZero short *s = (short *) va_arg(args,short *);
482*10465441SEvalZero *s = (short) simple_strtol(str,&next,base);
483*10465441SEvalZero } else {
484*10465441SEvalZero unsigned short *s = (unsigned short *) va_arg(args, unsigned short *);
485*10465441SEvalZero *s = (unsigned short) simple_strtoul(str, &next, base);
486*10465441SEvalZero }
487*10465441SEvalZero break;
488*10465441SEvalZero case 'l':
489*10465441SEvalZero if (is_sign) {
490*10465441SEvalZero long *l = (long *) va_arg(args,long *);
491*10465441SEvalZero *l = simple_strtol(str,&next,base);
492*10465441SEvalZero } else {
493*10465441SEvalZero unsigned long *l = (unsigned long*) va_arg(args,unsigned long*);
494*10465441SEvalZero *l = simple_strtoul(str,&next,base);
495*10465441SEvalZero }
496*10465441SEvalZero break;
497*10465441SEvalZero case 'L':
498*10465441SEvalZero if (is_sign) {
499*10465441SEvalZero long long *l = (long long*) va_arg(args,long long *);
500*10465441SEvalZero *l = simple_strtoll(str,&next,base);
501*10465441SEvalZero } else {
502*10465441SEvalZero unsigned long long *l = (unsigned long long*) va_arg(args,unsigned long long*);
503*10465441SEvalZero *l = simple_strtoull(str,&next,base);
504*10465441SEvalZero }
505*10465441SEvalZero break;
506*10465441SEvalZero case 'Z':
507*10465441SEvalZero {
508*10465441SEvalZero unsigned long *s = (unsigned long*) va_arg(args,unsigned long*);
509*10465441SEvalZero *s = (unsigned long) simple_strtoul(str,&next,base);
510*10465441SEvalZero }
511*10465441SEvalZero break;
512*10465441SEvalZero default:
513*10465441SEvalZero if (is_sign) {
514*10465441SEvalZero int *i = (int *) va_arg(args, int*);
515*10465441SEvalZero *i = (int) simple_strtol(str,&next,base);
516*10465441SEvalZero } else {
517*10465441SEvalZero unsigned int *i = (unsigned int*) va_arg(args, unsigned int*);
518*10465441SEvalZero *i = (unsigned int) simple_strtoul(str,&next,base);
519*10465441SEvalZero }
520*10465441SEvalZero break;
521*10465441SEvalZero }
522*10465441SEvalZero num++;
523*10465441SEvalZero
524*10465441SEvalZero if (!next)
525*10465441SEvalZero break;
526*10465441SEvalZero str = next;
527*10465441SEvalZero }
528*10465441SEvalZero return num;
529*10465441SEvalZero }
530*10465441SEvalZero
531*10465441SEvalZero /**
532*10465441SEvalZero * sscanf - Unformat a buffer into a list of arguments
533*10465441SEvalZero * @buf: input buffer
534*10465441SEvalZero * @fmt: formatting of buffer
535*10465441SEvalZero * @...: resulting arguments
536*10465441SEvalZero */
sscanf(const char * buf,const char * fmt,...)537*10465441SEvalZero int sscanf(const char * buf, const char * fmt, ...)
538*10465441SEvalZero {
539*10465441SEvalZero va_list args;
540*10465441SEvalZero int i;
541*10465441SEvalZero
542*10465441SEvalZero va_start(args,fmt);
543*10465441SEvalZero i = vsscanf(buf,fmt,args);
544*10465441SEvalZero va_end(args);
545*10465441SEvalZero
546*10465441SEvalZero return i;
547*10465441SEvalZero }
548*10465441SEvalZero
strspn(const char * s,const char * accept)549*10465441SEvalZero size_t strspn(const char *s, const char *accept)
550*10465441SEvalZero {
551*10465441SEvalZero size_t l=0;
552*10465441SEvalZero int a=1,i, al=strlen(accept);
553*10465441SEvalZero
554*10465441SEvalZero while((a)&&(*s))
555*10465441SEvalZero {
556*10465441SEvalZero for(a=i=0;(!a)&&(i<al);i++)
557*10465441SEvalZero if (*s==accept[i]) a=1;
558*10465441SEvalZero if (a) l++;
559*10465441SEvalZero s++;
560*10465441SEvalZero }
561*10465441SEvalZero return l;
562*10465441SEvalZero }
563*10465441SEvalZero
strcspn(const char * s,const char * reject)564*10465441SEvalZero size_t strcspn(const char *s, const char *reject)
565*10465441SEvalZero {
566*10465441SEvalZero size_t l=0;
567*10465441SEvalZero int a=1,i,al=strlen(reject);
568*10465441SEvalZero
569*10465441SEvalZero while((a)&&(*s))
570*10465441SEvalZero {
571*10465441SEvalZero for(i=0;(a)&&(i<al);i++)
572*10465441SEvalZero if (*s==reject[i]) a=0;
573*10465441SEvalZero if (a) l++;
574*10465441SEvalZero s++;
575*10465441SEvalZero }
576*10465441SEvalZero return l;
577*10465441SEvalZero }
578*10465441SEvalZero
strtok_r(char * s,const char * delim,char ** ptrptr)579*10465441SEvalZero char*strtok_r(char*s,const char*delim,char**ptrptr)
580*10465441SEvalZero {
581*10465441SEvalZero char*tmp=0;
582*10465441SEvalZero
583*10465441SEvalZero if (s==0) s=*ptrptr;
584*10465441SEvalZero s += strspn(s,delim); /* overread leading delimiter */
585*10465441SEvalZero if (*s)
586*10465441SEvalZero {
587*10465441SEvalZero tmp=s;
588*10465441SEvalZero s+=strcspn(s,delim);
589*10465441SEvalZero
590*10465441SEvalZero if (*s) *s++=0; /* not the end ? => terminate it */
591*10465441SEvalZero }
592*10465441SEvalZero *ptrptr=s;
593*10465441SEvalZero return tmp;
594*10465441SEvalZero }
595*10465441SEvalZero
strtok(char * s,const char * delim)596*10465441SEvalZero char *strtok(char *s, const char *delim)
597*10465441SEvalZero {
598*10465441SEvalZero static char *strtok_pos;
599*10465441SEvalZero return strtok_r(s,delim,&strtok_pos);
600*10465441SEvalZero }
601*10465441SEvalZero
strchr(const char * s1,int i)602*10465441SEvalZero char *strchr(const char *s1, int i)
603*10465441SEvalZero {
604*10465441SEvalZero const unsigned char *s = (const unsigned char *)s1;
605*10465441SEvalZero unsigned char c = (unsigned int)i;
606*10465441SEvalZero
607*10465441SEvalZero while (*s && *s != c)
608*10465441SEvalZero {
609*10465441SEvalZero s++;
610*10465441SEvalZero }
611*10465441SEvalZero
612*10465441SEvalZero if (*s != c)
613*10465441SEvalZero {
614*10465441SEvalZero s = NULL;
615*10465441SEvalZero }
616*10465441SEvalZero
617*10465441SEvalZero return (char *) s;
618*10465441SEvalZero }
619*10465441SEvalZero
strtol(const char * str,char ** endptr,int base)620*10465441SEvalZero long strtol(const char *str, char **endptr, int base)
621*10465441SEvalZero {
622*10465441SEvalZero return simple_strtol(str, endptr, base);
623*10465441SEvalZero }
624*10465441SEvalZero
strtoll(const char * str,char ** endptr,int base)625*10465441SEvalZero long long strtoll(const char *str, char **endptr, int base)
626*10465441SEvalZero {
627*10465441SEvalZero return simple_strtoll(str, endptr, base);
628*10465441SEvalZero }
629*10465441SEvalZero
630*10465441SEvalZero #endif
631