30#define BAD_METACHARS "/-+&;`'\\\"|*?~<>^()[]{}$\n\r\t "
70#define WILDMAT_ABORT -2
72#define WILDMAT_NEGATE_CLASS '^'
74#undef WILDMAT_MATCH_TAR_PATTERN
77#define local_strdup(__src_) \
79 char* __local_strdup_str = NULL; \
80 size_t __local_strdup_len = strlen((__src_)); \
81 Malloc(__local_strdup_str, char, __local_strdup_len + 1); \
82 if (!__local_strdup_str) { \
83 n_log(LOG_ERR, "Couldn't allocate %d byte for duplicating \"%s\"", (int)strlen((__src_)) + 1, (__src_)); \
85 for (size_t __local_strdup_it = 0; __local_strdup_it <= __local_strdup_len; __local_strdup_it++) { \
86 __local_strdup_str[__local_strdup_it] = (__src_)[__local_strdup_it]; \
93#define strprintf(__n_var, ...) \
95 char* __strprintf_ptr = NULL; \
97 int __needed = snprintf(NULL, 0, __VA_ARGS__); \
99 Malloc(__n_var, char, (size_t)__needed + 1); \
101 snprintf(__n_var, (size_t)__needed + 1, __VA_ARGS__); \
102 __strprintf_ptr = __n_var; \
104 n_log(LOG_ERR, "couldn't allocate %s with %d bytes", \
105 #__n_var, __needed + 1); \
109 n_log(LOG_ERR, "%s is already allocated.", #__n_var); \
115#define nstrprintf(__nstr_var, __format, ...) \
116 nstrprintf_ex(&(__nstr_var), (__format), ##__VA_ARGS__)
119#define nstrprintf_cat(__nstr_var, __format, ...) \
120 nstrprintf_cat_ex(&(__nstr_var), (__format), ##__VA_ARGS__)
123#define nstrcat(__nstr_dst, __nstr_src) \
125 N_STR* __nstrcat_ret = NULL; \
126 if (__nstr_src && __nstr_src->data) { \
127 __nstrcat_ret = nstrcat_ex(&(__nstr_dst), __nstr_src->data, __nstr_src->written, 1); \
133#define nstrcat_bytes(__nstr_dst, __void_src) \
134 nstrcat_bytes_ex(&(__nstr_dst), __void_src, strlen(__void_src))
137#define n_remove_ending_cr(__nstr_var) \
139 if (__nstr_var && __nstr_var->data && __nstr_var->written > 0 && __nstr_var->data[__nstr_var->written - 1] == '\r') { \
140 __nstr_var->data[__nstr_var->written - 1] = '\0'; \
141 __nstr_var->written--; \
146#define n_replace_cr(__nstr_var, __replacement) \
148 if (__nstr_var && __nstr_var->data && __nstr_var->written > 0) { \
149 char* __replaced = str_replace(__nstr_var->data, "\r", __replacement); \
151 Free(__nstr_var->data); \
152 __nstr_var->data = __replaced; \
153 __nstr_var->written = strlen(__nstr_var->data); \
154 __nstr_var->length = __nstr_var->written + 1; \
160const char* strcasestr(
const char* s1,
const char* s2);
166char*
trim(
const char* s);
201#define free_nstr(__ptr) \
206 n_log(LOG_DEBUG, "%s is already NULL", #__ptr); \
221int str_to_long(
const char* s,
long int* i,
const int base);
231int str_to_int(
const char* s,
int* i,
const int base);
233int skipw(
const char*
string,
char toskip,
NSTRBYTE* iterator,
int inc);
235int skipu(
const char*
string,
char toskip,
NSTRBYTE* iterator,
int inc);
237int strup(
const char*
string,
char* dest);
239int strlo(
const char*
string,
char* dest);
243char**
split(
const char* str,
const char* delim,
int empty);
249char*
join(
char** splitresult,
const char* delim);
255int scan_dir(
const char* dir,
LIST* result,
const int recurse);
257int scan_dir_ex(
const char* dir,
const char* pattern,
LIST* result,
const int recurse,
const int mode);
259int wildmat(
register const char* text,
register const char* p);
261int wildmatcase(
register const char* text,
register const char* p);
263char*
str_replace(
const char*
string,
const char* substr,
const char* replacement);
267int str_sanitize(
char*
string,
const char* mask,
const char replacement);
structure of a hash table
Structure of a generic LIST container.
size_t written
size of the written data inside the string
size_t length
length of string (in case we wanna keep information after the 0 end of string value)
int str_to_long_long(const char *s, long long int *i, const int base)
string to long long integer, shorter version
N_STR * n_str_template_expand(const char *tmpl, struct HASH_TABLE *vars)
Expand double-brace tokens in a template using a hash table.
char * trim_nocopy(char *s)
trim and put a \0 at the end, return new begin pointer
void free_nstr_ptr(void *ptr)
free a N_STR without setting the pointer to NULL
N_STR * nstrprintf_cat_ex(N_STR **nstr_var, const char *format,...)
concatenate printf on a N_STR
size_t NSTRBYTE
N_STR base unit.
int split_count(char **split_result)
count split elements
int str_sanitize_ex(char *string, const NSTRBYTE string_len, const char *mask, const NSTRBYTE masklen, const char replacement)
sanitize a string using a character mask
int nstr_to_file(N_STR *n_str, char *filename)
write a whole N_STR into a file
int scan_dir_ex(const char *dir, const char *pattern, LIST *result, const int recurse, const int mode)
get a list of files in a directory, extended N_STR version
int strcpy_u(const char *from, char *to, NSTRBYTE to_size, char split, NSTRBYTE *it)
copy from string to dest until from[iterator] == split
int str_to_long_long_ex(const char *s, NSTRBYTE start, NSTRBYTE end, long long int *i, const int base)
string to long long integer, with error checking
char * join(char **splitresult, const char *delim)
join a split result into a string
N_STR * nstrdup(N_STR *msg)
make a copy of a N_STR
int strlo(const char *string, char *dest)
lower case a string
N_STR * nstrcat_ex(N_STR **dest, void *src, NSTRBYTE size, int resize_flag)
concatenate data inside a N_STR
int write_and_fit(char **dest, NSTRBYTE *size, NSTRBYTE *written, const char *src)
write and fit into the char array
int str_to_int_ex(const char *s, NSTRBYTE start, NSTRBYTE end, int *i, const int base)
string to integer, with error checking
int str_to_int_nolog(const char *s, NSTRBYTE start, NSTRBYTE end, int *i, const int base, N_STR **infos)
string to integer, with error checking and no logging
int resize_nstr(N_STR *nstr, size_t size)
resize a N_STR
int char_to_nstr_nocopy_ex(char *from, NSTRBYTE nboct, N_STR **to)
convert a char into a N_STR without copying
N_STR * char_to_nstr(const char *src)
convert a char into a N_STR, shorter version
char * nfgets(char *buffer, NSTRBYTE size, FILE *stream)
N_STR wrapper around fgets.
int skipu(const char *string, char toskip, NSTRBYTE *iterator, int inc)
skip characters in string until string[iterator] == toskip
int empty_nstr(N_STR *nstr)
reinitialize a nstr
int wildmatcase(register const char *text, register const char *p)
pattern matching, case insensitive
N_STR * new_nstr(NSTRBYTE size)
create a new string
char * str_replace(const char *string, const char *substr, const char *replacement)
return a new string with all occurrences of substr replaced
char * trim(const char *s)
trim and put a \0 at the end, return new char *
int skipw(const char *string, char toskip, NSTRBYTE *iterator, int inc)
skip characters in string while string[iterator] == toskip
N_STR * nstrcat_bytes_ex(N_STR **dest, void *src, NSTRBYTE size)
wrapper to nstrcat_ex to concatenate void *data
int scan_dir(const char *dir, LIST *result, const int recurse)
get a list of files in a directory
int str_sanitize(char *string, const char *mask, const char replacement)
in-place substitution of a set of chars by a single one
char ** split(const char *str, const char *delim, int empty)
return an array of char pointers to the split sections
int wildmat(register const char *text, register const char *p)
pattern matching
int free_nstr_nolog(N_STR **ptr)
free a N_STR and set to NULL without logging
int str_to_long(const char *s, long int *i, const int base)
string to long integer, shorter version
int char_to_nstr_ex(const char *from, NSTRBYTE nboct, N_STR **to)
convert a char into a N_STR
N_STR * char_to_nstr_nocopy(char *src)
convert a char into a N_STR without copying, shorter version
int _free_nstr(N_STR **ptr)
free a N_STR and set the pointer to NULL
int write_and_fit_ex(char **dest, NSTRBYTE *size, NSTRBYTE *written, const char *src, NSTRBYTE src_size, NSTRBYTE additional_padding)
write and fit bytes into a dynamically sized buffer
N_STR * file_to_nstr(char *filename)
load a whole file into a N_STR
int free_split_result(char ***tab)
free a char **tab and set it to NULL
N_STR * nstrprintf_ex(N_STR **nstr_var, const char *format,...)
printf on a N_STR
void free_nstr_ptr_nolog(void *ptr)
free a N_STR without logging or setting to NULL
int str_to_int(const char *s, int *i, const int base)
string to integer, shorter version
int nstr_to_fd(N_STR *str, FILE *out, int lock)
write a whole N_STR into an open file descriptor
int str_to_long_ex(const char *s, NSTRBYTE start, NSTRBYTE end, long int *i, const int base)
string to long integer, with error checking
int strup(const char *string, char *dest)
upper case a string
A box including a string and his lenght.
Common headers and low-level functions & define.
List structures and definitions.