1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
|
/* $Id: strbuf.c,v 1.5 2003/05/13 06:16:54 twogood Exp $ */
#include "strbuf.h"
#include <stdlib.h>
#include <string.h>
static void strbuf_enlarge(StrBuf *strbuf, size_t size)
{
if (strbuf->buffer_size < size)
{
size_t new_size = strbuf->buffer_size ? strbuf->buffer_size : 2;
while (new_size < size)
new_size <<= 1;
strbuf->buffer = realloc(strbuf->buffer, new_size);
strbuf->buffer_size = new_size;
}
}
StrBuf* strbuf_new (const char *init)
{
StrBuf* result = (StrBuf*)malloc(sizeof(StrBuf));
memset(result, 0, sizeof(StrBuf));
strbuf_append(result, init);
return result;
}
void strbuf_destroy(StrBuf *strbuf, bool free_contents)
{
if (free_contents)
free(strbuf->buffer);
free(strbuf);
}
StrBuf* strbuf_append (StrBuf *strbuf, const char* str)
{
int length;
if (!str)
return strbuf;
length = strlen(str);
strbuf_enlarge(strbuf, strbuf->length + length + 1);
memcpy(strbuf->buffer + strbuf->length, str, length + 1);
strbuf->length += length;
return strbuf;
}
StrBuf* strbuf_append_wstr(StrBuf* strbuf, WCHAR* wstr)
{
if (wstr)
{
char* ascii_str = wstr_to_ascii(wstr);
strbuf_append(strbuf, ascii_str);
wstr_free_string(ascii_str);
}
return strbuf;
}
StrBuf* strbuf_append_c (StrBuf *strbuf, int c)
{
strbuf_enlarge(strbuf, strbuf->length + 2);
strbuf->buffer[strbuf->length++] = c;
strbuf->buffer[strbuf->length] = '\0';
return strbuf;
}
StrBuf* strbuf_append_crlf (StrBuf *strbuf)
{
strbuf_enlarge(strbuf, strbuf->length + 3);
strbuf->buffer[strbuf->length++] = '\r';
strbuf->buffer[strbuf->length++] = '\n';
strbuf->buffer[strbuf->length] = '\0';
return strbuf;
}
#if 0
StrBuf* strbuf_printf(StrBuf *strbuf, const char* format, ...)
{
va_list ap;
va_start(ap, format);
strbuf_vprintf(strbuf, format, ap);
va_end(ap);
}
StrBuf* strbuf_vprintf(StrBuf *strbuf, const char* format, va_list ap);
{
size_t bytes_left = 0;
size_t increase = 64;
int bytes_used = 0;
for (;;)
{
strbuf_enlarge(strbuf, strbuf->length + increase);
bytes_left = strbuf->buffer_size - strbuf->length;
bytes_used = vsnprintf(strbuf->buffer + strbuf->length,
bytes_left, format, ap);
if (bytes_used > -1 && bytes_used < size)
break;
/* see the printf man page */
if (bytes_used > -1) /* glibc 2.1 */
increase = bytes_used + 1;
else /* glibc 2.0 */
increase *= 2;
};
bytes->length += bytes_used;
return strbuf;
}
#endif
|