summaryrefslogtreecommitdiffstats
path: root/stream.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2025-01-21 16:48:59 -0800
committerKaz Kylheku <kaz@kylheku.com>2025-01-21 16:48:59 -0800
commiteccad1e4f3827f58700457474c7b1f7bf9d4223f (patch)
treea6a1fc863e587eab5fbdd15b772372adf724aa95 /stream.c
parent9ee82d9d744de52916817412318f43f26960d719 (diff)
downloadtxr-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.c45
1 files changed, 26 insertions, 19 deletions
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;
}
}
}