Follow-up Comment #1, bug#65109 (group groff):

The following commit does not resolve the problem, but is adjacent to it, and
helps distinguish problems with composite characters that are independent of
the selected output device from those that arise because a device doesn't have
support for a (composite) glyph.


commit 6008b6b7aa2920035e09d1dea44d262d30391195
Author: G. Branden Robinson <g.branden.robin...@gmail.com>
Date:   Thu Jan 18 12:45:57 2024 -0600

    [troff]: Diagnose bogus composite char escapes.
    
    [troff]: Diagnose bogus composite character escape sequences.  That is,
    when a composite character escape sequence like \[a ~] has a bogus
    modifier (as opposed to base) character, meaning one that has not been
    defined as the source _or_ destination of a `composite` request, warn
    about it.  For instance, \[a $] is nonsense, barring a request like
    `.composite $ \[uFF00]`, which would map `$`, when used as a modifier
    character in a composite special character escape sequence, to U+FF00,
    which would be a modifier form of the dollar sign in an alternate
    universe.
    
    * src/roff/troff/input.cpp (is_codepoint_composite): New function
      searches `composite_dictionary` for the presence of the given
      four-digit hexadecimal string as a key _or_ value.
    
    * src/roff/troff/input.h: Expose foregoing function to other translation
      units.
    
    * src/roff/troff/node.cpp (make_glyph_node): Check input `charinfo` for
      a Unicode code point sequence, and if it contains one, call
      `valid_unicode_code_sequence()` to check it for validity.  Then,
      iterate through each code point after the first {the base character},
      and call `is_codepoint_composite()` on it.  Diagnose invalid composite
      character and return null pointer if validation fails.
    
    Input:
    .nf
    \[A a~]
    \[A ~]
    \[u0041_0301]
    \[u0041_007E] \" should fail because 007E is explicitly spacing
    \[u0041_0041] \" same reason, more obviously
    \[u0041_0301_0301] \" should fail, would have a different meaning
    \[u0041_007E_0301] \" both problems above
    
    groff 1.23.0 and earlier:
    $ groff -T ps -z EXPERIMENTS/composite_character_construction.groff
    troff:...:5: warning: special character 'u0041_007E' not defined
    troff:...:6: warning: special character 'u0041_0041' not defined
    troff:...:7: warning: special character 'u0041_0301_0301' not defined
    troff:...:8: warning: special character 'u0041_007E_0301' not defined
    $ groff -Tutf8 -z EXPERIMENTS/composite_character_construction.groff
    [no output due to Savannah #65109]
    
    Now:
    $ ./build/test-groff -T ps -z
EXPERIMENTS/composite_character_construction.groff
    troff:...:5: warning: special character 'u0041_007E' not defined
    troff:...:6: error: cannot format glyph: 'u0041_0041' is not a valid
composite character
    troff:...:7: warning: special character 'u0041_0301_0301' not defined
    troff:...:8: warning: special character 'u0041_007E_0301' not defined
    $ ./build/test-groff -T utf8 -z
EXPERIMENTS/composite_character_construction.groff
    troff:...:6: error: cannot format glyph: 'u0041_0041' is not a valid
composite character




    _______________________________________________________

Reply to this item at:

  <https://savannah.gnu.org/bugs/?65109>

_______________________________________________
Message sent via Savannah
https://savannah.gnu.org/


Reply via email to