#ifndef __MHL_STRING_H #define __MHL_STRING_H #include #include #include #define mhl_str_dup(str) ((str ? strdup(str) : strdup(""))) #define mhl_str_ndup(str,len) ((str ? strndup(str,len) : strdup(""))) #define mhl_str_len(str) ((str ? strlen(str) : 0)) static inline char * mhl_str_dup_range(const char * s_start, const char * s_bound) { return mhl_str_ndup(s_start, s_bound - s_start); } static inline char* mhl_str_trim(char* str) { if (!str) return NULL; // NULL string ?! bail out. // find the first non-space char* start; for (start=str; ((*str) && (!isspace(*str))); str++); // only spaces ? if (!(*str)) { *str = 0; return str; } // get the size (cannot be empty - catched above) size_t _sz = strlen(str); // find the proper end char* end; for (end=(str+_sz-1); ((end>str) && (isspace(*end))); end--); end[1] = 0; // terminate, just to be sure // if we have no leading spaces, just trucate if (start==str) { end++; *end = 0; return str; } // if it' only one char, dont need memmove for that if (start==end) { str[0]=*start; str[1]=0; return str; } // by here we have a (non-empty) region between start end end memmove(str,start,(end-start+1)); return str; } static inline void mhl_str_toupper(char* str) { if (str) for (;*str;str++) *str = toupper(*str); } #define __STR_CONCAT_MAX 32 /* _NEVER_ call this function directly ! */ static inline char* __mhl_str_concat_hlp(const char* base, ...) { static const char* arg_ptr[__STR_CONCAT_MAX]; static size_t arg_sz[__STR_CONCAT_MAX]; int count = 0; size_t totalsize = 0; if (base) { arg_ptr[0] = base; arg_sz[0] = totalsize = strlen(base); count = 1; } va_list args; va_start(args,base); char* a; // note: we use ((char*)(1)) as terminator - NULL is a valid argument ! while ((a = va_arg(args, char*))!=(char*)1) { // printf("a=%u\n", a); if (a) { arg_ptr[count] = a; arg_sz[count] = strlen(a); totalsize += arg_sz[count]; count++; } } if (!count) return mhl_str_dup(""); // now as we know how much to copy, allocate the buffer char* buffer = (char*)mhl_mem_alloc_u(totalsize+2); char* current = buffer; int x=0; for (x=0; x