From da0e0f7061592dde760ee1a070dd959e5496ba88 Mon Sep 17 00:00:00 2001 From: Gerd Flaig Date: Sun, 30 Aug 2009 00:53:12 +0200 Subject: [PATCH] First working complete xdump parser --- package.lisp | 4 ++- xdump-test.lisp | 72 ++++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 68 insertions(+), 8 deletions(-) diff --git a/package.lisp b/package.lisp index 1b7cdb4..64ff316 100644 --- a/package.lisp +++ b/package.lisp @@ -21,5 +21,7 @@ (defpackage :empire-log (:use :cl) (:export :info)) + (defpackage :xdump-data + (:use :cl)) (defpackage :xdump - (:use :cl))) + (:use :cl :xdump-data))) 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")) -- 2.43.0