plan9port

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

sdbr_str2r.c (1088B)


      1 #include "std.h"
      2 
      3 static char*
      4 parsetuple(char *p, Sdbr *r)
      5 {
      6 	char *k, *v, *q;
      7 
      8 	for (;isspace(*p); ++p);
      9 	k = p;
     10 	for (;*p && !isspace(*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 && !isspace(*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 'f': *++q = '\f'; break;
     37 			case 'n': *++q = '\n'; break;
     38 			case 'r': *++q = '\r'; break;
     39 			case 't': *++q = '\t'; break;
     40 			case 'v': *++q = '\v'; break;
     41 			case '"': *++q = '"'; break;
     42 			}
     43 		*p++ = *q;
     44 	}
     45 	sdbr_add(r, Str(k), Strn(v, p - v));
     46 	return *q ? q + 1 : q;
     47 }
     48 
     49 void
     50 sdbr_str2r(Sdbr *sr, String s)
     51 {
     52 	String t;
     53 	char *p;
     54 
     55 	Strinit(&t);
     56 	Strdup(&t, s);
     57 	for (p = t.s; *p; p = parsetuple(p, sr));
     58 	Strclose(&t);
     59 }