From 90f6e953d2d2f905675aadbaf5e307e24c586edd Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Tue, 16 Dec 2008 20:29:35 +0100 Subject: [PATCH] Added some string utility functions. --- lib/utils.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ lib/utils.h | 17 +++++++++++++++-- 2 files changed, 72 insertions(+), 2 deletions(-) diff --git a/lib/utils.c b/lib/utils.c index 8b64b76..863fe4f 100644 --- a/lib/utils.c +++ b/lib/utils.c @@ -17,6 +17,7 @@ */ #include +#include #ifdef HAVE_CONFIG_H #include @@ -41,3 +42,59 @@ void _sizebuf(struct buffer *buf, size_t wanted, size_t el) buf->s = n; } +char *decstr(char **p, size_t *len) +{ + char *p2, *ret; + + for(p2 = *p; (p2 - *p) < *len; p2++) { + if(*p2 == 0) + break; + } + if((p2 - *p) == *len) + return(NULL); + p2++; + ret = *p; + *len -= p2 - *p; + *p = p2; + return(ret); +} + +char *vsprintf2(char *format, va_list al) +{ + int ret; + char *buf; + va_list al2; + + va_copy(al2, al); + ret = vsnprintf(NULL, 0, format, al2); + va_end(al2); + buf = smalloc(ret + 1); + va_copy(al2, al); + vsnprintf(buf, ret + 1, format, al2); + va_end(al2); + return(buf); +} + +char *sprintf2(char *format, ...) +{ + va_list args; + char *buf; + + va_start(args, format); + buf = vsprintf2(format, args); + va_end(args); + return(buf); +} + +char *sprintf3(char *format, ...) +{ + static char *buf = NULL; + va_list args; + + if(buf != NULL) + free(buf); + va_start(args, format); + buf = vsprintf2(format, args); + va_end(args); + return(buf); +} diff --git a/lib/utils.h b/lib/utils.h index d74d09d..3c9800c 100644 --- a/lib/utils.h +++ b/lib/utils.h @@ -1,10 +1,12 @@ #ifndef _UTILS_H #define _UTILS_H +#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 sstrdup(str) ({const char *__strbuf__ = (str); strcpy(smalloc(strlen(__strbuf__) + 1), __strbuf__);}) #define omalloc(o) ((o) = szmalloc(sizeof(*(o)))) #define bufinit(buf) memset(&(buf), 0, sizeof(buf)) @@ -23,12 +25,19 @@ do { \ memcpy((buf).b + (buf).d, (new), (__bufcat_size__) * sizeof(*((buf).b))); \ (buf).d += __bufcat_size__; \ } while(0) -#define bufcatstr2(buf, str) \ +#define bufcatstr(buf, str) \ do { \ char *__buf__; \ __buf__ = (str); \ bufcat((buf), __buf__, strlen(__buf__)); \ } while(0) +#define bufcatstr2(buf, str) \ +do { \ + char *__buf__; \ + __buf__ = (str); \ + bufcat((buf), __buf__, strlen(__buf__) + 1); \ +} while(0) +#define bufeat(buf, len) memmove((buf).b, (buf).b + (len), (buf).d -= (len)) struct buffer { void *b; @@ -48,5 +57,9 @@ struct charvbuf { }; void _sizebuf(struct buffer *buf, size_t wanted, size_t el); +char *decstr(char **p, size_t *len); +char *vsprintf2(char *format, va_list al); +char *sprintf2(char *format, ...); +char *sprintf3(char *format, ...); #endif -- 2.11.0