Re: m4sugar speedups [was: Multi-Line Definitions]

Benoit SIGOURE <[email protected]>
Newsgroups gmane.comp.sysutils.autoconf.patches,gmane.comp.gnu.m4.general
Message-ID <[email protected]>
On Sep 30, 2007, at 5:48 AM, Eric Blake wrote:

> From b2dda0adc778b0d3004950048211289958da2abc Mon Sep 17 00:00:00 2001
> From: Eric Blake <[email protected]>
> Date: Sat, 29 Sep 2007 21:44:10 -0600
> Subject: [PATCH] Speed optimization: avoid m4 regex when other  
> algorithms work.
>
> * lib/m4sugar/m4sh.m4 (AS_LITERAL_IF): Rewrite without regex.
> (_AS_QUOTE_IFELSE): Likewise.
> * lib/m4sugar/m4sugar.m4 (m4_strip): Reduce from 3 to 2 regex.
> (m4_bpatsubsts): Split...
> (_m4_bpatsubsts): ...so that recursion can avoid patsubst on empty
> regex.
> (_m4_divert()): Define, to avoid m4 warning on `m4_divert'.
> (m4_qlen): Optimize on short strings, to avoid regex.
> (m4_sign): Avoid regex, and fix bug with `01' and `-0'.
> * lib/autoconf/general.m4 (AC_CACHE_VAL): Rewrite without regex.
> (AC_DEFINE_TRACE): Likewise.
>
> Signed-off-by: Eric Blake <[email protected]>
[...]
> @@ -1449,16 +1458,20 @@ m4_define([m4_flatten],
>  #
>  # Because we want to preserve active symbols, STRING must be  
> double-quoted.

Hmm if you changed [[$1]] to [$1 ], STRING no longer needs to be  
double quoted, right?

>  #
> -# Then notice the 2 last patterns: they are in charge of removing the
> +# First, notice that we guarantee trailing space.  Why?  Because  
> regex
> +# are greedy, and `.* ?' always groups the space into the .* portion.
> +# The algorithm is simpler by avoiding `?' at the end.  The algorithm
> +# correctly strips everything if STRING is just ` '.
> +#
> +# Then notice the second pattern: it is in charge of removing the
>  # leading/trailing spaces.  Why not just `[^ ]'?  Because they are
> -# applied to doubly quoted strings, i.e. more or less [[STRING]].  So
> -# if there is a leading space in STRING, then it is the *third*
> -# character, since there are two leading `['; equally for the last  
> pattern.
> +# applied to over-quoted strings, i.e. more or less [STRING], due
> +# to the limitations of m4_bpatsubsts.  So the leading space in  
> STRING
> +# is the *second* character; equally for the trailing space.
>  m4_define([m4_strip],
> -[m4_bpatsubsts([[$1]],
> +[m4_bpatsubsts([$1 ],
>  	       [[	 ]+], [ ],
> -	       [^\(..\) ],    [\1],
> -	       [ \(..\)$],    [\1])])
> +	       [^. ?\(.*\) .$], [[[\1]]])])
>
>


Nice work!

-- 
Benoit Sigoure aka Tsuna
EPITA Research and Development Laboratory
PGP.sig (application/pgp-signature, 186 B) - not displayed
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.