--- libelwix/src/str.c 2016/05/18 12:47:42 1.7 +++ libelwix/src/str.c 2024/10/28 09:58:51 1.11 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: str.c,v 1.7 2016/05/18 12:47:42 misho Exp $ +* $Id: str.c,v 1.11 2024/10/28 09:58:51 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -12,7 +12,7 @@ terms: All of the documentation and software included in the ELWIX and AITNET Releases is copyrighted by ELWIX - Sofia/Bulgaria -Copyright 2004 - 2015 +Copyright 2004 - 2024 by Michael Pounov . All rights reserved. Redistribution and use in source and binary forms, with or without @@ -286,13 +286,45 @@ str_Dig2Hex(ait_val_t *digz) for (i = 0, b = AIT_GET_BUF(digz); i < AIT_LEN(digz); i++) { snprintf(szWork, sizeof szWork, "%02hhX", b[i]); - strncat(str, szWork, 2); + strcat(str, szWork); } return str; } /* + * str_Dig2Hex2() - Convert from digit array to Hex string + * + * @digz = Digits array + * @diglen = Array length + * return: NULL nothing to do or error; + * !=0 Allocated new converted string (must be e_free()) +*/ +char * +str_Dig2Hex2(u_char * __restrict digz, int diglen) +{ + register int i; + char szWork[3] = { 0, 0, 0 }, *str; + u_char *b; + + if (!digz || !diglen) + return NULL; + + str = e_malloc(diglen * 2 + 1); + if (!str) + return NULL; + else + memset(str, 0, diglen * 2 + 1); + + for (i = 0, b = digz; i < diglen; i++) { + snprintf(szWork, sizeof szWork, "%02hhX", b[i]); + strcat(str, szWork); + } + + return str; +} + +/* * str_LTrim() - Remove left whitespaces from text string * * @psLine = Text string @@ -432,9 +464,9 @@ str_Lower(char * __restrict psLine) } /* - * str_getString() - Get string from data buffer + * str_getString() - Get NULL delimited string from data buffer * - * @data = Data buffer + * @data = Const data buffer * @dlen = Data length * @next = Return next position after string if !=NULL * return: -1 error or size of string @@ -458,4 +490,98 @@ str_getString(const u_char * __restrict data, int dlen if (next) *next = (char*) pos + 1; return pos - data + 1; +} + +/* + * str_getString2() - Get string from data buffer with delimiter + * + * @data = Data buffer + * @dlen = Data length + * @delim = Data delimiter + * @next = Return next position after delimited string if !=NULL + * return: -1 error or size of string + */ +int +str_getString2(char * __restrict data, int dlen, char delim, char ** __restrict next) +{ + char *pos; + + if (!data || !dlen) + return -1; + + for (pos = data; pos < data + dlen; pos++) + if (!*pos || *pos == (u_char) delim) { + *pos = 0; + break; + } + if (*pos) { + elwix_SetErr(ENOEXEC, "Not found null-terminated string"); + return -1; + } + + if (next) + *next = (char*) pos + 1; + return pos - data; +} + +/* + * str_find2replace() - Search find string into data and replace + * + * @data = input string + * @find = search for string + * @replace = replace to string. If it is NULL then deletes found search string + * @str = new produced allocate string. If it is NULL then just return found occurances of find + * @mlen = allocated memory size for new string + * return: -1 error, 0 not found or >0 how many occurances we have for find string + */ +int +str_find2replace(const char *data, const char *find, const char *replace, char **str, int *mlen) +{ + int cnt = 0, data_len, slen, find_len, replace_len = 0; + const char *pos, *s; + + if (!data || !find) + return -1; + + find_len = strlen(find); + data_len = strlen(data); + for (pos = data; (pos = strstr(pos, find)); pos += find_len, cnt++); + + /* just count occurances */ + if (!str || !mlen) + return cnt; + + slen = data_len - find_len * cnt; + if (replace) { + replace_len = strlen(replace); + slen += replace_len * cnt; + } + /* alloc exports string */ + *mlen = slen + 1; + *str = e_malloc(*mlen); + if (!*str) + return -1; + else + memset(*str, 0, *mlen); + + /* search & replace */ + for (pos = data; *pos;) { + s = strstr(pos, find); + if (s) + slen = s - pos; + else + slen = strlen(pos); + /* + * This hack was made due to behaviour of compiler against strncat(*str, pos, slen)! + */ + memcpy(*str + strlen(*str), pos, slen); + if (s) { + if (replace) + strncat(*str, replace, replace_len); + pos += find_len; + } + pos += slen; + } + + return cnt; }