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; }
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); }