dvander@145: #include dvander@145: #include dvander@145: #include dvander@145: #include "CTextParsers.h" dvander@145: dvander@145: CTextParsers g_TextParse; dvander@145: dvander@145: static int g_ini_chartable1[255] = {0}; dvander@145: dvander@145: CTextParsers::CTextParsers() dvander@145: { dvander@145: g_ini_chartable1['_'] = 1; dvander@145: g_ini_chartable1['-'] = 1; dvander@145: g_ini_chartable1[','] = 1; dvander@145: g_ini_chartable1['+'] = 1; dvander@145: g_ini_chartable1['.'] = 1; dvander@145: g_ini_chartable1['$'] = 1; dvander@145: g_ini_chartable1['?'] = 1; dvander@145: g_ini_chartable1['/'] = 1; dvander@145: } dvander@145: dvander@145: bool CTextParsers::ParseFile_SMC(const char *file, ITextListener_SMC *smc_listener, unsigned int *line, unsigned int *col) dvander@145: { dvander@145: /* :TODO: Implement this */ dvander@145: if (line) dvander@145: { dvander@145: *line = 0; dvander@145: } dvander@145: dvander@145: return false; dvander@145: } dvander@145: dvander@145: bool CTextParsers::ParseFile_INI(const char *file, ITextListener_INI *ini_listener, unsigned int *line, unsigned int *col) dvander@145: { dvander@145: FILE *fp = fopen(file, "rt"); dvander@145: unsigned int curline = 0; dvander@145: unsigned int curtok; dvander@145: size_t len; dvander@145: dvander@145: if (!fp) dvander@145: { dvander@145: if (line) dvander@145: { dvander@145: *line = 0; dvander@145: } dvander@145: dvander@145: return false; dvander@145: } dvander@145: dvander@145: char buffer[2048]; dvander@145: char *ptr, *save_ptr; dvander@145: bool in_quote; dvander@145: while (!feof(fp)) dvander@145: { dvander@145: curline++; dvander@145: curtok = 0; dvander@145: buffer[0] = '\0'; dvander@145: if (fgets(buffer, sizeof(buffer), fp) == NULL) dvander@145: { dvander@145: break; dvander@145: } dvander@145: dvander@145: /* Preprocess the string before anything */ dvander@145: ptr = buffer; dvander@145: dvander@145: /* First strip beginning whitespace */ dvander@145: while ((*ptr != '\0') && isspace(*ptr)) dvander@145: { dvander@145: ptr++; dvander@145: } dvander@145: dvander@145: len = strlen(ptr); dvander@145: dvander@145: if (!len) dvander@145: { dvander@145: continue; dvander@145: } dvander@145: dvander@145: /* Now search for comment characters */ dvander@145: in_quote = false; dvander@145: save_ptr = ptr; dvander@145: for (size_t i=0; i=0 && iReadINI_RawLine(ptr, &curtok)) dvander@145: { dvander@145: goto event_failed; dvander@145: } dvander@145: dvander@145: if (*ptr == '[') dvander@145: { dvander@145: bool invalid_tokens = false; dvander@145: bool got_bracket = false; dvander@145: bool extra_tokens = false; dvander@145: char c; dvander@145: dvander@145: for (size_t i=1; iReadINI_NewSection(&ptr[1], invalid_tokens, got_bracket, extra_tokens, &curtok)) dvander@145: { dvander@145: goto event_failed; dvander@145: } dvander@145: } else { dvander@145: char *key_ptr = ptr; dvander@145: char *val_ptr = NULL; dvander@145: char c; dvander@145: size_t first_space = 0; dvander@145: bool invalid_tokens = false; dvander@145: bool equal_token = false; dvander@145: bool quotes = false; dvander@145: dvander@145: for (size_t i=0; iReadINI_KeyValue(key_ptr, val_ptr, invalid_tokens, equal_token, quotes, &curtok)) dvander@145: { dvander@145: curtok = 0; dvander@145: goto event_failed; dvander@145: } dvander@145: } dvander@145: } dvander@145: dvander@145: if (line) dvander@145: { dvander@145: *line = curline; dvander@145: } dvander@145: dvander@145: fclose(fp); dvander@145: dvander@145: return true; dvander@145: dvander@145: event_failed: dvander@145: if (line) dvander@145: { dvander@145: *line = curline; dvander@145: } dvander@145: dvander@145: if (col) dvander@145: { dvander@145: *col = curtok; dvander@145: } dvander@145: dvander@145: fclose(fp); dvander@145: dvander@145: return false; dvander@145: }