There are a set of syntactic symbols that are used to recognize
constructs inside of brace lists. A brace list is defined as an
enum
or aggregate initializer list, such as might statically
initialize an array of structs. The three special aggregate constructs
in Pike, ({ })
, ([ ])
and (< >)
, are treated as
brace lists too. An example:
1: static char* ingredients[] = 2: { 3: "Ham", 4: "Salt", 5: NULL 6: };
Following convention, line 2 in this example is assigned
brace-list-open
syntax, and line 3 is assigned
brace-list-intro
syntax. Likewise, line 6 is assigned
brace-list-close
syntax. Lines 4 and 5 however, are assigned
brace-list-entry
syntax, as would all subsequent lines in this
initializer list.
Your static initializer might be initializing nested structures, for example:
1: struct intpairs[] = 2: { 3: { 1, 2 }, 4: { 5: 3, 6: 4 7: } 8: { 1, 9: 2 }, 10: { 3, 4 } 11: };
Here, you’ve already seen the analysis of lines 1, 2, 3, and 11. On
line 4, things get interesting; this line is assigned
brace-entry-open
syntactic symbol because it’s a bracelist
entry line that starts with an open brace. Lines 5 and 6 are pretty
standard, and line 7 is a brace-list-close
as you’d expect.
Once again, line 8 is assigned as brace-entry-open
as is line
10. Line 9 is assigned two syntactic elements, brace-list-intro
with anchor point at the ‘{’ of line 839, and
brace-list-entry
anchored on the ‘1’ of line 8.
This extra
syntactic element was introduced in CC Mode 5.33.1 to allow extra
flexibility in indenting the second line of such a construct. You can
preserve the behaviour resulting from the former syntactic analysis by
giving brace-list-entry
an offset of
c-lineup-under-anchor
(see Miscellaneous Line-Up Functions).