190 lines
3.7 KiB
C++
190 lines
3.7 KiB
C++
/* -----------------------------------------------------------------------------
|
|
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;
|
|
}
|
|
//------------------------------------------------------------------------------
|