From a412f01ea84709b9af0113acc5aa2ce3dad1d292 Mon Sep 17 00:00:00 2001 From: Martin Mares Date: Fri, 28 Apr 2000 15:12:03 +0000 Subject: [PATCH] Include CF_HDR section in keywords.h as well, so that protocol symbols can be used in definition of ENUM's. --- conf/cf-lex.l | 6 +++--- conf/gen_keywords.m4 | 24 +++++++++++++++++++++--- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/conf/cf-lex.l b/conf/cf-lex.l index 483bcaf3..bdf9261d 100644 --- a/conf/cf-lex.l +++ b/conf/cf-lex.l @@ -20,13 +20,13 @@ #include "conf/cf-parse.tab.h" #include "lib/string.h" -static struct keyword { +struct keyword { byte *name; int value; struct keyword *next; -} keyword_list[] = { +}; + #include "conf/keywords.h" - { NULL, -1 } }; #define KW_HASH_SIZE 64 static struct keyword *kw_hash[KW_HASH_SIZE]; diff --git a/conf/gen_keywords.m4 b/conf/gen_keywords.m4 index 1c77cd5c..34a0011f 100644 --- a/conf/gen_keywords.m4 +++ b/conf/gen_keywords.m4 @@ -2,17 +2,28 @@ m4_divert(-1)m4_dnl # # BIRD -- Generator of Configuration Keyword List # -# (c) 1998--1999 Martin Mares +# (c) 1998--2000 Martin Mares # # Can be freely distributed and used under the terms of the GNU GPL. # +# Common aliases +m4_define(DNL, `m4_dnl') + +# Diversions used: +# 1 keywords + # Simple iterator m4_define(CF_itera, `m4_ifelse($#, 1, [[CF_iter($1)]], [[CF_iter($1)[[]]CF_itera(m4_shift($@))]])') m4_define(CF_iterate, `m4_define([[CF_iter]], m4_defn([[$1]]))CF_itera($2)') +# We include all the headers +m4_define(CF_HDR, `m4_divert(0)') +m4_define(CF_DECLS, `m4_divert(-1)') +m4_define(CF_DEFINES, `m4_divert(-1)') + # Keywords are translated to C initializers -m4_define(CF_handle_kw, `m4_divert(0){ "m4_translit($1,[[A-Z]],[[a-z]])", $1 }, +m4_define(CF_handle_kw, `m4_divert(1){ "m4_translit($1,[[A-Z]],[[a-z]])", $1 }, m4_divert(-1)') m4_define(CF_keywd, `m4_ifdef([[CF_tok_$1]],,[[m4_define([[CF_tok_$1]],1)CF_handle_kw($1)]])') m4_define(CF_KEYWORDS, `m4_define([[CF_toks]],[[]])CF_iterate([[CF_keywd]], [[$@]])m4_ifelse(CF_toks,,,%token[[]]CF_toks @@ -23,10 +34,17 @@ m4_define(CF_CLI, `CF_KEYWORDS(m4_translit($1, [[ ]], [[,]])) ') # Enums are translated to C initializers: use CF_ENUM(typename, prefix, values) -m4_define(CF_enum, `m4_divert(0){ "CF_enum_prefix[[]]$1", -((CF_enum_type<<16) | CF_enum_prefix[[]]$1) }, +m4_define(CF_enum, `m4_divert(1){ "CF_enum_prefix[[]]$1", -((CF_enum_type<<16) | CF_enum_prefix[[]]$1) }, m4_divert(-1)') m4_define(CF_ENUM, `m4_define([[CF_enum_type]],$1)m4_define([[CF_enum_prefix]],$2)CF_iterate([[CF_enum]], [[m4_shift(m4_shift($@))]])DNL') +# After all configuration templates end, we generate the +m4_m4wrap(` +m4_divert(0) +static struct keyword keyword_list[] = { +m4_undivert(1){ NULL, -1 } }; +') + # As we are processing C source, we must access all M4 primitives via # m4_* and also set different quoting convention: `[[' and ']]' m4_changequote([[,]])