summaryrefslogtreecommitdiffstats
path: root/stream.c
diff options
context:
space:
mode:
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;
}
}
}