#include "cstr.h" #include #include #include #include int cstrlen(const char * str) { return str ? strlen(str) : 0; } char * cstrcpy(char * dst, const char * src) { if(!dst) return (char*)0; int len = 0; if(src){ len = strlen(src); if(len){ memcpy(dst, src, len); } } dst[len]=0; return dst + len; } /* copy up to maxsize characters from src to dst and return pointer to the next byte after the end */ char * cstrncpy(char * dst, int maxsize, const char * src) { if(!dst) return (char*)0; unsigned int ms = maxsize; unsigned int len = 0; if(src && ms > 0){ len = strlen(src); if(len > ms){ len = ms; if(len){ memcpy(dst, src, len); } } } dst[len]=0; return dst + len; } /* copy up to maxsize characters from src to dst and return pointer to the next byte after the end */ char * cvstrncpy(char * dst, int maxsize, const char * ptr, ...) { va_list ap; char * p = dst; const char * r = ptr; unsigned int ms = maxsize; if(ms > 0){ va_start(ap, ptr); while(r){ unsigned int len = strlen(r); if(len > ms) len = ms; memcpy(p, r, len); p += len; ms -= len; r = va_arg(ap, const char*); } va_end(ap); *p = 0; } return p; } char * cstralloc(int size) { return (char*)malloc((size+0xF)&(~0xF)); } char * cstrdup(const char * str) { char * ret = NULL; if(str){ int len = strlen(str); if(len){ ret = cstralloc(len); memcpy(ret, str, len+1); } } return ret; } char * cstrndup(const char * str, int max_size) { char * ret = NULL; unsigned int ms = max_size; if(str){ unsigned int len = strlen(str); if(len>ms) len=ms; if(len){ ret = cstralloc(len); memcpy(ret, str, len); ret[len] = 0; } } return ret; } char * cvstrdup(const char * ptr, ...) { va_list ap; int len = 0; char *dst, *p; const char * r; if(!ptr) return (char*)ptr; // calculate size r = ptr; va_start(ap, ptr); while(r){ len += strlen(r); r = va_arg(ap, const char*); } va_end(ap); p = dst = cstralloc(len+1); if(dst){ r = ptr; va_start(ap, ptr); while(r){ len = strlen(r); memcpy(p, r, len); p += len; r = va_arg(ap, const char*); } va_end(ap); *p = 0; } return dst; } char * cstrnload(char * dst, int max_size, const char * path) { FILE * f = fopen(path, "rb"); unsigned long len; unsigned long ms = max_size; if (!f) return NULL; fseek(f, 0, SEEK_END); len = ftell(f); fseek(f, 0, SEEK_SET); if (len > ms) len = ms; ms = fread(dst, 1, len, f); fclose(f); if ((int)ms < 0){ return NULL; } dst[len] = 0; return dst + len; } char * cstraload(char ** p, const char * path) { char * ret = NULL; FILE * f = fopen(path, "rb"); int len; if (f){ fseek(f, 0, SEEK_END); len = ftell(f); fseek(f, 0, SEEK_SET); if (len > 0){ ret = malloc(len); if (ret){ int ms = fread(ret, 1, len, f); if (ms < len){ free(ret); *p = ret = NULL; } else{ *p = ret; ret += len; } } } fclose(f); } return ret; } const char * cstrlastpathelement(const char * str) { const char * p = strrchr(str, '/'); const char * p2 = strrchr(str, '/'); if(p