Пример #1
0
const char *Fmt::parseArgDefPerc(const char *fmt) {
    CrashIf(*fmt != '%');
    // TODO: more features
    instructions[nInst].t = typeFromChar(fmt[1]);
    instructions[nInst].argNo = currPercArgNo;
    ++nInst;
    ++currPercArgNo;
    return fmt + 2;
}
Пример #2
0
void parse(const char * filename, SSUStruct& ssus)
{
	void * parser = ssuParserAlloc(malloc);
	FILE * f = fopen(filename, "rt");
	ssus.fileName.push_back(filename);
	ssus.row.push_back(0);
	ssus.col.push_back(0);
	int lineNo = 0;
	while(!feof(f))
	{
		char s[4096];
		++ lineNo;
		if(fgets(s, 4096, f) == NULL)
			continue;
		++ ssus.row.back();
		size_t len = strlen(s);
		if(len == 0)
			continue;
		int i = (int)len - 1;
		while(i >= 0 && typeFromChar(s[i]) == 9)
			-- i;
		if(i < 0)
			continue;
		s[i + 1] = 0;
		int err = 0;
		char * cmt = extractComment(s, err);
		if(err)
		{
			fprintf(stderr, "[%s] %d:1  Unpaired quotes!", filename, lineNo);
			exit(0);
		}
		if(cmt != NULL)
			ssuParser(parser, TK_COMMENT, strdup(cmt), &ssus);
		char * sstart = s;
		char * scurrent = s;
		bool nextLine = false;
		int currentCharId = -1;
		while(!nextLine)
		{
			int charId = typeFromChar(*scurrent);
			switch(charId)
			{
			case 9:
				if(scurrent != sstart)
				{
					PUSH_LASTTOKEN;
				}
				nextLine = true;
				break;
			case 8:
				{
					PUSH_LASTTOKEN;
					do
					{
						++ scurrent;
					}
					while(typeFromChar(*scurrent) == 8);
					sstart = scurrent;
					currentCharId = -1;
					continue;
				}
			case 7:
				{
					PUSH_LASTTOKEN;
					sstart = scurrent + 1;
					scurrent = strchr(sstart, *scurrent);
					std::string tmpStr2(sstart, scurrent);
					ssuParser(parser, TK_CUSTOM, strdup(tmpStr2.c_str()), &ssus);
					sstart = scurrent + 1;
				}
				break;
			case 1:
			case 0:
				if(charId != currentCharId)
				{
					PUSH_LASTTOKEN
					currentCharId = charId;
					sstart = scurrent;
				}
				if(charId == 0)
				{
					ssus.col.back() = scurrent - s + 1;
					ssus.word = *scurrent;
					push(parser, &ssus);
					sstart = scurrent + 1;
				}
				break;
			}
			if(nextLine)
				break;
			++ scurrent;
		}
	}
	fclose(f);

	ssuParser(parser, 0, NULL, &ssus);
	ssuParserFree(parser, free);
	ssus.fileName.erase(ssus.fileName.end() - 1);
	ssus.row.erase(ssus.row.end() - 1);
	ssus.col.erase(ssus.col.end() - 1);
}