X-Git-Url: https://git.efficios.com/?a=blobdiff_plain;f=src%2Fplugins%2Fctf%2Fcommon%2Fmetadata%2Fparser.y;h=a75cff056afc4233a5473bffbb23d596db537f9b;hb=49a43e69c6ca442956f894029d0d8e2acae8b041;hp=ef89fcf8bfeb714ce750cd982857cc5305f4425a;hpb=98b15851a941e7342b8bb19e265cdc3a40fabfb8;p=babeltrace.git diff --git a/src/plugins/ctf/common/metadata/parser.y b/src/plugins/ctf/common/metadata/parser.y index ef89fcf8..a75cff05 100644 --- a/src/plugins/ctf/common/metadata/parser.y +++ b/src/plugins/ctf/common/metadata/parser.y @@ -1,28 +1,10 @@ %{ /* - * ctf-parser.y - * - * Common Trace Format Metadata Grammar. + * SPDX-License-Identifier: MIT * * Copyright 2010 - Mathieu Desnoyers * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. + * Common Trace Format Metadata Grammar. */ #define BT_LOG_OUTPUT_LEVEL ctf_plugin_metadata_log_level @@ -41,16 +23,10 @@ #include "common/list.h" #include "common/assert.h" #include "scanner.h" -#include "parser.h" #include "ast.h" #include "objstack.h" -#if BT_LOG_ENABLED_TRACE -# define YYDEBUG 1 -# define YYFPRINTF(_stream, _fmt, args...) BT_LOGT(_fmt, ## args) -#else -# define YYDEBUG 0 -#endif +#include "parser-wrap.h" /* Join two lists, put "add" at the end of "head". */ static inline void @@ -65,8 +41,6 @@ _bt_list_splice_tail (struct bt_list_head *add, struct bt_list_head *head) } } -BT_HIDDEN -int yyparse(struct ctf_scanner *scanner, yyscan_t yyscanner); BT_HIDDEN int yylex(union YYSTYPE *yyval, yyscan_t yyscanner); BT_HIDDEN @@ -945,19 +919,13 @@ static int set_parent_node(struct ctf_node *node, return 0; } -BT_HIDDEN +static void yyerror(struct ctf_scanner *scanner, yyscan_t yyscanner, const char *str) { _BT_LOGE_LINENO(yyget_lineno(scanner->scanner), "%s: token=\"%s\"", str, yyget_text(scanner->scanner)); } -BT_HIDDEN -int yywrap(void) -{ - return 1; -} - #define reparent_error(scanner, str) \ do { \ yyerror(scanner, scanner->scanner, YY_("reparent_error: " str)); \ @@ -1033,7 +1001,24 @@ void ctf_scanner_free(struct ctf_scanner *scanner) if (!scanner) return; - finalize_scope(&scanner->root_scope); + + struct ctf_scanner_scope *scope = scanner->cs; + + do { + struct ctf_scanner_scope *parent = scope->parent; + finalize_scope(scope); + + /* + * The root scope is allocated within the ctf_scanner structure, + * do doesn't need freeing. All others are allocated on their + * own. + */ + if (scope != &scanner->root_scope) + free(scope); + + scope = parent; + } while (scope); + objstack_destroy(scanner->objstack); ret = yylex_destroy(scanner->scanner); if (ret) @@ -1042,8 +1027,37 @@ void ctf_scanner_free(struct ctf_scanner *scanner) free(scanner); } +/* + * The bison-provided version of strlen (yystrlen) generates a benign + * -Wnull-dereference warning. That version is used when building on cygwin, + * for example, but you can also enable it by hand (to test) by removing the + * preprocessor conditional around it. + * + * Define yystrlen such that it will always use strlen. As far as we know, + * strlen provided by all the platforms we use is reliable. + */ +#define yystrlen strlen + %} +/* + * This ends up in parser.h and makes sure those who want to include it pass + * through parser-wrap.h. + */ +%code requires { +#ifndef ALLOW_INCLUDE_PARSER_H +# error "Don't include parser.h directly, include parser-wrap.h instead." +#endif +} + +%code provides { + BT_HIDDEN + void setstring(struct ctf_scanner *scanner, YYSTYPE *lvalp, const char *src); + + BT_HIDDEN + int import_string(struct ctf_scanner *scanner, YYSTYPE *lvalp, const char *src, char delim); +} + %define api.pure /* %locations */ %error-verbose @@ -1305,7 +1319,7 @@ unary_expression: $$->u.unary_expression.type = UNARY_SIGNED_CONSTANT; $$->u.unary_expression.u.signed_constant = -($$->u.unary_expression.u.unsigned_constant); - } else if ($$->u.unary_expression.type == UNARY_UNSIGNED_CONSTANT) { + } else if ($$->u.unary_expression.type == UNARY_SIGNED_CONSTANT) { $$->u.unary_expression.u.signed_constant = -($$->u.unary_expression.u.signed_constant); } else {