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 }