X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=src%2Fplugins%2Fctf%2Fcommon%2Fmetadata%2Fparser.y;h=b74497b034189b478cdd7792edd7760080d487f0;hb=e3e899ce2c68608f09259ad30969e54f045aadc1;hp=e014db1f2fb0c83b74cd219b56bd4342bb1e2fb2;hpb=1f1f272012561fcf88f41d482ba3275cf12f5794;p=babeltrace.git diff --git a/src/plugins/ctf/common/metadata/parser.y b/src/plugins/ctf/common/metadata/parser.y index e014db1f..b74497b0 100644 --- a/src/plugins/ctf/common/metadata/parser.y +++ b/src/plugins/ctf/common/metadata/parser.y @@ -41,16 +41,16 @@ #include "common/list.h" #include "common/assert.h" #include "scanner.h" -#include "parser.h" #include "ast.h" #include "objstack.h" -#if BT_LOG_ENABLED_VERBOSE -# define YYDEBUG 1 -# define YYFPRINTF(_stream, _fmt, args...) BT_LOGV(_fmt, ## args) -#else -# define YYDEBUG 0 -#endif +#include "parser-wrap.h" + +/* + * Avoid warning about "yynerrs" being unused, seen with bison 3.5.1 + clang 15 + * on Ubuntu 20.04. + */ +BT_DIAG_IGNORE_UNUSED_BUT_SET_VARIABLE /* Join two lists, put "add" at the end of "head". */ static inline void @@ -65,8 +65,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 @@ -165,7 +163,7 @@ int parse_base_sequence(const char *src, size_t len, size_t pos, return -1; } } - BT_ASSERT(nr_char > 0); + BT_ASSERT_DBG(nr_char > 0); buffer[nr_char] = '\0'; *buf_len = nr_char; return 0; @@ -318,7 +316,7 @@ static void push_scope(struct ctf_scanner *scanner) { struct ctf_scanner_scope *ns; - BT_LOGV("Pushing scope: scanner-addr=%p", scanner); + BT_LOGT("Pushing scope: scanner-addr=%p", scanner); ns = malloc(sizeof(struct ctf_scanner_scope)); init_scope(ns, scanner->cs); scanner->cs = ns; @@ -328,7 +326,7 @@ static void pop_scope(struct ctf_scanner *scanner) { struct ctf_scanner_scope *os; - BT_LOGV("Popping scope: scanner-addr=%p", scanner); + BT_LOGT("Popping scope: scanner-addr=%p", scanner); os = scanner->cs; scanner->cs = os->parent; finalize_scope(os); @@ -340,7 +338,7 @@ static int lookup_type(struct ctf_scanner_scope *s, const char *id) int ret; ret = GPOINTER_TO_INT(g_hash_table_lookup(s->classes, id)); - BT_LOGV("Looked up type: scanner-addr=%p, id=\"%s\", ret=%d", + BT_LOGT("Looked up type: scanner-addr=%p, id=\"%s\", ret=%d", s, id, ret); return ret; } @@ -351,20 +349,20 @@ int is_type(struct ctf_scanner *scanner, const char *id) struct ctf_scanner_scope *it; int ret = 0; - for (it = scanner->cs; it != NULL; it = it->parent) { + for (it = scanner->cs; it; it = it->parent) { if (lookup_type(it, id)) { ret = 1; break; } } - BT_LOGV("Found if ID is type: scanner-addr=%p, id=\"%s\", ret=%d", + BT_LOGT("Found if ID is type: scanner-addr=%p, id=\"%s\", ret=%d", scanner, id, ret); return ret; } static void add_type(struct ctf_scanner *scanner, char *id) { - BT_LOGV("Adding type: scanner-addr=%p, id=\"%s\"", + BT_LOGT("Adding type: scanner-addr=%p, id=\"%s\"", scanner, id); if (lookup_type(scanner->cs, id)) return; @@ -945,19 +943,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)); \ @@ -1042,8 +1034,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 +1326,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 {