[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[groff] 13/40: [pic]: Slightly refactor; update diagnostics.
From: |
G. Branden Robinson |
Subject: |
[groff] 13/40: [pic]: Slightly refactor; update diagnostics. |
Date: |
Sat, 12 Nov 2022 14:43:36 -0500 (EST) |
gbranden pushed a commit to branch master
in repository groff.
commit 08d0c1703cd405b653dc3edc9f1baa4eec95f653
Author: G. Branden Robinson <g.branden.robinson@gmail.com>
AuthorDate: Mon Nov 7 11:25:28 2022 -0600
[pic]: Slightly refactor; update diagnostics.
* src/preproc/pic/pic.ypp: Slightly refactor. Rename parameter `form`
(format) to `fmt` to make its nature as an abbreviation clear.
(format_number, do_sprintf): Reorder null pointer equality comparisons
to avoid inadvertent lvalue assignment.
(do_sprintf): Declare lists of valid format conversion specifiers and
modifiers explicitly instead of as happenstance literals. Recast
diagnostic messages to refer to "invalid", not "bad" input; refer to
input keyword correct as "sprintf" (not "snprintf"); and report the
identity of the invalid conversion specifier we reject.
---
ChangeLog | 14 ++++++++++++++
src/preproc/pic/pic.ypp | 45 ++++++++++++++++++++++++---------------------
2 files changed, 38 insertions(+), 21 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index 03115b187..2aab38a03 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,17 @@
+2022-11-07 G. Branden Robinson <g.branden.robinson@gmail.com>
+
+ * src/preproc/pic/pic.ypp: Slightly refactor. Rename parameter
+ `form` (format) to `fmt` to make its nature as an abbreviation
+ clear.
+ (format_number, do_sprintf): Reorder null pointer equality
+ comparisons to avoid inadvertent lvalue assignment.
+ (do_sprintf): Declare lists of valid format conversion
+ specifiers and modifiers explicitly instead of as happenstance
+ literals. Recast diagnostic messages to refer to "invalid", not
+ "bad" input; refer to input keyword correct as "sprintf" (not
+ "snprintf"); and report the identity of the invalid conversion
+ specifier we reject.
+
2022-11-07 G. Branden Robinson <g.branden.robinson@gmail.com>
* tmac/doc.tmac (Fl, doc-flag-recursion, doc-print-recursive)
diff --git a/src/preproc/pic/pic.ypp b/src/preproc/pic/pic.ypp
index 99cdd6082..e06b139c8 100644
--- a/src/preproc/pic/pic.ypp
+++ b/src/preproc/pic/pic.ypp
@@ -55,8 +55,8 @@ object_list olist;
const char *ordinal_postfix(int n);
const char *object_type_name(object_type type);
-char *format_number(const char *form, double n);
-char *do_sprintf(const char *form, const double *v, int nv);
+char *format_number(const char *fmt, double n);
+char *do_sprintf(const char *fmt, const double *v, int nv);
%}
@@ -1893,41 +1893,44 @@ const char *object_type_name(object_type type)
static char sprintf_buf[1024];
-char *format_number(const char *form, double n)
+char *format_number(const char *fmt, double n)
{
- if (form == 0)
- form = "%g";
- return do_sprintf(form, &n, 1);
+ if (0 /* nullptr */ == fmt)
+ fmt = "%g";
+ return do_sprintf(fmt, &n, 1);
}
-char *do_sprintf(const char *form, const double *v, int nv)
+char *do_sprintf(const char *fmt, const double *v, int nv)
{
+ // Define valid conversion specifiers and modifiers.
+ static const char spcs[] = "eEfgG%";
+ static const char mods[] = "#-+ 0123456789.";
string result;
int i = 0;
string one_format;
- while (*form) {
- if (*form == '%') {
- one_format += *form++;
- for (; *form != '\0' && strchr("#-+ 0123456789.", *form) != 0; form++)
- one_format += *form;
- if (*form == '\0' || strchr("eEfgG%", *form) == 0) {
- lex_error("bad sprintf format");
+ while (*fmt) {
+ if ('%' == *fmt) {
+ one_format += *fmt++;
+ for (; *fmt != '\0' && strchr(mods, *fmt) != 0; fmt++)
+ one_format += *fmt;
+ if ('\0' == *fmt || strchr(spcs, *fmt) == 0) {
+ lex_error("invalid sprintf conversion specifier '%1'", *fmt);
result += one_format;
- result += form;
+ result += fmt;
break;
}
- if (*form == '%') {
- form++;
+ if ('%' == *fmt) {
+ fmt++;
snprintf(sprintf_buf, sizeof(sprintf_buf), "%%");
}
else {
if (i >= nv) {
- lex_error("too few arguments to snprintf");
+ lex_error("too few arguments to sprintf");
result += one_format;
- result += form;
+ result += fmt;
break;
}
- one_format += *form++;
+ one_format += *fmt++;
one_format += '\0';
// We validated the format string above. Most conversion specifiers are
// rejected, including `n`.
@@ -1941,7 +1944,7 @@ char *do_sprintf(const char *form, const double *v, int
nv)
result += sprintf_buf;
}
else
- result += *form++;
+ result += *fmt++;
}
result += '\0';
return strsave(result.contents());
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [groff] 13/40: [pic]: Slightly refactor; update diagnostics.,
G. Branden Robinson <=