gbranden pushed a commit to branch master
in repository groff.
commit df28af3adcab2f54236993e73e153bad8aff3f62
Author: G. Branden Robinson <[email protected]>
AuthorDate: Sat Mar 15 16:36:43 2025 -0500
[troff]: Implement recursive node dumping (9/9).
Implement dumping of device extension node contents.
* src/roff/troff/request.h (class macro): Declare `json_dump()` member
function.
* src/roff/troff/node.cpp (device_extension_node::dump_properties): Call
member variable `mac`'s `json_dump()` member function.
* src/roff/troff/input.cpp (class macro_header): Declare `json_dump()`
member function.
(macro::json_dump): New member function calls `macro_header` `p`
member variable's `json_dump()` member function.
(macro_header::json_dump): New member function iterates though
`char_list` `cl` member variable's elements, calling
`json_encode_char()` on each one.
Changes `pline` request output as follows.
-{"type": "device_extension_node", "diversion level": 0, "is_special_node":
true, "tfont": "TR", "stroke_color": "default", "fill_color": "default"},
+{"type": "device_extension_node", "diversion level": 0, "is_special_node":
true, "macro": "custom-command", "tfont": "TR", "stroke_color": "default",
"fill_color": "default"},
---
ChangeLog | 17 +++++++++++++++++
src/roff/troff/input.cpp | 23 +++++++++++++++++++++++
src/roff/troff/node.cpp | 3 ++-
src/roff/troff/request.h | 3 ++-
4 files changed, 44 insertions(+), 2 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index 76ff7a700..89a975aae 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,20 @@
+2025-03-15 G. Branden Robinson <[email protected]>
+
+ [troff]: Implement dumping of device extension node contents.
+
+ * src/roff/troff/request.h (class macro): Declare `json_dump()`
+ member function.
+ * src/roff/troff/node.cpp
+ (device_extension_node::dump_properties): Call member variable
+ `mac`'s `json_dump()` member function.
+ * src/roff/troff/input.cpp (class macro_header): Declare
+ `json_dump()` member function.
+ (macro::json_dump): New member function calls `macro_header` `p`
+ member variable's `json_dump()` member function.
+ (macro_header::json_dump): New member function iterates though
+ `char_list` `cl` member variable's elements, calling
+ `json_encode_char()` on each one.
+
2025-03-15 G. Branden Robinson <[email protected]>
[troff]: Trivially refactor.
diff --git a/src/roff/troff/input.cpp b/src/roff/troff/input.cpp
index 4faf6f287..9c4427f3f 100644
--- a/src/roff/troff/input.cpp
+++ b/src/roff/troff/input.cpp
@@ -36,6 +36,8 @@ along with this program. If not, see
<http://www.gnu.org/licenses/>. */
#include <stack>
+#include "json-encode.h" // json_encode_char()
+
#include "troff.h"
#include "dictionary.h"
#include "hvunits.h"
@@ -3548,6 +3550,7 @@ public:
node_list nl;
macro_header() { count = 1; }
macro_header *copy(int);
+ void json_dump();
};
macro::~macro()
@@ -3711,6 +3714,11 @@ void macro::print_size()
errprint("%1", len);
}
+void macro::json_dump()
+{
+ p->json_dump();
+}
+
// make a copy of the first n bytes
macro_header *macro_header::copy(int n)
@@ -3734,6 +3742,21 @@ macro_header *macro_header::copy(int n)
return p;
}
+void macro_header::json_dump()
+{
+ fputc('\"', stderr);
+ int macro_len = cl.length();
+ for (int i = 0; i < macro_len; i++) {
+ json_char jc = json_encode_char(cl.get(i));
+ // Write out its JSON representation by character by character to
+ // keep libc string functions from interpreting C escape sequences.
+ for (size_t j = 0; j < jc.len; j++)
+ fputc(jc.buf[j], stderr);
+ }
+ fputc('\"', stderr);
+ fflush(stderr);
+}
+
void print_macros()
{
object_dictionary_iterator iter(request_dictionary);
diff --git a/src/roff/troff/node.cpp b/src/roff/troff/node.cpp
index b4ff2dc31..b02ce00b9 100644
--- a/src/roff/troff/node.cpp
+++ b/src/roff/troff/node.cpp
@@ -4148,7 +4148,8 @@ device_extension_node::device_extension_node(const macro
&m, tfont *t,
void device_extension_node::dump_properties()
{
node::dump_properties();
- // TODO: Implement `macro::dump()` and call it on `mac` from here.
+ fputs(", \"macro\": ", stderr);
+ mac.json_dump();
fputs(", \"tfont\": ", stderr);
tf->get_name().json_dump();
fputs(", \"stroke_color\": ", stderr);
diff --git a/src/roff/troff/request.h b/src/roff/troff/request.h
index 74e9e1ad4..335adb8fe 100644
--- a/src/roff/troff/request.h
+++ b/src/roff/troff/request.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.
@@ -70,6 +70,7 @@ public:
bool is_diversion();
bool is_string();
void clear_string_flag();
+ void json_dump();
friend class string_iterator;
friend void chop_macro();
friend void substring_request();
_______________________________________________
groff-commit mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/groff-commit