glsl/glcpp: Handle hex constants with 0X prefix
authorVlad Golovkin <vlad.golovkin.mail@gmail.com>
Thu, 19 Apr 2018 20:08:01 +0000 (23:08 +0300)
committerTimothy Arceri <tarceri@itsqueeze.com>
Mon, 23 Apr 2018 23:55:05 +0000 (09:55 +1000)
GLSL 4.6 spec describes hex constant as:

hexadecimal-constant:
    0x hexadecimal-digit
    0X hexadecimal-digit
    hexadecimal-constant hexadecimal-digit

Right now if you have a shader with the following structure:

    #if 0X1 // or any hex number with the 0X prefix
    // some code
    #endif

the code between #if and #endif gets removed because the checking is performed
only for "0x" prefix which results in strtoll being called with the base 8 and
after encountering the 'X' char the strtoll returns 0. Letting strtoll detect
the base makes this limitation go away and also makes code easier to read.

From the strtoll Linux man page:

"If base is zero or 16, the string may then include a "0x" prefix, and the
number will be read in base 16; otherwise, a zero base is taken as 10 (decimal)
unless the next character is '0', in which case it is taken as 8 (octal)."

This matches the behaviour in the GLSL spec.

This patch also adds a test for uppercase hex prefix.

Reviewed-by: Timothy Arceri <tarceri@itsqueeze.com>
src/compiler/glsl/glcpp/glcpp-parse.y
src/compiler/glsl/glcpp/tests/149-hex-const-uppercase-prefix.c [new file with mode: 0644]
src/compiler/glsl/glcpp/tests/149-hex-const-uppercase-prefix.c.expected [new file with mode: 0644]

index ccb3aa18d36ca086c8f7442bba6458382defec13..d83f99f1c7e05a567432bd96a879dcf993d6cf20 100644 (file)
@@ -462,13 +462,8 @@ control_line_error:
 
 integer_constant:
        INTEGER_STRING {
-               if (strlen ($1) >= 3 && strncmp ($1, "0x", 2) == 0) {
-                       $$ = strtoll ($1 + 2, NULL, 16);
-               } else if ($1[0] == '0') {
-                       $$ = strtoll ($1, NULL, 8);
-               } else {
-                       $$ = strtoll ($1, NULL, 10);
-               }
+               /* let strtoll detect the base */
+               $$ = strtoll ($1, NULL, 0);
        }
 |      INTEGER {
                $$ = $1;
diff --git a/src/compiler/glsl/glcpp/tests/149-hex-const-uppercase-prefix.c b/src/compiler/glsl/glcpp/tests/149-hex-const-uppercase-prefix.c
new file mode 100644 (file)
index 0000000..1be9b28
--- /dev/null
@@ -0,0 +1,5 @@
+#if 0x1234abcd == 0X1234abcd
+success
+#else
+failure
+#endif
diff --git a/src/compiler/glsl/glcpp/tests/149-hex-const-uppercase-prefix.c.expected b/src/compiler/glsl/glcpp/tests/149-hex-const-uppercase-prefix.c.expected
new file mode 100644 (file)
index 0000000..4cf250f
--- /dev/null
@@ -0,0 +1,5 @@
+
+success
+
+
+