tokenize.c - vx32 - Local 9vx git repository for patches.
 (HTM) git clone git://r-36.net/vx32
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
       tokenize.c (1690B)
       ---
            1 #include "u.h"
            2 #include "lib.h"
            3 
            4 static char qsep[] = " \t\r\n";
            5 
            6 static char*
            7 qtoken(char *s, char *sep)
            8 {
            9         int quoting;
           10         char *t;
           11 
           12         quoting = 0;
           13         t = s;        /* s is output string, t is input string */
           14         while(*t!='\0' && (quoting || utfrune(sep, *t)==nil)){
           15                 if(*t != '\''){
           16                         *s++ = *t++;
           17                         continue;
           18                 }
           19                 /* *t is a quote */
           20                 if(!quoting){
           21                         quoting = 1;
           22                         t++;
           23                         continue;
           24                 }
           25                 /* quoting and we're on a quote */
           26                 if(t[1] != '\''){
           27                         /* end of quoted section; absorb closing quote */
           28                         t++;
           29                         quoting = 0;
           30                         continue;
           31                 }
           32                 /* doubled quote; fold one quote into two */
           33                 t++;
           34                 *s++ = *t++;
           35         }
           36         if(*s != '\0'){
           37                 *s = '\0';
           38                 if(t == s)
           39                         t++;
           40         }
           41         return t;
           42 }
           43 
           44 static char*
           45 etoken(char *t, char *sep)
           46 {
           47         int quoting;
           48 
           49         /* move to end of next token */
           50         quoting = 0;
           51         while(*t!='\0' && (quoting || utfrune(sep, *t)==nil)){
           52                 if(*t != '\''){
           53                         t++;
           54                         continue;
           55                 }
           56                 /* *t is a quote */
           57                 if(!quoting){
           58                         quoting = 1;
           59                         t++;
           60                         continue;
           61                 }
           62                 /* quoting and we're on a quote */
           63                 if(t[1] != '\''){
           64                         /* end of quoted section; absorb closing quote */
           65                         t++;
           66                         quoting = 0;
           67                         continue;
           68                 }
           69                 /* doubled quote; fold one quote into two */
           70                 t += 2;
           71         }
           72         return t;
           73 }
           74 
           75 int
           76 gettokens(char *s, char **args, int maxargs, char *sep)
           77 {
           78         int nargs;
           79 
           80         for(nargs=0; nargs<maxargs; nargs++){
           81                 while(*s!='\0' && utfrune(sep, *s)!=nil)
           82                         *s++ = '\0';
           83                 if(*s == '\0')
           84                         break;
           85                 args[nargs] = s;
           86                 s = etoken(s, sep);
           87         }
           88 
           89         return nargs;
           90 }
           91 
           92 int
           93 tokenize(char *s, char **args, int maxargs)
           94 {
           95         int nargs;
           96 
           97         for(nargs=0; nargs<maxargs; nargs++){
           98                 while(*s!='\0' && utfrune(qsep, *s)!=nil)
           99                         s++;
          100                 if(*s == '\0')
          101                         break;
          102                 args[nargs] = s;
          103                 s = qtoken(s, qsep);
          104         }
          105 
          106         return nargs;
          107 }