mirror of
https://gitlab.nic.cz/labs/bird.git
synced 2024-12-23 02:01:55 +00:00
8751d8c447
Methods can now be called as x.m(y), as long as x can have its type inferred in config time. If used as a command, it modifies the object, if used as a value, it keeps the original object intact. Also functions add(x,y), delete(x,y), filter(x,y) and prepend(x,y) now spit a warning and are considered deprecated. It's also possible to call a method on a constant, see filter/test.conf for examples like bgp_path = +empty+.prepend(1). Inside instruction definitions (filter/f-inst.c), a METHOD_CONSTRUCTOR() call is added, which registers the instruction as a method for the type of its first argument. Each type has its own method symbol table and filter parser switches between them based on the inferred type of the object calling the method. Also FI_CLIST_(ADD|DELETE|FILTER) instructions have been split to allow for this method dispatch. With type inference, it's now possible.
53 lines
2.0 KiB
Plaintext
53 lines
2.0 KiB
Plaintext
m4_divert(-1)m4_dnl
|
|
#
|
|
# BIRD -- Generator of Configuration Keyword List
|
|
#
|
|
# (c) 1998--2000 Martin Mares <mj@atrey.karlin.mff.cuni.cz>
|
|
#
|
|
# 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(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, `CF_iterate([[CF_keywd]], [[$@]])DNL')
|
|
|
|
|
|
# CLI commands generate keywords as well
|
|
m4_define(CF_CLI, `CF_KEYWORDS(m4_translit($1, [[ ]], [[,]]))
|
|
')
|
|
|
|
# Enums are translated to C initializers: use CF_ENUM(typename, prefix, values)
|
|
# For different prefix: CF_ENUM_PX(typename, external prefix, C prefix, values)
|
|
m4_define(CF_enum, `m4_divert(1){ "CF_enum_prefix_ext[[]]$1", -((CF_enum_type<<16) | CF_enum_prefix_int[[]]$1) },
|
|
m4_divert(-1)')
|
|
m4_define(CF_ENUM, `m4_define([[CF_enum_type]],$1)m4_define([[CF_enum_prefix_ext]],$2)m4_define([[CF_enum_prefix_int]],$2)CF_iterate([[CF_enum]], [[m4_shift(m4_shift($@))]])DNL')
|
|
m4_define(CF_ENUM_PX, `m4_define([[CF_enum_type]],$1)m4_define([[CF_enum_prefix_ext]],$2)m4_define([[CF_enum_prefix_int]],$3)CF_iterate([[CF_enum]], [[m4_shift(m4_shift(m4_shift($@)))]])DNL')
|
|
|
|
# After all configuration templates end, we generate the
|
|
m4_m4wrap(`
|
|
m4_divert(0)
|
|
static const 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([[,]])
|