[Mesa-dev] [PATCH] glsl/glcpp: Handle hex constants with 0X prefix
Timothy Arceri
tarceri at itsqueeze.com
Mon Apr 23 00:53:12 UTC 2018
On 20/04/18 06:08, Vlad Golovkin wrote:
> 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.
The problem is strtoll supports much more than what GLSL allows.
>
> Also added 1 test for uppercase hex prefix.
> ---
> src/compiler/glsl/glcpp/glcpp-parse.y | 9 ++-------
> src/compiler/glsl/glcpp/tests/149-hex-const-uppercase-prefix.c | 5 +++++
> .../glsl/glcpp/tests/149-hex-const-uppercase-prefix.c.expected | 5 +++++
> 3 files changed, 12 insertions(+), 7 deletions(-)
> create mode 100644 src/compiler/glsl/glcpp/tests/149-hex-const-uppercase-prefix.c
> create mode 100644 src/compiler/glsl/glcpp/tests/149-hex-const-uppercase-prefix.c.expected
>
> diff --git a/src/compiler/glsl/glcpp/glcpp-parse.y b/src/compiler/glsl/glcpp/glcpp-parse.y
> index ccb3aa18d3..d83f99f1c7 100644
> --- a/src/compiler/glsl/glcpp/glcpp-parse.y
> +++ b/src/compiler/glsl/glcpp/glcpp-parse.y
> @@ -462,13 +462,8 @@ control_line_error:
>
> integer_constant:
> INTEGER_STRING {
> - if (strlen ($1) >= 3 && strncmp ($1, "0x", 2) == 0) {
As per my coment above strtoll supports much more than what GLSL allows.
Please just add strncmp($1, "0X", 2) == 0 to the if above.
That patch would have my r-b. If you send that fixed up patch I can push
it for you. Thanks for looking into this.
> - $$ = 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
> index 0000000000..1be9b28eb7
> --- /dev/null
> +++ b/src/compiler/glsl/glcpp/tests/149-hex-const-uppercase-prefix.c
> @@ -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
> index 0000000000..4cf250f6bb
> --- /dev/null
> +++ b/src/compiler/glsl/glcpp/tests/149-hex-const-uppercase-prefix.c.expected
> @@ -0,0 +1,5 @@
> +
> +success
> +
> +
> +
>
More information about the mesa-dev
mailing list