ndbaux.c (1503B)
1 #include <u.h> 2 #include <libc.h> 3 #include <bio.h> 4 #include <ctype.h> 5 #include <ndb.h> 6 #include "ndbhf.h" 7 8 9 /* 10 * parse a single tuple 11 */ 12 char* 13 _ndbparsetuple(char *cp, Ndbtuple **tp) 14 { 15 char *p; 16 int len; 17 Ndbtuple *t; 18 19 /* a '#' starts a comment lasting till new line */ 20 EATWHITE(cp); 21 if(*cp == '#' || *cp == '\n') 22 return 0; 23 24 t = ndbnew(nil, nil); 25 setmalloctag(t, getcallerpc(&cp)); 26 *tp = t; 27 28 /* parse attribute */ 29 p = cp; 30 while(*cp != '=' && !ISWHITE(*cp) && *cp != '\n') 31 cp++; 32 len = cp - p; 33 if(len >= Ndbalen) 34 len = Ndbalen-1; 35 strncpy(t->attr, p, len); 36 37 /* parse value */ 38 EATWHITE(cp); 39 if(*cp == '='){ 40 cp++; 41 if(*cp == '"'){ 42 p = ++cp; 43 while(*cp != '\n' && *cp != '"') 44 cp++; 45 len = cp - p; 46 if(*cp == '"') 47 cp++; 48 } else if(*cp == '#'){ 49 len = 0; 50 } else { 51 p = cp; 52 while(!ISWHITE(*cp) && *cp != '\n') 53 cp++; 54 len = cp - p; 55 } 56 ndbsetval(t, p, len); 57 } 58 59 return cp; 60 } 61 62 /* 63 * parse all tuples in a line. we assume that the 64 * line ends in a '\n'. 65 * 66 * the tuples are linked as a list using ->entry and 67 * as a ring using ->line. 68 */ 69 Ndbtuple* 70 _ndbparseline(char *cp) 71 { 72 Ndbtuple *t; 73 Ndbtuple *first, *last; 74 75 first = last = 0; 76 while(*cp != '#' && *cp != '\n'){ 77 t = 0; 78 cp = _ndbparsetuple(cp, &t); 79 if(cp == 0) 80 break; 81 if(first){ 82 last->line = t; 83 last->entry = t; 84 } else 85 first = t; 86 last = t; 87 t->line = 0; 88 t->entry = 0; 89 } 90 if(first) 91 last->line = first; 92 setmalloctag(first, getcallerpc(&cp)); 93 return first; 94 }