deri pushed a commit to branch deri-gropdf-ng in repository groff. commit a2b2d5526dca59e93d46019fa8625e6f4c5484d5 Author: Deri James <d...@chuzzlewit.myzen.co.uk> AuthorDate: Mon Jul 3 16:37:17 2023 +0100
Speculative additional request .stringhex. * src/roff/troff/input.cpp: Based on .stringup/down converts the contents of named string register to a hex string, two hex characters for each byte. In some situations you want to protect a string from being interpreted for its special characters (i.e. unicode), this achieves that. --- src/roff/troff/input.cpp | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/src/roff/troff/input.cpp b/src/roff/troff/input.cpp index 292ee7389..0c90a7451 100644 --- a/src/roff/troff/input.cpp +++ b/src/roff/troff/input.cpp @@ -4752,8 +4752,46 @@ void chop_macro() } enum case_xform_mode { STRING_UPCASE, STRING_DOWNCASE }; +const char * hex = "0123456789ABCDEF"; // Case-transform each byte of the string argument's contents. +void stringhex_request() +{ + symbol s = get_name(true /* required */); + if (s.is_null()) { + skip_line(); + return; + } + request_or_macro *p = lookup_request(s); + macro *m = p->to_macro(); + if (!m) { + error("cannot apply stringhex to a request ('%1')", + s.contents()); + skip_line(); + return; + } + string_iterator iter1(*m); + macro *mac = new macro; + int len = m->macro::length(); + for (int l = 0; l < len; l++) { + int nc, c = iter1.get(0); + if (c == PUSH_GROFF_MODE + || c == PUSH_COMP_MODE + || c == POP_GROFFCOMP_MODE) + mac->append(c); + else if (c == EOF) + break; + else { + nc = (int)hex[(c >> 4) & 0x0f]; + mac->append(nc); + nc = (int)hex[c & 0x0f]; + mac->append(nc); + } + } + request_dictionary.define(s, mac); + tok.next(); +} + void do_string_case_transform(case_xform_mode mode) { assert((mode == STRING_DOWNCASE) || (mode == STRING_UPCASE)); @@ -8435,6 +8473,7 @@ void init_input_requests() init_request("soquiet", source_quietly); init_request("spreadwarn", spreadwarn_request); init_request("stringdown", stringdown_request); + init_request("stringhex", stringhex_request); init_request("stringup", stringup_request); init_request("substring", substring_request); init_request("sy", system_request); _______________________________________________ Groff-commit mailing list Groff-commit@gnu.org https://lists.gnu.org/mailman/listinfo/groff-commit