You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
101 lines
1.9 KiB
101 lines
1.9 KiB
/********************************************************************* |
|
PicoTCP. Copyright (c) 2015 Altran ISY BeNeLux. Some rights reserved. |
|
See LICENSE and COPYING for usage. |
|
|
|
|
|
|
|
Author: Michele Di Pede |
|
*********************************************************************/ |
|
|
|
#include <ctype.h> |
|
#include <stdlib.h> |
|
#include "pico_strings.h" |
|
|
|
char *get_string_terminator_position(char *const block, size_t len) |
|
{ |
|
size_t length = pico_strnlen(block, len); |
|
|
|
return (len != length) ? (block + length) : 0; |
|
} |
|
|
|
int pico_strncasecmp(const char *const str1, const char *const str2, size_t n) |
|
{ |
|
int ch1; |
|
int ch2; |
|
size_t i; |
|
|
|
for (i = 0; i < n; ++i) { |
|
ch1 = toupper(*(str1 + i)); |
|
ch2 = toupper(*(str2 + i)); |
|
if (ch1 < ch2) |
|
return -1; |
|
|
|
if (ch1 > ch2) |
|
return 1; |
|
|
|
if ((!ch1) && (!ch2)) |
|
return 0; |
|
} |
|
return 1; |
|
} |
|
|
|
size_t pico_strnlen(const char *str, size_t n) |
|
{ |
|
size_t len = 0; |
|
|
|
if (!str) |
|
return 0; |
|
|
|
for (; len < n && *(str + len); ++len) |
|
; /* TICS require this empty statement here */ |
|
|
|
return len; |
|
} |
|
|
|
static inline int num2string_validate(int32_t num, char *buf, int len) |
|
{ |
|
if (num < 0) |
|
return -1; |
|
|
|
if (!buf) |
|
return -2; |
|
|
|
if (len < 2) |
|
return -3; |
|
|
|
return 0; |
|
} |
|
|
|
static inline int revert_and_shift(char *buf, int len, int pos) |
|
{ |
|
int i; |
|
|
|
len -= pos; |
|
for (i = 0; i < len; ++i) |
|
buf[i] = buf[i + pos]; |
|
return len; |
|
} |
|
|
|
int num2string(int32_t num, char *buf, int len) |
|
{ |
|
ldiv_t res; |
|
int pos = 0; |
|
|
|
if (num2string_validate(num, buf, len)) |
|
return -1; |
|
|
|
pos = len; |
|
buf[--pos] = '\0'; |
|
|
|
res.quot = (long)num; |
|
|
|
do { |
|
if (!pos) |
|
return -3; |
|
|
|
res = ldiv(res.quot, 10); |
|
buf[--pos] = (char)((res.rem + '0') & 0xFF); |
|
} while (res.quot); |
|
|
|
return revert_and_shift(buf, len, pos); |
|
}
|
|
|