When naming variables inside a &lt;para&gt; element you can use:<br>&lt;variable&gt;foo&lt;/variable&gt;<br><br>+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; is the same as ${foo}, since the value of
&lt;replaceable&gt;n&lt;/replaceable&gt; peeks under 0 levels of<br><br><div class="gmail_quote">On Tue, Dec 2, 2008 at 4:39 PM, SVN commits to the Asterisk project <span dir="ltr">&lt;<a href="mailto:asterisk-commits@lists.digium.com">asterisk-commits@lists.digium.com</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">Author: tilghman<br>
Date: Tue Dec &nbsp;2 12:39:12 2008<br>
New Revision: 160344<br>
<br>
URL: <a href="http://svn.digium.com/view/asterisk?view=rev&amp;rev=160344" target="_blank">http://svn.digium.com/view/asterisk?view=rev&amp;rev=160344</a><br>
Log:<br>
Add LOCAL_PEEK function, as requested by lmadsen.<br>
<br>
Modified:<br>
 &nbsp; &nbsp;trunk/apps/app_stack.c<br>
<br>
Modified: trunk/apps/app_stack.c<br>
URL: <a href="http://svn.digium.com/view/asterisk/trunk/apps/app_stack.c?view=diff&amp;rev=160344&amp;r1=160343&amp;r2=160344" target="_blank">http://svn.digium.com/view/asterisk/trunk/apps/app_stack.c?view=diff&amp;rev=160344&amp;r1=160343&amp;r2=160344</a><br>

==============================================================================<br>
--- trunk/apps/app_stack.c (original)<br>
+++ trunk/apps/app_stack.c Tue Dec &nbsp;2 12:39:12 2008<br>
@@ -142,6 +142,27 @@<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;ref type=&quot;application&quot;&gt;Return&lt;/ref&gt;<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;/see-also&gt;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;&lt;/function&gt;<br>
+ &nbsp; &nbsp; &nbsp; &lt;function name=&quot;LOCAL_PEEK&quot; language=&quot;en_US&quot;&gt;<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;synopsis&gt;<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Retrieve variables hidden by the local gosub stack frame.<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/synopsis&gt;<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;syntax&gt;<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;parameter name=&quot;n&quot; required=&quot;true&quot; /&gt;<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;parameter name=&quot;varname&quot; required=&quot;true&quot; /&gt;<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/syntax&gt;<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;description&gt;<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;para&gt;Read a variable &lt;replaceable&gt;varname&lt;/replaceable&gt; hidden by<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;replaceable&gt;n&lt;/replaceable&gt; levels of gosub stack frames. &nbsp;Note that ${LOCAL_PEEK(0,foo)}<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; is the same as ${foo}, since the value of &lt;replaceable&gt;n&lt;/replaceable&gt; peeks under 0 levels of<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; stack frames; in other words, 0 is the current level. &nbsp;If &lt;replaceable&gt;n&lt;/replaceable&gt; exceeds<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; the available number of stack frames, then an empty string is returned.&lt;/para&gt;<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/description&gt;<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;see-also&gt;<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;ref type=&quot;application&quot;&gt;Gosub&lt;/ref&gt;<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;ref type=&quot;application&quot;&gt;GosubIf&lt;/ref&gt;<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;ref type=&quot;application&quot;&gt;Return&lt;/ref&gt;<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/see-also&gt;<br>
+ &nbsp; &nbsp; &nbsp; &lt;/function&gt;<br>
 &nbsp;***/<br>
<br>
&nbsp;static const char *app_gosub = &quot;Gosub&quot;;<br>
@@ -469,6 +490,42 @@<br>
 &nbsp; &nbsp; &nbsp; &nbsp;.name = &quot;LOCAL&quot;,<br>
 &nbsp; &nbsp; &nbsp; &nbsp;.write = local_write,<br>
 &nbsp; &nbsp; &nbsp; &nbsp;.read = local_read,<br>
+};<br>
+<br>
+static int peek_read(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)<br>
+{<br>
+ &nbsp; &nbsp; &nbsp; int found = 0, n;<br>
+ &nbsp; &nbsp; &nbsp; struct ast_var_t *variables;<br>
+ &nbsp; &nbsp; &nbsp; AST_DECLARE_APP_ARGS(args,<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; AST_APP_ARG(n);<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; AST_APP_ARG(name);<br>
+ &nbsp; &nbsp; &nbsp; );<br>
+<br>
+ &nbsp; &nbsp; &nbsp; if (!chan) {<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ast_log(LOG_ERROR, &quot;LOCAL_PEEK must be called on an active channel\n&quot;);<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return -1;<br>
+ &nbsp; &nbsp; &nbsp; }<br>
+<br>
+ &nbsp; &nbsp; &nbsp; AST_STANDARD_APP_ARGS(args, data);<br>
+ &nbsp; &nbsp; &nbsp; n = atoi(args.n);<br>
+ &nbsp; &nbsp; &nbsp; *buf = &#39;\0&#39;;<br>
+<br>
+ &nbsp; &nbsp; &nbsp; ast_channel_lock(chan);<br>
+ &nbsp; &nbsp; &nbsp; AST_LIST_TRAVERSE(&amp;chan-&gt;varshead, variables, entries) {<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (!strcmp(<a href="http://args.name" target="_blank">args.name</a>, ast_var_name(variables)) &amp;&amp; ++found &gt; n) {<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ast_copy_string(buf, ast_var_value(variables), len);<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br>
+ &nbsp; &nbsp; &nbsp; }<br>
+ &nbsp; &nbsp; &nbsp; ast_channel_unlock(chan);<br>
+ &nbsp; &nbsp; &nbsp; return 0;<br>
+}<br>
+<br>
+static struct ast_custom_function peek_function = {<br>
+ &nbsp; &nbsp; &nbsp; .name = &quot;LOCAL_PEEK&quot;,<br>
+ &nbsp; &nbsp; &nbsp; .synopsis = &quot;Peeks at variables within the variable stack&quot;,<br>
+ &nbsp; &nbsp; &nbsp; .syntax = &quot;LOCAL_PEEK(&lt;n&gt;|&lt;varname&gt;)&quot;,<br>
+ &nbsp; &nbsp; &nbsp; .read = peek_read,<br>
&nbsp;};<br>
<br>
&nbsp;static int handle_gosub(struct ast_channel *chan, AGI *agi, int argc, char **argv)<br>
@@ -585,6 +642,7 @@<br>
 &nbsp; &nbsp; &nbsp; &nbsp;ast_unregister_application(app_gosubif);<br>
 &nbsp; &nbsp; &nbsp; &nbsp;ast_unregister_application(app_gosub);<br>
 &nbsp; &nbsp; &nbsp; &nbsp;ast_custom_function_unregister(&amp;local_function);<br>
+ &nbsp; &nbsp; &nbsp; ast_custom_function_unregister(&amp;peek_function);<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp;return 0;<br>
&nbsp;}<br>
@@ -607,6 +665,7 @@<br>
 &nbsp; &nbsp; &nbsp; &nbsp;ast_register_application_xml(app_gosubif, gosubif_exec);<br>
 &nbsp; &nbsp; &nbsp; &nbsp;ast_register_application_xml(app_gosub, gosub_exec);<br>
 &nbsp; &nbsp; &nbsp; &nbsp;ast_custom_function_register(&amp;local_function);<br>
+ &nbsp; &nbsp; &nbsp; ast_custom_function_register(&amp;peek_function);<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp;return 0;<br>
&nbsp;}<br>
<br>
<br>
_______________________________________________<br>
--Bandwidth and Colocation Provided by <a href="http://www.api-digital.com--" target="_blank">http://www.api-digital.com--</a><br>
<br>
asterisk-commits mailing list<br>
To UNSUBSCRIBE or update options visit:<br>
 &nbsp; <a href="http://lists.digium.com/mailman/listinfo/asterisk-commits" target="_blank">http://lists.digium.com/mailman/listinfo/asterisk-commits</a><br>
</blockquote></div><br><br clear="all"><br>-- <br>Eliel Sardaņons<br>