mirror of
https://github.com/GrammaticalFramework/gf-core.git
synced 2026-04-22 19:22:50 -06:00
PgfPrinter::nprintf dynamically reallocates the printing buffer if needed
This commit is contained in:
@@ -47,19 +47,26 @@ void PgfPrinter::puts(const char *s)
|
|||||||
|
|
||||||
void PgfPrinter::nprintf(size_t buf_size, const char *format, ...)
|
void PgfPrinter::nprintf(size_t buf_size, const char *format, ...)
|
||||||
{
|
{
|
||||||
if (res) {
|
again: {
|
||||||
size_t size = res->size+buf_size;
|
if (res) {
|
||||||
res = (PgfText *) realloc(res, sizeof(PgfText)+size+1);
|
size_t size = res->size+buf_size;
|
||||||
} else {
|
res = (PgfText *) realloc(res, sizeof(PgfText)+size+1);
|
||||||
res = (PgfText *) malloc(sizeof(PgfText)+buf_size+1);
|
} else {
|
||||||
res->size = 0;
|
res = (PgfText *) malloc(sizeof(PgfText)+buf_size+1);
|
||||||
}
|
res->size = 0;
|
||||||
|
}
|
||||||
|
|
||||||
va_list ap;
|
va_list ap;
|
||||||
va_start(ap, format);
|
va_start(ap, format);
|
||||||
res->size +=
|
size_t out =
|
||||||
vsnprintf(res->text+res->size, buf_size, format, ap);
|
vsnprintf(res->text+res->size, buf_size, format, ap);
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
|
if (out >= buf_size) {
|
||||||
|
buf_size = out+1;
|
||||||
|
goto again;
|
||||||
|
}
|
||||||
|
res->size += out;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
PgfText *PgfPrinter::get_text()
|
PgfText *PgfPrinter::get_text()
|
||||||
@@ -192,7 +199,7 @@ PgfExpr PgfPrinter::emeta(PgfMetaId meta)
|
|||||||
if (meta == 0) {
|
if (meta == 0) {
|
||||||
puts("?");
|
puts("?");
|
||||||
} else {
|
} else {
|
||||||
nprintf(16, "?%d", meta);
|
nprintf(4, "?%d", meta);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@@ -217,7 +224,7 @@ PgfExpr PgfPrinter::evar(int index)
|
|||||||
var = var->next;
|
var = var->next;
|
||||||
}
|
}
|
||||||
if (var == NULL) {
|
if (var == NULL) {
|
||||||
nprintf(16, "#%d", index);
|
nprintf(4, "#%d", index);
|
||||||
} else {
|
} else {
|
||||||
puts(&var->name);
|
puts(&var->name);
|
||||||
}
|
}
|
||||||
@@ -257,9 +264,9 @@ PgfLiteral PgfPrinter::lint(size_t size, uintmax_t *v)
|
|||||||
if (size == 0)
|
if (size == 0)
|
||||||
puts("0");
|
puts("0");
|
||||||
else {
|
else {
|
||||||
nprintf(32, "%jd", v[0]);
|
nprintf(LINT_BASE_LOG+2, "%jd", v[0]);
|
||||||
for (size_t i = 1; i < size; i++) {
|
for (size_t i = 1; i < size; i++) {
|
||||||
nprintf(32, "%0" xstr(LINT_BASE_LOG) "ju", v[i]);
|
nprintf(LINT_BASE_LOG+1, "%0" xstr(LINT_BASE_LOG) "ju", v[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
@@ -41,6 +41,9 @@ public:
|
|||||||
|
|
||||||
void puts(PgfText *s);
|
void puts(PgfText *s);
|
||||||
void puts(const char *s);
|
void puts(const char *s);
|
||||||
|
|
||||||
|
// buf_size is the expected buffer size. If larger is needed,
|
||||||
|
// it will be allocated automatically.
|
||||||
void nprintf(size_t buf_size, const char *format, ...) __attribute__ ((format (printf, 3, 4)));
|
void nprintf(size_t buf_size, const char *format, ...) __attribute__ ((format (printf, 3, 4)));
|
||||||
|
|
||||||
PgfText *get_text();
|
PgfText *get_text();
|
||||||
|
|||||||
Reference in New Issue
Block a user