+(defun meta-finalizer (parser)
+ (with-parser parser
+ (with-slots (name entry-buffer) parser
+ (define-table name entry-buffer))))
+
+(defmethod array-p ((parser xdump-parser) column)
+ (let ((column-len (meta-len column))
+ (column-type (sym-by-value parser "meta-type" (meta-type column))))
+ (and (> column-len 0)
+ (not (string= column-type "c")))))
+
+(defmethod entry-from-vector (parser class meta-table entry-vector
+ &key (array-support-p t))
+ (with-slots (table-classes-package) parser
+ (let ((new-entry (make-instance class))
+ (entries entry-vector))
+ (loop
+ for column across meta-table do
+ (let ((slot (find-symbol (string-upcase (meta-name column))
+ table-classes-package)))
+ (if (and array-support-p (array-p parser column))
+ ;; then collect array
+ (let ((array nil))
+ (dotimes (j (meta-len column))
+ (push (pop entries) array))
+ (setf (slot-value new-entry slot) array))
+ ;; else collect single entry
+ (progn
+ (setf (slot-value new-entry slot) (pop entries))))))
+ new-entry)))
+
+(defmethod table-entry-insert-at ((table xdump-table) entry index)
+ ; extend array if necessary
+ (let ((entries (table-entries table)))
+ (unless (> (fill-pointer entries) index)
+ (adjust-array entries (max 1 (* 2 index))
+ :fill-pointer index
+ :initial-element nil))
+ (setf (aref entries index) entry)))
+
+(defun load-table (name timestamp entry-buffer)
+ (with-slots (index-by-name meta-by-index table-by-index table-classes-package
+ user-log)
+ *current-parser*
+ (print `(load-table ,name ,timestamp ,entry-buffer) user-log)