Ejemplo n.º 1
0
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++;
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
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;
}
Ejemplo n.º 4
0
static char *
SkipRCurly(char *s)
{
    if (*s == R_CURLY) {
	flt_puts(s++, 1, Action_attr);
	s = SkipBlanks(s);
	s = SkipError(s);
    }
    return s;
}