<br><font size=2 face="sans-serif">Hi all,</font>
<br>
<br><font size=2 face="sans-serif">A note of warning about using STRTOK_R. Just like STRTOK, STRTOK_R destroys the string being parsed, so if the string is precious, make a copy of it.</font>
<br>
<br><font size=2 face="sans-serif">BTW, I've been using STRTOK_R, STRSEP_R and STRSEP_RS for several years now, on this and other platforms, and have not found a problem. Unlike STRTOK, these functions do not internally save where the parsing has got up to. That's your job. You have to pass the string each time. Harald's example below is a good one.</font>
<br>
<br><font size=2 face="sans-serif">In case you're wondering how they work, let us assume our parse string is &quot;,ABC,,,DEF,&quot; and the search string is &quot;-,+&quot; (hyphen comma plus).</font>
<br>
<br><font size=2 face="sans-serif">STRTOK_R will return ABC on the first call, DEF on the second, and either NULL or an empty string on the third. (I've forgotten which one it is, but it's the same as STRTOK.)</font>
<br>
<br><font size=2 face="sans-serif">STRSEP_R (short for STRing SEParator) will return an empty string on the first, third and fourth calls, ABC on the second call, DEF on the fifth call, and either NULL or an empty string on the sixth. In other words, it goes serarator by separator.</font>
<br>
<br><font size=2 face="sans-serif">STRSEP_RS is identical to STRSEP_R, except it also returns the seperator encountered. This can be useful in parsing MicroSoft's CSV structure where a comma can be in the data, and double quotes are added around the whole field. Thus the following is valid</font>
<br><font size=2 face="sans-serif">&nbsp; &nbsp; &nbsp; &nbsp; 111,&quot;2,2&quot;,333</font>
<br><font size=2 face="sans-serif">where the first three cells contain 111, 2,2 (2 comma 2) and 333.</font>
<br>
<br><font size=2 face="sans-serif">Enjoy,<br>
Peter S<br>
<br>
Peter Scandrett<br>
Engineering Systems Department<br>
ALSTOM Australia Limited<br>
3 Bridge Street, Pymble, 2073, Australia<br>
Phone (+612) 94 88 49 11<br>
Fax (+612) 94 88 49 00<br>
peter.scandrett@transport.alstom.com</font>
<br>
<br>
<br>
<table width=100%>
<tr valign=top>
<td>
<td><font size=1 face="sans-serif"><b>Harald Kipp &lt;harald.kipp@egnite.de&gt;</b></font>
<br><font size=1 face="sans-serif">Sent by: en-nut-discussion-admin@egnite.de</font>
<p><font size=1 face="sans-serif">05-08-2003 07:03 pm</font>
<br><font size=1 face="sans-serif">Please respond to en-nut-discussion</font>
<br>
<td><font size=1 face="Arial">&nbsp; &nbsp; &nbsp; &nbsp; </font>
<br><font size=1 face="sans-serif">&nbsp; &nbsp; &nbsp; &nbsp; To: &nbsp; &nbsp; &nbsp; &nbsp;en-nut-discussion@egnite.de</font>
<br><font size=1 face="sans-serif">&nbsp; &nbsp; &nbsp; &nbsp; cc: &nbsp; &nbsp; &nbsp; &nbsp;(bcc: Peter Scandrett/AUMIL01/Transport/ALSTOM)</font>
<br><font size=1 face="sans-serif">&nbsp; &nbsp; &nbsp; &nbsp; Subject: &nbsp; &nbsp; &nbsp; &nbsp;Re: [En-Nut-Discussion] any code in lib for parsing POST &nbsp;tokens in req_query?</font></table>
<br>
<br>
<br><font size=2 face="Courier New">Damian,<br>
<br>
The next release will include a form sample:<br>
<br>
/*<br>
 &nbsp;* CGI Sample: Proccessing a form.<br>
 &nbsp;*<br>
 &nbsp;* This routine must have been registered by NutRegisterCgi() and is<br>
 &nbsp;* automatically called by NutHttpProcessRequest() when the client<br>
 &nbsp;* request the URL 'cgi-bin/form.cgi'.<br>
 &nbsp;*<br>
 &nbsp;* Thanks to Tom Boettger, who provided this sample for ICCAVR.<br>
 &nbsp;*/<br>
int ShowForm(FILE * stream, REQUEST * req)<br>
{<br>
 &nbsp; &nbsp; static prog_char html_head[] = &quot;&lt;HTML&gt;&lt;BODY&gt;&lt;BR&gt;&lt;H1&gt;Form <br>
Result&lt;/H1&gt;&lt;BR&gt;&lt;BR&gt;&quot;;<br>
 &nbsp; &nbsp; static prog_char html_body[] = &quot;&lt;BR&gt;&lt;BR&gt;&lt;p&gt;&lt;a <br>
href=\&quot;../index.html\&quot;&gt;return to main&lt;/a&gt;&lt;/BODY&gt;&lt;/HTML&gt;&lt;/p&gt;&quot;;<br>
<br>
 &nbsp; &nbsp; NutHttpSendHeaderTop(stream, req, 200, &quot;Ok&quot;);<br>
 &nbsp; &nbsp; NutHttpSendHeaderBot(stream, html_mt, -1);<br>
<br>
 &nbsp; &nbsp; /* Send HTML header. */<br>
 &nbsp; &nbsp; fputs_P(html_head, stream);<br>
<br>
 &nbsp; &nbsp; if (req-&gt;req_query) {<br>
#ifdef __IMAGECRAFT__<br>
 &nbsp; &nbsp; &nbsp; &nbsp; char *param1;<br>
 &nbsp; &nbsp; &nbsp; &nbsp; char *param2;<br>
 &nbsp; &nbsp; &nbsp; &nbsp; char *param3;<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp; /*<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* Extract the parameters. Note, that it is potentially dangerous<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* to use strtok in multithreaded applications. There's no problem<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* here, because we can be sure that there will by no thread switch<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* between the first and the last call to strtok. Otherwise we<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* must use strtok_r().<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*/<br>
 &nbsp; &nbsp; &nbsp; &nbsp; param1 = strtok(req-&gt;req_query, &quot;=&quot;);<br>
 &nbsp; &nbsp; &nbsp; &nbsp; param1 = strtok(NULL, &quot;&amp;&quot;);<br>
 &nbsp; &nbsp; &nbsp; &nbsp; param2 = strtok(NULL, &quot;=&quot;);<br>
 &nbsp; &nbsp; &nbsp; &nbsp; param2 = strtok(NULL, &quot;&amp;&quot;);<br>
 &nbsp; &nbsp; &nbsp; &nbsp; param3 = strtok(NULL, &quot;=&quot;);<br>
 &nbsp; &nbsp; &nbsp; &nbsp; param3 = strtok(NULL, &quot;&amp;&quot;);<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp; /* Send the parameters back to the client. */<br>
 &nbsp; &nbsp; &nbsp; &nbsp; fputs(&quot;Param1=&quot;, stream);<br>
 &nbsp; &nbsp; &nbsp; &nbsp; fputs(param1, stream);<br>
 &nbsp; &nbsp; &nbsp; &nbsp; fputs(&quot;&lt;BR&gt;Param2=&quot;, stream);<br>
 &nbsp; &nbsp; &nbsp; &nbsp; fputs(param2, stream);<br>
 &nbsp; &nbsp; &nbsp; &nbsp; fputs(&quot;&lt;BR&gt;Param3=&quot;, stream);<br>
 &nbsp; &nbsp; &nbsp; &nbsp; fputs(param3, stream);<br>
#else<br>
 &nbsp; &nbsp; &nbsp; &nbsp; /*<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* There's no strtok in the GCC library. So we take the chance to<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* demonstrate Peter Scandrett's strtok_r().<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*/<br>
 &nbsp; &nbsp; &nbsp; &nbsp; char *qp;<br>
 &nbsp; &nbsp; &nbsp; &nbsp; char *c[3];<br>
 &nbsp; &nbsp; &nbsp; &nbsp; char *p[3];<br>
 &nbsp; &nbsp; &nbsp; &nbsp; u_char i;<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp; /* Extract 3 parameters. */<br>
 &nbsp; &nbsp; &nbsp; &nbsp; qp = req-&gt;req_query;<br>
 &nbsp; &nbsp; &nbsp; &nbsp; for(i = 0; i &lt; 3; i++) {<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; c[i] = strtok_r(&amp;qp, &quot;=&quot;);<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; p[i] = strtok_r(&amp;qp, &quot;&amp;&quot;);<br>
 &nbsp; &nbsp; &nbsp; &nbsp; }<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp; /* Send the parameters back to the client. */<br>
 &nbsp; &nbsp; &nbsp; &nbsp; for(i = 0; i &lt; 3; i++) {<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fprintf_P(stream, PSTR(&quot;%s: %s&lt;BR&gt;\r\n&quot;), c[i], p[i]);<br>
 &nbsp; &nbsp; &nbsp; &nbsp; }<br>
#endif<br>
 &nbsp; &nbsp; }<br>
<br>
 &nbsp; &nbsp; fputs_P(html_body, stream);<br>
 &nbsp; &nbsp; fflush(stream);<br>
<br>
 &nbsp; &nbsp; return 0;<br>
}<br>
<br>
_______________________________________________<br>
En-Nut-Discussion mailing list</font>
<br><font size=2 face="Courier New">En-Nut-Discussion@egnite.de<br>
http://www.egnite.de/mailman/listinfo/en-nut-discussion<br>
</font>
<br>
<br>