stringextra.c
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #include <stdint.h>
00033 #include <stdlib.h>
00034 #include <string.h>
00035 #include <ctype.h>
00036
00037
00038
00039 #ifndef __HAVE_ARCH_STRNICMP
00040
00041
00042
00043
00044
00045
00046 int strnicmp(const char *s1, const char *s2, size_t len)
00047 {
00048
00049 unsigned char c1, c2;
00050
00051 c1 = 0; c2 = 0;
00052 if (len) {
00053 do {
00054 c1 = *s1; c2 = *s2;
00055 s1++; s2++;
00056 if (!c1)
00057 break;
00058 if (!c2)
00059 break;
00060 if (c1 == c2)
00061 continue;
00062 c1 = tolower(c1);
00063 c2 = tolower(c2);
00064 if (c1 != c2)
00065 break;
00066 } while (--len);
00067 }
00068 return (int)c1 - (int)c2;
00069 }
00070 #endif
00071
00072 char * ___strtok;
00073
00074 #ifndef __HAVE_ARCH_STRNCAT
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084 char * strncat(char *dest, const char *src, size_t count)
00085 {
00086 char *tmp = dest;
00087
00088 if (count) {
00089 while (*dest)
00090 dest++;
00091 while ((*dest++ = *src++)) {
00092 if (--count == 0) {
00093 *dest = '\0';
00094 break;
00095 }
00096 }
00097 }
00098
00099 return tmp;
00100 }
00101 #endif
00102
00103 #ifndef __HAVE_ARCH_STRSPN
00104
00105
00106
00107
00108
00109
00110 size_t strspn(const char *s, const char *accept)
00111 {
00112 const char *p;
00113 const char *a;
00114 size_t count = 0;
00115
00116 for (p = s; *p != '\0'; ++p) {
00117 for (a = accept; *a != '\0'; ++a) {
00118 if (*p == *a)
00119 break;
00120 }
00121 if (*a == '\0')
00122 return count;
00123 ++count;
00124 }
00125
00126 return count;
00127 }
00128 #endif
00129
00130 #ifndef __HAVE_ARCH_STRCSPN
00131
00132
00133
00134
00135
00136
00137 size_t strcspn(const char *s, const char *reject)
00138 {
00139 const char *p;
00140 const char *r;
00141 size_t count = 0;
00142
00143 for (p = s; *p != '\0'; ++p) {
00144 for (r = reject; *r != '\0'; ++r) {
00145 if (*p == *r)
00146 return count;
00147 }
00148 ++count;
00149 }
00150
00151 return count;
00152 }
00153 #endif
00154
00155 #ifndef __HAVE_ARCH_STRPBRK
00156
00157
00158
00159
00160
00161 char * strpbrk(const char * cs,const char * ct)
00162 {
00163 const char *sc1,*sc2;
00164
00165 for( sc1 = cs; *sc1 != '\0'; ++sc1) {
00166 for( sc2 = ct; *sc2 != '\0'; ++sc2) {
00167 if (*sc1 == *sc2)
00168 return (char *) sc1;
00169 }
00170 }
00171 return NULL;
00172 }
00173 #endif
00174
00175 #ifndef __HAVE_ARCH_STRTOK
00176
00177
00178
00179
00180
00181
00182
00183 char * strtok(char * s,const char * ct)
00184 {
00185 char *sbegin, *send;
00186
00187 sbegin = s ? s : ___strtok;
00188 if (!sbegin) {
00189 return NULL;
00190 }
00191 sbegin += strspn(sbegin,ct);
00192 if (*sbegin == '\0') {
00193 ___strtok = NULL;
00194 return( NULL );
00195 }
00196 send = strpbrk( sbegin, ct);
00197 if (send && *send != '\0')
00198 *send++ = '\0';
00199 ___strtok = send;
00200 return (sbegin);
00201 }
00202 #endif
00203
00204 #ifndef __HAVE_ARCH_STRSEP
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216 char * strsep(char **s, const char *ct)
00217 {
00218 char *sbegin = *s, *end;
00219
00220 if (sbegin == NULL)
00221 return NULL;
00222
00223 end = strpbrk(sbegin, ct);
00224 if (end)
00225 *end++ = '\0';
00226 *s = end;
00227
00228 return sbegin;
00229 }
00230 #endif
00231
00232 #ifndef __HAVE_ARCH_BCOPY
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245 char * bcopy(const char * src, char * dest, int count)
00246 {
00247 return memmove(dest,src,count);
00248 }
00249 #endif
00250
00251 #ifndef __HAVE_ARCH_MEMSCAN
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261 void * memscan(const void * addr, int c, size_t size)
00262 {
00263 unsigned char * p = (unsigned char *) addr;
00264
00265 while (size) {
00266 if (*p == c)
00267 return (void *) p;
00268 p++;
00269 size--;
00270 }
00271 return (void *) p;
00272 }
00273 #endif