From rklochkov at common-lisp.net Sat May 7 18:28:44 2011 From: rklochkov at common-lisp.net (rklochkov) Date: Sat, 07 May 2011 14:28:44 -0400 Subject: [cl-dbf-cvs] CVS cl-dbf Message-ID: Update of /project/cl-dbf/cvsroot/cl-dbf In directory cl-net:/tmp/cvs-serv16505 Log Message: First release Status: Vendor Tag: slavsoft Release Tags: initial N cl-dbf/cl-dbf.asd N cl-dbf/package.lisp N cl-dbf/src.lisp N cl-dbf/src.fasl N cl-dbf/doc/xbase.css N cl-dbf/doc/ndx_example.html N cl-dbf/doc/dbf.html N cl-dbf/doc/mdx.html N cl-dbf/doc/ndx.html N cl-dbf/doc/data_types.html N cl-dbf/doc/index.html No conflicts created by this import From rklochkov at common-lisp.net Sat May 7 18:44:11 2011 From: rklochkov at common-lisp.net (rklochkov) Date: Sat, 07 May 2011 14:44:11 -0400 Subject: [cl-dbf-cvs] CVS cl-dbf Message-ID: Update of /project/cl-dbf/cvsroot/cl-dbf In directory cl-net:/tmp/cvs-serv18729 Removed Files: src.fasl Log Message: Remove stale fasl From rklochkov at common-lisp.net Sun May 8 13:48:24 2011 From: rklochkov at common-lisp.net (rklochkov) Date: Sun, 08 May 2011 09:48:24 -0400 Subject: [cl-dbf-cvs] CVS cl-dbf Message-ID: Update of /project/cl-dbf/cvsroot/cl-dbf In directory cl-net:/tmp/cvs-serv26011 Modified Files: cl-dbf.asd src.lisp Log Message: Fixed asd dependencies. Added with-db macro. Remove stream from function args except dbopen. --- /project/cl-dbf/cvsroot/cl-dbf/cl-dbf.asd 2011/05/07 18:28:43 1.1.1.1 +++ /project/cl-dbf/cvsroot/cl-dbf/cl-dbf.asd 2011/05/08 13:48:23 1.2 @@ -7,7 +7,7 @@ :author "Roman Klochkov " :version "0.1" :license "GPL" - :depends-on (#:com.gigamonkeys.binary-data) + :depends-on (#:com.gigamonkeys.binary-data #:flexi-streams) :components ((:file #:package) (:file #:src :depends-on (#:package)))) \ ?? ?????????? ?????????? ?????? ?????????? ???????????? --- /project/cl-dbf/cvsroot/cl-dbf/src.lisp 2011/05/07 18:28:43 1.1.1.1 +++ /project/cl-dbf/cvsroot/cl-dbf/src.lisp 2011/05/08 13:48:23 1.2 @@ -4,8 +4,8 @@ ;; for now you can do something like ;; (with-open-file (stream filename) ;; (let ((driver (dbopen stream))) -;; (read-record driver stream) -;; (read-record driver stream) +;; (read-record driver) +;; (read-record driver) ;; ....)) (in-package #:cl-dbf) @@ -36,8 +36,10 @@ (dotimes (i length) (write-byte 0 out)))) +(defclass xbase-common () + (stream)) -(define-tagged-binary-class dbf-header () +(define-tagged-binary-class dbf-header (xbase-common) ((db-type u1)) (:dispatch (select-db-driver db-type))) @@ -121,10 +123,13 @@ (defun dbopen (stream) (assert (and (input-stream-p stream) (output-stream-p stream))) - (read-value 'dbf-header stream)) + (file-position stream 0) + (let ((db (read-value 'dbf-header stream))) + (setf (slot-value db 'stream) stream) + db)) -(defun goto-bof (driver stream) - (file-position stream (header-size driver))) +(defun goto-bof (driver) + (file-position (slot-value driver 'stream) (header-size driver))) (defun external-format (driver) (case (code-page driver) @@ -137,17 +142,27 @@ (#xC9 '(:code-page :id 1251)) (t '(:code-page :id 437)))) -(defmethod read-record ((driver dbase3-header) stream) - (case (read-byte stream) - (32 (loop - :for field :in (fields driver) - :collect - (let ((s (make-array (size field) :element-type '(unsigned-byte 8)))) - (read-sequence s stream) - (flexi-streams:octets-to-string - s - :external-format (external-format driver))))) - (t nil))) +(defmethod read-record ((driver dbase3-header)) + (with-slots (stream) driver + (case (read-byte stream) + (32 (loop + :for field :in (fields driver) + :collect + (let ((s (make-array (size field) + :element-type '(unsigned-byte 8)))) + (read-sequence s stream) + (flexi-streams:octets-to-string + s + :external-format (external-format driver))))) + (t nil)))) + +(defmacro with-db (db filespec &body body) + (let ((stream (gensym))) + `(with-open-file (,stream ,filespec :direction :io + :element-type 'unsigned-byte + :if-exists :overwrite) + (let ((,db (dbopen ,stream))) + , at body))))