Re: Bash-specific performance by avoiding sed

Pavel Raiskup <[email protected]>
Newsgroups gmane.comp.gnu.libtool.general
Message-ID <[email protected]>
On Monday 05 of October 2015 01:25:24 Pavel Raiskup wrote:
> On Monday 05 of October 2015 00:45:50 Pavel Raiskup wrote:
> > > should we test the size of the string first ?  i've written such raw shell 
> > > string parsing functions before, and once you hit a certain size (like 1k+ 
> > > iirc), forking out to sed is way faster, especially when running in multibyte 
> > > locales (like UTF8) which most people are doing nowadays.
> > > -mike
> > 
> > Well, that optimization would require (fast) strlen()-like construct.
> > Anyway, the vast majority of calls to func_quote () function will have
> > short ARG, and its complexity is still "just" linear.  We could optimize
> > later if that was a real issue.
> > 
> > I would like to propose solution based on Eric's one, without using of
> > '${VAR%.}' and '${VAR#.}' constructs -- sounds like this could be even
> > more portable while it keeps almost the same speed (if we can use += its
> > even faster).
> > 
> > I have yet a another patch trying to minimize option-parser overhead
> > (that is focused on the POV of Richard, but that needs to be cleaned up a
> > bit, I'll post hopefully tomorrow).
> > 
> > Any comment is welcome!
> 
> Re-attached (fixes for 'make syntax-check' and fixed one comment).

Hmm, one might-be-a-problem with this (catched by testsuite), when you
have:

  $ cat build-aux/test-quoting
  . `echo "$0" |${SED-sed} 's|[^/]*$||'`/funclib.sh
  # source this for "GNU m4" detection methods
  . `echo "$0" |${SED-sed} 's|[^/]*$||'`/extract-trace

  func_quote_for_eval "$@"
  echo "$func_quote_for_eval_result"

Then:

  $ ./build-aux/test-quoting '"a b"' # fine
  "\"a b\""

  $ ./build-aux/test-quoting '"*tool"' # broken
  ./build-aux/test-quoting '"*tool"'
  \"libtool\"

We would like to have an output \"*\".  I'm not aware of portable way
how to disable wildcard expansion in shell, and autoconf 'Shellology'
section haven't helped me.  In particular, the problem is here:

  x='a"[a-z]*"c'
  IFS='"'
  for i in $x; do # Here we wan't to disable wildcard expansion
    echo $i
  done

Any idea other than fallback to $sed_quote_subst in case of '*' or '['
exists in ARG?

Pavel


_______________________________________________
https://lists.gnu.org/mailman/listinfo/libtool
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.