-READ works, don't think I left any outstanding bugs.
-LIST works. No obvious problems. No, actually it doesn't validate
 the output lines well enough. Lets out stuff with spaces, etc.
-WRITE works, initial bugs seem ironed out. Doesn't write new keys,
 but isn't meant to. Keeps lines in order.
-ADD works.
-DELETE written, almost carbon-copy of WRITE, but with a NOP.
 Not extensively tested.

-VERIFY not yet done. Details confusing- EG, is two :s on a line
 a fault? My interpretation would be the second : is part of the value.

-CHECK is a new operation I want: simply see if the given key is valid
 or not, nothing else. Doesn't even need to open a file!

-Overall structure is a bit stupid- most of the functions share 99%
of their code with each other. I could probably make a generic function
that takes a function pointer, and save even more space.
OTOH, is it even worth it? Maybe 8K instead of 12K? Well, it might
make processing faster in situations where it gets called a lot.
But I don't know how much overhead function pointers bring. Hmm,
can't be *too* much, as they'd mostly apply to what happens when
the thing matches a key, rather than the rest of the time.

If I try to do this, I ought to keep the original version, and
then compare the two versions afterwards for filesize (I might
not even save any) and try benchmarking them in various ways.

