diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2025-01-21 16:48:59 -0800 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2025-01-21 16:48:59 -0800 |
commit | eccad1e4f3827f58700457474c7b1f7bf9d4223f (patch) | |
tree | a6a1fc863e587eab5fbdd15b772372adf724aa95 /stream.c | |
parent | 9ee82d9d744de52916817412318f43f26960d719 (diff) | |
download | txr-eccad1e4f3827f58700457474c7b1f7bf9d4223f.tar.gz txr-eccad1e4f3827f58700457474c7b1f7bf9d4223f.tar.bz2 txr-eccad1e4f3827f58700457474c7b1f7bf9d4223f.zip |
get-csv: refactor into switches.
* stream.c (get_csv): All cases handle end-of-stream
the same way, so we check for nil outside of the case
switch. Then only characters need to be handled, so we
can call c_chr(ch) and switch on it.
Diffstat (limited to 'stream.c')
-rw-r--r-- | stream.c | 45 |
1 files changed, 26 insertions, 19 deletions
@@ -5443,55 +5443,62 @@ val get_csv(val source_opt) ch = ch2; else if (ch2) unget_char(ch2, source); + } else if (ch == nil) { + vec_push(record, field); + break; } switch (state) { case rfield: - if (ch == chr('\n')) { + switch (c_chr(ch)) { + case '\n': vec_push(record, field); done = 1; - } else if (ch == chr(',')) { + break; + case ',': vec_push(record, field); field = mkstring(zero, chr(' ')); - } else if (ch == chr('"')) { + break; + case '"': if (empty(field)) state = qfield; else string_extend(field, ch, nil); - } else if (ch == nil) { - vec_push(record, field); - done = 1; - } else { + break; + default: string_extend(field, ch, nil); + break; } break; case qfield: - if (ch == chr('"')) { + switch (c_chr(ch)) { + case '"': state = quot; - } else if (ch == nil) { - vec_push(record, field); - done = 1; - } else { + break; + default: string_extend(field, ch, nil); + break; } break; case quot: - if (ch == chr(',')) { + switch (c_chr(ch)) { + case ',': vec_push(record, field); field = mkstring(zero, chr(' ')); state = rfield; - } else if (ch == chr('"')) { + break; + case '"': string_extend(field, ch, nil); state = qfield; - } else if (ch == chr('\n')) { - vec_push(record, field); - done = 1; - } else if (ch == nil) { + break; + case '\n': vec_push(record, field); done = 1; - } else { + break; + default: string_extend(field, ch, nil); state = rfield; + break; } } } |