texinfo-commits
[Top][All Lists]
Advanced

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

texinfo ChangeLog doc/texinfo.tex


From: Karl Berry
Subject: texinfo ChangeLog doc/texinfo.tex
Date: Fri, 23 Sep 2011 16:43:22 +0000

CVSROOT:        /sources/texinfo
Module name:    texinfo
Changes by:     Karl Berry <karl>       11/09/23 16:43:22

Modified files:
        .              : ChangeLog 
        doc            : texinfo.tex 

Log message:
        handle macros with >= 10 args, from Vincent Belaiche

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/texinfo/ChangeLog?cvsroot=texinfo&r1=1.1252&r2=1.1253
http://cvs.savannah.gnu.org/viewcvs/texinfo/doc/texinfo.tex?cvsroot=texinfo&r1=1.349&r2=1.350

Patches:
Index: ChangeLog
===================================================================
RCS file: /sources/texinfo/texinfo/ChangeLog,v
retrieving revision 1.1252
retrieving revision 1.1253
diff -u -b -r1.1252 -r1.1253
--- ChangeLog   21 Sep 2011 16:21:34 -0000      1.1252
+++ ChangeLog   23 Sep 2011 16:43:22 -0000      1.1253
@@ -1,6 +1,20 @@
+2011-09-23  Vincent address@hidden  <address@hidden>
+
+       * doc/texinfo.tex (\macroxxx): complain if more than 256 args
+       and non-etex.
+       (\parsemargdef, \defmacro): handle >= 10 args.
+       Processing if <10 args is unchanged.
+       (\parsemmanyargdef, \endargs@, \nil@, \nilm@, \nillm@,
+        \getargvals@, \getargvals@@, \push@, \macvalstoargs@,
+        \macargexpandinbody@, \putargsintokens@,
+        \texisavetoksstackpoint, \texirestoretoksstackpoint,
+        \texinonouternewtoks, \setemptyargvalues@,
+        \setemptyargvaluesparser@, \pop@, \longpop@): new macros.
+       (\texiatcatcode): used to save and restore.
+
 2011-09-21  Karl Berry  <address@hidden>
 
-       * doc/texinfo.tex: replace %% with % for comments.      
+       * doc/texinfo.tex: consistently use % rather than %% for comments.
 
 2011-09-18  Karl Berry  <address@hidden>
 

Index: doc/texinfo.tex
===================================================================
RCS file: /sources/texinfo/texinfo/doc/texinfo.tex,v
retrieving revision 1.349
retrieving revision 1.350
diff -u -b -r1.349 -r1.350
--- doc/texinfo.tex     21 Sep 2011 16:21:34 -0000      1.349
+++ doc/texinfo.tex     23 Sep 2011 16:43:22 -0000      1.350
@@ -3,7 +3,7 @@
 % Load plain if necessary, i.e., if running under initex.
 \expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi
 %
-\def\texinfoversion{2011-09-21.09}
+\def\texinfoversion{2011-09-23.09}
 %
 % Copyright 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995,
 % 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
@@ -7247,9 +7247,15 @@
 \def\macroxxx#1{%
   \getargs{#1}% now \macname is the macname and \argl the arglist
   \ifx\argl\empty       % no arguments
-     \paramno=0
+     \paramno=0\relax
   \else
      \expandafter\parsemargdef \argl;%
+     \if\paramno>256\relax
+       \ifx\eTeXversion\thisisundefined
+         \errhelp = \EMsimple
+         \errmessage{You need eTeX to compile a file with macros with more 
than 256 arguments}
+       \fi
+     \fi
   \fi
   \if1\csname ismacro.\the\macname\endcsname
      \message{Warning: redefining \the\macname}%
@@ -7299,9 +7305,17 @@
 \def\getmacname#1 #2\relax{\macname={#1}}
 \def\getmacargs#1{\def\argl{#1}}
 
+% For macro processing make @ a letter so that we can make Texinfo private 
macro names.
address@hidden
+\catcode address@hidden
+
 % Parse the optional {params} list.  Set up \paramno and \paramlist
-% so \defmacro knows what to do.  Define \macarg.blah for each blah
-% in the params list to be ##N where N is the position in that list.
+% so \defmacro knows what to do.  Define \macarg.BLAH for each BLAH
+% in the params list to some hook where the argument si to be expanded.  If
+% there are less than 10 arguments that hook is to be replaced by ##N where N
+% is the position in that list, that is to say the macro arguments are to be
+% defined `a la TeX in the macro body.  
+%
 % That gets used by \mbodybackslash (above).
 %
 % We need to get `macro parameter char #' into several definitions.
@@ -7311,12 +7325,33 @@
 %
 % The same technique is used to protect \eatspaces till just before
 % the macro is used.
-
+%
+% If there are 10 or more arguments, a different technique is used, where the
+% hook remains in the body, and when macro is to be expanded the body is
+% processed again to replace the arguments.
+%
+% In that case, the hook is \the\toks N-1, and we simply set \toks N-1 to the
+% argument N value and then \edef  the body (nothing else will expand because 
of
+% the catcode regime underwhich the body was input).
+%
+% If you compile with TeX (not eTeX), and you have macros with 10 or more
+% arguments, you need that no macro has more than 256 arguments, otherwise an
+% error is produced.
 \def\parsemargdef#1;{%
   \paramno=0\def\paramlist{}%
   \let\hash\relax
   \let\xeatspaces\relax
   \parsemargdefxxx#1,;,%
+  % In case that there are 10 or more arguments we parse again the arguments
+  % list to set new definitions for the \macarg.BLAH macros corresponding to
+  % each BLAH argument. It was anyhow needed to parse already once this list
+  % in order to count the arguments, and as macros with at most 9 arguments
+  % are by far more frequent than macro with 10 or more arguments, defining
+  % twice the \macarg.BLAH macros does not cost too much processing power.
+  \ifnum\paramno<10\relax\else
+    \paramno0\relax
+    \parsemmanyargdef@@#1,;,% 10 or more arguments
+  \fi
 }
 \def\parsemargdefxxx#1,{%
   \if#1;\let\next=\relax
@@ -7327,16 +7362,205 @@
     \edef\paramlist{\paramlist\hash\the\paramno,}%
   \fi\next}
 
+\def\parsemmanyargdef@@#1,{%
+  \if#1;\let\next=\relax
+  \else 
+    \let\next=\parsemmanyargdef@@
+    \edef\tempb{\eatspaces{#1}}%
+    \expandafter\def\expandafter\tempa
+       \expandafter{\csname macarg.\tempb\endcsname}%
+    % Note that we need some extra \noexpand\noexpand, this is because we
+    % don't want \the  to be expanded in the \parsermacbody  as it uses an
+    % \xdef .
+    \expandafter\edef\tempa
+      {\noexpand\noexpand\noexpand\the\toks\the\paramno}%
+    \advance\paramno by 1\relax
+  \fi\next}
+
 % These two commands read recursive and nonrecursive macro bodies.
 % (They're different since rec and nonrec macros end differently.)
 %
+
+\catcode address@hidden
 address@hidden macro%
 {\xdef\temp{\eatcr{#1}}\endgroup\defmacro}%
 address@hidden rmacro%
 {\xdef\temp{\eatcr{#1}}\endgroup\defmacro}%
+\catcode address@hidden
 
-% This defines the macro itself. There are six cases: recursive and
-% nonrecursive macros of zero, one, and many arguments.
address@hidden
address@hidden
address@hidden@}%
address@hidden@}%
+
+% This macro is expanded during the Texinfo macro expansion, not during its
+% definition.  It gets all the arguments values and assigns them to macros
+% macarg.ARGNAME
+%
+% #1 is the macro name
+% #2 is the list of argument names
+% #3 is the list of argument values
address@hidden
+  address@hidden
+  address@hidden Need to keep a copy for parameter expansion.
+  \def\paramlist{#2,address@hidden
+  \def\macroname{#1}%
+  \begingroup
+  \macroargctxt
+  \def\argvaluelist{#3,address@hidden
+  address@hidden
+  address@hidden
+    \setemptyargvalues@
+  \else
+    \getargvals@@
+  \fi
+}
+
+% 
+\def\getargvals@@{%
+  \ifx\paramlist\nilm@
+      % Some sanity check needed here that \argvaluelist is also empty.
+      \ifx\argvaluelist\nillm@
+      \else
+        \errhelp = \EMsimple
+        \errmessage{Too many arguments in macro `\macroname'!}%
+      \fi
+      \let\next\macargexpandinbody@
+  \else
+    \ifx\argvaluelist\nillm@
+       % No more arguments values passed to macro.  Set remaining named-arg
+       % macros to empty.
+       \let\next\setemptyargvalues@
+    \else
+      % pop current arg name into address@hidden
+      address@hidden@address@hidden@}%
+      address@hidden
+       % pop current argument value into address@hidden
+      address@hidden@address@hidden@}%
+      address@hidden
+       % Here address@hidden is the current arg name and address@hidden is the 
current arg value.
+       % First place the new argument macro definition into address@hidden
+       address@hidden
+       \expandafter\let\csname address@hidden
+       address@hidden
+         \csname address@hidden
+       address@hidden@tempe{\the\macname}}%
+       address@hidden@tempd\macargdeflist@
+       \let\next\getargvals@@
+    \fi
+  \fi
+  \next
+}
+
address@hidden
+  \expandafter\expandafter\expandafter\def
+  \expandafter\expandafter\expandafter#2%
+  \expandafter\expandafter\expandafter{%
+  \expandafter#1#2}%
+}
+
+% Replace arguments by their values in the macro body, and place the result
+% in macro address@hidden
address@hidden
+  %  To do this we use the property that token registers that are \the'ed
+  % within an \edef  expand only once. So we are going to place all argument
+  % values into respective token registers.
+  %
+  % First we save the token context, and initialize argument numbering.
+  \begingroup
+    \paramno0\relax
+    % Then, for each argument number #N, we place the corresponding argument
+    % value into a new token list register \toks#N
+    address@hidden@,;,%
+    % Then, we expand the body so that argument are replaced by their
+    % values. The trick for values not to be expanded themselves is that they
+    % are within tokens and that tokens expand only once in an \edef .
+    address@hidden mac.\macroname .body\endcsname}%
+    % Now we restore the token stack pointer to free the token list registers
+    % which we have used, but we make sure that expanded body is saved after
+    % group.
+    \expandafter
+  \endgroup
+  address@hidden@tempc}%
+  }
+
address@hidden 
+  %% Define the named-macro outside of this group and then close this group. 
+  \expandafter
+  \endgroup
+  \macargdeflist@
+  % First the replace in body the macro arguments by their values, the result
+  % is in address@hidden .
+  \macvalstoargs@
+  % Then we point at the \norecurse or \gobble (for recursive) macro value
+  % with address@hidden .
+  address@hidden mac.\macroname .recurse\endcsname
+  % Depending on whether it is recursive or not, we need some tailing
+  % \egroup .
+  address@hidden
+     address@hidden
+  \else
+     address@hidden
+  \fi
+  % And now we do the real job:
+  address@hidden@address@hidden@tempc}%
+  address@hidden
+}
+
address@hidden,{%
+  \if#1;\let\next\relax
+  \else
+    \let\next\putargsintokens@
+    % First we allocate the new token list register, and give it a temporary
+    % alias address@hidden .
+    address@hidden
+    % Then we place the argument value into that token list register.
+    address@hidden macarg.#1\endcsname
+    address@hidden@tempa}%
+    \advance\paramno by 1\relax
+  \fi
+  \next
+}
+
+% Save the token stack pointer into macro #1
address@hidden
+% Restore the token stack pointer from number in macro #1
address@hidden
+% newtoks that can be used non \outer .
+\def\texinonouternewtoks{\alloc@ 5\toks \toksdef address@hidden
+
+% Tailing missing arguments are set to empty
address@hidden
+  \ifx\paramlist\nilm@
+    \let\next\macargexpandinbody@
+  \else
+    address@hidden@
+    \let\next\setemptyargvalues@
+  \fi
+  \next
+}
+
address@hidden,address@hidden
+  address@hidden
+    \expandafter\def\csname macarg.#1\endcsname{}}%
+  address@hidden@tempa\macargdeflist@
+  \def\paramlist{#2}%
+}
+
+% #1 is the element target macro
+% #2 is the list macro
+% #3,#4\endargs@ is the list value
address@hidden,address@hidden
+   \def#1{#3}%
+   \def#2{#4}%
+}
address@hidden,address@hidden
+   \long\def#1{#3}%
+   \long\def#2{#4}%
+}
+
+% This defines a Texinfo @macro. There are eight cases: recursive and
+% nonrecursive macros of zero, one, up to nine, and many arguments.
 % Much magic with \expandafter here.
 % \xdef is used so that macro definitions will survive the file
 % they're defined in; @include reads the file inside a group.
@@ -7355,7 +7579,8 @@
          \expandafter\noexpand\csname\the\macname xxx\endcsname}%
       \expandafter\xdef\csname\the\macname xxx\endcsname##1{%
          \egroup\noexpand\scanmacro{\temp}}%
-    \else % many
+    \else
+      \ifnum\paramno<10\relax % at most 9
       \expandafter\xdef\csname\the\macname\endcsname{%
          \bgroup\noexpand\macroargctxt
          \noexpand\csname\the\macname xx\endcsname}%
@@ -7366,6 +7591,13 @@
       \expandafter\expandafter
         \csname\the\macname xxx\endcsname
           \paramlist{\egroup\noexpand\scanmacro{\temp}}%
+      \else % 10 or more
+        \expandafter\xdef\csname\the\macname\endcsname{%
+          address@hidden
+        }%    
+        \global\expandafter\let\csname mac.\the\macname .body\endcsname\temp
+        \global\expandafter\let\csname mac.\the\macname 
.recurse\endcsname\gobble
+      \fi
     \fi
   \else
     \ifcase\paramno
@@ -7382,7 +7614,8 @@
         \egroup
         \noexpand\norecurse{\the\macname}%
         \noexpand\scanmacro{\temp}\egroup}%
-    \else % many
+    \else % at most 9
+      \ifnum\paramno<10\relax
       \expandafter\xdef\csname\the\macname\endcsname{%
          \bgroup\noexpand\macroargctxt
          \expandafter\noexpand\csname\the\macname xx\endcsname}%
@@ -7396,9 +7629,18 @@
           \egroup
           \noexpand\norecurse{\the\macname}%
           \noexpand\scanmacro{\temp}\egroup}%
+      \else % 10 or more:
+        \expandafter\xdef\csname\the\macname\endcsname{%
+          address@hidden
+        }%
+        \global\expandafter\let\csname mac.\the\macname .body\endcsname\temp
+        \global\expandafter\let\csname mac.\the\macname 
.recurse\endcsname\norecurse
+      \fi
     \fi
   \fi}
 
+\catcode address@hidden
+
 \def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}}
 
 % \braceorline decides whether the next nonwhitespace character is a



reply via email to

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