Recently Written · git

librivox

Automated youtube uploading of audiobooks

git clone https://github.com/equwal/librivox

Log | Files | Refs


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)