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 | bd64fbb8c9e78212e80e265ded709c58f5a403a8 (patch) | |
tree | a6a1fc863e587eab5fbdd15b772372adf724aa95 | |
parent | f469b7207bbda3616387eba1785e7a416dc25642 (diff) | |
download | txr-bd64fbb8c9e78212e80e265ded709c58f5a403a8.tar.gz txr-bd64fbb8c9e78212e80e265ded709c58f5a403a8.tar.bz2 txr-bd64fbb8c9e78212e80e265ded709c58f5a403a8.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.
-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; } } } |