dvander@145: #include dvander@145: #include dvander@150: #include dvander@145: #include dvander@150: #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@150: static int g_ws_chartable[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@150: g_ws_chartable['\n'] = 1; dvander@150: g_ws_chartable['\v'] = 1; dvander@150: g_ws_chartable['\r'] = 1; dvander@150: g_ws_chartable['\t'] = 1; dvander@150: g_ws_chartable['\f'] = 1; dvander@150: g_ws_chartable[' '] = 1; dvander@150: } dvander@150: dvander@150: unsigned int CTextParsers::GetUTF8CharBytes(const char *stream) dvander@150: { dvander@150: return _GetUTF8CharBytes(stream); dvander@145: } dvander@145: dvander@159: bool CTextParsers::ParseFile_SMC(const char *file, ITextListener_SMC *smc_listener, unsigned int *line, unsigned int *col, bool strict) dvander@145: { dvander@159: /* This beast is a lot more rigorous than our INI friend. */ 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@150: 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@150: dvander@150: //:TODO: this will only run once, so find a nice way to move it out of the while loop dvander@150: /* If this is the first line, check the first three bytes for BOM */ dvander@150: if (curline == 1 && dvander@150: buffer[0] == (char)0xEF && dvander@150: buffer[1] == (char)0xBB && dvander@150: buffer[2] == (char)0xBF) dvander@150: { dvander@150: /* We have a UTF-8 marked file... skip these bytes */ dvander@150: ptr = &buffer[3]; dvander@150: } else { dvander@150: ptr = buffer; dvander@150: } dvander@150: dvander@150: /*************************************************** dvander@150: * We preprocess the string before parsing tokens! * dvander@150: ***************************************************/ dvander@150: dvander@145: /* First strip beginning whitespace */ dvander@150: while (*ptr != '\0' && g_ws_chartable[*ptr] != 0) 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@150: bool alnum; dvander@150: wchar_t wc; 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@150: bool alnum; dvander@150: wchar_t wc; dvander@150: 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: }