commit x64 compilation from lulu cause the other branch dont seems to compile properly at home
This commit is contained in:
189
include/framework/ascii/parser.cpp
Normal file
189
include/framework/ascii/parser.cpp
Normal file
@ -0,0 +1,189 @@
|
||||
/* -----------------------------------------------------------------------------
|
||||
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;
|
||||
}
|
||||
//------------------------------------------------------------------------------
|
||||
Reference in New Issue
Block a user