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 }