From eccad1e4f3827f58700457474c7b1f7bf9d4223f Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Tue, 21 Jan 2025 16:48:59 -0800 Subject: 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. --- stream.c | 45 ++++++++++++++++++++++++++------------------- 1 file changed, 26 insertions(+), 19 deletions(-) (limited to 'stream.c') diff --git a/stream.c b/stream.c index 8b9b2f60..421b70eb 100644 --- a/stream.c +++ b/stream.c @@ -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; } } } -- cgit v1.2.3