gbranden pushed a commit to branch master
in repository groff.
commit 5dcf31ee541676d74f59684bbe61a05e4f287690
Author: G. Branden Robinson <[email protected]>
AuthorDate: Thu Feb 27 02:15:16 2025 -0600
[troff]: `pnr` request reports autoincr amounts.
* src/roff/troff/reg.h (class reg): Declare `const` virtual functions
`get_increment()` and `can_autoincrement()` returning `int` and
`bool`, respectively. These exist at the root of the register class
hierarchy because the `dictionary` class that tracks defined registers
effectively erases details of their types. (groff doesn't use RTTI
anywhere, and doing so seemed unnecessary, so I didn't explore it.)
(class general_reg): Declare non-virtual versions of `get_increment()`
and `can_autoincrement()`.
* src/roff/troff/reg.cpp: Include "lib.h" since we now need its
`INT_DIGITS` symbol.
(reg::get_increment): Define as returning constant zero.
(reg::can_autoincrement): Define as returning constant false.
(general_reg::get_increment): Define.
(general_reg::can_autoincrement): Define as returning constant true.
(dump_register): If the register can autoincrement, report the
autoincrement amount, with an explicit sign for clarity and easy
distinction from the register's value and number format.
* doc/groff.texi.in (Debugging) <pnr>:
* man/groff.7.man (Request short reference) <pnr>:
* man/groff_diff.7.man (New requests) <pnr>: Document it.
Illustration:
$ printf '.nr a 1\n.nr b 2 2\n.nr c 3 999999\n.nr d 4 -2\n.nr e 2147483647
2147483647\n.af b i\n.pnr .a a b c d e\n' | ./build/test-groff
.a 0
a 1 +0 0
b 2 +2 i
c 3 +999999 0
d 4 -2 0
e 2147483647 +2147483647 0
---
ChangeLog | 28 ++++++++++++++++++++++++++++
doc/groff.texi.in | 11 ++++++++---
man/groff.7.man | 6 ++++--
man/groff_diff.7.man | 2 +-
src/roff/troff/reg.cpp | 29 ++++++++++++++++++++++++++++-
src/roff/troff/reg.h | 6 +++++-
6 files changed, 74 insertions(+), 8 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index adbd4ee0f..a3212a1ee 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,31 @@
+2025-02-27 G. Branden Robinson <[email protected]>
+
+ [troff]: Make `pnr` request report autoincrement amounts.
+
+ * src/roff/troff/reg.h (class reg): Declare `const` virtual
+ functions `get_increment()` and `can_autoincrement()` returning
+ `int` and `bool`, respectively. These exist at the root of the
+ register class hierarchy because the `dictionary` class that
+ tracks defined registers effectively erases details of their
+ types. (groff doesn't use RTTI anywhere, and doing so seemed
+ unnecessary, so I didn't explore it.)
+ (class general_reg): Declare non-virtual versions of
+ `get_increment()` and `can_autoincrement()`.
+ * src/roff/troff/reg.cpp: Include "lib.h" since we now need its
+ `INT_DIGITS` symbol.
+ (reg::get_increment): Define as returning constant zero.
+ (reg::can_autoincrement): Define as returning constant false.
+ (general_reg::get_increment): Define.
+ (general_reg::can_autoincrement): Define as returning constant
+ true.
+ (dump_register): If the register can autoincrement, report the
+ autoincrement amount, with an explicit sign for clarity and easy
+ distinction from the register's value and number format.
+
+ * doc/groff.texi.in (Debugging) <pnr>:
+ * man/groff.7.man (Request short reference) <pnr>:
+ * man/groff_diff.7.man (New requests) <pnr>: Document it.
+
2025-02-26 G. Branden Robinson <[email protected]>
* doc/doc.am: In `DOC_PDFMOM` macro, use `PDFMOMBIN` macro
diff --git a/doc/groff.texi.in b/doc/groff.texi.in
index 51890e3ff..ffb413860 100644
--- a/doc/groff.texi.in
+++ b/doc/groff.texi.in
@@ -17580,9 +17580,14 @@ strings, and diversions with their sizes in bytes.
@Defreq {pnr, [@Var{reg} @r{@dots{}}]}
@cindex dumping registers (@code{pnr})
@cindex registers, dumping (@code{pnr})
-Report the name and value and, if the value is numeric, the assigned
-format of each register @var{reg}, or, without arguments, those of all
-defined registers, to the standard error stream.
+Report the name and value and,
+if the value is numeric,
+the autoincrement amount and assigned format of each register
+@var{reg},
+or,
+without arguments,
+those of all defined registers,
+to the standard error stream.
@endDefreq
@Defreq {pstream, }
diff --git a/man/groff.7.man b/man/groff.7.man
index b53338a5d..8c9747d2e 100644
--- a/man/groff.7.man
+++ b/man/groff.7.man
@@ -4173,14 +4173,16 @@ Report the names,
values,
and
(as applicable)
+autoincrement amounts and
assigned formats of all defined registers to the standard error stream.
.
.TPx
.REQ .pnr "reg \fR\&.\|.\|.\&\fP"
Report the name and value and,
if the value is numeric,
-the assigned format of each register
-.IR reg ,
+the autoincrement amount and assigned format,
+of each register
+.I reg
to the standard error stream.
.
.TPx
diff --git a/man/groff_diff.7.man b/man/groff_diff.7.man
index e248b688d..e12f05848 100644
--- a/man/groff_diff.7.man
+++ b/man/groff_diff.7.man
@@ -3403,7 +3403,7 @@ The list is empty if there are none.
.IR reg \~.\|.\|.]
Report the name and value and,
if the value is numeric,
-the assigned format of each register
+the autoincrement amount and assigned format of each register
.IR reg ,
or,
without arguments,
diff --git a/src/roff/troff/reg.cpp b/src/roff/troff/reg.cpp
index c22b088c2..9de106b85 100644
--- a/src/roff/troff/reg.cpp
+++ b/src/roff/troff/reg.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 1989-2024 Free Software Foundation, Inc.
+/* Copyright (C) 1989-2025 Free Software Foundation, Inc.
Written by James Clark ([email protected])
This file is part of groff.
@@ -24,6 +24,7 @@ along with this program. If not, see
<http://www.gnu.org/licenses/>. */
#include "troff.h"
#include "dictionary.h"
+#include "lib.h" // INT_DIGITS
#include "token.h"
#include "request.h"
#include "reg.h"
@@ -50,6 +51,11 @@ void reg::set_increment(units /*n*/)
error("cannot automatically increment read-only register");
}
+int reg::get_increment() const
+{
+ return 0;
+}
+
void reg::alter_format(char /*f*/, int /*w*/)
{
error("cannot assign format of read-only register");
@@ -65,6 +71,11 @@ void reg::set_value(units /*n*/)
error("cannot write read-only register");
}
+bool reg::can_autoincrement() const
+{
+ return false;
+}
+
general_reg::general_reg() : format('1'), width(0), inc(0)
{
}
@@ -235,6 +246,16 @@ void general_reg::set_increment(units n)
inc = n;
}
+int general_reg::get_increment() const
+{
+ return inc;
+}
+
+bool general_reg::can_autoincrement() const
+{
+ return true;
+}
+
void general_reg::alter_format(char f, int w)
{
format = f;
@@ -521,9 +542,15 @@ void rename_register_request()
static void dump_register(symbol *id, reg *r)
{
int n;
+ const size_t sz = INT_DIGITS + 1 /* leading sign */;
+ char inc[sz];
errprint("%1\t", id->contents());
if (r->get_value(&n)) {
errprint("%1", n);
+ if (r->can_autoincrement()) {
+ (void) snprintf(inc, sz, "%+d", r->get_increment());
+ errprint("\t%1", inc);
+ }
const char *f = r->get_format();
assert(f != 0 /* nullptr */);
if (f != 0 /* nullptr*/)
diff --git a/src/roff/troff/reg.h b/src/roff/troff/reg.h
index 9f2a7ea75..d617998eb 100644
--- a/src/roff/troff/reg.h
+++ b/src/roff/troff/reg.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 1989-2024 Free Software Foundation, Inc.
+/* Copyright (C) 1989-2025 Free Software Foundation, Inc.
Written by James Clark ([email protected])
This file is part of groff.
@@ -24,9 +24,11 @@ public:
virtual void increment();
virtual void decrement();
virtual void set_increment(units);
+ virtual int get_increment() const;
virtual void alter_format(char f, int w = 0);
virtual const char *get_format();
virtual void set_value(units);
+ virtual bool can_autoincrement() const;
};
// TODO: Use template to parameterize class in the pointed-to data type?
@@ -56,6 +58,8 @@ public:
void decrement();
void alter_format(char f, int w = 0);
void set_increment(units);
+ int get_increment() const;
+ bool can_autoincrement() const;
const char *get_format();
void add_value(units);
_______________________________________________
groff-commit mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/groff-commit