better labelling in ast_function_labeling, this time the number is even printed forward rather than backward... ;)

This commit is contained in:
Wolfgang (Blub) Bumiller 2012-08-24 18:08:28 +02:00
parent 2524d9c31b
commit 7fec608417

39
ast.c
View file

@ -718,37 +718,20 @@ 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++);
size_t id = (self->labelcount++);
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;
char *from = self->labelbuf + sizeof(self->labelbuf)-1;
*from-- = 0;
do {
unsigned int digit = id % 10;
*from = digit + '0';
id /= 10;
} while (id);
memcpy(from - len, prefix, len);
return from - len;
}
/*********************************************************************/