;;; -*- Mode: Lisp; Base: 10.; Package: Moby-File-System -*-

;;; All "MAP-" streams are internal to the file system and support only simple
;;; serial IO.  All "MLM-" streams are streams used when opening files.

;(DEFFLAVOR MOBY-MAP-STREAM-MIXIN
;	((STATUS :OPEN)			;:OPEN, :EOF, :BEING-CLOSED, :CLOSED
;	 (MAP (MAP-CREATE))			;The map this stream is acting upon.
;	 (MAP-INDEX 0)				;Current index within map.
;	 (BYTE-SIZE 8)				;The byte size of the STREAM.
;	 (RQB (SI:GET-DISK-RQB STANDARD-BLOCK-SIZE)) ;The RQB in which the physical buffer lives.
;	 (RQB-VALID-PAGES NIL))			;The number of pages of data in RQB
;	()
;  (:INCLUDED-FLAVORS SI:STREAM)
;  (:INITABLE-INSTANCE-VARIABLES MAP BYTE-SIZE)
;  (:GETTABLE-INSTANCE-VARIABLES BYTE-SIZE))

(DEFFLAVOR MOBY-ARRAY-STREAM-MIXIN
	((STATUS :OPEN)			;:OPEN, :EOF, :BEING-CLOSED, :CLOSED
	 (BYTE-SIZE 8)			;The byte size of the STREAM.
	 (MAP-INDEX 0)
	 (PARTITION-HOST)
	 (DATA-POINTER)
	 (MAPPED-AREA))
	()
  (:INCLUDED-FLAVORS SI:STREAM)
  (:REQUIRED-INSTANCE-VARIABLES FILE)
  (:INITABLE-INSTANCE-VARIABLES DATA-POINTER BYTE-SIZE PARTITION-HOST)
  (:GETTABLE-INSTANCE-VARIABLES BYTE-SIZE PARTITION-HOST))

(DEFMETHOD (MOBY-ARRAY-STREAM-MIXIN :AFTER :INIT) (&REST IGNORE)
  (SETQ DATA-POINTER (MFILE-DATA-POINTER FILE))
  (SETQ MAPPED-AREA (MOBY-MAPPED-AREA-FOR-SECTION FILE))
  (IF (NULL MAPPED-AREA)
      (let ((dir (send self :direction)))
	(setq mapped-area
	      (moby-map-section partition-host file dir nil))))) ;not possible to be
				;output and no section-map, so options doesnt matter.

(defun moby-map-section (partition-host file direction options)
 "Returns area-number of mapped section"
 (let* ((mpa (send partition-host :mpa-defstruct))
	(partition-header (mpa-partition-header mpa))
	(host-index (send partition-host :host-index)))
  (COND ((EQ direction :OUTPUT)
	 (let* ((a-name (moby-area-name-for-section file))
		(area-number
		  (cond ((boundp a-name) 
			 (symbol-value a-name))
			(t
			 (moby-setup-area a-name
					  'section
					  file
					  partition-header
					  host-index)))))
	   (cond ((null (mfile-map file))
		  (setf (mfile-map file)
			(moby-make-section-map
			  (ROOT-AREA-OF-PARTITION-HOST PARTITION-HOST)
			  nil			;map-moby-handle supplied as nil.
			  file
			  area-number
			  10.
			  (moby-options-from-options options)))))	;moby-options
;	   ;this just adds to the section map, doesnt actually make any regions.
;	   ; host-index used just to test whether dataspace part of region map is
;	   ; is required (it is iff host is local).
;	   (moby-add-region-to-map-and-allocate-namespace
;	     (mfile-map file)
;	     (aref *area-to-msa* area-number)
;	     #o400
;	     partition-header)

	   ;this causes actual regions to appear for entire map, as updated.
	   (moby-store-map-for-area area-number (mfile-map file)
				    'all nil host-index)	;consable?
	   area-number))
	((EQ direction :INPUT)
	 (let* ((host-index (send partition-host :host-index))
		(area-number
		  (moby-setup-area
		    (moby-area-name-for-section file)
		    'section
		    file
		    partition-header
		    host-index)))
	   (moby-store-map-for-area area-number (mfile-map file) 'all nil
	    host-index)
	   area-number)))
	))

;(DEFWRAPPER (MOBY-MAP-STREAM-MIXIN :CLOSE) ((&OPTIONAL IGNORE) . BODY)
;  `(AND (NEQ STATUS :CLOSED)
;	(PROG1 (PROGN ,@BODY) (SETQ STATUS :CLOSED))))

(DEFWRAPPER (MOBY-ARRAY-STREAM-MIXIN :CLOSE) ((&OPTIONAL IGNORE) . BODY)
  `(AND (NEQ STATUS :CLOSED)
	(PROG1 (PROGN ,@BODY) (SETQ STATUS :CLOSED))))

;(DEFMETHOD (MOBY-MAP-STREAM-MIXIN :CLOSE) (&OPTIONAL IGNORE)
;  (AND RQB (SI:RETURN-DISK-RQB RQB))
;  (SETQ RQB NIL))

(DEFMETHOD (MOBY-ARRAY-STREAM-MIXIN :CLOSE) (&OPTIONAL IGNORE)
  NIL)

;(DEFFLAVOR MOBY-MAP-INPUT-STREAM-MIXIN
;	()
;	(MOBY-MAP-STREAM-MIXIN)
;  (:INCLUDED-FLAVORS SI:BUFFERED-INPUT-STREAM))

(DEFFLAVOR MOBY-ARRAY-INPUT-STREAM-MIXIN
	()
	(MOBY-ARRAY-STREAM-MIXIN)
  (:INCLUDED-FLAVORS SI:BUFFERED-INPUT-STREAM))

;(DEFFLAVOR MOBY-MAP-OUTPUT-STREAM-MIXIN
;	()
;	(MOBY-MAP-STREAM-MIXIN)
;  (:INCLUDED-FLAVORS SI:BUFFERED-OUTPUT-STREAM))

(DEFFLAVOR MOBY-ARRAY-OUTPUT-STREAM-MIXIN
	()
	(MOBY-ARRAY-STREAM-MIXIN)
  (:INCLUDED-FLAVORS SI:BUFFERED-OUTPUT-STREAM))

;(DEFMETHOD (MOBY-MAP-INPUT-STREAM-MIXIN :NEXT-INPUT-BUFFER) (&OPTIONAL IGNORE)
;  (COND ((EQ STATUS :CLOSED)
;	 (FERROR NIL "Attempt to get input from ~S, which is closed." SELF)))
;  (LET ((MAP-NBLOCKS (MOBY-MAP-NBLOCKS MAP))
;	SIZE)
;    (COND ((< MAP-INDEX MAP-NBLOCKS)
;	   (SETQ STATUS :OPEN)			;May have been at :EOF
;	   (SETQ SIZE (MOBY-MAP-BLOCK-SIZE MAP MAP-INDEX)
;		 RQB-VALID-PAGES (CEILING SIZE PAGE-SIZE-IN-BITS))
;	   (MLM-DISK-READ RQB (MOBY-MAP-BLOCK-LOCATION MAP MAP-INDEX) RQB-VALID-PAGES)
;	   (VALUES (GET-RQB-ARRAY RQB BYTE-SIZE) 0 (FLOOR SIZE BYTE-SIZE)))
;	  ;; If we're out of range, simply call it an :EOF.
;	  (T (SETQ STATUS :EOF)
;	     NIL))))

(DEFMETHOD (MOBY-ARRAY-INPUT-STREAM-MIXIN :NEXT-INPUT-BUFFER) (&OPTIONAL IGNORE)
  (COND ((EQ STATUS :CLOSED)
	 (FERROR NIL "Attempt to get input from ~S, which is closed." SELF)))
  (let ((array-nblocks (moby-a-of-a-nblocks DATA-POINTER))
	(size nil))
    (COND ((< map-index array-nblocks)
	   (SETQ STATUS :OPEN)			;May have been at :EOF
	   (setq size (moby-a-of-a-block-size DATA-POINTER map-index))
	   (VALUES (aref DATA-POINTER map-index 0)
		   0
		   (floor size byte-size)))
	  ;; If we're out of range, simply call it an :EOF.
	  (T (SETQ STATUS :EOF)
	     NIL))))

;;; This doesn't really discard the buffer (why bother), but does increment
;;; the buffer pointer for the next :NEXT-INPUT-BUFFER message.
;(DEFMETHOD (MOBY-MAP-INPUT-STREAM-MIXIN :DISCARD-INPUT-BUFFER) (IGNORE)
;  (INCF MAP-INDEX))

;; This doesn't really discard the buffer (why bother), but does increment
;; the buffer pointer for the next :NEXT-INPUT-BUFFER message.
(DEFMETHOD (MOBY-ARRAY-INPUT-STREAM-MIXIN :DISCARD-INPUT-BUFFER) (IGNORE)
  (incf map-index))

;;; This message would work, but would not do anything near what
;;; the user would want -- it would just use up more disk space.
;(DEFMETHOD (MOBY-MAP-OUTPUT-STREAM-MIXIN :FORCE-OUTPUT) IGNORE)

;; This message would work, but would not do anything near what
;; the user would want -- it would just use up more disk space.
(DEFMETHOD (MOBY-ARRAY-OUTPUT-STREAM-MIXIN :FORCE-OUTPUT) IGNORE)

;(DEFMETHOD (MOBY-MAP-OUTPUT-STREAM-MIXIN :NEW-OUTPUT-BUFFER) (&AUX LOC)
;  (COND ((EQ STATUS :CLOSED)
;	 (FERROR NIL "Attempt to do output on ~S, which is closed." SELF)))
;  (IF (= MAP-INDEX (MOBY-MAP-NBLOCKS MAP))
;      ;; At end: add a new block.
;      (PROGN
;	(MULTIPLE-VALUE (LOC RQB-VALID-PAGES)
;	  (ALLOCATE-DISK-BLOCK))
;	(MAP-APPEND-BLOCK MAP LOC 0)
;	(VALUES (GET-RQB-ARRAY RQB BYTE-SIZE)
;		0
;		(FLOOR (* RQB-VALID-PAGES PAGE-SIZE-IN-BITS) BYTE-SIZE)))
;    ;; In the middle: read contents of next existing block
;    ;; so that we can change only the bytes actually output.
;    (LET ((SIZE (MOBY-MAP-BLOCK-SIZE MAP MAP-INDEX)))
;      (SETQ RQB-VALID-PAGES (CEILING SIZE PAGE-SIZE-IN-BITS))
;      (MLM-DISK-READ RQB (MOBY-MAP-BLOCK-LOCATION MAP MAP-INDEX) RQB-VALID-PAGES)
;      (VALUES (GET-RQB-ARRAY RQB BYTE-SIZE) 0 (FLOOR SIZE BYTE-SIZE)))))

(DEFMETHOD (MOBY-ARRAY-OUTPUT-STREAM-MIXIN :NEW-OUTPUT-BUFFER) (&AUX ARRAY)
  (COND ((EQ STATUS :CLOSED)
	 (FERROR NIL "Attempt to do output on ~S, which is closed." SELF)))
  (IF (= MAP-INDEX (MOBY-A-OF-A-NBLOCKS DATA-POINTER))
      ;; At end: add a new block.
      (PROGN
	(SETQ ARRAY (ALLOCATE-DISK-ARRAY FILE MAPPED-AREA BYTE-SIZE))
	(ARRAY-OF-ARRAYS-APPEND-ARRAY DATA-POINTER ARRAY 0)
	(VALUES (AREF DATA-POINTER MAP-INDEX 0)
		0
		;(FLOOR (* RQB-VALID-PAGES PAGE-SIZE-IN-BITS) BYTE-SIZE)
		(ARRAY-LENGTH (AREF DATA-POINTER MAP-INDEX 0))))
    ;; In the middle: read contents of next existing block
    ;; so that we can change only the bytes actually output.
    (LET ((SIZE (MOBY-A-OF-A-BLOCK-SIZE DATA-POINTER MAP-INDEX)))
      (VALUES (AREF DATA-POINTER MAP-INDEX 0) 0 (FLOOR SIZE BYTE-SIZE)))))

(defun allocate-disk-array
       (file mapped-area byte-size &optional (size 200))  ;**small for test purposes
  file	;not needed since region is in, therefore *moby-page-association* does not point
	; to section.
  (let* ((type (car (rassq byte-size si:array-bits-per-element))))
    (make-array size :area mapped-area :type type)))

;;; The :NEW-OUTPUT-BUFFER method gets the old data, so this has nothing to do.
;(DEFMETHOD (MOBY-MAP-OUTPUT-STREAM-MIXIN :GET-OLD-DATA) (&REST IGNORE) NIL)

(DEFMETHOD (MOBY-ARRAY-OUTPUT-STREAM-MIXIN :SEND-OUTPUT-BUFFER) (BUFFER TO-INDEX)
  (OR (= MAPPED-AREA (%AREA-NUMBER BUFFER))
      (FERROR NIL "Attempt to :SEND-OUTPUT-BUFFER ~S, in area ~S"
	      BUFFER MAPPED-AREA))
  (LET* (;(ARRAY (MOBY-A-OF-A-ARRAY DATA-POINTER MAP-INDEX))
	 (SIZE (* TO-INDEX BYTE-SIZE))
	 ;(USED-NPAGES (CEILING SIZE PAGE-SIZE-IN-BITS))
	 )
    (COND ((ZEROP SIZE)
	   (DECF (MOBY-A-OF-A-NBLOCKS DATA-POINTER)))
	  (T (WHEN (< (MOBY-A-OF-A-BLOCK-SIZE DATA-POINTER MAP-INDEX) SIZE)
	       (SETF (MOBY-A-OF-A-BLOCK-SIZE DATA-POINTER MAP-INDEX) SIZE))
	     (INCF MAP-INDEX)))))

;(DEFMETHOD (MOBY-MAP-OUTPUT-STREAM-MIXIN :DISCARD-OUTPUT-BUFFER) (BUFFER)
;  (SEND SELF :SEND-OUTPUT-BUFFER BUFFER 0))

(DEFMETHOD (MOBY-ARRAY-OUTPUT-STREAM-MIXIN :DISCARD-OUTPUT-BUFFER) (BUFFER)
  (SEND SELF :SEND-OUTPUT-BUFFER BUFFER 0))

;;These flavors are not used.
;;(DEFFLAVOR MAP-INPUT-STREAM
;;	()
;;	(MOBY-MAP-INPUT-STREAM-MIXIN SI:BUFFERED-INPUT-STREAM))
;;
;;(DEFFLAVOR MAP-OUTPUT-STREAM
;;	()
;;	(MOBY-MAP-OUTPUT-STREAM-MIXIN SI:BUFFERED-OUTPUT-STREAM))

;;; The next two flavors are used internally by the file system.
;(DEFFLAVOR MOBY-MAP-CHARACTER-INPUT-STREAM
;	()
;	(MOBY-MAP-INPUT-STREAM-MIXIN SI:BUFFERED-LINE-INPUT-STREAM))

;(DEFFLAVOR MOBY-ARRAY-CHARACTER-INPUT-STREAM
;	()
;	(MOBY-ARRAY-INPUT-STREAM-MIXIN SI:BUFFERED-LINE-INPUT-STREAM))

;(DEFFLAVOR MOBY-MAP-CHARACTER-OUTPUT-STREAM
;	()
;	(MOBY-MAP-OUTPUT-STREAM-MIXIN SI:BUFFERED-OUTPUT-CHARACTER-STREAM))

;(DEFFLAVOR MOBY-ARRAY-CHARACTER-OUTPUT-STREAM
;	()
;	(MOBY-ARRAY-OUTPUT-STREAM-MIXIN SI:BUFFERED-OUTPUT-CHARACTER-STREAM))

;(DEFMETHOD (MOBY-MAP-CHARACTER-OUTPUT-STREAM :MAP) () MAP)

;(DEFMETHOD (MOBY-ARRAY-CHARACTER-OUTPUT-STREAM :DATA-POINTER) () DATA-POINTER)

;;; The next flavor is for input streams opened in an odd byte size.
;(DEFFLAVOR MOBY-ODD-BYTE-SIZE-MIXIN () ()
;  (:REQUIRED-FLAVORS MOBY-MAP-INPUT-STREAM-MIXIN))

;(DEFWRAPPER (MOBY-ODD-BYTE-SIZE-MIXIN :NEXT-INPUT-BUFFER) ((&OPTIONAL IGNORE) . BODY)
;  (LET ((VAL1 (GENTEMP)) (VAL2 (GENTEMP)) (VAL3 (GENTEMP)) (I (GENTEMP)))
;    `(MULTIPLE-VALUE-PROG1 (,VAL1 ,VAL2 ,VAL3)
;	 (PROGN . ,BODY)
;       (COND (,VAL1
;	      (LOOP FOR ,I FROM ,VAL2 BELOW ,VAL3
;		    DO (ASET (LDB BYTE-SIZE (AREF ,VAL1 ,I)) ,VAL1 ,I))))
;       (VALUES ,VAL1 ,VAL2 ,VAL3))))

(DEFFLAVOR MOBY-LM-STREAM-MIXIN
	(TRUENAME
	 PARTITION-HOST)
	(SI:PROPERTY-LIST-MIXIN SI:FILE-STREAM-MIXIN)
  (:GETTABLE-INSTANCE-VARIABLES TRUENAME PARTITION-HOST)
  (:INITABLE-INSTANCE-VARIABLES PARTITION-HOST)
  (:INIT-KEYWORDS :FILE :APPEND :TRUENAME))

(DEFMETHOD (MOBY-LM-STREAM-MIXIN :INIT) (PLIST)
  (LET ((FILE (GET PLIST :FILE)))
    (IF FILE
	(SETQ TRUENAME (FILE-TRUENAME FILE)
	      SI:PROPERTY-LIST (MBFS-FILE-PROPERTIES FILE))
      (SETQ TRUENAME (GET PLIST :TRUENAME)))))

(DEFMETHOD (MOBY-LM-STREAM-MIXIN :QFASLP) ()
  (GET (LOCF SI:PROPERTY-LIST) :QFASLP))

;; For probes, assume you really mean :LENGTH-IN-BYTES
(DEFMETHOD (MOBY-LM-STREAM-MIXIN :LENGTH) ()
  (GET (LOCF SI:PROPERTY-LIST) :LENGTH-IN-BYTES))

(DEFMETHOD (MOBY-LM-STREAM-MIXIN :PROPERTIES) (&OPTIONAL ERROR-P)
  ERROR-P ; would be quite hard to get an error here
  (VALUES (CONS TRUENAME SI:PROPERTY-LIST) MLM-UNSETTABLE-PROPERTIES))

(DEFFLAVOR MOBY-LM-DATA-STREAM-MIXIN
	(FILE)
	(MOBY-LM-STREAM-MIXIN)
  (:INCLUDED-FLAVORS MOBY-ARRAY-STREAM-MIXIN)
  (:INITABLE-INSTANCE-VARIABLES FILE)
  (:GETTABLE-INSTANCE-VARIABLES FILE))
	
(DEFMETHOD (MOBY-LM-DATA-STREAM-MIXIN :STATUS) () STATUS)

(DEFMETHOD (MOBY-LM-DATA-STREAM-MIXIN :DELETE) (&OPTIONAL (ERROR-P T))
  (IDENTIFY-FILE-OPERATION :DELETE
    (HANDLING-ERRORS ERROR-P
      (MBFS-DELETE-FILE PARTITION-HOST FILE))))

(DEFMETHOD (MOBY-LM-DATA-STREAM-MIXIN :RENAME) (NEW-NAME &OPTIONAL (ERROR-P T))
  (IDENTIFY-FILE-OPERATION :RENAME
    (HANDLING-ERRORS ERROR-P
      (MBFS-RENAME-FILE PARTITION-HOST FILE
			(PATHNAME-DIRECTORY NEW-NAME)
			(PATHNAME-NAME NEW-NAME)
			(PATHNAME-TYPE NEW-NAME)
			(PATHNAME-VERSION NEW-NAME)))
    (SETQ TRUENAME (FILE-TRUENAME FILE))))

(DEFMETHOD (MOBY-LM-DATA-STREAM-MIXIN :CHANGE-PROPERTIES) (ERROR-P &REST PROPERTIES)
  (IDENTIFY-FILE-OPERATION :CHANGE-PROPERTIES
    (HANDLING-ERRORS ERROR-P
      (MBFS-CHANGE-FILE-PROPERTIES PARTITION-HOST FILE PROPERTIES))))

(DEFMETHOD (MOBY-LM-DATA-STREAM-MIXIN :INIT) (IGNORE)
  (SETQ DATA-POINTER (MFILE-DATA-POINTER FILE)
	TRUENAME (FILE-TRUENAME FILE)
	SI:PROPERTY-LIST (MBFS-FILE-PROPERTIES FILE))
  (WITHOUT-INTERRUPTS
    (SETQ MLM-FILE-STREAMS-LIST
	  (CONS SELF MLM-FILE-STREAMS-LIST))))

(DEFMETHOD (MOBY-LM-DATA-STREAM-MIXIN :SET-BUFFER-POINTER) (NEW-POINTER)
  (DO ((NBLOCKS (MOBY-A-OF-A-NBLOCKS DATA-POINTER))
       (I 0 (1+ I))
       (P 0 P1)
       (P1))
      (NIL)
    (COND ((OR ( I NBLOCKS)
	       (> (SETQ P1 (+ P (FLOOR (MOBY-A-OF-A-BLOCK-SIZE DATA-POINTER I) BYTE-SIZE)))
		  NEW-POINTER))
	   (SETQ MAP-INDEX I)
	   (RETURN P))))
  )

(DEFFLAVOR MOBY-LM-INPUT-STREAM-MIXIN
	()
	(MOBY-LM-DATA-STREAM-MIXIN SI:INPUT-FILE-STREAM-MIXIN)
  (:INCLUDED-FLAVORS MOBY-ARRAY-STREAM-MIXIN)
  )

(DEFFLAVOR MOBY-LM-OUTPUT-STREAM-MIXIN
	()
	(MOBY-LM-DATA-STREAM-MIXIN SI:OUTPUT-FILE-STREAM-MIXIN)
  (:INCLUDED-FLAVORS MOBY-ARRAY-STREAM-MIXIN)
  )

(DEFMETHOD (MOBY-LM-INPUT-STREAM-MIXIN :AFTER :CLOSE) (&OPTIONAL IGNORE)
  (MBFS-CLOSE-FILE FILE)
  (WITHOUT-INTERRUPTS
    (SETQ MLM-FILE-STREAMS-LIST (DELQ SELF MLM-FILE-STREAMS-LIST)))
  (SETQ FILE NIL)
  (SETQ DATA-POINTER NIL))

;; For input streams, :LENGTH may be different from :LENGTH-IN-BYTES
(DEFMETHOD (MOBY-LM-INPUT-STREAM-MIXIN :LENGTH) ()
  (FLOOR (* (GET (LOCF SI:PROPERTY-LIST) :LENGTH-IN-BYTES)
	    (GET (LOCF SI:PROPERTY-LIST) :BYTE-SIZE))
	 BYTE-SIZE))

(DEFMETHOD (MOBY-LM-OUTPUT-STREAM-MIXIN :AFTER :INIT) (INIT-PLIST)
  (WHEN (GET INIT-PLIST :APPEND)
    (SETQ MAP-INDEX (MOBY-A-OF-A-NBLOCKS DATA-POINTER)))
  )
      
(DEFMETHOD (MOBY-LM-OUTPUT-STREAM-MIXIN :AFTER :CLOSE) (&OPTIONAL ABORTP)
  (cond ((and abortp (not (MFILE-CLOSED? file)))
	 (setf (MFILE-DELETED? file) t)
	 (MBFS-expunge-file file)
;	 (write-directory-files (mfile-directory file))
	 (moby-writeout-root partition-host))
	(t
	 (MBFS-close-file file)))
;    (IF (AND ABORTP (NOT (MFILE-CLOSED? FILE)))
;	(MBFS-EXPUNGE-FILE FILE)
;      (MBFS-CLOSE-FILE FILE))
    (WITHOUT-INTERRUPTS
      (SETQ MLM-FILE-STREAMS-LIST (DELQ SELF MLM-FILE-STREAMS-LIST)))
    (SETQ FILE NIL)
    (setq DATA-POINTER NIL)
    )

(DEFFLAVOR MOBY-LM-INPUT-STREAM
	()
	(MOBY-LM-INPUT-STREAM-MIXIN MOBY-ARRAY-INPUT-STREAM-MIXIN
	 SI:BUFFERED-INPUT-STREAM))

(DEFFLAVOR MOBY-LM-OUTPUT-STREAM
	()
	(MOBY-LM-OUTPUT-STREAM-MIXIN MOBY-ARRAY-OUTPUT-STREAM-MIXIN
	 SI:BUFFERED-OUTPUT-STREAM))

(DEFFLAVOR MOBY-LM-CHARACTER-INPUT-STREAM
	()
	(MOBY-LM-INPUT-STREAM-MIXIN MOBY-ARRAY-INPUT-STREAM-MIXIN
	 SI:BUFFERED-INPUT-CHARACTER-STREAM))

(DEFFLAVOR MOBY-LM-CHARACTER-OUTPUT-STREAM
	()
	(MOBY-LM-OUTPUT-STREAM-MIXIN MOBY-ARRAY-OUTPUT-STREAM-MIXIN
	 SI:BUFFERED-OUTPUT-CHARACTER-STREAM))

(DEFFLAVOR MOBY-LM-PROBE-STREAM
	()
	(MOBY-LM-STREAM-MIXIN SI:STREAM)
  ;; Kludge so that OPEN can pass this a :BYTE-SIZE :DEFAULT
  (:INIT-KEYWORDS :BYTE-SIZE))

(DEFMETHOD (MOBY-LM-PROBE-STREAM :STATUS) () :CLOSED)
(DEFMETHOD (MOBY-LM-PROBE-STREAM :DIRECTION) () NIL)
(DEFMETHOD (MOBY-LM-PROBE-STREAM :BYTE-SIZE) () (GETF SI:PROPERTY-LIST :BYTE-SIZE))

(COMPILE-FLAVOR-METHODS ;MOBY-ARRAY-CHARACTER-INPUT-STREAM MOBY-ARRAY-CHARACTER-OUTPUT-STREAM
			MOBY-LM-INPUT-STREAM MOBY-LM-OUTPUT-STREAM
			MOBY-LM-CHARACTER-INPUT-STREAM MOBY-LM-CHARACTER-OUTPUT-STREAM
			MOBY-LM-PROBE-STREAM)

;(DEFUN MAKE-MAP-STREAM (FLAVOR &REST INIT-PLIST)
;  (INSTANTIATE-FLAVOR FLAVOR (LOCF INIT-PLIST) NIL NIL MOBY-FILE-SYSTEM-AREA))

;(DEFUN MAKE-ARRAY-STREAM (FLAVOR &REST INIT-PLIST)
;  (INSTANTIATE-FLAVOR FLAVOR (LOCF INIT-PLIST) NIL NIL MOBY-FILE-SYSTEM-AREA))

;(DEFUN MAKE-MAP-STREAM-IN (MAP)
;  (MAKE-MAP-STREAM 'MOBY-MAP-CHARACTER-INPUT-STREAM
;		   :MAP MAP))

;(DEFUN MAKE-ARRAY-STREAM-IN (DATA-POINTER)
;  (MAKE-ARRAY-STREAM 'MOBY-ARRAY-CHARACTER-INPUT-STREAM
;		     :DATA-POINTER DATA-POINTER))

;(DEFUN MAKE-MAP-STREAM-OUT ()
;  (MAKE-MAP-STREAM 'MOBY-MAP-CHARACTER-OUTPUT-STREAM
;		   :MAP (MAP-CREATE 4)))	;Internal things tend to be small.

;(DEFUN MAKE-ARRAY-STREAM-OUT (PARTITION-HOST)
;  (MAKE-ARRAY-STREAM 'MOBY-ARRAY-CHARACTER-OUTPUT-STREAM
;			Internal things tend to be small.
;    :DATA-POINTER (ARRAY-OF-ARRAYS-CREATE PARTITION-HOST 4))) 

;;; A simple stream for reading and writing the disk configuration.
;;; MOBY-DISK-CONFIGURATION-BUFFER-POINTER must be bound for this stream to work.

;(DEFSELECT (MOBY-DISK-CONFIGURATION-STREAM MOBY-DISK-CONFIGURATION-STREAM-DEFAULT)
;  (:TYI (&OPTIONAL IGNORE)
;    (AREF MOBY-DISK-CONFIGURATION-BUFFER
;	  (PROG1 MOBY-DISK-CONFIGURATION-BUFFER-POINTER
;		 (INCF MOBY-DISK-CONFIGURATION-BUFFER-POINTER))))
;  (:UNTYI (CHAR)
;    (DECF MOBY-DISK-CONFIGURATION-BUFFER-POINTER)
;    CHAR)
;  (:TYO (CHAR)
;    (ASET CHAR MOBY-DISK-CONFIGURATION-BUFFER
;	  (PROG1 MOBY-DISK-CONFIGURATION-BUFFER-POINTER
;		 (INCF MOBY-DISK-CONFIGURATION-BUFFER-POINTER)))))

;(DEFUN MOBY-DISK-CONFIGURATION-STREAM-DEFAULT (OP &OPTIONAL ARG1 &REST ARGS)
;  (STREAM-DEFAULT-HANDLER #'MOBY-DISK-CONFIGURATION-STREAM OP ARG1 ARGS))
