void CfgParser::ParseBlock(const char *&p,TreeFileRef &tree) { string name, value; int index; while(1) { SkipWhitesNL(p); if(*p=='\0' || *p=='}') break; if(!ReadName(p,name,index)) { SkipError(p); continue; } if(*p=='{') { p++; ParseBlock(p,tree.SerChild(name.c_str(),index)); } else { if(!ReadValue(p,value)) SkipError(p); else { map<string,string>::iterator f = defines.find(value); if(f!=defines.end()) value = f->second; if(name.c_str()[0]=='@') defines[name.c_str()+1] = value; else if(name.c_str()[0]=='$') { if(name == "$include") { CfgParser included; string path = base_dir + value; included.auto_index = auto_index; included.defines = defines; included.Load(path.c_str(),tree,*filesystem); defines = included.defines; auto_index = included.auto_index; } } else { tree.SerString(name.c_str(),value,"",index); } } } } if(*p=='}') p++; }
static char * SkipAddress(char *s, int *count) { char *base = s; int done; if (*count) { if (isComma(*s)) { flt_putc(*s++); } else { return s; } } if (isdigit(CharOf(*s))) { while (isdigit(CharOf(*s))) s++; flt_puts(base, (int) (s - base), Number_attr); } else if (*s == '$') { flt_puts(s++, 1, Literal_attr); } else if (isSlash(*s)) { if (*s == BACKSLASH) { flt_puts(s++, 1, Action_attr); } s = SkipPattern(s, &done, 0); } else { s = SkipError(s); } *count += 1; return s; }
static char * SkipTwoPatterns(char *s, int flags) { char *base; int done; s = SkipPattern(s, &done, 0); s = SkipPattern(done ? s - 1 : s, &done, 1); if (flags) { base = s; while (*s != 0 && !isspace(CharOf(*s))) { if (isdigit(CharOf(*s)) || *s == 'g' || *s == 'p') s++; else if (*s == 'w') { s += strlen(s); } else { break; } } flt_puts(base, (int) (s - base), Ident2_attr); s = SkipBlanks(s); s = SkipError(s); } return s; }
static char * SkipRCurly(char *s) { if (*s == R_CURLY) { flt_puts(s++, 1, Action_attr); s = SkipBlanks(s); s = SkipError(s); } return s; }