+(defmethod get-table ((parser xdump-parser) table-name)
+ (with-slots (index-by-name table-by-index) parser
+ (let* ((table-index (gethash table-name index-by-name))
+ (table (aref table-by-index table-index)))
+ table)))
+
+(defmacro with-parser (parser &body body)
+ `(let ((*current-parser* ,parser))
+ ,@body))
+
+(defun table (table-name &optional (parser *current-parser*))
+ (get-table parser table-name))
+
+(defun checkpoint (&optional (parser *current-parser*))
+ (flush-log parser))
+
+(defmethod get-table-entry ((parser xdump-parser) table-name index)
+ (aref (table-entries (get-table parser table-name)) index))
+
+(defmethod sym-by-value ((parser xdump-parser) table-name value)
+ (with-slots (table-classes-package) parser
+ (let ((value-slot (find-symbol "VALUE" table-classes-package))
+ (name-slot (find-symbol "NAME" table-classes-package))
+ (meta-type-table (get-table parser table-name)))
+ (loop for entry across (table-entries meta-type-table)
+ if (= (slot-value entry value-slot) value)
+ return (slot-value entry name-slot)))))
+
+(defmethod reset-table-parser ((parser xdump-parser))
+ (with-slots (line-parser entry-buffer entry-index finalizer name timestamp)
+ parser
+ (setf line-parser #'header-parser
+ entry-buffer (make-array 1 :fill-pointer 0 :adjustable t)
+ entry-index 0
+ finalizer nil
+ name nil
+ timestamp nil)))
+
+(defun define-meta-table (entry-buffer)
+ (with-slots (meta-index meta-meta user-log) *current-parser*
+ (print `(define-meta-table ,entry-buffer) user-log)
+ ; build meta-index from integer index to
+ ; slot symbol