vx32

Local 9vx git repository for patches.
git clone git://r-36.net/vx32
Log | Files | 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 }