38 #ifdef WICONNECT_USE_STRTOLL
41 extern long long strtoll(
const char *__n,
char **__end_PTR,
int __base);
56 static char *chop(
char *haystack,
const char *needle)
62 char *end = strstr(haystack, needle);
66 return end + strlen(needle);
73 static bool empty(
const char *s)
79 static bool isSpace(
const char *s)
83 if(!isspace((uint8_t)*s++))
92 static void toLower(
char *s)
96 *s = tolower((
int) * s);
102 static char *strip(
char *s,
const char *chars)
104 return rightStrip(leftStrip(s, chars), chars);
110 static char *leftStrip(
char *s,
const char *chars)
112 return s + strspn(s, chars);
118 static char *rightStrip(
char *s,
const char *chars)
120 char *end = s + strlen(s) - 1;
121 while (end > s && strstr(chars, end))
130 static bool parseInt(
const char *s, intmax_t *result, intmax_t min, intmax_t max)
132 return parseBase(s, result, min, max, 10);
136 static bool parseHex(
const char *s, intmax_t *result, intmax_t min, intmax_t max)
138 return parseBase(s, result, min, max, 16);
142 static bool parseBase(
const char *s, intmax_t *result, intmax_t min, intmax_t max,
int base)
149 #ifdef WICONNECT_USE_STRTOLL
150 intmax_t value = strtoll(s, &end, base);
152 intmax_t value = strtol(s, &end, base);
154 if (*end || value < min || value > max)
164 static bool parseBool(
const char *onoff,
bool *var)
166 const char*
const on_vals[] =
176 if(strcasecmp(on_vals[i], onoff) == 0)
183 const char*
const off_vals[] =
193 if(strcasecmp(off_vals[i], onoff) == 0)
205 static void binToHex(
char *dst,
int max_dst,
const void *data,
int data_len)
207 char *end = dst + max_dst - 1;
208 for (
int i = 0; i < data_len; ++i)
212 dst += sprintf(dst,
"%2.2x", ((uint8_t *)data)[i]);
222 static void binToHex(
void *h,
int len)
224 char *dst = (
char*)h;
225 char *src= (
char*)h+len;
227 memmove(src, dst, len);
231 sprintf(dst,
"%2.2X", (
unsigned int)(*src & 0xff));
241 static int hexToBin(
char *s)
249 for (i = j = 0; i < len; i += 2, j++)
251 const int num = hexToInt(&s[i]);
261 static int hexToInt(
const char *hex_str)
263 int hi = hexToNibble(*hex_str);
264 int lo = hexToNibble(*(hex_str+1));
265 if (hi == -1 || lo == -1)
269 return (hi << 4) | lo;
273 static int hexToNibble(
char c)
275 if (c >=
'0' && c <=
'9')
279 if (c >=
'a' && c <=
'f')
281 return 10 + (c -
'a');
283 if (c >=
'A' && c <=
'F')
285 return 10 + (c -
'A');
291 static const char* uint32ToStr(
char* intStrBuffer,
int integer)
293 sprintf(intStrBuffer,
"%u", integer);
298 static bool strToUint32(
const char *str, uint32_t *uint32Ptr)
301 bool result = (str[0] ==
'0' && str[1] ==
'x') ? StringUtil::parseHex(&str[2], &r, 0, UINT_MAX): StringUtil::parseInt(str, &r, 0, UINT_MAX);
302 *uint32Ptr = (uint32_t)r;
307 static bool strToUint16(
const char *str, uint16_t *uint16Ptr)
310 bool result = StringUtil::parseInt(str, &r, 0, USHRT_MAX);
311 *uint16Ptr = (uint16_t)r;
316 static bool strToInt32(
const char *str, int32_t *int32Ptr)
319 bool result = StringUtil::parseInt(str, &r, INT_MIN, INT_MAX);
320 *int32Ptr = (int32_t)r;
326 static bool strHexToUint32(
const char *strHex, uint32_t *uint32Ptr)
329 bool result = StringUtil::parseHex(strHex, &r, 0, UINT_MAX);
330 *uint32Ptr = (uint32_t)r;
335 static char *strtok_r(
char *str,
const char *delim,
char **nextp)
344 str += strspn(str, delim);
353 str += strcspn(str, delim);
366 static int strncasecmp(
const char *s1,
const char *s2,
int n)
371 while (n-- != 0 && tolower(*s1) == tolower(*s2))
373 if (n == 0 || *s1 ==
'\0' || *s2 ==
'\0')
379 return tolower(*(
unsigned char *) s1) - tolower(*(
unsigned char *) s2);
383 static int strcasecmp(
const char *s1,
const char *s2)
385 register const unsigned char *p1 = (
const unsigned char *) s1;
386 register const unsigned char *p2 = (
const unsigned char *) s2;
387 unsigned char c1, c2;
405 if (UCHAR_MAX <= INT_MAX)
411 return (c1 > c2 ? 1 : c1 < c2 ? -1 : 0);
#define ARRAY_COUNT(x)
Return number of elements in static array x.