|
1 /****************************************************************************** |
|
2 * |
|
3 * |
|
4 * |
|
5 * |
|
6 * Copyright (C) 1997-2008 by Dimitri van Heesch. |
|
7 * |
|
8 * Permission to use, copy, modify, and distribute this software and its |
|
9 * documentation under the terms of the GNU General Public License is hereby |
|
10 * granted. No representations are made about the suitability of this software |
|
11 * for any purpose. It is provided "as is" without express or implied warranty. |
|
12 * See the GNU General Public License for more details. |
|
13 * |
|
14 * Documents produced by Doxygen are derivative works derived from the |
|
15 * input used in their production; they are not affected by this license. |
|
16 * |
|
17 */ |
|
18 |
|
19 #include <stdlib.h> |
|
20 |
|
21 #include "cppvalue.h" |
|
22 #include "constexp.h" |
|
23 |
|
24 CPPValue parseOctal() |
|
25 { |
|
26 long val = 0; |
|
27 for (const char *p = g_strToken.data(); *p != 0; p++) |
|
28 { |
|
29 if (*p >= '0' && *p <= '7') val = val * 8 + *p - '0'; |
|
30 } |
|
31 return CPPValue(val); |
|
32 } |
|
33 |
|
34 CPPValue parseDecimal() |
|
35 { |
|
36 long val = 0; |
|
37 for (const char *p = g_strToken.data(); *p != 0; p++) |
|
38 { |
|
39 if (*p >= '0' && *p <= '9') val = val * 10 + *p - '0'; |
|
40 } |
|
41 return CPPValue(val); |
|
42 } |
|
43 |
|
44 CPPValue parseHexadecimal() |
|
45 { |
|
46 long val = 0; |
|
47 for (const char *p = g_strToken.data(); *p != 0; p++) |
|
48 { |
|
49 if (*p >= '0' && *p <= '9') val = val * 16 + *p - '0'; |
|
50 else if (*p >= 'a' && *p <= 'f') val = val * 16 + *p - 'a' + 10; |
|
51 else if (*p >= 'A' && *p <= 'F') val = val * 16 + *p - 'A' + 10; |
|
52 } |
|
53 //printf("parseHexadecimal %s->%x\n",g_strToken.data(),val); |
|
54 return CPPValue(val); |
|
55 } |
|
56 |
|
57 CPPValue parseCharacter() // does not work for '\n' and the alike |
|
58 { |
|
59 if (g_strToken[1]=='\\') |
|
60 { |
|
61 switch(g_strToken[2]) |
|
62 { |
|
63 case 'n': return CPPValue((long)'\n'); |
|
64 case 't': return CPPValue((long)'\t'); |
|
65 case 'v': return CPPValue((long)'\v'); |
|
66 case 'b': return CPPValue((long)'\b'); |
|
67 case 'r': return CPPValue((long)'\r'); |
|
68 case 'f': return CPPValue((long)'\f'); |
|
69 case 'a': return CPPValue((long)'\a'); |
|
70 case '\\': return CPPValue((long)'\\'); |
|
71 case '?': return CPPValue((long)'\?'); |
|
72 case '\'': return CPPValue((long)'\''); |
|
73 case '"': return CPPValue((long)'"'); |
|
74 case '0': // fall through |
|
75 case '1': // fall through |
|
76 case '2': // fall through |
|
77 case '3': // fall through |
|
78 case '4': // fall through |
|
79 case '5': // fall through |
|
80 case '6': // fall through |
|
81 case '7': // fall through |
|
82 return parseOctal(); |
|
83 case 'x': |
|
84 case 'X': return parseHexadecimal(); |
|
85 default: printf("Invalid escape sequence %s found!\n",g_strToken.data()); |
|
86 return CPPValue(0L); |
|
87 } |
|
88 } |
|
89 return CPPValue((long)g_strToken[1]); |
|
90 } |
|
91 |
|
92 CPPValue parseFloat() |
|
93 { |
|
94 return CPPValue(atof(g_strToken)); |
|
95 } |