X-Git-Url: http://dolda2000.com/gitweb/?p=mctap.git;a=blobdiff_plain;f=src%2Futils.h;fp=src%2Futils.h;h=3a1c41aac2fb2e9ac40a0a2a6043abadfce34c3b;hp=0000000000000000000000000000000000000000;hb=b5038e157d54458fe2145e4ac06f0c2567382624;hpb=3415540feb47f1c379767c984620f8a7a3c4e2b1 diff --git a/src/utils.h b/src/utils.h new file mode 100644 index 0000000..3a1c41a --- /dev/null +++ b/src/utils.h @@ -0,0 +1,90 @@ +#ifndef _UTILS_H +#define _UTILS_H + +#include +#include +#include + +#define smalloc(size) ({void *__result__; ((__result__ = malloc(size)) == NULL)?({exit(-1); (void *)0;}):__result__;}) +#define srealloc(ptr, size) ({void *__result__; ((__result__ = realloc((ptr), (size))) == NULL)?({exit(-1); (void *)0;}):__result__;}) +#define szmalloc(size) memset(smalloc(size), 0, size) +#define sstrdup(str) ({char *__strbuf__ = (str); strcpy(smalloc(strlen(__strbuf__) + 1), __strbuf__);}) +#define omalloc(o) ((o) = szmalloc(sizeof(*(o)))) + +#define bufinit(buf) memset(&(buf), 0, sizeof(buf)) +#define buffree(buf) do { if((buf).b != NULL) {free((buf).b);} } while(0) +#define bufdupc(buf) memcpy(smalloc((buf).d * sizeof(*((buf).b))), (buf).b, (buf).d * sizeof(*((buf).b))) +#define sizebuf(buf, wanted) (_sizebuf((struct buffer *)&(buf), (wanted), sizeof(*((buf).b)))) +#define sizebuf2(buf, wanted) (_sizebuf2((void **)&(buf), &(buf ## size), (wanted), sizeof(*(buf)))) +#define bufdel(buf, i) (memmove((buf).b + (i), (buf).b + (i) + 1, (--((buf).d) - (i)) * sizeof(*((buf).b)))) +#define bufadd(buf, new) \ +do { \ + _sizebuf((struct buffer *)&(buf), (buf).d + 1, sizeof(*((buf).b))); \ + (buf).b[(buf).d++] = (new); \ +} while(0) +#define bufcat(buf, new, size) \ +do { \ + size_t __bufcat_size__; \ + __bufcat_size__ = (size); \ + _sizebuf((struct buffer *)&(buf), (buf).d + __bufcat_size__, sizeof((buf).b)); \ + memcpy((buf).b + (buf).d, (new), (__bufcat_size__) * sizeof(*((buf).b))); \ + (buf).d += __bufcat_size__; \ +} while(0) +#define bufcatnum(buf, num, type) \ +do { \ + type __buf__; \ + __buf__ = (num); \ + bufcat((buf), &__buf__, sizeof(type)); \ +} while(0) +#define bufcatuid(buf, uid) \ +do { \ + uniqid_t __buf__; \ + __buf__ = (uid); \ + bufcat((buf), &__buf__, sizeof(__buf__)); \ +} while(0) +#define bufcatstr(buf, str) \ +do { \ + char *__buf__; \ + __buf__ = (str); \ + bufcat((buf), __buf__, strlen(__buf__) + 1); \ +} while(0) +#define bufcatstr2(buf, str) \ +do { \ + char *__buf__; \ + __buf__ = (str); \ + bufcat((buf), __buf__, strlen(__buf__)); \ +} while(0) +#define bufcats(buf, d) bufcat((buf), &(d), sizeof(d)) +#define bufeat(buf, len) \ +do { \ + size_t __bufeat_size__; \ + __bufeat_size__ = (len); \ + memmove((buf).b, (buf).b + __bufeat_size__, (buf).d -= __bufeat_size__); \ +} while(0) + +struct buffer { + void *b; + size_t s, d; +}; + +struct charbuf { + char *b; + size_t s, d; +}; + +struct charvbuf { + char **b; + size_t s, d; +}; + +struct ptrbuf { + void **b; + size_t s, d; +}; + +void _sizebuf(struct buffer *buf, size_t wanted, size_t el); +void _sizebuf2(void **buf, size_t *sz, size_t wanted, size_t el); +char *vsprintf2(char *format, va_list al); +char *sprintf2(char *format, ...); + +#endif