-(defun entry-from-vector (class meta-table entry-vector table-classes-package)
- (let ((new-entry (make-instance class))
- (i 0))
- (loop
- for column across meta-table do
- (let ((slot (find-symbol (string-upcase (meta-name column))
- table-classes-package)))
- (setf (slot-value new-entry slot) (nth i entry-vector))
- (incf i)))
- new-entry))
+(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)))