groff-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Groff-commit] groff ChangeLog NEWS doc/groff.texinfo man/grof...


From: Werner LEMBERG
Subject: [Groff-commit] groff ChangeLog NEWS doc/groff.texinfo man/grof...
Date: Thu, 26 Oct 2006 19:39:07 +0000

CVSROOT:        /cvsroot/groff
Module name:    groff
Changes by:     Werner LEMBERG <wl>     06/10/26 19:39:07

Modified files:
        .              : ChangeLog NEWS 
        doc            : groff.texinfo 
        man            : groff.man groff_diff.man 
        src/roff/troff : input.cpp input.h 
        tmac           : trace.tmac 

Log message:
        Add `\%^' escape to handle the parameters to a macro as a string
        argument.
        
        * src/roff/troff/input.h (DOUBLE_QUOTE): New special character.
        
        * src/roff/troff/input.cpp (input_iterator, input_stack,
        macro_iterator): Add `space_follows_arg' member function.
        (macro_iterator::add_arg): Add parameter to set the `space_follows'
        flag.
        (arg_list): Add member `space_follows'.
        Update constructor and all callers.
        (decode_args): Store discarded double quotes.
        (interpolate_args): Handle DOUBLE_QUOTE.
        Add `\%^' escape.
        (get_copy, token::next, composite_glyph_name): Handle DOUBLE_QUOTE.
        
        * tmac/trace.tmac: Trace .nr, .ds, .ds1, .as, .as1.
        
        * docs/groff.texinfo (Parameters), man/groff.man,
        man/groff_diff.man, NEWS: Document it.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/groff/ChangeLog?cvsroot=groff&r1=1.996&r2=1.997
http://cvs.savannah.gnu.org/viewcvs/groff/NEWS?cvsroot=groff&r1=1.221&r2=1.222
http://cvs.savannah.gnu.org/viewcvs/groff/doc/groff.texinfo?cvsroot=groff&r1=1.250&r2=1.251
http://cvs.savannah.gnu.org/viewcvs/groff/man/groff.man?cvsroot=groff&r1=1.82&r2=1.83
http://cvs.savannah.gnu.org/viewcvs/groff/man/groff_diff.man?cvsroot=groff&r1=1.59&r2=1.60
http://cvs.savannah.gnu.org/viewcvs/groff/src/roff/troff/input.cpp?cvsroot=groff&r1=1.42&r2=1.43
http://cvs.savannah.gnu.org/viewcvs/groff/src/roff/troff/input.h?cvsroot=groff&r1=1.7&r2=1.8
http://cvs.savannah.gnu.org/viewcvs/groff/tmac/trace.tmac?cvsroot=groff&r1=1.9&r2=1.10

Patches:
Index: ChangeLog
===================================================================
RCS file: /cvsroot/groff/groff/ChangeLog,v
retrieving revision 1.996
retrieving revision 1.997
diff -u -b -r1.996 -r1.997
--- ChangeLog   24 Oct 2006 18:51:29 -0000      1.996
+++ ChangeLog   26 Oct 2006 19:39:07 -0000      1.997
@@ -1,3 +1,26 @@
+2006-10-26  Werner LEMBERG  <address@hidden>
+
+       Add `\%^' escape to handle the parameters to a macro as a string
+       argument.
+
+       * src/roff/troff/input.h (DOUBLE_QUOTE): New special character.
+
+       * src/roff/troff/input.cpp (input_iterator, input_stack,
+       macro_iterator): Add `space_follows_arg' member function.
+       (macro_iterator::add_arg): Add parameter to set the `space_follows'
+       flag.
+       (arg_list): Add member `space_follows'.
+       Update constructor and all callers.
+       (decode_args): Store discarded double quotes.
+       (interpolate_args): Handle DOUBLE_QUOTE.
+       Add `\%^' escape.
+       (get_copy, token::next, composite_glyph_name): Handle DOUBLE_QUOTE.
+
+       * tmac/trace.tmac: Trace .nr, .ds, .ds1, .as, .as1.
+
+       * docs/groff.texinfo (Parameters), man/groff.man,
+       man/groff_diff.man, NEWS: Document it.
+
 2006-10-24  Bernd Warken
 
        * Makefile.in (NOMAKEDIRS): Add groffer subdirectories.

Index: NEWS
===================================================================
RCS file: /cvsroot/groff/groff/NEWS,v
retrieving revision 1.221
retrieving revision 1.222
diff -u -b -r1.221 -r1.222
--- NEWS        2 Sep 2006 21:39:33 -0000       1.221
+++ NEWS        26 Oct 2006 19:39:07 -0000      1.222
@@ -57,6 +57,10 @@
   environment, then iterates through all of the known environments, printing
   each except the one that is current.
 
+o A new escape `\$^' has been added.  It represents the parameters of a
+  macro as if they were an argument to the `ds' request.  This is used by
+  `trace.tmac'.
+
 Pic
 ---
 
@@ -75,7 +79,6 @@
 
 o New option `-c' to output more font information as comments.
 
-
 Macro Packages
 --------------
 
@@ -83,6 +86,7 @@
   DragonFly OS.
 
 o -mtrace now shows whether a macro has been called as .foo or as 'foo.
+  It also traces calls to the `nr', `ds', `ds1', `as', and `as1' requests.
 
 o The PSPIC macro now works with all devices (producing a hollow
   rectangle on devices which don't support inclusion of PS images) and

Index: doc/groff.texinfo
===================================================================
RCS file: /cvsroot/groff/groff/doc/groff.texinfo,v
retrieving revision 1.250
retrieving revision 1.251
diff -u -b -r1.250 -r1.251
--- doc/groff.texinfo   23 Oct 2006 09:29:44 -0000      1.250
+++ doc/groff.texinfo   26 Oct 2006 19:39:07 -0000      1.251
@@ -11248,6 +11248,30 @@
 is preserved (see @ref{Request and Macro Arguments}).
 @endDefesc
 
address@hidden {\\$^, , , }
+Handle the parameters of a macro as if they were an argument to the
address@hidden or similar requests.
+
address@hidden
+.de foo
+.  tm $1=`\\$1'
+.  tm $2=`\\$2'
+.  tm $*=`\\$*'
+.  tm $@@=`\\$@@'
+.  tm $^=`\\$^'
+..
+.foo " This is a "test"
+    @result{} $1=` This is a '
+    @result{} $2=`test"'
+    @result{} $*=` This is a  test"'
+    @result{} $@@=`" This is a " "test""'
+    @result{} $^=`" This is a "test"'
address@hidden
+
+This escape is useful mainly for macro packages like @file{trace.tmac} which
+redefines some requests and macros for debugging purposes.
address@hidden
+
 @Defesc {\\$0, , , }
 @cindex macro name register (@code{\$0})
 @cindex @code{als} request, and @code{\$0}

Index: man/groff.man
===================================================================
RCS file: /cvsroot/groff/groff/man/groff.man,v
retrieving revision 1.82
retrieving revision 1.83
diff -u -b -r1.82 -r1.83
--- man/groff.man       2 Sep 2006 21:39:34 -0000       1.82
+++ man/groff.man       26 Oct 2006 19:39:07 -0000      1.83
@@ -2,7 +2,7 @@
 .ig
 groff.man
 
-Last update: 1 Sep 2006
+Last update: 26 Oct 2006
 
 This file is part of groff, the GNU roff type-setting system.
 
@@ -2516,6 +2516,12 @@
 In a macro or string, the concatenation of all the arguments with each
 surrounded by double quotes, and separated by spaces.
 .
+.ESC $^
+In a macro, the representation of all parameters as if they were an
+argument to the
+.request ds
+request.
+.
 .\" --------- escaped characters ---------
 .
 .ESC \[rs]

Index: man/groff_diff.man
===================================================================
RCS file: /cvsroot/groff/groff/man/groff_diff.man,v
retrieving revision 1.59
retrieving revision 1.60
diff -u -b -r1.59 -r1.60
--- man/groff_diff.man  2 Sep 2006 21:39:34 -0000       1.59
+++ man/groff_diff.man  26 Oct 2006 19:39:07 -0000      1.60
@@ -3,7 +3,7 @@
 .ig
 groff_diff.man
 
-Last update : 1 Sep 2006
+Last update : 26 Oct 2006
 
 This file is part of groff, the GNU roff type-setting system.
 It is the source of the man-page groff_diff(7).
@@ -697,6 +697,13 @@
 surrounded by double quotes, and separated by spaces.
 .
 .TP
+.B \[rs]$^
+In a macro, the representation of all parameters as if they were an
+argument to the
+.B ds
+request.
+.
+.TP
 .BI \[rs]$( nn
 .TQ
 .BI \[rs]$[ nnn ]

Index: src/roff/troff/input.cpp
===================================================================
RCS file: /cvsroot/groff/groff/src/roff/troff/input.cpp,v
retrieving revision 1.42
retrieving revision 1.43
diff -u -b -r1.42 -r1.43
--- src/roff/troff/input.cpp    10 Sep 2006 08:34:37 -0000      1.42
+++ src/roff/troff/input.cpp    26 Oct 2006 19:39:07 -0000      1.43
@@ -217,6 +217,7 @@
   virtual int has_args() { return 0; }
   virtual int nargs() { return 0; }
   virtual input_iterator *get_arg(int) { return 0; }
+  virtual int space_follows_arg(int) { return 0; }
   virtual int get_break_flag() { return 0; }
   virtual int get_location(int, const char **, int *) { return 0; }
   virtual void backtrace() {}
@@ -417,6 +418,7 @@
   static int peek();
   static void push(input_iterator *);
   static input_iterator *get_arg(int);
+  static int space_follows_arg(int);
   static int get_break_flag();
   static int nargs();
   static int get_location(int, const char **, int *);
@@ -624,6 +626,15 @@
   return 0;
 }
 
+int input_stack::space_follows_arg(int i)
+{
+  input_iterator *p;
+  for (p = top; p != 0; p = p->next)
+    if (p->has_args())
+      return p->space_follows_arg(i);
+  return 0;
+}
+
 int input_stack::get_break_flag()
 {
   return top->get_break_flag();
@@ -955,6 +966,8 @@
       input_stack::decrease_level();
       continue;
     }
+    if (c == DOUBLE_QUOTE)
+      continue;
     if (c == ESCAPE_NEWLINE) {
       if (defining)
        return c;
@@ -1707,6 +1720,8 @@
       case END_QUOTE:
        input_stack::decrease_level();
        continue;
+      case DOUBLE_QUOTE:
+       continue;
       case EOF:
        type = TOKEN_EOF;
        return;
@@ -3577,12 +3592,13 @@
 
 struct arg_list {
   macro mac;
+  int space_follows;
   arg_list *next;
-  arg_list(const macro &);
+  arg_list(const macro &, int);
   ~arg_list();
 };
 
-arg_list::arg_list(const macro &m) : mac(m), next(0)
+arg_list::arg_list(const macro &m, int s) : mac(m), space_follows(s), next(0)
 {
 }
 
@@ -3599,11 +3615,12 @@
   macro_iterator();
   ~macro_iterator();
   int has_args() { return 1; }
-  input_iterator *get_arg(int i);
+  input_iterator *get_arg(int);
+  int space_follows_arg(int);
   int get_break_flag() { return with_break; }
   int nargs() { return argc; }
-  void add_arg(const macro &m);
-  void shift(int n);
+  void add_arg(const macro &, int);
+  void shift(int);
   int is_macro() { return 1; }
   int is_diversion();
 };
@@ -3624,12 +3641,26 @@
     return 0;
 }
 
-void macro_iterator::add_arg(const macro &m)
+int macro_iterator::space_follows_arg(int i)
+{
+  if (i > 0 && i <= argc) {
+    arg_list *p = args;
+    for (int j = 1; j < i; j++) {
+      assert(p != 0);
+      p = p->next;
+    }
+    return p->space_follows;
+  }
+  else
+    return 0;
+}
+
+void macro_iterator::add_arg(const macro &m, int s)
 {
   arg_list **p;
   for (p = &args; *p; p = &((*p)->next))
     ;
-  *p = new arg_list(m);
+  *p = new arg_list(m, s);
   ++argc;
 }
 
@@ -3729,15 +3760,18 @@
       macro arg;
       int quote_input_level = 0;
       int done_tab_warning = 0;
+      arg.append(compatible_flag ? PUSH_COMP_MODE : PUSH_GROFF_MODE);
+      // we store discarded double quotes for \$^
       if (c == '"') {
+       arg.append(DOUBLE_QUOTE);
        quote_input_level = input_stack::get_level();
        c = get_copy(&n);
       }
-      arg.append(compatible_flag ? PUSH_COMP_MODE : PUSH_GROFF_MODE);
       while (c != EOF && c != '\n' && !(c == ' ' && quote_input_level == 0)) {
        if (quote_input_level > 0 && c == '"'
            && (compatible_flag
                || input_stack::get_level() == quote_input_level)) {
+         arg.append(DOUBLE_QUOTE);
          c = get_copy(&n);
          if (c == '"') {
            arg.append(c);
@@ -3760,7 +3794,7 @@
        }
       }
       arg.append(POP_GROFFCOMP_MODE);
-      mi->add_arg(arg);
+      mi->add_arg(arg, (c == ' '));
     }
   }
 }
@@ -3811,7 +3845,7 @@
        c = get_copy(&n);
       }
     }
-    mi->add_arg(arg);
+    mi->add_arg(arg, (c == ' '));
   }
 }
 
@@ -3917,6 +3951,7 @@
     gl.clear();
     int c;
     while ((c = p->get(0)) != EOF)
+      if (c != DOUBLE_QUOTE)
       gl += c;
     gl += '\0';
     const char *u = glyph_name_to_unicode(gl.contents());
@@ -4233,6 +4268,7 @@
       input_iterator *p = input_stack::get_arg(i);
       int c;
       while ((c = p->get(0)) != EOF)
+       if (c != DOUBLE_QUOTE)
        args += c;
       if (i != limit)
        args += ' ';
@@ -4251,6 +4287,7 @@
       input_iterator *p = input_stack::get_arg(i);
       int c;
       while ((c = p->get(0)) != EOF)
+       if (c != DOUBLE_QUOTE)
        args += c;
       args += END_QUOTE;
       args += '"';
@@ -4262,6 +4299,25 @@
       input_stack::push(make_temp_iterator(args.contents()));
     }
   }
+  else if (s[0] == '^' && s[1] == '\0') {
+    int limit = input_stack::nargs();
+    string args;
+    int c = input_stack::peek();
+    for (int i = 1; i <= limit; i++) {
+      input_iterator *p = input_stack::get_arg(i);
+      while ((c = p->get(0)) != EOF) {
+       if (c == DOUBLE_QUOTE)
+         c = '"';
+       args += c;
+      }
+      if (input_stack::space_follows_arg(i))
+       args += ' ';
+    }
+    if (limit > 0) {
+      args += '\0';
+      input_stack::push(make_temp_iterator(args.contents()));
+    }
+  }
   else {
     const char *p;
     for (p = s; *p && csdigit(*p); p++)

Index: src/roff/troff/input.h
===================================================================
RCS file: /cvsroot/groff/groff/src/roff/troff/input.h,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -b -r1.7 -r1.8
--- src/roff/troff/input.h      26 May 2005 21:02:01 -0000      1.7
+++ src/roff/troff/input.h      26 Oct 2006 19:39:07 -0000      1.8
@@ -1,5 +1,5 @@
 // -*- C++ -*-
-/* Copyright (C) 2001, 2004 Free Software Foundation, Inc.
+/* Copyright (C) 2001, 2004, 2006 Free Software Foundation, Inc.
      Written by James Clark (address@hidden)
 
 This file is part of groff.
@@ -59,6 +59,7 @@
 const int POP_GROFFCOMP_MODE = 0213;
 const int BEGIN_QUOTE = 0214;
 const int END_QUOTE = 0215;
+const int DOUBLE_QUOTE = 0216;
 
 #else /* IS_EBCDIC_HOST */
 
@@ -98,6 +99,7 @@
 const int POP_GROFFCOMP_MODE = 073;
 const int BEGIN_QUOTE = 074;
 const int END_QUOTE = 075;
+const int DOUBLE_QUOTE = 076;
 
 #endif /* IS_EBCDIC_HOST */
 

Index: tmac/trace.tmac
===================================================================
RCS file: /cvsroot/groff/groff/tmac/trace.tmac,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -b -r1.9 -r1.10
--- tmac/trace.tmac     23 Oct 2006 07:59:54 -0000      1.9
+++ tmac/trace.tmac     26 Oct 2006 19:39:07 -0000      1.10
@@ -9,30 +9,61 @@
 .
 .eo
 .
+.rn nr !!nr
+.
+.de nr
+.  do tm1 "\*[!!!sp]*** .nr \$*
+.  !!nr \$*
+..
+.
+.rn ds !!ds
+.rn ds1 !!ds1
+.rn as !!as
+.rn as1 !!as1
+.
+.de ds
+.  do tm1 "\*[!!!sp]*** .ds \$^
+.  do !!ds \$^\"
+..
+.
+.de ds1
+.  do tm1 "\*[!!!sp]*** .ds1 \$^
+.  do !!ds1 \$^\"
+..
+.
+.de as
+.  do tm1 "\*[!!!sp]*** .as \$^
+.  do !!as \$^\"
+..
+.
+.de as1
+.  do tm1 "\*[!!!sp]*** .as1 \$^
+.  do !!as1 \$^\"
+..
+.
 .rn de !!de
 .rn de1 !!de1
 .
-.
 .!!de de
 .  do ecs
 .  ec
 .  do !!de \$1
-.    do ie \\n[.br] .ds !!!br .\"
-.    el .do ds !!!br '\"
+.    do ie \\n[.br] .!!ds !!!br .\"
+.    el .do !!ds !!!br '\"
 .    ie "\$1"\\$0" .do tm1 "\\*[!!!sp]*** de trace enter: \\*[!!!br]\\$0 \\$@
 .    el .do tm1 "\\*[!!!sp]*** de trace enter \$1: \\*[!!!br]\\$0 \\$@
-.    do as !!!sp " \"
+.    do !!as !!!sp " \"
 .    do ie \\n[.br] .do !!\$1 \\$@
 .    el 'do !!\$1 \\$@
 .    do substring !!!sp 1
-.    do ie \\n[.br] .ds !!!br .\"
-.    el .do ds !!!br '\"
+.    do ie \\n[.br] .!!ds !!!br .\"
+.    el .do !!ds !!!br '\"
 .    ie "\$1"\\$0" .do tm1 "\\*[!!!sp]*** trace exit: \\*[!!!br]\\$0 \\$@
 .    el .do tm1 "\\*[!!!sp]*** trace exit \$1: \\*[!!!br]\\$0 \\$@
 \..
 .
-.  do ds !!d1 !!\$1
-.  do ds !!d2 \$2
+.  do !!ds !!d1 !!\$1
+.  do !!ds !!d2 \$2
 .
 .  do ecr
 .  do dei !!d1 !!d2
@@ -42,22 +73,22 @@
 .  do ecs
 .  ec
 .  do !!de \$1
-.    do ie \\n[.br] .ds !!!br .\"
-.    el .do ds !!!br '\"
+.    do ie \\n[.br] .!!ds !!!br .\"
+.    el .do !!ds !!!br '\"
 .    ie "\$1"\\$0" .do tm1 "\\*[!!!sp]*** de1 trace enter: \\*[!!!br]\\$0 \\$@
 .    el .do tm1 "\\*[!!!sp]*** de1 trace enter \$1: \\*[!!!br]\\$0 \\$@
-.    do as !!!sp " \"
+.    do !!as !!!sp " \"
 .    do ie \\n[.br] .do !!\$1 \\$@
 .    el 'do !!\$1 \\$@
 .    do substring !!!sp 1
-.    do ie \\n[.br] .ds !!!br .\"
-.    el .do ds !!!br '\"
+.    do ie \\n[.br] .!!ds !!!br .\"
+.    el .do !!ds !!!br '\"
 .    ie "\$1"\\$0" .do tm1 "\\*[!!!sp]*** trace exit: \\*[!!!br]\\$0 \\$@
 .    el .do tm1 "\\*[!!!sp]*** trace exit \$1: \\*[!!!br]\\$0 \\$@
 \..
 .
-.  do ds !!d1 !!\$1
-.  do ds !!d2 \$2
+.  do !!ds !!d1 !!\$1
+.  do !!ds !!d2 \$2
 .
 .  do ecr
 .  do dei1 !!d1 !!d2
@@ -70,22 +101,22 @@
 .  do ecs
 .  ec
 .  do !!de \$1
-.    do ie \\n[.br] .ds !!!br .\"
-.    el .do ds !!!br '\"
+.    do ie \\n[.br] .!!ds !!!br .\"
+.    el .do !!ds !!!br '\"
 .    ie "\$1"\\$0" .do tm1 "\\*[!!!sp]*** am trace enter: \\*[!!!br]\\$0 \\$@
 .    el .do tm1 "\\*[!!!sp]*** am trace enter \$1: \\*[!!!br]\\$0 \\$@
-.    do as !!!sp " \"
+.    do !!as !!!sp " \"
 .    do ie \\n[.br] .do !!\$1 \\$@
 .    el 'do !!\$1 \\$@
 .    do substring !!!sp 1
-.    do ie \\n[.br] .ds !!!br .\"
-.    el .do ds !!!br '\"
+.    do ie \\n[.br] .!!ds !!!br .\"
+.    el .do !!ds !!!br '\"
 .    ie "\$1"\\$0" .do tm1 "\\*[!!!sp]*** trace exit: \\*[!!!br]\\$0 \\$@
 .    el .do tm1 "\\*[!!!sp]*** trace exit \$1: \\*[!!!br]\\$0 \\$@
 \..
 .
-.  do ds !!a1 !!\$1
-.  do ds !!a2 \$2
+.  do !!ds !!a1 !!\$1
+.  do !!ds !!a2 \$2
 .
 .  do ecr
 .  do ami !!a1 !!a2
@@ -95,22 +126,22 @@
 .  do ecs
 .  ec
 .  do !!de \$1
-.    do ie \\n[.br] .ds !!!br .\"
-.    el .do ds !!!br '\"
+.    do ie \\n[.br] .!!ds !!!br .\"
+.    el .do !!ds !!!br '\"
 .    ie "\$1"\\$0" .do tm1 "\\*[!!!sp]*** am1 trace enter: \\*[!!!br]\\$0 \\$@
 .    el .do tm1 "\\*[!!!sp]*** am1 trace enter \$1: \\*[!!!br]\\$0 \\$@
-.    do as !!!sp " \"
+.    do !!as !!!sp " \"
 .    do ie \\n[.br] .do !!\$1 \\$@
 .    el 'do !!\$1 \\$@
 .    do substring !!!sp 1
-.    do ie \\n[.br] .ds !!!br .\"
-.    el .do ds !!!br '\"
+.    do ie \\n[.br] .!!ds !!!br .\"
+.    el .do !!ds !!!br '\"
 .    ie "\$1"\\$0" .do tm1 "\\*[!!!sp]*** trace exit: \\*[!!!br]\\$0 \\$@
 .    el .do tm1 "\\*[!!!sp]*** trace exit \$1: \\*[!!!br]\\$0 \\$@
 \..
 .
-.  do ds !!a1 !!\$1
-.  do ds !!a2 \$2
+.  do !!ds !!a1 !!\$1
+.  do !!ds !!a2 \$2
 .
 .  do ecr
 .  do ami1 !!a1 !!a2




reply via email to

[Prev in Thread] Current Thread [Next in Thread]