[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;
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [groff] 08/35: [libgroff]: Enable more informative diagnostics.,
G. Branden Robinson <=