PgfPrinter::nprintf dynamically reallocates the printing buffer if needed

This commit is contained in:
krangelov
2021-08-27 11:57:58 +02:00
parent 8195f8b0cb
commit 5271ddd10b
2 changed files with 26 additions and 16 deletions

View File

@@ -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;

View File

@@ -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();