Comment lines start with a '#' character at column one and extend to the end of the line. User records consist of a 'first' line followed by the 'rest-of-record'. The rest-of-record is either a blank line, or a sequence of zero or more 'subsequent' lines followed by a 'final' line. A 'first' line has a non-'#', non-space, non-tab character at column one, followed by zero or more non-space, non-tab characters, followed by one or more spaces or tabs, followed by an attribute list (*without* a trailing comma), followed by a newline. A 'subsequent' line has a space or tab in the first column, followed by zero or more spaces or tabs, followed by an attribute list, followed by a comma, followed by a newline. A 'final' line is identical to a 'subsequent' line except that there is no trailing comma.
New to this version of builddbm (and radiusd) is that comment lines may be embedded in a record at will. Blank lines may *not* be embedded in records, but may be present anywhere outside of a record.
EBNF Users file grammar:
<USERS-FILE> ::= {<empty-line> | <comment-line> | <record>}* <empty-line> ::= \n <comment-line> ::= #{.}* <record> ::= <first-line><rest-of-record> <first-line> ::= <user-name><whitespace><attribute-list> <rest-of-record> ::= {<comment-line>}*<empty-line> | {<comment-line> | <subsequent-line>}* <final-line> <user-name> ::= {[^#, \t\n]}+ <whitespace> ::= {[ \t]}+ <subsequent-line> ::= <whitespace><attribute-list>, <final-line> ::= <whitespace><attribute-list> <attribute-list> ::= <attribute>{<whitespace><attribute>}* <attribute> ::= <attr-name>{<whitespace>}* ={<whitespace>}*<attr-value> <attr-name> ::= <attr-segment>{-<attr-segment>}* <attr-segment> ::= <upper-case>{<upper-case>}* {<lower-case> | <decimal-digit>}* <attr-value> ::= <attr-value-plain> | <attr-value-quoted> <attr-value-plain> ::= <dotted-decimal-IP-address> | <enum-attr-value> | <integer> <attr-value-quoted> ::= "<string>" | "<date>" | "<filter>" <upper-case> ::= [A-Z] <lower-case> ::= [a-z] <decimal-digit> ::= [0-9] <alphanumeric> ::= <upper-case> | <lower-case> | <decimal-digit> <enum-attr-value> ::= <attr-segment>{-<attr-segment>}* <string> ::= {[^"]}* <date> ::= <day>.<month>.<year> <month> ::= <decimal-digit><decimal-digit> <space> ::= [ ] <day> ::= <decimal-digit><decimal-digit> <year> ::= 19<decimal-digit><decimal-digit> <filter> ::= <IP-filter> | <generic-filter>Note: