diff --git a/Ghidra/Features/Base/src/main/javacc/ghidra/app/util/cparser/C/C.jj b/Ghidra/Features/Base/src/main/javacc/ghidra/app/util/cparser/C/C.jj index 49d6bd44d4..f295183396 100644 --- a/Ghidra/Features/Base/src/main/javacc/ghidra/app/util/cparser/C/C.jj +++ b/Ghidra/Features/Base/src/main/javacc/ghidra/app/util/cparser/C/C.jj @@ -1079,11 +1079,11 @@ SKIP : TOKEN : { ( "ull" | "ULL" | "ul" | "UL" | "ll" | "LL" | "l" | "L" | "U" | "u")? ("i")? ( ["0"-"9"] )* + ("u"|"U")? ("ll"|"LL"|"l"|"L")? (("i"|"I") ("8"|"16"|"32"|"64"|"128"))? | - ( "ull" | "ULL" | "ul" | "UL" | "ll" | "LL" | "l" | "L" | "U" | "u")? ("i")? ( ["0"-"9"] )* + ("u"|"U")? ("ll"|"LL"|"l"|"L")? (("i"|"I") ("8"|"16"|"32"|"64"|"128"))? | - ( "ull" | "ULL" | "ul" | "UL" | "ll" | "LL" | "l" | "L" | "U" | "u")? ("i")? ( ["0"-"9"] )* + ("u"|"U")? ("ll"|"LL"|"l"|"L")? (("i"|"I") ("8"|"16"|"32"|"64"|"128"))? > | <#DECIMAL_LITERAL : [ "1"-"9" ] ( [ "0"-"9" ] )*> @@ -3079,39 +3079,46 @@ Object Constant() : { ( t = { - String sval = t.image; - if (sval.endsWith("i8") || sval.endsWith("I8")) { + String sval = t.image.toLowerCase(); + if (sval.endsWith("i8")) { sval = sval.substring(0,sval.length()-2); } - else if (sval.endsWith("i16") || sval.endsWith("I16")) { + else if (sval.endsWith("i16")) { sval = sval.substring(0,sval.length()-3); } - else if (sval.endsWith("i32") || sval.endsWith("I32")) { + else if (sval.endsWith("i32")) { sval = sval.substring(0,sval.length()-3); } - else if (sval.endsWith("i64") || sval.endsWith("I64")) { + else if (sval.endsWith("i64")) { sval = sval.substring(0,sval.length()-3); } + else if (sval.endsWith("i128")) { + sval = sval.substring(0,sval.length()-4); + } - if (sval.endsWith("ull") || sval.endsWith("ULL")) { + if (sval.endsWith("ull")) { sval = sval.substring(0,sval.length()-3); } - else if (sval.endsWith("ll") || sval.endsWith("LL")) { + else if (sval.endsWith("ll")) { sval = sval.substring(0,sval.length()-2); } - else if (sval.endsWith("ul") || sval.endsWith("UL")) { + else if (sval.endsWith("ul")) { sval = sval.substring(0,sval.length()-2); } - else if (sval.endsWith("l") || sval.endsWith("L")) { + else if (sval.endsWith("l")) { sval = sval.substring(0,sval.length()-1); } - else if (sval.endsWith("u") || sval.endsWith("U")) { + else if (sval.endsWith("u")) { sval = sval.substring(0,sval.length()-1); } - if (sval.startsWith("0x") || sval.startsWith("0X")) { + if (sval.startsWith("0x")) { BigInteger bigConst = new BigInteger(sval.substring(2), 16); obj = Long.valueOf(bigConst.longValue()); } + else if (sval.startsWith("0")) { + BigInteger bigConst = new BigInteger(sval, 8); + obj = Long.valueOf(bigConst.longValue()); + } else { BigInteger bigConst = new BigInteger(sval); obj = Long.valueOf(bigConst.longValue()); diff --git a/Ghidra/Features/Base/src/test/resources/ghidra/app/util/cparser/CParserTest.h b/Ghidra/Features/Base/src/test/resources/ghidra/app/util/cparser/CParserTest.h index 0b536ee0e7..114d618b98 100644 --- a/Ghidra/Features/Base/src/test/resources/ghidra/app/util/cparser/CParserTest.h +++ b/Ghidra/Features/Base/src/test/resources/ghidra/app/util/cparser/CParserTest.h @@ -1189,8 +1189,37 @@ void multilineStrings(void) char b[] = "This is a " "multiline string."; } - +/** + ** Constants + **/ + /* Decimal */ + int d_int = 123; + unsigned d_uint = 4000000123u; + long d_long = 1000000123l; + unsigned long d_ulong = 7000000001ul; + long long d_llong = 6000000002LL; + unsigned long long d_ullong = 50000000003ull; + __int64 d_i64 = 500000000004I64; + unsigned __int64 d_ui64 = 5000000000005ui64; + /* Octal */ + int o_int = 01234; + unsigned o_uint = 04000000012u; + long o_long = 02000000024l; + unsigned long o_ulong = 01000000001UL; + long long o_llong = 01100000000002ll; + unsigned long long o_ullong = 01110000000000003Ull; + __int64 o_i64 = 0111100000000000004i64; + unsigned __int64 o_ui64 = 0222200000000000005uI64; + /* Hexadecimal */ + int h_int = 0x123b; + unsigned h_uint = 0XB0000012u; + long h_long = 0x20000034l; + unsigned long h_ulong = 0XA0000056uL; + long long h_llong = 0x8b00000000000ll; + unsigned long long h_ullong = 0xAC4000000000012uLL; + __int64 h_i64 = 0x6d2200000000023I64; + unsigned __int64 h_ui64 = 0x7e4400000000034Ui64; /** ** #line in structure/function body