plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

sdbr_str2r.c (1022B)


      1 #include "std.h"
      2 
      3 static char*
      4 parsetuple(char *p, Sdbr *r)
      5 {
      6 	char *k, *v, *q;
      7 
      8 	for (;ISWHITE(*p); ++p);
      9 	k = p;
     10 	for (;*p && !ISWHITE(*p) && *p != '='; ++p)
     11 		if (*p == '#')
     12 			*p-- = '\0';
     13 	if (!*p || *p != '=') {
     14 		if (k != p)
     15 			sdbr_add(r, Strn(k, p - k), Str(nil));
     16 		return p;
     17 	}
     18 	*p++ = '\0';
     19 	if (*p != '"') {
     20 		v = p;
     21 		for (;*p && !ISWHITE(*p); ++p)
     22 			if (*p == '#')
     23 				*p-- = '\0';
     24 		if (v != p)
     25 			sdbr_add(r, Str(k), Strn(v, p - v));
     26 		else
     27 			sdbr_add(r, Str(k), Str(nil));
     28 		return p;
     29 	}
     30 	v = ++p;
     31 	for (q = p; *q && *q != '"'; ++q) {
     32 		if (*q == '\\')
     33 			switch (*(q + 1)) {
     34 			case '\\': ++q; break;
     35 			case '0': *++q = '\0'; break;
     36 			case 'n': *++q = '\n'; break;
     37 			case 'r': *++q = '\r'; break;
     38 			case 't': *++q = '\t'; break;
     39 			case '"': *++q = '"'; break;
     40 			}
     41 		*p++ = *q;
     42 	}
     43 	sdbr_add(r, Str(k), Strn(v, p - v));
     44 	return *q ? q + 1 : q;
     45 }
     46 
     47 void
     48 sdbr_str2r(Sdbr *sr, String s)
     49 {
     50 	String t;
     51 	char *p;
     52 
     53 	Strinit(&t);
     54 	Strdup(&t, s);
     55 	for (p = t.s; *p; p = parsetuple(p, sr));
     56 	Strclose(&t);
     57 }