all but string and whitespace coded up (TODO: proofread)