You initialize tables by enclosing a set of initializers within braces. Each initializer looks like:
where expr-list is a comma-separated list of expressions corresponding to an index of the table (so, for a table indexed by[expr-list] =expr
count, for example, this would be a single expression
of type count) and expr is the yield value to
assign to that index.
For example,
global a: table[count] of string = {
[11] = "eleven",
[5] = "five",
};
initializes the table a to have two elements, one indexed
by 11 and yielding the string "eleven" and the other
indexed by 5 and yielding the string "five".
(Note the comma after the last list element; it is optional,
similar to how C allows final commas in declarations.)
You can also group together a set of indices together to initialize them to the same value:
type HostType: enum { DeskTop, Server, Router };
global a: table[addr] of HostType = {
[[155.26.27.2, 155.26.27.8, 155.26.27.44]] = Server,
};
is equivalent to:
type HostType: enum { DeskTop, Server, Router };
global a: table[addr] of HostType = {
[155.26.27.2] = Server,
[155.26.27.8] = Server,
[155.26.27.44] = Server,
};
This mechanism also applies to
which can be used in table initializations for any indices of
type addr. For example, if www.my-server.com corresponded
to the addresses 155.26.27.2 and 155.26.27.44, then the above
could be written:
global a: table[addr] of HostType = {
[[www.my-server.com, 155.26.27.8]] = Server,
};
and if it corresponded to all there, then:
global a: table[addr] of HostType = {
[www.my-server.com] = Server,
};
You can also use multiple index groupings across different indices:
global access_allowed: table[addr, port] of bool = {
[www.my-server.com, [21/tcp, 80/tcp]] = T,
};
is equivalent to:
global access_allowed: table[addr, port] of bool = {
[155.26.27.2, 21/tcp] = T,
[155.26.27.2, 80/tcp] = T,
[155.26.27.8, 21/tcp] = T,
[155.26.27.8, 80/tcp] = T,
[155.26.27.44, 21/tcp] = T,
[155.26.27.44, 80/tcp] = T,
};
Fixme: add example of cross-product initialization of sets