1
0
mirror of https://github.com/cc65/cc65.git synced 2024-12-28 22:30:12 +00:00

cc65: Add support for binary literals

Binary literals, 0b001, are a GCC extension in C and a C++14 feature.
This commit is contained in:
Lauri Kasanen 2019-07-16 18:39:37 +03:00 committed by Oliver Schmidt
parent 76fe064e03
commit 925ea9d544
2 changed files with 538 additions and 2 deletions

View File

@ -464,8 +464,8 @@ static void NumericConst (void)
unsigned DigitVal;
unsigned long IVal; /* Value */
/* Check for a leading hex or octal prefix and determine the possible
** integer types.
/* Check for a leading hex, octal or binary prefix and determine the
** possible integer types.
*/
if (CurC == '0') {
/* Gobble 0 and examine next char */
@ -473,6 +473,9 @@ static void NumericConst (void)
if (toupper (CurC) == 'X') {
Base = Prefix = 16;
NextChar (); /* gobble "x" */
} else if (toupper (CurC) == 'B' && IS_Get (&Standard) >= STD_CC65) {
Base = Prefix = 2;
NextChar (); /* gobble 'b' */
} else {
Base = 10; /* Assume 10 for now - see below */
Prefix = 8; /* Actual prefix says octal */

533
test/val/binlit.c Normal file
View File

@ -0,0 +1,533 @@
static unsigned char small[256];
static unsigned big[256];
int main() {
unsigned i;
small[0] = 0b0;
small[1] = 0b1;
small[2] = 0b10;
small[3] = 0b11;
small[4] = 0b100;
small[5] = 0b101;
small[6] = 0b110;
small[7] = 0b111;
small[8] = 0b1000;
small[9] = 0b1001;
small[10] = 0b1010;
small[11] = 0b1011;
small[12] = 0b1100;
small[13] = 0b1101;
small[14] = 0b1110;
small[15] = 0b1111;
small[16] = 0b10000;
small[17] = 0b10001;
small[18] = 0b10010;
small[19] = 0b10011;
small[20] = 0b10100;
small[21] = 0b10101;
small[22] = 0b10110;
small[23] = 0b10111;
small[24] = 0b11000;
small[25] = 0b11001;
small[26] = 0b11010;
small[27] = 0b11011;
small[28] = 0b11100;
small[29] = 0b11101;
small[30] = 0b11110;
small[31] = 0b11111;
small[32] = 0b100000;
small[33] = 0b100001;
small[34] = 0b100010;
small[35] = 0b100011;
small[36] = 0b100100;
small[37] = 0b100101;
small[38] = 0b100110;
small[39] = 0b100111;
small[40] = 0b101000;
small[41] = 0b101001;
small[42] = 0b101010;
small[43] = 0b101011;
small[44] = 0b101100;
small[45] = 0b101101;
small[46] = 0b101110;
small[47] = 0b101111;
small[48] = 0b110000;
small[49] = 0b110001;
small[50] = 0b110010;
small[51] = 0b110011;
small[52] = 0b110100;
small[53] = 0b110101;
small[54] = 0b110110;
small[55] = 0b110111;
small[56] = 0b111000;
small[57] = 0b111001;
small[58] = 0b111010;
small[59] = 0b111011;
small[60] = 0b111100;
small[61] = 0b111101;
small[62] = 0b111110;
small[63] = 0b111111;
small[64] = 0b1000000;
small[65] = 0b1000001;
small[66] = 0b1000010;
small[67] = 0b1000011;
small[68] = 0b1000100;
small[69] = 0b1000101;
small[70] = 0b1000110;
small[71] = 0b1000111;
small[72] = 0b1001000;
small[73] = 0b1001001;
small[74] = 0b1001010;
small[75] = 0b1001011;
small[76] = 0b1001100;
small[77] = 0b1001101;
small[78] = 0b1001110;
small[79] = 0b1001111;
small[80] = 0b1010000;
small[81] = 0b1010001;
small[82] = 0b1010010;
small[83] = 0b1010011;
small[84] = 0b1010100;
small[85] = 0b1010101;
small[86] = 0b1010110;
small[87] = 0b1010111;
small[88] = 0b1011000;
small[89] = 0b1011001;
small[90] = 0b1011010;
small[91] = 0b1011011;
small[92] = 0b1011100;
small[93] = 0b1011101;
small[94] = 0b1011110;
small[95] = 0b1011111;
small[96] = 0b1100000;
small[97] = 0b1100001;
small[98] = 0b1100010;
small[99] = 0b1100011;
small[100] = 0b1100100;
small[101] = 0b1100101;
small[102] = 0b1100110;
small[103] = 0b1100111;
small[104] = 0b1101000;
small[105] = 0b1101001;
small[106] = 0b1101010;
small[107] = 0b1101011;
small[108] = 0b1101100;
small[109] = 0b1101101;
small[110] = 0b1101110;
small[111] = 0b1101111;
small[112] = 0b1110000;
small[113] = 0b1110001;
small[114] = 0b1110010;
small[115] = 0b1110011;
small[116] = 0b1110100;
small[117] = 0b1110101;
small[118] = 0b1110110;
small[119] = 0b1110111;
small[120] = 0b1111000;
small[121] = 0b1111001;
small[122] = 0b1111010;
small[123] = 0b1111011;
small[124] = 0b1111100;
small[125] = 0b1111101;
small[126] = 0b1111110;
small[127] = 0b1111111;
small[128] = 0b10000000;
small[129] = 0b10000001;
small[130] = 0b10000010;
small[131] = 0b10000011;
small[132] = 0b10000100;
small[133] = 0b10000101;
small[134] = 0b10000110;
small[135] = 0b10000111;
small[136] = 0b10001000;
small[137] = 0b10001001;
small[138] = 0b10001010;
small[139] = 0b10001011;
small[140] = 0b10001100;
small[141] = 0b10001101;
small[142] = 0b10001110;
small[143] = 0b10001111;
small[144] = 0b10010000;
small[145] = 0b10010001;
small[146] = 0b10010010;
small[147] = 0b10010011;
small[148] = 0b10010100;
small[149] = 0b10010101;
small[150] = 0b10010110;
small[151] = 0b10010111;
small[152] = 0b10011000;
small[153] = 0b10011001;
small[154] = 0b10011010;
small[155] = 0b10011011;
small[156] = 0b10011100;
small[157] = 0b10011101;
small[158] = 0b10011110;
small[159] = 0b10011111;
small[160] = 0b10100000;
small[161] = 0b10100001;
small[162] = 0b10100010;
small[163] = 0b10100011;
small[164] = 0b10100100;
small[165] = 0b10100101;
small[166] = 0b10100110;
small[167] = 0b10100111;
small[168] = 0b10101000;
small[169] = 0b10101001;
small[170] = 0b10101010;
small[171] = 0b10101011;
small[172] = 0b10101100;
small[173] = 0b10101101;
small[174] = 0b10101110;
small[175] = 0b10101111;
small[176] = 0b10110000;
small[177] = 0b10110001;
small[178] = 0b10110010;
small[179] = 0b10110011;
small[180] = 0b10110100;
small[181] = 0b10110101;
small[182] = 0b10110110;
small[183] = 0b10110111;
small[184] = 0b10111000;
small[185] = 0b10111001;
small[186] = 0b10111010;
small[187] = 0b10111011;
small[188] = 0b10111100;
small[189] = 0b10111101;
small[190] = 0b10111110;
small[191] = 0b10111111;
small[192] = 0b11000000;
small[193] = 0b11000001;
small[194] = 0b11000010;
small[195] = 0b11000011;
small[196] = 0b11000100;
small[197] = 0b11000101;
small[198] = 0b11000110;
small[199] = 0b11000111;
small[200] = 0b11001000;
small[201] = 0b11001001;
small[202] = 0b11001010;
small[203] = 0b11001011;
small[204] = 0b11001100;
small[205] = 0b11001101;
small[206] = 0b11001110;
small[207] = 0b11001111;
small[208] = 0b11010000;
small[209] = 0b11010001;
small[210] = 0b11010010;
small[211] = 0b11010011;
small[212] = 0b11010100;
small[213] = 0b11010101;
small[214] = 0b11010110;
small[215] = 0b11010111;
small[216] = 0b11011000;
small[217] = 0b11011001;
small[218] = 0b11011010;
small[219] = 0b11011011;
small[220] = 0b11011100;
small[221] = 0b11011101;
small[222] = 0b11011110;
small[223] = 0b11011111;
small[224] = 0b11100000;
small[225] = 0b11100001;
small[226] = 0b11100010;
small[227] = 0b11100011;
small[228] = 0b11100100;
small[229] = 0b11100101;
small[230] = 0b11100110;
small[231] = 0b11100111;
small[232] = 0b11101000;
small[233] = 0b11101001;
small[234] = 0b11101010;
small[235] = 0b11101011;
small[236] = 0b11101100;
small[237] = 0b11101101;
small[238] = 0b11101110;
small[239] = 0b11101111;
small[240] = 0b11110000;
small[241] = 0b11110001;
small[242] = 0b11110010;
small[243] = 0b11110011;
small[244] = 0b11110100;
small[245] = 0b11110101;
small[246] = 0b11110110;
small[247] = 0b11110111;
small[248] = 0b11111000;
small[249] = 0b11111001;
small[250] = 0b11111010;
small[251] = 0b11111011;
small[252] = 0b11111100;
small[253] = 0b11111101;
small[254] = 0b11111110;
small[255] = 0b11111111;
for (i = 0; i < 256; i++) {
if (small[i] != i)
return 1;
}
big[0] = 0b1111111100000000;
big[1] = 0b1111111100000001;
big[2] = 0b1111111100000010;
big[3] = 0b1111111100000011;
big[4] = 0b1111111100000100;
big[5] = 0b1111111100000101;
big[6] = 0b1111111100000110;
big[7] = 0b1111111100000111;
big[8] = 0b1111111100001000;
big[9] = 0b1111111100001001;
big[10] = 0b1111111100001010;
big[11] = 0b1111111100001011;
big[12] = 0b1111111100001100;
big[13] = 0b1111111100001101;
big[14] = 0b1111111100001110;
big[15] = 0b1111111100001111;
big[16] = 0b1111111100010000;
big[17] = 0b1111111100010001;
big[18] = 0b1111111100010010;
big[19] = 0b1111111100010011;
big[20] = 0b1111111100010100;
big[21] = 0b1111111100010101;
big[22] = 0b1111111100010110;
big[23] = 0b1111111100010111;
big[24] = 0b1111111100011000;
big[25] = 0b1111111100011001;
big[26] = 0b1111111100011010;
big[27] = 0b1111111100011011;
big[28] = 0b1111111100011100;
big[29] = 0b1111111100011101;
big[30] = 0b1111111100011110;
big[31] = 0b1111111100011111;
big[32] = 0b1111111100100000;
big[33] = 0b1111111100100001;
big[34] = 0b1111111100100010;
big[35] = 0b1111111100100011;
big[36] = 0b1111111100100100;
big[37] = 0b1111111100100101;
big[38] = 0b1111111100100110;
big[39] = 0b1111111100100111;
big[40] = 0b1111111100101000;
big[41] = 0b1111111100101001;
big[42] = 0b1111111100101010;
big[43] = 0b1111111100101011;
big[44] = 0b1111111100101100;
big[45] = 0b1111111100101101;
big[46] = 0b1111111100101110;
big[47] = 0b1111111100101111;
big[48] = 0b1111111100110000;
big[49] = 0b1111111100110001;
big[50] = 0b1111111100110010;
big[51] = 0b1111111100110011;
big[52] = 0b1111111100110100;
big[53] = 0b1111111100110101;
big[54] = 0b1111111100110110;
big[55] = 0b1111111100110111;
big[56] = 0b1111111100111000;
big[57] = 0b1111111100111001;
big[58] = 0b1111111100111010;
big[59] = 0b1111111100111011;
big[60] = 0b1111111100111100;
big[61] = 0b1111111100111101;
big[62] = 0b1111111100111110;
big[63] = 0b1111111100111111;
big[64] = 0b1111111101000000;
big[65] = 0b1111111101000001;
big[66] = 0b1111111101000010;
big[67] = 0b1111111101000011;
big[68] = 0b1111111101000100;
big[69] = 0b1111111101000101;
big[70] = 0b1111111101000110;
big[71] = 0b1111111101000111;
big[72] = 0b1111111101001000;
big[73] = 0b1111111101001001;
big[74] = 0b1111111101001010;
big[75] = 0b1111111101001011;
big[76] = 0b1111111101001100;
big[77] = 0b1111111101001101;
big[78] = 0b1111111101001110;
big[79] = 0b1111111101001111;
big[80] = 0b1111111101010000;
big[81] = 0b1111111101010001;
big[82] = 0b1111111101010010;
big[83] = 0b1111111101010011;
big[84] = 0b1111111101010100;
big[85] = 0b1111111101010101;
big[86] = 0b1111111101010110;
big[87] = 0b1111111101010111;
big[88] = 0b1111111101011000;
big[89] = 0b1111111101011001;
big[90] = 0b1111111101011010;
big[91] = 0b1111111101011011;
big[92] = 0b1111111101011100;
big[93] = 0b1111111101011101;
big[94] = 0b1111111101011110;
big[95] = 0b1111111101011111;
big[96] = 0b1111111101100000;
big[97] = 0b1111111101100001;
big[98] = 0b1111111101100010;
big[99] = 0b1111111101100011;
big[100] = 0b1111111101100100;
big[101] = 0b1111111101100101;
big[102] = 0b1111111101100110;
big[103] = 0b1111111101100111;
big[104] = 0b1111111101101000;
big[105] = 0b1111111101101001;
big[106] = 0b1111111101101010;
big[107] = 0b1111111101101011;
big[108] = 0b1111111101101100;
big[109] = 0b1111111101101101;
big[110] = 0b1111111101101110;
big[111] = 0b1111111101101111;
big[112] = 0b1111111101110000;
big[113] = 0b1111111101110001;
big[114] = 0b1111111101110010;
big[115] = 0b1111111101110011;
big[116] = 0b1111111101110100;
big[117] = 0b1111111101110101;
big[118] = 0b1111111101110110;
big[119] = 0b1111111101110111;
big[120] = 0b1111111101111000;
big[121] = 0b1111111101111001;
big[122] = 0b1111111101111010;
big[123] = 0b1111111101111011;
big[124] = 0b1111111101111100;
big[125] = 0b1111111101111101;
big[126] = 0b1111111101111110;
big[127] = 0b1111111101111111;
big[128] = 0b1111111110000000;
big[129] = 0b1111111110000001;
big[130] = 0b1111111110000010;
big[131] = 0b1111111110000011;
big[132] = 0b1111111110000100;
big[133] = 0b1111111110000101;
big[134] = 0b1111111110000110;
big[135] = 0b1111111110000111;
big[136] = 0b1111111110001000;
big[137] = 0b1111111110001001;
big[138] = 0b1111111110001010;
big[139] = 0b1111111110001011;
big[140] = 0b1111111110001100;
big[141] = 0b1111111110001101;
big[142] = 0b1111111110001110;
big[143] = 0b1111111110001111;
big[144] = 0b1111111110010000;
big[145] = 0b1111111110010001;
big[146] = 0b1111111110010010;
big[147] = 0b1111111110010011;
big[148] = 0b1111111110010100;
big[149] = 0b1111111110010101;
big[150] = 0b1111111110010110;
big[151] = 0b1111111110010111;
big[152] = 0b1111111110011000;
big[153] = 0b1111111110011001;
big[154] = 0b1111111110011010;
big[155] = 0b1111111110011011;
big[156] = 0b1111111110011100;
big[157] = 0b1111111110011101;
big[158] = 0b1111111110011110;
big[159] = 0b1111111110011111;
big[160] = 0b1111111110100000;
big[161] = 0b1111111110100001;
big[162] = 0b1111111110100010;
big[163] = 0b1111111110100011;
big[164] = 0b1111111110100100;
big[165] = 0b1111111110100101;
big[166] = 0b1111111110100110;
big[167] = 0b1111111110100111;
big[168] = 0b1111111110101000;
big[169] = 0b1111111110101001;
big[170] = 0b1111111110101010;
big[171] = 0b1111111110101011;
big[172] = 0b1111111110101100;
big[173] = 0b1111111110101101;
big[174] = 0b1111111110101110;
big[175] = 0b1111111110101111;
big[176] = 0b1111111110110000;
big[177] = 0b1111111110110001;
big[178] = 0b1111111110110010;
big[179] = 0b1111111110110011;
big[180] = 0b1111111110110100;
big[181] = 0b1111111110110101;
big[182] = 0b1111111110110110;
big[183] = 0b1111111110110111;
big[184] = 0b1111111110111000;
big[185] = 0b1111111110111001;
big[186] = 0b1111111110111010;
big[187] = 0b1111111110111011;
big[188] = 0b1111111110111100;
big[189] = 0b1111111110111101;
big[190] = 0b1111111110111110;
big[191] = 0b1111111110111111;
big[192] = 0b1111111111000000;
big[193] = 0b1111111111000001;
big[194] = 0b1111111111000010;
big[195] = 0b1111111111000011;
big[196] = 0b1111111111000100;
big[197] = 0b1111111111000101;
big[198] = 0b1111111111000110;
big[199] = 0b1111111111000111;
big[200] = 0b1111111111001000;
big[201] = 0b1111111111001001;
big[202] = 0b1111111111001010;
big[203] = 0b1111111111001011;
big[204] = 0b1111111111001100;
big[205] = 0b1111111111001101;
big[206] = 0b1111111111001110;
big[207] = 0b1111111111001111;
big[208] = 0b1111111111010000;
big[209] = 0b1111111111010001;
big[210] = 0b1111111111010010;
big[211] = 0b1111111111010011;
big[212] = 0b1111111111010100;
big[213] = 0b1111111111010101;
big[214] = 0b1111111111010110;
big[215] = 0b1111111111010111;
big[216] = 0b1111111111011000;
big[217] = 0b1111111111011001;
big[218] = 0b1111111111011010;
big[219] = 0b1111111111011011;
big[220] = 0b1111111111011100;
big[221] = 0b1111111111011101;
big[222] = 0b1111111111011110;
big[223] = 0b1111111111011111;
big[224] = 0b1111111111100000;
big[225] = 0b1111111111100001;
big[226] = 0b1111111111100010;
big[227] = 0b1111111111100011;
big[228] = 0b1111111111100100;
big[229] = 0b1111111111100101;
big[230] = 0b1111111111100110;
big[231] = 0b1111111111100111;
big[232] = 0b1111111111101000;
big[233] = 0b1111111111101001;
big[234] = 0b1111111111101010;
big[235] = 0b1111111111101011;
big[236] = 0b1111111111101100;
big[237] = 0b1111111111101101;
big[238] = 0b1111111111101110;
big[239] = 0b1111111111101111;
big[240] = 0b1111111111110000;
big[241] = 0b1111111111110001;
big[242] = 0b1111111111110010;
big[243] = 0b1111111111110011;
big[244] = 0b1111111111110100;
big[245] = 0b1111111111110101;
big[246] = 0b1111111111110110;
big[247] = 0b1111111111110111;
big[248] = 0b1111111111111000;
big[249] = 0b1111111111111001;
big[250] = 0b1111111111111010;
big[251] = 0b1111111111111011;
big[252] = 0b1111111111111100;
big[253] = 0b1111111111111101;
big[254] = 0b1111111111111110;
big[255] = 0b1111111111111111;
for (i = 0; i < 256; i++) {
if (big[i] != i + 65280U)
return 1;
}
return 0;
}