commit a5437562c8da571a85040555ef0462ac4a4db7f3 jose <jose@linux-q5ep.lan> 2018-11-12 09:13:22 -0800 removed tracing.
librivox.asd | 1 + packages.lisp | 5 ++++- src/csv-reader.lisp | 60 ----------------------------------------------------- src/utils.lisp | 22 ++++++++++++++++++++ 4 files changed, 27 insertions(+), 61 deletions(-)
diff --git a/librivox.asd b/librivox.asd index b5ffa0f..d5d2e72 100644 --- a/librivox.asd +++ b/librivox.asd @@ -9,6 +9,7 @@ :description "Librivox auto downloader/youtube uploader." :components ((:file "packages") (:file "src/utils") + (:file "src/csv") (:file "src/bash") (:file "src/workaround") (:file "src/ffmpeg") diff --git a/packages.lisp b/packages.lisp index d6c44aa..6d314ad 100644 --- a/packages.lisp +++ b/packages.lisp @@ -1,7 +1,10 @@ (defpackage :utils (:use :cl :cl-user) - (:export :mvbind :dbind :list-directory :dolines + (:export :mvbind :dbind :list-directory :dolines :doread :push-on :with-gensyms :once-only :aif :awhen)) +(defpackage :csv + (:use :cl :utils) + (:import-from :utils :push-on :with-gensyms :make-reader :doread)) (defpackage :bash (:use :cl :uiop) (:export :run-line diff --git a/src/csv-reader.lisp b/src/csv-reader.lisp deleted file mode 100644 index 426401b..0000000 --- a/src/csv-reader.lisp +++ /dev/null @@ -1,60 +0,0 @@ -(defpackage :csv - (:use :cl :utils) - (:import-from :utils :push-on :with-gensyms :make) - (:export :read-csv)) -(in-package :csv) -(defun toggle (val) - (setf val (not val))) -(make ((line "") (pos 0)) read-char-fast (stream) - (if (string= "" line) - (let ((next (read-line stream nil nil))) - (when next (setf line next pos 0) #\Newline)) - (elt line (incf pos)))) -(defvar *in* nil) -(defun switches (prev curr str) - (format t "~A ~A ~A~%" *in* prev curr) - (let ((res (if (null curr) - (setf *in* nil) - (if *in* - (if (char= #\" prev curr) - #\" - (if #1=(char= #\" prev) - (progn (setf *in* nil) #\Nul) - prev)) - (if #1# - (setf *in* t)))))) - (if (characterp res) - (push-on res str) - str))) -(defun splice (str) - (when (not (string= "" str)) - (let ((res (search (string #\Nul) str))) - (cons (subseq str 0 res) (splice (subseq str (1+ res))))))) -(defmacro make-reader (name (stream-var dispatch-1 dispatch-2) &body body) - (with-gensyms (sub-char numarg) - `(progn (defun ,name (,stream-var ,sub-char ,numarg) - (declare (ignore ,sub-char ,numarg)) - ,@body) - (set-dispatch-macro-character ,dispatch-1 ,dispatch-2 #',name)))) -(make-reader my-csv (stream #\# #\,) - (do ((prev #1= (read-char stream nil nil) curr) - (curr #1# #1#) - (str (make-array 0 :adjustable t :element-type 'character) - (switches prev curr str))) - ((and (char= curr #\#) (char= prev #\,)) (splice (switches nil nil str))))) -;;; '#, "hi there","man!",# -(make-reader my-string (stream #\# #\>) - (do* ((prev #1=(read-char stream nil nil) curr) - (first prev) - (curr #1# #1#) - (str (make-array 0 :adjustable t :element-type 'character) - (push-on prev str))) - ((char= curr first) str))) - -;; (make-reader csv (stream #\#) -;; (do ((prev #1=(read-char-fast stream) curr) -;; (curr #1# #1#)) -;; ((not curr)))) -;; (defun read-csv (path) -;; (with-open-file (stream path) -;; (mapcar #'(lambda (x) (subseq x 1)) (read-string stream)))) diff --git a/src/utils.lisp b/src/utils.lisp index 6e50185..ca091fa 100644 --- a/src/utils.lisp +++ b/src/utils.lisp @@ -4,6 +4,17 @@ `(let (,@(mapcar #'(lambda (sym) `(,sym ',(gensym))) symbols)) ,@body)) +(defmacro doread((var stream) &body body) + "Read character by character with the speed of line by line reading." + (with-gensyms (line count len) + `(do ((,line #1=(read-line ,stream nil nil) #1#)) + ((null ,line)) + (do* ((,line (concatenate 'string ,line (format nil "~%~%"))) + (,len (length ,line)) + (,count 0 (1+ ,count)) + (,var #2=(elt ,line ,count) #2#)) + ((= (1- ,len) ,count)) + ,@body)))) (defmacro once-only ((&rest names) &body body) "A macro-writing utility for evaluating code only once." (let ((gensyms (loop for n in names collect (gensym)))) @@ -11,6 +22,17 @@ `(let (,,@(loop for g in gensyms for n in names collect ``(,,g ,,n))) ,(let (,@(loop for n in names for g in gensyms collect `(,n ,g))) ,@body))))) +(defmacro make-reader (name (stream-var dispatch-1 dispatch-2) &body body) + (with-gensyms (sub-char numarg) + `(progn (defun ,name (,stream-var ,sub-char ,numarg) + (declare (ignore ,sub-char ,numarg)) + ,@body) + (set-dispatch-macro-character ,dispatch-1 ,dispatch-2 #',name)))) +(defun push-on (elem array) + (let ((len (length array))) + (adjust-array array (1+ len)) + (setf (elt array len) elem) + array)) (defmacro dolines ((var path) &body body) (with-gensyms (s) `(with-open-file (,s ,path)