groff-commit
[Top][All Lists]
Advanced

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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]