<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 TRANSITIONAL//EN">
<HTML>
<HEAD>
  <META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=UTF-8">
  <META NAME="GENERATOR" CONTENT="GtkHTML/3.14.3">
</HEAD>
<BODY TEXT="#000000" BGCOLOR="#ffffff">
On Wed, 2007-10-31 at 18:05 +0100, Vadim Lebedev wrote:<BR>
<BLOCKQUOTE TYPE=CITE>
    ...<BR>
    Well the following is obviously MUUCH faster than the original:<BR>
    <BR>
    static void pbx_substitute_variables(char *passdata, int datalen, struct ast_channel *c, struct ast_exten *e)<BR>
    {<BR>
    <BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* No variables or expressions in e-&gt;data, so why scan it? */<BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (e-&gt;data &amp;&amp; !strchr(e-&gt;data, '$'))<BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ast_copy_string(passdata, e-&gt;data, datalen);<BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
    &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <BR>
    &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; *passdata = 0;<BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pbx_substitute_variables_helper(c, e-&gt;data, passdata, datalen - 1);<BR>
    }<BR>
    <BR>
    <BR>
    Original:<BR>
    static void pbx_substitute_variables(char *passdata, int datalen, struct ast_channel *c, struct ast_exten *e)<BR>
    {<BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memset(passdata, 0, datalen);<BR>
    <BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* No variables or expressions in e-&gt;data, so why scan it? */<BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (e-&gt;data &amp;&amp; !strchr(e-&gt;data, '$') &amp;&amp; !strstr(e-&gt;data,&quot;${&quot;) &amp;&amp; !strstr(e-&gt;data,&quot;$[&quot;) &amp;&amp; !strstr(e-&gt;data,&quot;$(&quot;)) {<BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ast_copy_string(passdata, e-&gt;data, datalen);<BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
    <BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pbx_substitute_variables_helper(c, e-&gt;data, passdata, datalen - 1);<BR>
    }<BR>
    <BR>
    <BR>
</BLOCKQUOTE>
<BR>
Oh, and yes, I forgot to mention *passdata = 0; vs memset(passdata, 0, datalen);<BR>
Considering that the passdata buffer is 8192 bytes long, just writing 1 byte vs. 8192 bytes WOULD be a huge savings in time. <BR>
<BR>
BUT, you can't do that. pbx_substitute_variables_helper will not work. It depends on passdata being nulled out, and it will fail to work&nbsp; correctly if you go that route.<BR>
<BR>
murf<BR>
<BR>
<BR>
<TABLE CELLSPACING="0" CELLPADDING="0" WIDTH="100%">
<TR>
<TD>
<PRE>
-- 
Steve Murphy
Software Developer
Digium
</PRE>
</TD>
</TR>
</TABLE>
</BODY>
</HTML>