/* ----------------------------------------------------------------------------- GSFramework Copyright 2001-2013 Emmanuel Julien. All Rights Reserved. ----------------------------------------------------------------------------- */ #include "ascii/parser.h" #include "ntypes.h" using namespace GS; //------------------------------------------------------------------------------ bool AsciiParser::IsUpperCase(const char c) { return asbool((c >= 'A') && (c <= 'Z')); } const char *AsciiParser::RunToEOS(const char *s, const char *e) { while (s < e) { if (s[0] == '\\') s += 2; // Jump modifiers. else if (s[0] == '"') break; else s++; } return s; } bool AsciiParser::IsConstantFloat(const char *s, const char *e) { const char *eoc = SkipEntry(s, e); if (s[0] == '-') { s++; eoc = SkipEntry(s, e); } while (s < eoc) { if ((s[0] == '.') || (s[0] == 'f')) return true; s++; } return false; } const char *AsciiParser::Find(const char *s, const char *e, char f) { for (;;) { s = SkipSpace(s, e); if (s == e) return NULL; if (s[0] == '(') s = RunToEOG(s, e, '(', ')'); else { if (s[0] == f) break; s++; } } return s; } const char *AsciiParser::SkipEntry(const char *s, const char *e, bool skip_minus) { { while ( (s[0] != 0x20) && !((s[0] == 0xd) && (s[1] == 0xa)) && (s[0] != 0x9) && (s[0] != 0xa) && (s[0] != 0xd) && (s[0] != '/') && (s[0] != '*') && (s[0] != '+') && (s[0] != '=') && (s[0] != ';') && (s[0] != ':') && (s[0] != ',') && (s[0] != '<') && (s[0] != '>') && (s[0] != '(') && (s[0] != ')') && (s[0] != '\"') ) { if (!skip_minus && (s[0] == '-')) break; if (s == e) break; s++; } } return s; } const char *AsciiParser::RunToEOL(const char *s, const char *e) { while ( ((s[0] != 0xd) || (s[1] != 0xa)) && (s[0] != 0xa) && (s[0] != 0xd) && (s < e) ) s++; return s; } const char *AsciiParser::SkipEOL(const char *s, const char *e) { if ((s[0] == 0xd) && (s[1] == 0xa)) s += 2; else if ((s[0] == 0xa) || (s[0] == 0xd)) s++; return s > e ? e : s; } const char *AsciiParser::RunToEOG(const char *s, const char *e, char op, char cl) { uint pc = 0; s++; while (s < e) { if (s[0] == op) pc++; if (s[0] == cl) { if (!pc) break; pc--; } s++; } if (s == e) return NULL; return s; } const char *AsciiParser::RunToEOC(const char *s, const char *e) { s += 2; while (((s[0] != '*') || (s[1] != '/')) && (s < e)) s += ((s[0] == 0xd) && (s[1] == 0xa)) ? 2 : 1; return s >= e ? e : s + 2; } const char *AsciiParser::RunToEOE(const char *s, const char *e) { while (s < e) { s = SkipSpace(s, e); if (s[0] == '(') s = RunToEOG(s, e, '(', ')'); else if (s[0] == '\"') { s++; while ((s < e) && (s[0] != '\"')) s++; if (s < e) s++; } else { if ((s[0] == ',') || (s[0] == ';') ) break; s++; } } return s; } const char *AsciiParser::SkipSpace(const char *s, const char *e) { while (s < e) { if (s[0] == 0x20) s++; else if ((s[0] == 0xd) && (s[1] == 0xa)) s += 2; else if ((s[0] == '/') && (s[1] == '/')) s = RunToEOL(s, e); else if ((s[0] == '/') && (s[1] == '*')) s = RunToEOC(s, e); else if (s[0] == 0x9) s++; else if (s[0] == 0xa) s++; else if (s[0] == 0xd) s++; // else if (s[0] == -17 && s[1] == -69 && s[2] == -65) s+=3; // remove the BOM from utf 8 file else break; } return s; } const char *AsciiParser::NextEntry(const char *s, const char *e, bool skip_minus) { s = SkipEntry(s, e, skip_minus); s = SkipSpace(s, e); return s; } //------------------------------------------------------------------------------