125 строки
4.1 KiB
Diff
125 строки
4.1 KiB
Diff
From 2b1d8978ea303e8da1bc8f672cdb82c76ef38c02 Mon Sep 17 00:00:00 2001
|
|
From: =?UTF-8?q?Petr=20P=C3=ADsa=C5=99?= <ppisar@redhat.com>
|
|
Date: Mon, 3 Dec 2018 10:42:21 +0100
|
|
Subject: [PATCH] Recognize binary integer literals
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
Some compilers support binary constants written as 0b1 or 0B1. This is
|
|
the case of GCC
|
|
<https://gcc.gnu.org/onlinedocs/gcc/Binary-constants.html>.
|
|
|
|
This is based on a patch provided by Josef Kubin <entomolog@centrum.cz>.
|
|
|
|
<https://bugzilla.redhat.com/show_bug.cgi?id=1655319>
|
|
|
|
Signed-off-by: Petr Písař <ppisar@redhat.com>
|
|
---
|
|
regression/TEST | 2 +-
|
|
regression/input/binary-constant.c | 12 ++++++++++++
|
|
regression/standard/binary-constant.c | 12 ++++++++++++
|
|
src/lexi.c | 23 +++++++++++++++++------
|
|
4 files changed, 42 insertions(+), 7 deletions(-)
|
|
create mode 100644 regression/input/binary-constant.c
|
|
create mode 100644 regression/standard/binary-constant.c
|
|
|
|
diff --git a/regression/TEST b/regression/TEST
|
|
index 56f41d9..64b9bce 100755
|
|
--- a/regression/TEST
|
|
+++ b/regression/TEST
|
|
@@ -37,7 +37,7 @@ BUGS="case-label.c one-line-1.c one-line-2.c one-line-3.c \
|
|
one-line-4.c struct-decl.c sizeof-in-while.c line-break-comment.c \
|
|
macro.c enum.c elif.c nested.c wrapped-string.c minus_predecrement.c \
|
|
bug-gnu-33364.c float-constant-suffix.c block-comments.c \
|
|
- no-forced-nl-in-block-init.c hexadecimal_float.c"
|
|
+ no-forced-nl-in-block-init.c hexadecimal_float.c binary-constant.c"
|
|
|
|
INDENTSRC="args.c backup.h backup.c dirent_def.h globs.c indent.h \
|
|
indent.c indent_globs.h io.c lexi.c memcpy.c parse.c pr_comment.c \
|
|
diff --git a/regression/input/binary-constant.c b/regression/input/binary-constant.c
|
|
new file mode 100644
|
|
index 0000000..25f1624
|
|
--- /dev/null
|
|
+++ b/regression/input/binary-constant.c
|
|
@@ -0,0 +1,12 @@
|
|
+int foo = 0b1;
|
|
+long int foo = 0b1L;
|
|
+unsigned int foo = 0b1U;
|
|
+unsigned long int foo = 0b1LU;
|
|
+
|
|
+int foo = 0B1;
|
|
+long int foo = 0B1L;
|
|
+unsigned int foo = 0B1U;
|
|
+unsigned long int foo = 0B1LU;
|
|
+
|
|
+int foo = 0b01010101;
|
|
+int foo = 0B01010101;
|
|
diff --git a/regression/standard/binary-constant.c b/regression/standard/binary-constant.c
|
|
new file mode 100644
|
|
index 0000000..25f1624
|
|
--- /dev/null
|
|
+++ b/regression/standard/binary-constant.c
|
|
@@ -0,0 +1,12 @@
|
|
+int foo = 0b1;
|
|
+long int foo = 0b1L;
|
|
+unsigned int foo = 0b1U;
|
|
+unsigned long int foo = 0b1LU;
|
|
+
|
|
+int foo = 0B1;
|
|
+long int foo = 0B1L;
|
|
+unsigned int foo = 0B1U;
|
|
+unsigned long int foo = 0B1LU;
|
|
+
|
|
+int foo = 0b01010101;
|
|
+int foo = 0B01010101;
|
|
diff --git a/src/lexi.c b/src/lexi.c
|
|
index 848ddc9..6eaba95 100644
|
|
--- a/src/lexi.c
|
|
+++ b/src/lexi.c
|
|
@@ -286,15 +286,24 @@ extern codes_ty lexi(void)
|
|
if (parser_state_tos->last_rw == rw_return)
|
|
parser_state_tos->last_rw = rw_none;
|
|
|
|
+ /* decimal, octal, hex, binary and floating point number format */
|
|
if (isdigit (*buf_ptr) ||
|
|
((buf_ptr[0] == '.') && isdigit (buf_ptr[1])))
|
|
{
|
|
- int seendot = 0, seenexp = 0, ishexa = 0;
|
|
+ int seendot = 0, seenexp = 0, ishexa = 0, isbinary = 0;
|
|
|
|
- if ((*buf_ptr == '0') && ((buf_ptr[1] == 'x') || (buf_ptr[1] == 'X')))
|
|
+ if (*buf_ptr == '0')
|
|
{
|
|
- ishexa = 1;
|
|
- buf_ptr += 1;
|
|
+ if ((buf_ptr[1] == 'x') || (buf_ptr[1] == 'X'))
|
|
+ {
|
|
+ ishexa = 1;
|
|
+ buf_ptr += 1;
|
|
+ }
|
|
+ else if ((buf_ptr[1] == 'b') || (buf_ptr[1] == 'B'))
|
|
+ {
|
|
+ isbinary = 1;
|
|
+ buf_ptr += 1;
|
|
+ }
|
|
}
|
|
while (1)
|
|
{
|
|
@@ -312,8 +321,10 @@ extern codes_ty lexi(void)
|
|
|
|
buf_ptr++;
|
|
|
|
- if (!(ishexa && !seenexp ?
|
|
- isxdigit (*buf_ptr) : isdigit (*buf_ptr)
|
|
+ if (!(
|
|
+ (ishexa && !seenexp && isxdigit (*buf_ptr)) ||
|
|
+ (isbinary && !seenexp && (*buf_ptr == '0' || *buf_ptr == '1')) ||
|
|
+ ((!(ishexa || isbinary) || seenexp) && isdigit (*buf_ptr))
|
|
) && *buf_ptr != '.')
|
|
{
|
|
if ((ishexa ?
|
|
--
|
|
2.17.2
|
|
|