diff options
Diffstat (limited to 'stdlib/csv.tl')
-rw-r--r-- | stdlib/csv.tl | 89 |
1 files changed, 44 insertions, 45 deletions
diff --git a/stdlib/csv.tl b/stdlib/csv.tl index c56d2520..f3b4f190 100644 --- a/stdlib/csv.tl +++ b/stdlib/csv.tl @@ -28,48 +28,47 @@ (defun get-csv (: (stream *stdin*)) (if (stringp stream) (upd stream make-string-input-stream)) - (enumlet (rfield qfield quot) - (let ((record (vec)) - (field (str 0)) - (state rfield) - (done nil)) - (while (not done) - (let ((ch (get-char stream))) - (when (eq ch #\return) - (let ((ch2 (get-char stream))) - (if (eq ch2 #\newline) - (set ch ch2) - (if ch2 - (unget-char ch2 stream))))) - (caseql* state - (rfield (caseql* ch - (#\newline (vec-push record field) - (set done t)) - (#\, (vec-push record field) - (set field (str 0))) - (#\" (cond - ((empty field) - (set state qfield)) - (t - (string-extend field ch)))) - (nil (vec-push record field) - (set done t)) - (t (string-extend field ch)))) - (qfield (caseql* ch - (#\" (set state quot)) - (nil (vec-push record field) - (set done t)) - (t (string-extend field ch)))) - (quot (caseql* ch - (#\, (vec-push record field) - (set field (str 0) - state rfield)) - (#\" (string-extend field ch) - (set state qfield)) - (#\newline (vec-push record field) - (set done t)) - (nil (vec-push record field) - (set done t)) - (t (string-extend field ch) - (set state rfield))))))) - record))) + (let ((record (vec)) + (field (str 0)) + (state :rfield) + (done nil)) + (while (not done) + (let ((ch (get-char stream))) + (when (eq ch #\return) + (let ((ch2 (get-char stream))) + (if (eq ch2 #\newline) + (set ch ch2) + (if ch2 + (unget-char ch2 stream))))) + (caseq state + (:rfield (caseql* ch + (#\newline (vec-push record field) + (set done t)) + (#\, (vec-push record field) + (set field (str 0))) + (#\" (cond + ((empty field) + (set state :qfield)) + (t + (string-extend field ch)))) + (nil (vec-push record field) + (set done t)) + (t (string-extend field ch)))) + (:qfield (caseql* ch + (#\" (set state :quot)) + (nil (vec-push record field) + (set done t)) + (t (string-extend field ch)))) + (:quot (caseql* ch + (#\, (vec-push record field) + (set field (str 0) + state :rfield)) + (#\" (string-extend field ch) + (set state :qfield)) + (#\newline (vec-push record field) + (set done t)) + (nil (vec-push record field) + (set done t)) + (t (string-extend field ch) + (set state :rfield))))))) + record)) |