From: Wolfgang (Blub) Bumiller Date: Thu, 3 May 2012 11:45:24 +0000 (+0200) Subject: sprintf with length modifiers is annoying... X-Git-Tag: 0.1-rc1~504 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=0f023bc2194230adfdaed1703917d4c7f7271097;p=xonotic%2Fgmqcc.git sprintf with length modifiers is annoying... --- diff --git a/ast.c b/ast.c index 0d07768..47638cb 100644 --- a/ast.c +++ b/ast.c @@ -368,10 +368,36 @@ void ast_function_delete(ast_function *self) mem_d(self); } +static void ast_util_hexitoa(char *buf, size_t size, unsigned int num) +{ + unsigned int base = 10; +#define checknul() do { if (size == 1) { *buf = 0; return; } } while (0) +#define addch(x) do { *buf++ = (x); --size; checknul(); } while (0) + if (size < 1) + return; + checknul(); + if (!num) + addch('0'); + else { + while (num) + { + int digit = num % base; + num /= base; + addch('0' + digit); + } + } + + *buf = 0; +#undef addch +#undef checknul +} + const char* ast_function_label(ast_function *self, const char *prefix) { size_t id = (self->labelcount++); - sprintf(self->labelbuf, "%16s%8u", prefix, (unsigned int)id); + size_t len = strlen(prefix); + strncpy(self->labelbuf, prefix, sizeof(self->labelbuf)); + ast_util_hexitoa(self->labelbuf + len, sizeof(self->labelbuf)-len, id); return self->labelbuf; }