Blob Blame History Raw
From 925ea9d5443949cfd916504a9ed04ada8b750e27 Mon Sep 17 00:00:00 2001
From: Lauri Kasanen <cand@gmx.com>
Date: Tue, 16 Jul 2019 18:39:37 +0300
Subject: [PATCH 13/29] cc65: Add support for binary literals

Binary literals, 0b001, are a GCC extension in C and a C++14 feature.
---
 src/cc65/scanner.c |   7 +-
 test/val/binlit.c  | 533 +++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 538 insertions(+), 2 deletions(-)
 create mode 100644 test/val/binlit.c

diff --git a/src/cc65/scanner.c b/src/cc65/scanner.c
index 695085e9..3e829aab 100644
--- a/src/cc65/scanner.c
+++ b/src/cc65/scanner.c
@@ -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 */
diff --git a/test/val/binlit.c b/test/val/binlit.c
new file mode 100644
index 00000000..2b6c1ca8
--- /dev/null
+++ b/test/val/binlit.c
@@ -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;
+}
-- 
2.21.0