X-Git-Url: http://git.pond.sub.org/?p=eow;a=blobdiff_plain;f=xdump-test.lisp;h=928748c7422a51fbfab77377e6f03171d0425546;hp=1e328809a01f47dc107c9caa51b8cd23e884f330;hb=da0e0f7061592dde760ee1a070dd959e5496ba88;hpb=bed7f6f60f166f71b2e3a98bb8d1e67c3e501909 diff --git a/xdump-test.lisp b/xdump-test.lisp index 1e32880..928748c 100644 --- a/xdump-test.lisp +++ b/xdump-test.lisp @@ -11,14 +11,30 @@ (len :accessor meta-len) (table :accessor meta-table))) +(defclass xdump-table () + ((name :accessor table-name :initarg :name) + (index :accessor table-index :initarg :index) + (last-update :accessor table-last-update :initform 0) + (entry-class :accessor table-entry-class :initarg :entry-class) + (entries :accessor table-entries :initform (make-array 8 + :fill-pointer 8 + :adjustable t + :initial-element nil)))) + ;(defclass empire-table () ; (())) (defvar *meta-by-index* (make-array 50 :adjustable t :initial-element nil)) -(defvar *index-by-name* (make-hash-table :size 50)) +(defvar *table-by-index* (make-array 50 :adjustable t :initial-element nil)) +(defvar *index-by-name* (make-hash-table :size 50 :test 'equal)) (defvar *meta-index* (make-array 5) "meta slot symbol by meta table column index") (defvar *meta-meta* (make-array 5)) +(defun get-table-entry (table-name index) + (let* ((table-index (gethash table-name *index-by-name*)) + (table (aref *table-by-index* table-index))) + (aref (table-entries table) index))) + (defclass xdump-parser () ((line-parser :accessor line-parser :initform nil) (entry-buffer :accessor entry-buffer :initform (make-array 1 :fill-pointer 0 :adjustable t)) @@ -66,10 +82,48 @@ ; voodoo: the first column of the table of tables is the uid (elt (aref entry-buffer 0) 4) (gethash name *index-by-name*)))) - (setf (aref *meta-by-index* table-index) meta-table))))) + (setf (aref *meta-by-index* table-index) meta-table) + + ;; create xdump-table instance and entry class + (let* ((class-name (string-upcase (format nil "~a-table-entry" name))) + (package (find-package "XDUMP-DATA")) + (table-instance (make-instance 'xdump-table + :name name + :index table-index + :entry-class (intern class-name package))) + (slot-list (loop for entry across entry-buffer + collect (car entry)))) + (setf (aref *table-by-index* table-index) table-instance) + (format t "slot-list: ~a~%" slot-list) + (eval `(defclass ,(find-symbol class-name package) () + ,(mapcar #'(lambda (raw-slot-name) + (let* ((slot-name (string-upcase raw-slot-name)) + (accessor-name (string-upcase (format nil "~a-~a" name slot-name)))) + (list (intern slot-name package) :accessor (intern accessor-name package)))) + slot-list)))))))) (defun table-finalizer (parser) - t) + (with-slots (entry-buffer name timestamp) parser + (if (string= name "table") ; special magic: prefill index-by-name + (loop for entry across entry-buffer do + (setf (gethash (second entry) *index-by-name*) (first entry)))) + (format t "table-finalizer: ~a~%" name) + (let* ((table-index (gethash name *index-by-name*)) + (meta-table (aref *meta-by-index* table-index)) + (table (aref *table-by-index* table-index))) + (loop for entry across entry-buffer do + (let ((e (make-instance (table-entry-class table))) + (index (first entry)) + (entries (table-entries table))) + ; extend array if necessary + (unless (> (fill-pointer entries) index) + (adjust-array entries (* 2 index) :fill-pointer t)) + (setf (aref entries index) e) + (loop + for item in entry + for column across meta-table do + (setf (slot-value e (find-symbol (string-upcase (meta-name column)) (find-package "XDUMP-DATA"))) item)))) + (setf (table-last-update table) timestamp)))) (defmethod finish-table ((parser xdump-parser) number-of-records) (if (not (equal number-of-records (length (entry-buffer parser)))) @@ -93,10 +147,12 @@ name input-name timestamp input-timestamp))) -(defmethod parse-table ((parser xdump-parser) name timestamp) - (with-slots (line-parser finalizer) parser +(defmethod parse-table ((parser xdump-parser) input-name input-timestamp) + (with-slots (line-parser finalizer name timestamp) parser (setf line-parser #'parse-entry - finalizer #'table-finalizer))) + finalizer #'table-finalizer + name input-name + timestamp input-timestamp))) (defmethod header-parser ((parser xdump-parser) line) (multiple-value-bind (fullmatch groups) @@ -143,4 +199,6 @@ (defun t2 () (test-parse "xdump-meta-meta.txt") (test-parse "xdump-meta-table.txt") - (test-parse "xdump-table.txt")) + (test-parse "xdump-table.txt") + (test-parse "xdump-meta-34.txt") + (test-parse "xdump-34.txt"))