ECF (Easy Configuration Format) Specification

In ECF, a file is started with a format specifier, followed by any number of 'entries',
where each entry is either an empty line, a key-value pair (aka a "setting"), or a
comment. All lines of input text have their leading and trailing whitespace trimmed,
except for the contents of multiline string values, where only the leading whitespace is
trimmed, and the contents of multiline comments, where no whitespace is trimmed.

A format specifier is a line of text that starts with "format " and is followed by an
integer that defines the version of the file's data. This is meant to allow programs to
update settings to newer versions expected by the program.

A setting entry consists of a key (any key-unique text that doesn't contain any newlines
or colons), then a colon, then (optionally) whitespace, then a value (with no other
trailing characters). A value can be the text "empty" (non-case-dependant) for an empty
value, or "true" or "false" (again, non-case-dependant) for a boolean value, or a 64-bit
singed integer, or a 64-bit floating point number, or text enclosed in quotation marks
for a single-line string, or just a quotation mark to start a multi-line string.

Multiline string values are started with a single quotation mark and are followed by
lines of text that start (optionally) with whitespace, followed by a single quotation
mark, then followed by any text. The text after each line's quotation mark (except for
the initial line) define the contents of the multiline string. For example, the text
'line1\nline2' with the key 'ex key' would be stored as: 'ex key: "\n"line1\n"line2'.

A comment entry starts with either "#" for a single-line comment, or "##" for a multiline
comment. Multiline comments start and end with lines which are nothing but "##", and
everything between those two lines are the contents of the comment.

Additional notes:
- Every invalid line of text should be converted to a single-line comment when parsed.
- No escape sequences are needed for string values
- The entirety of text between a newline and a colon counts as the key's string
- When formatting data from a layout and key-value pairs, any pairs whose keys are not
	specified in the layout should be added to the end of the formatted text



COMMON PRACTICES

To define namespaces, every key in the namespace should start with the namespace's name,
directly followed by a period, then directly followed by the key's name. To have nested
namespaces, just continue adding each namespace's name with a period after each name. For
example, the key "example key" within the namespace "nested namespace" within the
namespace "outer namespace" should be "outer namespace.nested namespace.example key".

To define data structures, such as structs, arrays, etc, simply use namespaces. For
example, a list of customers should be defined as follows:

customers.0.name: "example customer 1"
customers.0.id: 1234
customers.1.name: "example customer 2"
customers.1.id: 4321
