[En-Nut-Discussion] Using STRTOK_R

peter.scandrett at transport.alstom.com peter.scandrett at transport.alstom.com
Wed Aug 6 09:09:56 CEST 2003


Hi all,

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.

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.

In case you're wondering how they work, let us assume our parse string is 
",ABC,,,DEF," and the search string is "-,+" (hyphen comma plus).

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.)

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.

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
        111,"2,2",333
where the first three cells contain 111, 2,2 (2 comma 2) and 333.

Enjoy,
Peter S

Peter Scandrett
Engineering Systems Department
ALSTOM Australia Limited
3 Bridge Street, Pymble, 2073, Australia
Phone (+612) 94 88 49 11
Fax (+612) 94 88 49 00
peter.scandrett at transport.alstom.com




Harald Kipp <harald.kipp at egnite.de>
Sent by: en-nut-discussion-admin at egnite.de
05-08-2003 07:03 pm
Please respond to en-nut-discussion

 
        To:     en-nut-discussion at egnite.de
        cc:     (bcc: Peter Scandrett/AUMIL01/Transport/ALSTOM)
        Subject:        Re: [En-Nut-Discussion] any code in lib for parsing POST  tokens in 
req_query?


Damian,

The next release will include a form sample:

/*
  * CGI Sample: Proccessing a form.
  *
  * This routine must have been registered by NutRegisterCgi() and is
  * automatically called by NutHttpProcessRequest() when the client
  * request the URL 'cgi-bin/form.cgi'.
  *
  * Thanks to Tom Boettger, who provided this sample for ICCAVR.
  */
int ShowForm(FILE * stream, REQUEST * req)
{
     static prog_char html_head[] = "<HTML><BODY><BR><H1>Form 
Result</H1><BR><BR>";
     static prog_char html_body[] = "<BR><BR><p><a 
href=\"../index.html\">return to main</a></BODY></HTML></p>";

     NutHttpSendHeaderTop(stream, req, 200, "Ok");
     NutHttpSendHeaderBot(stream, html_mt, -1);

     /* Send HTML header. */
     fputs_P(html_head, stream);

     if (req->req_query) {
#ifdef __IMAGECRAFT__
         char *param1;
         char *param2;
         char *param3;

         /*
          * Extract the parameters. Note, that it is potentially dangerous
          * to use strtok in multithreaded applications. There's no 
problem
          * here, because we can be sure that there will by no thread 
switch
          * between the first and the last call to strtok. Otherwise we
          * must use strtok_r().
          */
         param1 = strtok(req->req_query, "=");
         param1 = strtok(NULL, "&");
         param2 = strtok(NULL, "=");
         param2 = strtok(NULL, "&");
         param3 = strtok(NULL, "=");
         param3 = strtok(NULL, "&");

         /* Send the parameters back to the client. */
         fputs("Param1=", stream);
         fputs(param1, stream);
         fputs("<BR>Param2=", stream);
         fputs(param2, stream);
         fputs("<BR>Param3=", stream);
         fputs(param3, stream);
#else
         /*
          * There's no strtok in the GCC library. So we take the chance to
          * demonstrate Peter Scandrett's strtok_r().
          */
         char *qp;
         char *c[3];
         char *p[3];
         u_char i;

         /* Extract 3 parameters. */
         qp = req->req_query;
         for(i = 0; i < 3; i++) {
             c[i] = strtok_r(&qp, "=");
             p[i] = strtok_r(&qp, "&");
         }

         /* Send the parameters back to the client. */
         for(i = 0; i < 3; i++) {
             fprintf_P(stream, PSTR("%s: %s<BR>\r\n"), c[i], p[i]);
         }
#endif
     }

     fputs_P(html_body, stream);
     fflush(stream);

     return 0;
}

_______________________________________________
En-Nut-Discussion mailing list
En-Nut-Discussion at egnite.de
http://www.egnite.de/mailman/listinfo/en-nut-discussion


-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.egnite.de/pipermail/en-nut-discussion/attachments/20030806/2330dea5/attachment.htm 


More information about the En-Nut-Discussion mailing list