Signed-off-by: Giovanni Mascellani gmascellani@codeweavers.com
Il 11/05/22 16:39, Matteo Bruni ha scritto:
Signed-off-by: Matteo Bruni mbruni@codeweavers.com
v2: Don't duplicate parse_integer().
Supersedes 235242.
This fixes arithmetic-int.shader_test on 32-bit Linux for me.
libs/vkd3d-shader/hlsl.l | 6 ++--- libs/vkd3d-shader/preproc.y | 34 +----------------------- libs/vkd3d-shader/vkd3d_shader_main.c | 32 ++++++++++++++++++++++ libs/vkd3d-shader/vkd3d_shader_private.h | 2 ++ 4 files changed, 38 insertions(+), 36 deletions(-)
diff --git a/libs/vkd3d-shader/hlsl.l b/libs/vkd3d-shader/hlsl.l index 267c8c30..ff7b712f 100644 --- a/libs/vkd3d-shader/hlsl.l +++ b/libs/vkd3d-shader/hlsl.l @@ -197,15 +197,15 @@ row_major {return KW_ROW_MAJOR; } return C_FLOAT; } 0x[0-9a-fA-F]+ {
sscanf(yytext, "0x%x", &yylval->intval);
0[0-7]+ {yylval->intval = vkd3d_parse_integer(yytext); return C_INTEGER; }
sscanf(yytext, "0%o", &yylval->intval);
[0-9]+ {yylval->intval = vkd3d_parse_integer(yytext); return C_INTEGER; }
yylval->intval = (atoi(yytext));
yylval->intval = vkd3d_parse_integer(yytext); return C_INTEGER; }
diff --git a/libs/vkd3d-shader/preproc.y b/libs/vkd3d-shader/preproc.y index 3f02ac03..009c35ff 100644 --- a/libs/vkd3d-shader/preproc.y +++ b/libs/vkd3d-shader/preproc.y @@ -165,38 +165,6 @@ static bool preproc_push_if(struct preproc_ctx *ctx, bool condition) return true; }
-static int char_to_int(char c) -{
- if ('0' <= c && c <= '9')
return c - '0';
- if ('A' <= c && c <= 'F')
return c - 'A' + 10;
- if ('a' <= c && c <= 'f')
return c - 'a' + 10;
- return -1;
-}
-static uint32_t preproc_parse_integer(const char *s) -{
- uint32_t base = 10, ret = 0;
- int digit;
- if (*s == '0')
- {
base = 8;
++s;
if (*s == 'x' || *s == 'X')
{
base = 16;
++s;
}
- }
- while ((digit = char_to_int(*s++)) >= 0)
ret = ret * base + (uint32_t)digit;
- return ret;
-}
- static int default_open_include(const char *filename, bool local, const char *parent_data, void *context, struct vkd3d_shader_code *out) {
@@ -691,7 +659,7 @@ directive primary_expr : T_INTEGER {
$$ = preproc_parse_integer($1);
$$ = vkd3d_parse_integer($1); vkd3d_free($1); } | T_IDENTIFIER
diff --git a/libs/vkd3d-shader/vkd3d_shader_main.c b/libs/vkd3d-shader/vkd3d_shader_main.c index 62baf17f..6fd32435 100644 --- a/libs/vkd3d-shader/vkd3d_shader_main.c +++ b/libs/vkd3d-shader/vkd3d_shader_main.c @@ -24,6 +24,38 @@
VKD3D_DEBUG_ENV_NAME("VKD3D_SHADER_DEBUG");
+static inline int char_to_int(char c) +{
- if ('0' <= c && c <= '9')
return c - '0';
- if ('A' <= c && c <= 'F')
return c - 'A' + 10;
- if ('a' <= c && c <= 'f')
return c - 'a' + 10;
- return -1;
+}
+uint32_t vkd3d_parse_integer(const char *s) +{
- uint32_t base = 10, ret = 0;
- int digit;
- if (*s == '0')
- {
base = 8;
++s;
if (*s == 'x' || *s == 'X')
{
base = 16;
++s;
}
- }
- while ((digit = char_to_int(*s++)) >= 0)
ret = ret * base + (uint32_t)digit;
- return ret;
+}
- void vkd3d_string_buffer_init(struct vkd3d_string_buffer *buffer) { buffer->buffer_size = 16;
diff --git a/libs/vkd3d-shader/vkd3d_shader_private.h b/libs/vkd3d-shader/vkd3d_shader_private.h index 29e178cc..8bde5523 100644 --- a/libs/vkd3d-shader/vkd3d_shader_private.h +++ b/libs/vkd3d-shader/vkd3d_shader_private.h @@ -1035,6 +1035,8 @@ static inline size_t bytecode_get_size(struct vkd3d_bytecode_buffer *buffer) return buffer->size; }
+uint32_t vkd3d_parse_integer(const char *s);
- struct vkd3d_shader_message_context { enum vkd3d_shader_log_level log_level;