mirror of
https://github.com/openshwprojects/OpenBK7231T_App.git
synced 2026-03-25 00:26:54 +01:00
144 lines
2.8 KiB
C
144 lines
2.8 KiB
C
#include "new_common.h"
|
|
|
|
// Why strdup breaks strings?
|
|
// backlog lcd_clearAndGoto I2C1 0x23 1 1; lcd_print I2C1 0x23 Enabled
|
|
// it got broken around 64 char
|
|
// where is buffer with [64] bytes?
|
|
char *test_strdup(const char *s)
|
|
{
|
|
char *res;
|
|
size_t len;
|
|
|
|
if (s == NULL)
|
|
return NULL;
|
|
|
|
len = strlen(s);
|
|
res = malloc(len + 1);
|
|
if (res)
|
|
memcpy(res, s, len + 1);
|
|
|
|
return res;
|
|
}
|
|
int strIsInteger(const char *s) {
|
|
if(s==0)
|
|
return 0;
|
|
if(*s == 0)
|
|
return 0;
|
|
while(*s) {
|
|
if(isdigit(*s)==false)
|
|
return 0;
|
|
s++;
|
|
}
|
|
return 1;
|
|
}
|
|
// returns amount of space left in buffer (0=overflow happened)
|
|
int strcat_safe(char *tg, const char *src, int tgMaxLen) {
|
|
int curOfs = 1;
|
|
|
|
// skip
|
|
while(*tg != 0) {
|
|
tg++;
|
|
curOfs++;
|
|
if(curOfs >= tgMaxLen - 1) {
|
|
*tg = 0;
|
|
return 0;
|
|
}
|
|
}
|
|
// copy
|
|
while(*src != 0) {
|
|
*tg = *src;
|
|
src++;
|
|
tg++;
|
|
curOfs++;
|
|
if(curOfs >= tgMaxLen - 1) {
|
|
*tg = 0;
|
|
return 0;
|
|
}
|
|
}
|
|
*tg = 0;
|
|
return tgMaxLen-curOfs;
|
|
}
|
|
|
|
|
|
int strcpy_safe_checkForChanges(char *tg, const char *src, int tgMaxLen) {
|
|
int changesFound = 0;
|
|
int curOfs = 0;
|
|
// copy
|
|
while(*src != 0) {
|
|
if(*tg != *src) {
|
|
changesFound++;
|
|
*tg = *src;
|
|
}
|
|
src++;
|
|
tg++;
|
|
curOfs++;
|
|
if(curOfs >= tgMaxLen - 1) {
|
|
if(*tg != 0) {
|
|
changesFound++;
|
|
*tg = 0;
|
|
}
|
|
return 0;
|
|
}
|
|
}
|
|
if(*tg != 0) {
|
|
changesFound++;
|
|
*tg = 0;
|
|
}
|
|
return changesFound;
|
|
}
|
|
int strcpy_safe(char *tg, const char *src, int tgMaxLen) {
|
|
int curOfs = 0;
|
|
// copy
|
|
while(*src != 0) {
|
|
*tg = *src;
|
|
src++;
|
|
tg++;
|
|
curOfs++;
|
|
if(curOfs >= tgMaxLen - 1) {
|
|
*tg = 0;
|
|
return 0;
|
|
}
|
|
}
|
|
*tg = 0;
|
|
return tgMaxLen-curOfs;
|
|
}
|
|
|
|
void urldecode2_safe(char *dst, const char *srcin, int maxDstLen)
|
|
{
|
|
int curLen = 1;
|
|
int a = 0, b = 0;
|
|
// avoid signing issues in conversion to int for isxdigit(int c)
|
|
const unsigned char *src = (const unsigned char *)srcin;
|
|
while (*src) {
|
|
if(curLen >= (maxDstLen - 1)){
|
|
break;
|
|
}
|
|
if ((*src == '%') &&
|
|
((a = src[1]) && (b = src[2])) &&
|
|
(isxdigit(a) && isxdigit(b))) {
|
|
if (a >= 'a')
|
|
a -= 'a'-'A';
|
|
if (a >= 'A')
|
|
a -= ('A' - 10);
|
|
else
|
|
a -= '0';
|
|
if (b >= 'a')
|
|
b -= 'a'-'A';
|
|
if (b >= 'A')
|
|
b -= ('A' - 10);
|
|
else
|
|
b -= '0';
|
|
*dst++ = 16*a+b;
|
|
src+=3;
|
|
} else if (*src == '+') {
|
|
*dst++ = ' ';
|
|
src++;
|
|
} else {
|
|
*dst++ = *src++;
|
|
}
|
|
curLen++;
|
|
}
|
|
*dst++ = '\0';
|
|
}
|
|
|