gbranden pushed a commit to branch master
in repository groff.
commit c220a3c3096ec62fb43a7244a8900fac9286384e
Author: G. Branden Robinson <[email protected]>
AuthorDate: Sun Mar 16 09:32:00 2025 -0500
[libgroff]: Fix logic error.
...when encoding characters ", \, and / as (or in) JSON strings.
* src/libs/libgroff/json_encode.cpp (json_encode_char):
* src/libs/libgroff/string.cpp (string::json_length):
* src/libs/libgroff/symbol.cpp (symbol::json_length): Restructure
control flow to handle them before other printable characters.
Problem introduced yesterday with landing of new JSON encoding feature.
---
ChangeLog | 14 ++++++++++++++
src/libs/libgroff/json_encode.cpp | 14 +++++++-------
src/libs/libgroff/string.cpp | 9 ++++-----
src/libs/libgroff/symbol.cpp | 9 ++++-----
4 files changed, 29 insertions(+), 17 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index cdf7d6500..b072ea14a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,17 @@
+2025-03-16 G. Branden Robinson <[email protected]>
+
+ [libgroff]: Fix logic error when encoding characters ", \, and /
+ as (or in) JSON strings.
+
+ * src/libs/libgroff/json_encode.cpp (json_encode_char):
+ * src/libs/libgroff/string.cpp (string::json_length):
+ * src/libs/libgroff/symbol.cpp (symbol::json_length):
+ Restructure control flow to handle them before other printable
+ characters.
+
+ Problem introduced yesterday with landing of new JSON encoding
+ feature.
+
2025-03-15 G. Branden Robinson <[email protected]>
* src/roff/troff/input.cpp (macro:json_dump): A `macro` object
diff --git a/src/libs/libgroff/json_encode.cpp
b/src/libs/libgroff/json_encode.cpp
index a3bc47de7..a4256771b 100644
--- a/src/libs/libgroff/json_encode.cpp
+++ b/src/libs/libgroff/json_encode.cpp
@@ -26,21 +26,21 @@ along with this program. If not, see
<http://www.gnu.org/licenses/>. */
#include "json-encode.h" // json_char
// Return pointer to mutable buffer representing character `c` as a JSON
-// string. The caller must free the buffer.
+// string (without bracketing `"`s). The caller must free the buffer.
json_char json_encode_char(unsigned char c)
{
assert(c < 256);
json_char jc;
- // Handle the most common cases first.
- if (csprint(c)) {
- jc.len = 1;
- jc.buf[0] = c;
- }
- else if (('"' == c) || ('\\' == c) || ('/' == c)) {
+ // These printable characters require escaping.
+ if (('"' == c) || ('\\' == c) || ('/' == c)) {
jc.len = 2;
jc.buf[0] = '\\';
jc.buf[1] = c;
}
+ else if (csprint(c)) {
+ jc.len = 1;
+ jc.buf[0] = c;
+ }
else if ('\b' == c) {
jc.len = 2;
jc.buf[0] = '\\';
diff --git a/src/libs/libgroff/string.cpp b/src/libs/libgroff/string.cpp
index 739fdfe05..05f2c442c 100644
--- a/src/libs/libgroff/string.cpp
+++ b/src/libs/libgroff/string.cpp
@@ -333,15 +333,14 @@ size_t string::json_length() const
int nextrachars = 2; // leading and trailing double quotes
for (size_t i = 0; i < n; i++) {
ch = p[i];
- // Handle the most common cases first.
if (ch < 128) {
- if (csprint(ch))
+ // These printable characters require escaping.
+ if (('"' == ch) || ('\\' == ch) || ('/' == ch))
+ nextrachars++;
+ else if (csprint(ch))
;
else
switch (ch) {
- case '"':
- case '\\':
- case '/':
case '\b':
case '\f':
case '\n':
diff --git a/src/libs/libgroff/symbol.cpp b/src/libs/libgroff/symbol.cpp
index 1ed91f359..e6e1e9f29 100644
--- a/src/libs/libgroff/symbol.cpp
+++ b/src/libs/libgroff/symbol.cpp
@@ -172,15 +172,14 @@ size_t symbol::json_length() const
int nextrachars = 2; // leading and trailing double quotes
for (size_t i = 0; p[i] != '\0'; i++, len++) {
ch = p[i];
- // Handle the most common cases first.
if (ch < 128) {
- if (csprint(ch))
+ // These printable characters require escaping.
+ if (('"' == ch) || ('\\' == ch) || ('/' == ch))
+ nextrachars++;
+ else if (csprint(ch))
;
else
switch (ch) {
- case '"':
- case '\\':
- case '/':
case '\b':
case '\f':
case '\n':
_______________________________________________
groff-commit mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/groff-commit