From 7964c4eff78de2fcca3c0b79161fa1f4cf626690 Mon Sep 17 00:00:00 2001 From: Gerd Flaig Date: Sun, 30 Aug 2009 01:28:45 +0200 Subject: [PATCH] Start integration of xdump with protocol --- empire.lisp | 26 ++++++++++++++------------ eow.mbd | 3 ++- package.lisp | 3 ++- xdump-test.lisp => xdump.lisp | 15 ++++++--------- 4 files changed, 24 insertions(+), 23 deletions(-) rename xdump-test.lisp => xdump.lisp (96%) diff --git a/empire.lisp b/empire.lisp index 2f3452e..c8993e8 100644 --- a/empire.lisp +++ b/empire.lisp @@ -303,20 +303,22 @@ (char= +special-command-char+ (aref line 0)))) (defclass xdump-mode (play-mode) - ((table-buffer - :initform nil - :accessor table-buffer - :documentation "Intermediate storage for incomplete table dump."))) + ((parser :initform (xdump:make-parser)) + (phase :initform :meta-meta))) (defmethod handle-data ((m xdump-mode) message) - (with-slots (connection table-buffer) m - (if (char= #\/ (aref message 0)) - (progn - (format t "table: ~a~%" table-buffer) - (set-new-mode m 'play-mode))) - ;XXX check table size - (with-input-from-string (s (format nil "(~a)" message)) - (setf table-buffer (cons (read s) table-buffer))))) + (with-slots (connection parser phase) m + (if (xdump:parse-line parser message) + ;;XXX consider something like a 'pop-mode function + (case phase + (:meta-meta + (setf phase :meta-table) + (send-message connection "xdump meta table" :next-mode 'xdump-mode)) + (:meta-table + (setf phase :table) + (send-message connection "xdump table *" :next-mode 'xdump-mode)) + (:table + (set-new-mode (connection-mode connection) 'play-mode)))))) (defmethod special-xup ((c connection)) (send-message c "xdump meta meta" :next-mode 'xdump-mode)) diff --git a/eow.mbd b/eow.mbd index 587b648..2c8ded1 100644 --- a/eow.mbd +++ b/eow.mbd @@ -12,6 +12,7 @@ ("util" (:needs "package")) ("locked-queue" (:needs "package")) ("log" (:needs "package")) + ("xdump" (:needs "package")) ("web" (:needs "locked-queue" "log")) - ("empire" (:needs "util" "log"))) + ("empire" (:needs "util" "log" "xdump"))) (:needs :usocket :hunchentoot :parenscript)) diff --git a/package.lisp b/package.lisp index 64ff316..5459b50 100644 --- a/package.lisp +++ b/package.lisp @@ -24,4 +24,5 @@ (defpackage :xdump-data (:use :cl)) (defpackage :xdump - (:use :cl :xdump-data))) + (:use :cl :xdump-data) + (:export :make-parser :parse-line))) diff --git a/xdump-test.lisp b/xdump.lisp similarity index 96% rename from xdump-test.lisp rename to xdump.lisp index 928748c..c2f866e 100644 --- a/xdump-test.lisp +++ b/xdump.lisp @@ -1,7 +1,5 @@ (in-package :xdump) -(defparameter *mode* (make-instance 'empire::xdump-mode :connection nil)) - (defvar *current-parser* nil) (defclass table-column-meta () @@ -128,7 +126,8 @@ (defmethod finish-table ((parser xdump-parser) number-of-records) (if (not (equal number-of-records (length (entry-buffer parser)))) (error "Table row count mismatch")) - (funcall (finalizer parser) parser)) + (funcall (finalizer parser) parser) + t) ;; finished (defmethod parse-entry ((parser xdump-parser) line) (if (char= #\/ (aref line 0)) @@ -136,7 +135,8 @@ (let ((fields (mapcar #'read-from-string (cl-ppcre:split " " line)))) (with-slots (entry-buffer entry-index) parser (vector-push-extend fields entry-buffer) - (incf entry-index))))) + (incf entry-index)) + nil))) (defmethod parse-meta ((parser xdump-parser) input-name input-timestamp) (with-slots (line-parser finalizer name timestamp) parser @@ -168,7 +168,8 @@ (declare (ignorable fullmatch)) (let ((name (aref groups 0)) (timestamp (parse-integer (aref groups 1)))) - (parse-table parser name timestamp)))))) + (parse-table parser name timestamp))))) + nil) (defmethod parse-line ((parser xdump-parser) line) (with-slots (line-parser) parser @@ -189,10 +190,6 @@ (with-open-file (s filename) (parse s))) -(defun xd-test (input) - (loop for m in input - do (empire::handle-data *mode* m))) - (defun t1 () (test-parse "xdump-meta-meta.txt")) -- 2.43.0