X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fmisc.c;h=cdb2608aa45511cee77721445d4bca2a6e4fa880;hb=cac45fffc58cc10056c528582ee4b78b8ee175e0;hp=a087263556804d251b3a1e0a901b44448c8de18f;hpb=0c6c288b5360fcdb7f9b5826d05c01ade33253f0;p=chaz%2Ftar diff --git a/src/misc.c b/src/misc.c index a087263..cdb2608 100644 --- a/src/misc.c +++ b/src/misc.c @@ -827,3 +827,44 @@ page_aligned_alloc (void **ptr, size_t size) return ptr_align (*ptr, alignment); } + + +struct namebuf +{ + char *buffer; /* directory, `/', and directory member */ + size_t buffer_size; /* allocated size of name_buffer */ + size_t dir_length; /* length of directory part in buffer */ +}; + +namebuf_t +namebuf_create (const char *dir) +{ + namebuf_t buf = xmalloc (sizeof (*buf)); + buf->buffer_size = strlen (dir) + 2; + buf->buffer = xmalloc (buf->buffer_size); + strcpy (buf->buffer, dir); + buf->dir_length = strlen (buf->buffer); + if (!ISSLASH (buf->buffer[buf->dir_length - 1])) + buf->buffer[buf->dir_length++] = DIRECTORY_SEPARATOR; + return buf; +} + +void +namebuf_free (namebuf_t buf) +{ + free (buf->buffer); + free (buf); +} + +char * +namebuf_name (namebuf_t buf, const char *name) +{ + size_t len = strlen (name); + while (buf->dir_length + len + 1 >= buf->buffer_size) + buf->buffer = x2realloc (buf->buffer, &buf->buffer_size); + strcpy (buf->buffer + buf->dir_length, name); + return buf->buffer; +} + + +