URL:
  <https://savannah.gnu.org/bugs/?59676>

                 Summary: [PATCH] grog/subs.pl: Don't use "exists" on array
values
                 Project: GNU troff
            Submitted by: bjarniig
            Submitted on: Sun 13 Dec 2020 07:24:14 PM UTC
                Category: None
                Severity: 3 - Normal
              Item Group: Incorrect behaviour
                  Status: None
                 Privacy: Public
             Assigned to: None
             Open/Closed: Open
         Discussion Lock: Any
         Planned Release: None

    _______________________________________________________

Details:

src/roff/grog/subs.pl: Don't use "exists" on array values

1) perlfunc(1) warns against using "exists" on array values.
Use "defined" instead.

  This avoids the use of defined macros as indicators for a
particular macro package.

  The ".TL" macro for 'ms'-files is thus available as an indicator.

  This is a correction of patch #59664, 3th item.

2) Remove inline comments.

  Otherwise the comment can be included in the name of a defined macro.
  Seen in the file "doc/meref.me" with the line

.de TL                  \" *** title line

3) Do not remove the beginning line of a macro definition (.de...).

  Defined macros must be excluded from being used as indicators for a
particular macro package.

  A correction of the patch in #59622.

Signed-off-by: Bjarni Ingi Gislason <bjarn...@rhi.hi.is>
---
 src/roff/grog/subs.pl | 18 ++++++++++--------
 1 file changed, 10 insertions(+), 8 deletions(-)

diff --git a/src/roff/grog/subs.pl b/src/roff/grog/subs.pl
index 54d195b5..db5bc10a 100644
--- a/src/roff/grog/subs.pl
+++ b/src/roff/grog/subs.pl
@@ -563,16 +563,18 @@ sub do_line {
 
   $line =~ s/^['.]\s*/./;      # let only a dot as leading character,
                                # remove spaces after the leading dot
+  $line =~ s/\\".*$//;         # remove inline comments (for '.de ...' lines)
   $line =~ s/\s+$//;           # remove final spaces
 
   return if ( $line =~ /^\.$/ );       # ignore .
   return if ( $line =~ /^\.\.$/ );     # ignore ..
 
   # Ignore "Standard preamble" from perl module "Pod::Man"
-  # Keep commands, that are in me files
+  # Keep macros in me files and defined macros
   if ( $line !~ /^\.(
                    [ilnp]p|
-                   sh
+                   sh|
+                   de1?\s+.*
                  )$/x ) {
     return if ( $line =~ /^\.[[:lower:]]/ );
     return if ( $line =~ /^\.\s*\\}/ );
@@ -618,14 +620,14 @@ sub do_line {
     # this line is a macro definition, add it to %macros
     my $macro = $line;
     $macro =~ s/^\.de1?\s+(\w+)\W*/.$1/;
-    return if ( exists $macros{$macro} );
+    return if ( defined $macros{$macro} );
     $macros{$macro} = 1;
     return;
   }
 
 
   # if line command is a defined macro, just ignore this line
-  return if ( exists $macros{$command} );
+  return if ( defined $macros{$command} );
 
 
   ######################################################################
@@ -766,10 +768,10 @@ sub do_line {
     $Groff{'NH'}++;            # for ms
     return;
   }
-#  if ( $command =~ /^\.TL$/ ) {
-#    $Groff{'TL'}++;           # for ms
-#    return;
-#  }
+  if ( $command =~ /^\.TL$/ ) {
+    $Groff{'TL'}++;            # for ms
+    return;
+  }
   if ( $command =~ /^\.XP$/ ) {
     $Groff{'XP'}++;            # for ms
     return;
-- 
2.29.2






    _______________________________________________________

Reply to this item at:

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

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


Reply via email to