libds

simple data structures library and utility functions
git clone git://git.2f30.org/libds
Log | Files | Refs | LICENSE

tokenize.c (1734B)


      1 /* Licensed under GPLv2, taken from Plan9 */
      2 #include <string.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 || strchr(sep, *t)==NULL)) {
     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 || strchr(sep, *t)==NULL)) {
     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' && strchr(sep, *s)!=NULL)
     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' && strchr(qsep, *s)!=NULL)
     99 			s++;
    100 		if(*s == '\0')
    101 			break;
    102 		args[nargs] = s;
    103 		s = qtoken(s, qsep);
    104 	}
    105 
    106 	return nargs;
    107 }