|
Packit |
1c1d7e |
/******************************************************************************
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
* Copyright (C) 1997-2015 by Dimitri van Heesch.
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
* Permission to use, copy, modify, and distribute this software and its
|
|
Packit |
1c1d7e |
* documentation under the terms of the GNU General Public License is hereby
|
|
Packit |
1c1d7e |
* granted. No representations are made about the suitability of this software
|
|
Packit |
1c1d7e |
* for any purpose. It is provided "as is" without express or implied warranty.
|
|
Packit |
1c1d7e |
* See the GNU General Public License for more details.
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
* Documents produced by Doxygen are derivative works derived from the
|
|
Packit |
1c1d7e |
* input used in their production; they are not affected by this license.
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
#include <stdlib.h>
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
#include "cppvalue.h"
|
|
Packit |
1c1d7e |
#include "constexp.h"
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
CPPValue parseOctal()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
long val = 0;
|
|
Packit |
1c1d7e |
for (const char *p = g_strToken.data(); *p != 0; p++)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (*p >= '0' && *p <= '7') val = val * 8 + *p - '0';
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return CPPValue(val);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
CPPValue parseDecimal()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
long val = 0;
|
|
Packit |
1c1d7e |
for (const char *p = g_strToken.data(); *p != 0; p++)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (*p >= '0' && *p <= '9') val = val * 10 + *p - '0';
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return CPPValue(val);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
CPPValue parseHexadecimal()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
long val = 0;
|
|
Packit |
1c1d7e |
for (const char *p = g_strToken.data(); *p != 0; p++)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (*p >= '0' && *p <= '9') val = val * 16 + *p - '0';
|
|
Packit |
1c1d7e |
else if (*p >= 'a' && *p <= 'f') val = val * 16 + *p - 'a' + 10;
|
|
Packit |
1c1d7e |
else if (*p >= 'A' && *p <= 'F') val = val * 16 + *p - 'A' + 10;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
//printf("parseHexadecimal %s->%x\n",g_strToken.data(),val);
|
|
Packit |
1c1d7e |
return CPPValue(val);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
CPPValue parseCharacter() // does not work for '\n' and the alike
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (g_strToken[1]=='\\')
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
switch(g_strToken[2])
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
case 'n': return CPPValue((long)'\n');
|
|
Packit |
1c1d7e |
case 't': return CPPValue((long)'\t');
|
|
Packit |
1c1d7e |
case 'v': return CPPValue((long)'\v');
|
|
Packit |
1c1d7e |
case 'b': return CPPValue((long)'\b');
|
|
Packit |
1c1d7e |
case 'r': return CPPValue((long)'\r');
|
|
Packit |
1c1d7e |
case 'f': return CPPValue((long)'\f');
|
|
Packit |
1c1d7e |
case 'a': return CPPValue((long)'\a');
|
|
Packit |
1c1d7e |
case '\\': return CPPValue((long)'\\');
|
|
Packit |
1c1d7e |
case '?': return CPPValue((long)'\?');
|
|
Packit |
1c1d7e |
case '\'': return CPPValue((long)'\'');
|
|
Packit |
1c1d7e |
case '"': return CPPValue((long)'"');
|
|
Packit |
1c1d7e |
case '0': // fall through
|
|
Packit |
1c1d7e |
case '1': // fall through
|
|
Packit |
1c1d7e |
case '2': // fall through
|
|
Packit |
1c1d7e |
case '3': // fall through
|
|
Packit |
1c1d7e |
case '4': // fall through
|
|
Packit |
1c1d7e |
case '5': // fall through
|
|
Packit |
1c1d7e |
case '6': // fall through
|
|
Packit |
1c1d7e |
case '7': // fall through
|
|
Packit |
1c1d7e |
return parseOctal();
|
|
Packit |
1c1d7e |
case 'x':
|
|
Packit |
1c1d7e |
case 'X': return parseHexadecimal();
|
|
Packit |
1c1d7e |
default: printf("Invalid escape sequence %s found!\n",g_strToken.data());
|
|
Packit |
1c1d7e |
return CPPValue(0L);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return CPPValue((long)g_strToken[1]);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
CPPValue parseFloat()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return CPPValue(atof(g_strToken));
|
|
Packit |
1c1d7e |
}
|