From: Nicolai Hähnle <nicolai.haeh...@amd.com> --- src/compiler/glsl/glcpp/glcpp-parse.y | 99 ++++++++++++++--------------------- src/compiler/glsl/glcpp/glcpp.h | 7 ++- src/compiler/glsl/glcpp/pp.c | 45 +++++++--------- 3 files changed, 59 insertions(+), 92 deletions(-)
diff --git a/src/compiler/glsl/glcpp/glcpp-parse.y b/src/compiler/glsl/glcpp/glcpp-parse.y index 898a26044fa..70df98ff6e1 100644 --- a/src/compiler/glsl/glcpp/glcpp-parse.y +++ b/src/compiler/glsl/glcpp/glcpp-parse.y @@ -205,78 +205,72 @@ input: ; line: control_line | SPACE control_line | text_line { _glcpp_parser_print_expanded_token_list (parser, $1); const char *newline_str = "\n"; size_t size = strlen(newline_str); - ralloc_str_append(&parser->output, newline_str, - parser->output_length, size); - parser->output_length += size; + stringbuf_append(parser->output, newline_str, size); } | expanded_line ; expanded_line: IF_EXPANDED expression NEWLINE { if (parser->is_gles && $2.undefined_macro) glcpp_error(& @1, parser, "undefined macro %s in expression (illegal in GLES)", $2.undefined_macro); _glcpp_parser_skip_stack_push_if (parser, & @1, $2.value); } | ELIF_EXPANDED expression NEWLINE { if (parser->is_gles && $2.undefined_macro) glcpp_error(& @1, parser, "undefined macro %s in expression (illegal in GLES)", $2.undefined_macro); _glcpp_parser_skip_stack_change_if (parser, & @1, "elif", $2.value); } | LINE_EXPANDED integer_constant NEWLINE { parser->has_new_line_number = 1; parser->new_line_number = $2; - ralloc_asprintf_rewrite_tail (&parser->output, - &parser->output_length, - "#line %" PRIiMAX "\n", - $2); + stringbuf_printf(parser->output, + "#line %" PRIiMAX "\n", + $2); } | LINE_EXPANDED integer_constant integer_constant NEWLINE { parser->has_new_line_number = 1; parser->new_line_number = $2; parser->has_new_source_number = 1; parser->new_source_number = $3; - ralloc_asprintf_rewrite_tail (&parser->output, - &parser->output_length, - "#line %" PRIiMAX " %" PRIiMAX "\n", - $2, $3); + stringbuf_printf(parser->output, + "#line %" PRIiMAX " %" PRIiMAX "\n", + $2, $3); } ; define: OBJ_IDENTIFIER replacement_list NEWLINE { _define_object_macro (parser, & @1, $1, $2); } | FUNC_IDENTIFIER '(' ')' replacement_list NEWLINE { _define_function_macro (parser, & @1, $1, NULL, $4); } | FUNC_IDENTIFIER '(' identifier_list ')' replacement_list NEWLINE { _define_function_macro (parser, & @1, $1, $3, $5); } ; control_line: control_line_success { const char *newline_str = "\n"; size_t size = strlen(newline_str); - ralloc_str_append(&parser->output, newline_str, - parser->output_length, size); - parser->output_length += size; + stringbuf_append(parser->output, newline_str, size); } | control_line_error | HASH_TOKEN LINE pp_tokens NEWLINE { if (parser->skip_stack == NULL || parser->skip_stack->type == SKIP_NO_SKIP) { _glcpp_parser_expand_and_lex_from (parser, LINE_EXPANDED, $3, EXPANSION_MODE_IGNORE_DEFINED); @@ -452,21 +446,21 @@ control_line_success: | HASH_TOKEN VERSION_TOKEN version_constant IDENTIFIER NEWLINE { if (parser->version_set) { glcpp_error(& @1, parser, "#version must appear on the first line"); } _glcpp_parser_handle_version_declaration(parser, $3, $4, true); } | HASH_TOKEN NEWLINE { glcpp_parser_resolve_implicit_version(parser); } | HASH_TOKEN PRAGMA NEWLINE { - ralloc_asprintf_rewrite_tail (&parser->output, &parser->output_length, "#%s", $2); + stringbuf_printf(parser->output, "#%s", $2); } ; control_line_error: HASH_TOKEN ERROR_TOKEN NEWLINE { glcpp_error(& @1, parser, "#%s", $2); } | HASH_TOKEN DEFINE_TOKEN NEWLINE { glcpp_error (& @1, parser, "#define without macro name"); } @@ -1130,145 +1124,130 @@ _token_list_equal_ignoring_space(token_list_t *a, token_list_t *b) } node_a = node_a->next; node_b = node_b->next; } return 1; } static void -_token_print(char **out, size_t *len, token_t *token) +_token_print(struct stringbuf *sb, token_t *token) { if (token->type < 256) { size_t size = sizeof(char); - ralloc_str_append(out, (char *) &token->type, *len, size); - *len += size; + stringbuf_append(sb, (char *) &token->type, size); return; } switch (token->type) { case INTEGER: - ralloc_asprintf_rewrite_tail (out, len, "%" PRIiMAX, token->value.ival); + stringbuf_printf(sb, "%" PRIiMAX, token->value.ival); break; case IDENTIFIER: case INTEGER_STRING: case OTHER: { size_t size = strlen(token->value.str); - ralloc_str_append(out, token->value.str, *len, size); - *len += size; + stringbuf_append(sb, token->value.str, size); break; } case SPACE: { const char *token_str = " "; size_t size = strlen(token_str); - ralloc_str_append(out, token_str, *len, size); - *len += size; + stringbuf_append(sb, token_str, size); break; } case LEFT_SHIFT: { const char *token_str = "<<"; size_t size = strlen(token_str); - ralloc_str_append(out, token_str, *len, size); - *len += size; + stringbuf_append(sb, token_str, size); break; } case RIGHT_SHIFT: { const char *token_str = ">>"; size_t size = strlen(token_str); - ralloc_str_append(out, token_str, *len, size); - *len += size; + stringbuf_append(sb, token_str, size); break; } case LESS_OR_EQUAL: { const char *token_str = "<="; size_t size = strlen(token_str); - ralloc_str_append(out, token_str, *len, size); - *len += size; + stringbuf_append(sb, token_str, size); break; } case GREATER_OR_EQUAL: { const char *token_str = ">="; size_t size = strlen(token_str); - ralloc_str_append(out, token_str, *len, size); - *len += size; + stringbuf_append(sb, token_str, size); break; } case EQUAL: { const char *token_str = "=="; size_t size = strlen(token_str); - ralloc_str_append(out, token_str, *len, size); - *len += size; + stringbuf_append(sb, token_str, size); break; } case NOT_EQUAL: { const char *token_str = "!="; size_t size = strlen(token_str); - ralloc_str_append(out, token_str, *len, size); - *len += size; + stringbuf_append(sb, token_str, size); break; } case AND: { const char *token_str = "&&"; size_t size = strlen(token_str); - ralloc_str_append(out, token_str, *len, size); - *len += size; + stringbuf_append(sb, token_str, size); break; } case OR: { const char *token_str = "||"; size_t size = strlen(token_str); - ralloc_str_append(out, token_str, *len, size); - *len += size; + stringbuf_append(sb, token_str, size); break; } case PASTE: { const char *token_str = "##"; size_t size = strlen(token_str); - ralloc_str_append(out, token_str, *len, size); - *len += size; + stringbuf_append(sb, token_str, size); break; } case PLUS_PLUS: { const char *token_str = "++"; size_t size = strlen(token_str); - ralloc_str_append(out, token_str, *len, size); - *len += size; + stringbuf_append(sb, token_str, size); break; } case MINUS_MINUS: { const char *token_str = "--"; size_t size = strlen(token_str); - ralloc_str_append(out, token_str, *len, size); - *len += size; + stringbuf_append(sb, token_str, size); break; } case DEFINED: { const char *token_str = "defined"; size_t size = strlen(token_str); - ralloc_str_append(out, token_str, *len, size); - *len += size; + stringbuf_append(sb, token_str, size); break; } case PLACEHOLDER: /* Nothing to print. */ break; default: assert(!"Error: Don't know how to print token."); break; } @@ -1382,39 +1361,39 @@ _token_paste(glcpp_parser_t *parser, token_t *token, token_t *other) if (combined_type == INTEGER) combined_type = INTEGER_STRING; combined = _token_create_str (parser, combined_type, str); combined->location = token->location; return combined; } FAIL: glcpp_error (&token->location, parser, ""); - ralloc_asprintf_rewrite_tail (&parser->info_log, &parser->info_log_length, "Pasting \""); - _token_print (&parser->info_log, &parser->info_log_length, token); - ralloc_asprintf_rewrite_tail (&parser->info_log, &parser->info_log_length, "\" and \""); - _token_print (&parser->info_log, &parser->info_log_length, other); - ralloc_asprintf_rewrite_tail (&parser->info_log, &parser->info_log_length, "\" does not give a valid preprocessing token.\n"); + stringbuf_printf(parser->info_log, "Pasting \""); + _token_print(parser->info_log, token); + stringbuf_printf(parser->info_log, "\" and \""); + _token_print(parser->info_log, other); + stringbuf_printf(parser->info_log, "\" does not give a valid preprocessing token.\n"); return token; } static void _token_list_print(glcpp_parser_t *parser, token_list_t *list) { token_node_t *node; if (list == NULL) return; for (node = list->head; node; node = node->next) - _token_print (&parser->output, &parser->output_length, node->token); + _token_print(parser->output, node->token); } void yyerror(YYLTYPE *locp, glcpp_parser_t *parser, const char *error) { glcpp_error(locp, parser, "%s", error); } static void add_builtin_define(glcpp_parser_t *parser, const char *name, int value) @@ -1452,24 +1431,22 @@ glcpp_parser_create(const struct gl_extensions *extension_list, parser->in_control_line = 0; parser->paren_count = 0; parser->commented_newlines = 0; parser->skip_stack = NULL; parser->skipping = 0; parser->lex_from_list = NULL; parser->lex_from_node = NULL; - parser->output = ralloc_strdup(parser, ""); - parser->output_length = 0; - parser->info_log = ralloc_strdup(parser, ""); - parser->info_log_length = 0; + parser->output = stringbuf_new(parser); + parser->info_log = stringbuf_new(parser); parser->error = 0; parser->extensions = extensions; parser->extension_list = extension_list; parser->state = state; parser->api = api; parser->version = 0; parser->version_set = false; parser->has_new_line_number = 0; @@ -2446,24 +2423,24 @@ _glcpp_parser_handle_version_declaration(glcpp_parser_t *parser, intmax_t versio add_builtin_define(parser, "__have_builtin_builtin_sign64", 1); add_builtin_define(parser, "__have_builtin_builtin_umul64", 1); add_builtin_define(parser, "__have_builtin_builtin_udiv64", 1); add_builtin_define(parser, "__have_builtin_builtin_umod64", 1); add_builtin_define(parser, "__have_builtin_builtin_idiv64", 1); add_builtin_define(parser, "__have_builtin_builtin_imod64", 1); } } if (explicitly_set) { - ralloc_asprintf_rewrite_tail(&parser->output, &parser->output_length, - "#version %" PRIiMAX "%s%s", version, - es_identifier ? " " : "", - es_identifier ? es_identifier : ""); + stringbuf_printf(parser->output, + "#version %" PRIiMAX "%s%s", version, + es_identifier ? " " : "", + es_identifier ? es_identifier : ""); } } /* GLSL version if no version is explicitly specified. */ #define IMPLICIT_GLSL_VERSION 110 /* GLSL ES version if no version is explicitly specified. */ #define IMPLICIT_GLSL_ES_VERSION 100 void diff --git a/src/compiler/glsl/glcpp/glcpp.h b/src/compiler/glsl/glcpp/glcpp.h index 2804636c30e..ed56528f5e3 100644 --- a/src/compiler/glsl/glcpp/glcpp.h +++ b/src/compiler/glsl/glcpp/glcpp.h @@ -23,20 +23,21 @@ #ifndef GLCPP_H #define GLCPP_H #include <stdint.h> #include <stdbool.h> #include "main/mtypes.h" #include "util/ralloc.h" +#include "util/stringbuf.h" #include "util/hash_table.h" #define yyscan_t void* /* Some data types used for parser values. */ typedef struct expression_value { intmax_t value; char *undefined_macro; @@ -192,24 +193,22 @@ struct glcpp_parser { int last_token_was_space; int first_non_space_token_this_line; int newline_as_space; int in_control_line; int paren_count; int commented_newlines; skip_node_t *skip_stack; int skipping; token_list_t *lex_from_list; token_node_t *lex_from_node; - char *output; - char *info_log; - size_t output_length; - size_t info_log_length; + struct stringbuf *output; + struct stringbuf *info_log; int error; glcpp_extension_iterator extensions; const struct gl_extensions *extension_list; void *state; gl_api api; unsigned version; /** * Has the #version been set? * diff --git a/src/compiler/glsl/glcpp/pp.c b/src/compiler/glsl/glcpp/pp.c index 96125f2e2f1..77a68737bd9 100644 --- a/src/compiler/glsl/glcpp/pp.c +++ b/src/compiler/glsl/glcpp/pp.c @@ -25,55 +25,45 @@ #include <string.h> #include <ctype.h> #include "glcpp.h" void glcpp_error (YYLTYPE *locp, glcpp_parser_t *parser, const char *fmt, ...) { va_list ap; parser->error = 1; - ralloc_asprintf_rewrite_tail(&parser->info_log, - &parser->info_log_length, - "%u:%u(%u): " - "preprocessor error: ", - locp->source, - locp->first_line, - locp->first_column); + stringbuf_printf(parser->info_log, + "%u:%u(%u): preprocessor error: ", + locp->source, + locp->first_line, + locp->first_column); va_start(ap, fmt); - ralloc_vasprintf_rewrite_tail(&parser->info_log, - &parser->info_log_length, - fmt, ap); + stringbuf_vprintf(parser->info_log, fmt, ap); va_end(ap); - ralloc_asprintf_rewrite_tail(&parser->info_log, - &parser->info_log_length, "\n"); + stringbuf_printf(parser->info_log, "\n"); } void glcpp_warning (YYLTYPE *locp, glcpp_parser_t *parser, const char *fmt, ...) { va_list ap; - ralloc_asprintf_rewrite_tail(&parser->info_log, - &parser->info_log_length, - "%u:%u(%u): " - "preprocessor warning: ", - locp->source, - locp->first_line, - locp->first_column); + stringbuf_printf(parser->info_log, + "%u:%u(%u): preprocessor warning: ", + locp->source, + locp->first_line, + locp->first_column); va_start(ap, fmt); - ralloc_vasprintf_rewrite_tail(&parser->info_log, - &parser->info_log_length, - fmt, ap); + stringbuf_vprintf(parser->info_log, fmt, ap); va_end(ap); - ralloc_asprintf_rewrite_tail(&parser->info_log, - &parser->info_log_length, "\n"); + stringbuf_printf(parser->info_log, "\n"); } /* Given str, (that's expected to start with a newline terminator of some * sort), return a pointer to the first character in str after the newline. * * A newline terminator can be any of the following sequences: * * "\r\n" * "\n\r" * "\n" @@ -231,19 +221,20 @@ glcpp_preprocess(void *ralloc_ctx, const char **shader, char **info_log, glcpp_lex_set_source_string (parser, *shader); glcpp_parser_parse (parser); if (parser->skip_stack) glcpp_error (&parser->skip_stack->loc, parser, "Unterminated #if\n"); glcpp_parser_resolve_implicit_version(parser); - ralloc_strcat(info_log, parser->info_log); + ralloc_strcat(info_log, stringbuf_build(parser->info_log)); - ralloc_steal(ralloc_ctx, parser->output); - *shader = parser->output; + char *shader_out = stringbuf_build(parser->output); + ralloc_steal(ralloc_ctx, shader_out); + *shader = shader_out; errors = parser->error; glcpp_parser_destroy (parser); return errors; } -- 2.11.0 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev