groff-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[groff] 08/35: [libgroff]: Enable more informative diagnostics.


From: G. Branden Robinson
Subject: [groff] 08/35: [libgroff]: Enable more informative diagnostics.
Date: Tue, 21 Jun 2022 14:26:28 -0400 (EDT)

gbranden pushed a commit to branch master
in repository groff.

commit a68ad8278d06f87bd984828b7f0cef732fc09798
Author: G. Branden Robinson <g.branden.robinson@gmail.com>
AuthorDate: Sun Jun 19 02:21:03 2022 -0500

    [libgroff]: Enable more informative diagnostics.
    
    [libgroff]: Update return type of `font::load_desc` function to enable
    more informative diagnostics from callers.
    
    * src/include/font.h (font::load_desc): Change return type from `bool`
      to `const char` pointer.
    * src/libs/libgroff/font.cpp (font::load_desc): Return null pointer
      literal on failed `open()` or validation failures.  Return filespec on
      success.
    
    * src/libs/libdriver/input.cpp (do_file):
    * src/preproc/grn/main.cpp (getres):
    * src/roff/groff/groff.cpp (main):
    * src/roff/troff/input.cpp (main): Compare `font::load_desc()` return
      value to null pointer literal instead of treating it as a Boolean.
    
    * src/roff/groff/groff.cpp (main): Report full filespec of troublesome
      "DESC" file when complainiing of missing "postpro" directive.
---
 ChangeLog                    | 22 +++++++++++++++++++++
 src/include/font.h           |  2 +-
 src/libs/libdriver/input.cpp |  2 +-
 src/libs/libgroff/font.cpp   | 46 +++++++++++++++++++++++---------------------
 src/preproc/grn/main.cpp     |  2 +-
 src/roff/groff/groff.cpp     |  7 ++++---
 src/roff/troff/input.cpp     |  2 +-
 7 files changed, 54 insertions(+), 29 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 9af479cb..684de007 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,25 @@
+2022-06-19  G. Branden Robinson <g.branden.robinson@gmail.com>
+
+       [libgroff]: Update return type of `font::load_desc` function to
+       enable more informative diagnostics from callers.
+
+       * src/include/font.h (font::load_desc): Change return type from
+       `bool` to `const char` pointer.
+       * src/libs/libgroff/font.cpp (font::load_desc): Return null
+       pointer literal on failed `open()` or validation failures.
+       Return filespec on success.
+
+       * src/libs/libdriver/input.cpp (do_file):
+       * src/preproc/grn/main.cpp (getres):
+       * src/roff/groff/groff.cpp (main):
+       * src/roff/troff/input.cpp (main): Compare `font::load_desc()`
+       return value to null pointer literal instead of treating it as a
+       Boolean.
+
+       * src/roff/groff/groff.cpp (main): Report full filespec of
+       troublesome "DESC" file when complainiing of missing "postpro"
+       directive.
+
 2022-06-18  G. Branden Robinson <g.branden.robinson@gmail.com>
 
        * src/roff/groff/groff.cpp: Add new Boolean global,
diff --git a/src/include/font.h b/src/include/font.h
index 08725861..68a82faf 100644
--- a/src/include/font.h
+++ b/src/include/font.h
@@ -223,7 +223,7 @@ public:
 
   // Open the DESC file (depending on the device) and initialize some
   // static variables with info from there.
-  static bool load_desc();
+  static const char *load_desc();
   static FONT_COMMAND_HANDLER
     set_unknown_desc_command_handler(FONT_COMMAND_HANDLER);    // Register
                        // a function which defines the semantics of
diff --git a/src/libs/libdriver/input.cpp b/src/libs/libdriver/input.cpp
index 96d400dc..45f273d4 100644
--- a/src/libs/libdriver/input.cpp
+++ b/src/libs/libdriver/input.cpp
@@ -1601,7 +1601,7 @@ do_file(const char *filename)
     char *tmp_dev = get_string_arg();
     if (pr == 0) {             // note: 'pr' initialized after prologue
       device = tmp_dev;
-      if (!font::load_desc())
+      if (0 /* nullptr */ == font::load_desc())
        fatal("cannot load description of '%1' device", tmp_dev);
     }
     else {
diff --git a/src/libs/libgroff/font.cpp b/src/libs/libgroff/font.cpp
index 0f6a7b9a..7655e0a3 100644
--- a/src/libs/libgroff/font.cpp
+++ b/src/libs/libgroff/font.cpp
@@ -1061,13 +1061,15 @@ static struct {
   { "sizescale", &font::sizescale },
   };
 
-bool font::load_desc()
+// Return file specification of DESC file for selected output device if
+// it can be located and is valid, and a null pointer otherwise.
+const char *font::load_desc()
 {
   int nfonts = 0;
   FILE *fp;
   char *path;
   if ((fp = open_file("DESC", &path)) == 0)
-    return false;
+    return 0 /* nullptr */;
   text_file t(fp, path);
   while (t.next_line()) {
     char *p = strtok(t.buf, WS);
@@ -1082,12 +1084,12 @@ bool font::load_desc()
       char *q = strtok(0, WS);
       if (0 == q) {
        t.error("missing value for directive '%1'", p);
-       return false;
+       return 0 /* nullptr */;
       }
       int val;
       if (sscanf(q, "%d", &val) != 1) {
        t.error("'%1' directive given invalid number '%2'", p, q);
-       return false;
+       return 0 /* nullptr */;
       }
       if ((strcmp(p, "res") == 0
           || strcmp(p, "hor") == 0
@@ -1099,7 +1101,7 @@ bool font::load_desc()
          && val < 1) {
        t.error("expected argument to '%1' directive to be a"
                " positive number, got '%2'", p, val);
-       return false;
+       return 0 /* nullptr */;
       }
       *(table[idx-1].ptr) = val;
     }
@@ -1107,7 +1109,7 @@ bool font::load_desc()
       p = strtok(0, WS);
       if (0 == p) {
        t.error("'family' directive requires an argument");
-       return false;
+       return 0 /* nullptr */;
       }
       char *tem = new char[strlen(p)+1];
       strcpy(tem, p);
@@ -1117,12 +1119,12 @@ bool font::load_desc()
       p = strtok(0, WS);
       if (0 == p) {
        t.error("'fonts' directive requires arguments");
-       return false;
+       return 0 /* nullptr */;
       }
       if (sscanf(p, "%d", &nfonts) != 1 || nfonts <= 0) {
        t.error("expected first argument to 'fonts' directive to be a"
                " non-negative number, got '%1'", p);
-       return false;
+       return 0 /* nullptr */;
       }
       font_name_table = (const char **)new char *[nfonts+1];
       for (int i = 0; i < nfonts; i++) {
@@ -1130,7 +1132,7 @@ bool font::load_desc()
        while (0 == p) {
          if (!t.next_line()) {
            t.error("unexpected end of file while reading font list");
-           return false;
+           return 0 /* nullptr */;
          }
          p = strtok(t.buf, WS);
        }
@@ -1142,7 +1144,7 @@ bool font::load_desc()
       if (p != 0) {
        t.error("font count does not match declared number of fonts"
                " ('%1')", nfonts);
-       return false;
+       return 0 /* nullptr */;
       }
       font_name_table[nfonts] = 0;
     }
@@ -1150,12 +1152,12 @@ bool font::load_desc()
       if (0 == res) {
        t.error("'res' directive must precede 'papersize' in device"
                " description file");
-       return false;
+       return 0 /* nullptr */;
       }
       p = strtok(0, WS);
       if (0 == p) {
        t.error("'papersize' directive requires an argument");
-       return false;
+       return 0 /* nullptr */;
       }
       bool found_paper = false;
       char *savedp = strdup(p);
@@ -1177,7 +1179,7 @@ bool font::load_desc()
       if (!found_paper) {
        t.error("unable to determine a paper format from '%1'", savedp);
        free(savedp);
-       return false;
+       return 0 /* nullptr */;
       }
       free(savedp);
     }
@@ -1194,7 +1196,7 @@ bool font::load_desc()
        while (0 == p) {
          if (!t.next_line()) {
            t.error("list of sizes must be terminated by '0'");
-           return false;
+           return 0 /* nullptr */;
          }
          p = strtok(t.buf, WS);
        }
@@ -1209,7 +1211,7 @@ bool font::load_desc()
          // fall through
        default:
          t.error("invalid size range '%1'", p);
-         return false;
+         return 0 /* nullptr */;
        }
        if (i + 2 > n) {
          int *old_sizes = sizes;
@@ -1225,7 +1227,7 @@ bool font::load_desc()
       }
       if (i == 1) {
        t.error("must have some sizes");
-       return false;
+       return 0 /* nullptr */;
       }
     }
     else if (strcmp("styles", p) == 0) {
@@ -1265,7 +1267,7 @@ bool font::load_desc()
       p = strtok(0, WS);
       if (0 == p) {
        t.error("'image_generator' directive requires an argument");
-       return false;
+       return 0 /* nullptr */;
       }
       image_generator = strsave(p);
     }
@@ -1281,21 +1283,21 @@ bool font::load_desc()
   t.lineno = 0;
   if (res == 0) {
     t.error("device description file missing 'res' directive");
-    return false;
+    return 0 /* nullptr */;
   }
   if (unitwidth == 0) {
     t.error("device description file missing 'unitwidth' directive");
-    return false;
+    return 0 /* nullptr */;
   }
   if (font_name_table == 0) {
     t.error("device description file missing 'fonts' directive");
-    return false;
+    return 0 /* nullptr */;
   }
   if (sizes == 0) {
     t.error("device description file missing 'sizes' directive");
-    return false;
+    return 0 /* nullptr */;
   }
-  return true;
+  return path;
 }
 
 void font::handle_unknown_font_command(const char *, const char *,
diff --git a/src/preproc/grn/main.cpp b/src/preproc/grn/main.cpp
index fcc22896..a96f25d4 100644
--- a/src/preproc/grn/main.cpp
+++ b/src/preproc/grn/main.cpp
@@ -428,7 +428,7 @@ getres()
 {
   int linepiece;
 
-  if (!font::load_desc())
+  if (0 /* nullptr */ == font::load_desc())
     fatal("cannot load 'DESC' description file for device '%1'",
          device);
 
diff --git a/src/roff/groff/groff.cpp b/src/roff/groff/groff.cpp
index 662f323c..95180f9e 100644
--- a/src/roff/groff/groff.cpp
+++ b/src/roff/groff/groff.cpp
@@ -348,12 +348,13 @@ int main(int argc, char **argv)
     commands[PIC_INDEX].append_arg("-U");
   }
   font::set_unknown_desc_command_handler(handle_unknown_desc_command);
-  if (!font::load_desc())
+  const char *desc = font::load_desc();
+  if (0 /* nullptr */ == desc)
     fatal("cannot load 'DESC' description file for device '%1'",
          device);
   if (need_postdriver && (0 /* nullptr */ == postdriver))
-    fatal("no 'postpro' directive in 'DESC' file for device '%1'",
-          device);
+    fatal_with_file_and_line(desc, 0, "device description file missing"
+                            " 'postpro' directive");
   if (predriver && !zflag) {
     commands[TROFF_INDEX].insert_arg(commands[TROFF_INDEX].get_name());
     commands[TROFF_INDEX].set_name(predriver);
diff --git a/src/roff/troff/input.cpp b/src/roff/troff/input.cpp
index e390e8f8..5a299121 100644
--- a/src/roff/troff/input.cpp
+++ b/src/roff/troff/input.cpp
@@ -8160,7 +8160,7 @@ int main(int argc, char **argv)
   set_string(".T", device);
   init_charset_table();
   init_hpf_code_table();
-  if (!font::load_desc())
+  if (0 /* nullptr */ == font::load_desc())
     fatal("cannot load 'DESC' description file for device '%1'",
          device);
   units_per_inch = font::res;



reply via email to

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