(FILECREATED "16-Sep-86 12:41:44" {ERIS}<LISPCORE>LIBRARY>CLSTREAMS.;40 89094  

      changes to:  (FNS %%SYNONYM-STREAM-DEVICE-READP %%TWO-WAY-STREAM-DEVICE-BACKFILEPTR 
                        %%INITIALIZE-CLSTREAM-TYPES)

      previous date: "28-Aug-86 17:54:50" {ERIS}<LISPCORE>LIBRARY>CLSTREAMS.;39)


(* Copyright (c) 1985, 1986 by Xerox Corporation. All rights reserved.)

(PRETTYCOMPRINT CLSTREAMSCOMS)

(RPAQQ CLSTREAMSCOMS ((* * 
                      "Implements a number of stream functions from CommonLisp.  See CLtL chapter 21"
                         )
                      (COMS (* "documented functions and macros")
                            (FUNCTIONS OPEN CLOSE)
                            (FUNCTIONS STREAM-ELEMENT-TYPE INPUT-STREAM-P OUTPUT-STREAM-P)
                            (FUNCTIONS FILE-STREAM-POSITION)
                            (FUNCTIONS MAKE-SYNONYM-STREAM MAKE-BROADCAST-STREAM 
                                   MAKE-CONCATENATED-STREAM MAKE-TWO-WAY-STREAM MAKE-ECHO-STREAM 
                                   MAKE-STRING-INPUT-STREAM)
                            (FUNCTIONS %%MAKE-INITIAL-STRING-STREAM-CONTENTS)
                            (DECLARE: DOCOPY (FUNCTIONS WITH-OPEN-STREAM WITH-INPUT-FROM-STRING 
                                                    WITH-OUTPUT-TO-STRING WITH-OPEN-FILE))
                            (FUNCTIONS MAKE-STRING-OUTPUT-STREAM MAKE-FILL-POINTER-OUTPUT-STREAM 
                                   GET-OUTPUT-STREAM-STRING \STRING-STREAM-OUTCHARFN 
                                   \ADJUSTABLE-STRING-STREAM-OUTCHARFN))
                      (COMS (* "helpers")
                            (FUNCTIONS %%NEW-FILE PREDICT-NAME))
                      (COMS (* "methods for the special devices")
                            (FNS %%BROADCAST-STREAM-DEVICE-BOUT %%BROADCAST-STREAM-DEVICE-CLOSEFILE 
                                 %%BROADCAST-STREAM-DEVICE-FORCEOUTPUT 
                                 %%BROADCAST-STREAM-DEVICE-OPENFILE)
                            (FNS %%CONCATENATED-STREAM-DEVICE-BIN 
                                 %%CONCATENATED-STREAM-DEVICE-CLOSEFILE 
                                 %%CONCATENATED-STREAM-DEVICE-EOFP 
                                 %%CONCATENATED-STREAM-DEVICE-OPENFILE 
                                 %%CONCATENATED-STREAM-DEVICE-PEEKBIN)
                            (FNS %%ECHO-STREAM-DEVICE-BIN)
                            (FNS %%SYNONYM-STREAM-DEVICE-BIN %%SYNONYM-STREAM-DEVICE-BOUT 
                                 %%SYNONYM-STREAM-DEVICE-CLOSEFILE %%SYNONYM-STREAM-DEVICE-EOFP 
                                 %%SYNONYM-STREAM-DEVICE-FORCEOUTPUT 
                                 %%SYNONYM-STREAM-DEVICE-GETFILEINFO %%SYNONYM-STREAM-DEVICE-OPENFILE 
                                 %%SYNONYM-STREAM-DEVICE-PEEKBIN %%SYNONYM-STREAM-DEVICE-READP 
                                 %%SYNONYM-STREAM-DEVICE-BACKFILEPTR 
                                 %%SYNONYM-STREAM-DEVICE-SETFILEINFO)
                            (FNS %%TWO-WAY-STREAM-DEVICE-BIN %%TWO-WAY-STREAM-DEVICE-BOUT 
                                 %%TWO-WAY-STREAM-DEVICE-CLOSEFILE %%TWO-WAY-STREAM-DEVICE-EOFP 
                                 %%TWO-WAY-STREAM-DEVICE-BACKFILEPTR 
                                 %%TWO-WAY-STREAM-DEVICE-FORCEOUTPUT %%TWO-WAY-STREAM-DEVICE-OPENFILE 
                                 %%TWO-WAY-STREAM-DEVICE-PEEKBIN)
                            (FUNCTIONS %%FILL-POINTER-STREAM-DEVICE-CLOSEFILE 
                                   %%FILL-POINTER-STREAM-DEVICE-GETFILEPTR))
                      (COMS (* "helper stuff")
                            (FNS %%SYNONYM-STREAM-DEVICE-GET-STREAM))
                      (COMS (* "package initialization")
                            (VARIABLES *TRACE-OUTPUT* *DEBUG-IO* *QUERY-IO* *TERMINAL-IO* 
                                   *ERROR-OUTPUT* *STANDARD-OUTPUT* *STANDARD-INPUT*)
                            (FUNCTIONS %%INITIALIZE-SYNONYM-IMAGEOPS %%INITIALIZE-STANDARD-STREAMS)
                            (FNS %%INITIALIZE-CLSTREAM-TYPES)
                            (DECLARE: DONTEVAL@LOAD DOCOPY (*)
                                   (P (%%INITIALIZE-CLSTREAM-TYPES)
                                      (%%INITIALIZE-STANDARD-STREAMS)
                                      (* (%%INITIALIZE-SYNONYM-IMAGEOPS)))))
                      (PROP FILETYPE CLSTREAMS)
                      (SETFS FILE-STREAM-POSITION)))
(* * "Implements a number of stream functions from CommonLisp.  See CLtL chapter 21")




(* "documented functions and macros")

(DEFUN OPEN (FILENAME &KEY (DIRECTION :INPUT)
                   (ELEMENT-TYPE (QUOTE STRING-CHAR))
                   (IF-EXISTS NIL EXISTS-P)
                   (IF-DOES-NOT-EXIST NIL DOES-NOT-EXIST-P)) 
          
          (* * "Return a stream which reads from or writes to Filename.  Defined keywords: :direction (one of :input, :output or :probe :element-type), Type of object to read or write, default String-Char, :if-exists (one of :error, :new-version, :overwrite, :append or nil), :if-does-not-exist (one of :error, :create or nil). See the manual for details.")
 (CL:UNLESS (MEMQ DIRECTION (QUOTE (:INPUT :OUTPUT :IO :PROBE)))
        (CL:ERROR "~S isn't a valid direction for open." DIRECTION))
 (CL:UNLESS (MEMQ ELEMENT-TYPE (QUOTE (STRING-CHAR UNSIGNED-BYTE CHARACTER :DEFAULT)))
        (CL:ERROR "~S isn't an implemented element-type for open." ELEMENT-TYPE))
 (LET ((PATHNAME (PATHNAME FILENAME))
       (FOR-INPUT (MEMQ DIRECTION (QUOTE (:IO :INPUT))))
       (FOR-OUTPUT (MEMQ DIRECTION (QUOTE (:IO :OUTPUT))))
       (STREAM NIL))
          
          (* * "Do hairy defaulting of :if-exists and :if-does-not-exist keywords.")

      (CL:UNLESS EXISTS-P (SETQ IF-EXISTS (CL:IF (EQ (PATHNAME-VERSION PATHNAME)
                                                     :NEWEST)
                                                 :NEW-VERSION :ERROR)))
      (CL:UNLESS DOES-NOT-EXIST-P (SETQ IF-DOES-NOT-EXIST (COND
                                                             ((OR (MEMQ IF-EXISTS (QUOTE (:OVERWRITE
                                                                                          :APPEND)))
                                                                  (EQ DIRECTION :INPUT))
                                                              :ERROR)
                                                             ((EQ DIRECTION :PROBE)
                                                              NIL)
                                                             (T :CREATE))))
      (LOOP                                                  (* 
                                        "See if the file exists and handle the existential keywords.")
            (LET ((NAMESTRING (PREDICT-NAME PATHNAME)))
                 (if NAMESTRING
                     then                                    (* "file exists")
                          (if FOR-OUTPUT
                              then (CASE IF-EXISTS (:ERROR (CERROR "write it anyway." 
                                                                  "File ~A already exists." 
                                                                  NAMESTRING)
                                                          (SETQ STREAM (OPENSTREAM NAMESTRING
                                                                              (QUOTE OUTPUT)))
                                                          (RETURN NIL))
                                         ((:NEW-VERSION :SUPERSEDE :RENAME :RENAME-AND-DELETE)
                                          (SETQ STREAM (OPENSTREAM PATHNAME (QUOTE OUTPUT)
                                                              (QUOTE NEW)))
                                          (RETURN NIL))
                                         (:OVERWRITE (SETQ STREAM (OPENSTREAM NAMESTRING (QUOTE
                                                                                          OUTPUT)
                                                                         (QUOTE OLD)))
                                                (RETURN NIL))
                                         (:APPEND (SETQ STREAM (OPENSTREAM NAMESTRING (QUOTE APPEND)
                                                                      (QUOTE OLD)))
                                                (RETURN NIL))
                                         ((NIL)
                                          (RETURN-FROM OPEN NIL))
                                         (T (CL:ERROR "~S is not a valid value for :if-exists." 
                                                   IF-EXISTS)))
                            elseif FOR-INPUT
                              then (SETQ STREAM (OPENSTREAM NAMESTRING (QUOTE INPUT)
                                                       (QUOTE OLD)))
                                   (RETURN NIL)
                            else (SETQ STREAM (create STREAM
                                                     FULLFILENAME ← (FULLNAME NAMESTRING)))
                                 (RETURN NIL))
                   else                                      (* "file does not exist")
                        (if FOR-OUTPUT
                            then (CASE IF-DOES-NOT-EXIST (:ERROR (CERROR "prompt for a new name." 
                                                                        "File ~A does not exist." 
                                                                        PATHNAME)
                                                                (FORMAT *QUERY-IO* 
                                                                       "~&New file name: ")
                                                                (SETQ PATHNAME (PATHNAME (READ-LINE
                                                                                          *QUERY-IO*)
                                                                                      )))
                                       (:CREATE (SETQ STREAM (OPENSTREAM PATHNAME (QUOTE OUTPUT)
                                                                    (QUOTE NEW)))
                                              (RETURN NIL))
                                       ((NIL)
                                        (RETURN-FROM OPEN NIL))
                                       (T (CL:ERROR "~S is not a valid value for :if-does-not-exist." 
                                                 IF-DOES-NOT-EXIST)))
                          elseif FOR-INPUT
                            then (CASE IF-DOES-NOT-EXIST (:ERROR (CERROR "prompt for a new name." 
                                                                        "File ~A does not exist." 
                                                                        PATHNAME)
                                                                (FORMAT *QUERY-IO* 
                                                                       "~&New file name: ")
                                                                (SETQ PATHNAME (PATHNAME (READ-LINE
                                                                                          *QUERY-IO*)
                                                                                      )))
                                       (:CREATE (%%NEW-FILE PATHNAME))
                                       ((NIL)
                                        (RETURN-FROM OPEN NIL))
                                       (T (CL:ERROR "~S is not a valid value for :if-does-not-exist." 
                                                 IF-DOES-NOT-EXIST)))
                          else                               (* "Open for probe.")
                               (RETURN NIL)))))
      STREAM))

(DEFUN CLOSE (STREAM &KEY ABORT) 
          
          (* * "Close a stream.  If ABORT, then don't keep the file")
 (if (STREAMP STREAM)
     then (if (OPENP STREAM)
              then 
          
          (* * "determine 'deletability' of stream's file before closing, as that trashes the info")

                   (LET ((ABORTABLE (AND (DIRTYABLE STREAM)
                                         (NOT (APPENDONLY STREAM)))))
                        (CLOSEF STREAM)
                        (if (AND ABORT ABORTABLE)
                            then                             (* 
       "eventually we will change device CLOSEF methods to take an ABORT arg.  For now, simulate it.")
                                 (DELFILE (NAMESTRING STREAM)))))
   else (ERROR "Closing a non-stream" STREAM))
 T)

(DEFUN STREAM-ELEMENT-TYPE (STREAM) (QUOTE UNSIGNED-BYTE))

(DEFUN INPUT-STREAM-P (STREAM) (CL:WHEN (NOT (STREAMP STREAM))
                                      (\ILLEGAL.ARG STREAM))
          
          (* * "we return T instead of the stream because Symbolics does")

                               (AND (\IOMODEP STREAM (QUOTE INPUT)
                                           T)
                                    T))

(DEFUN OUTPUT-STREAM-P (STREAM) (CL:WHEN (NOT (STREAMP STREAM))
                                       (\ILLEGAL.ARG STREAM))
          
          (* * "we return T instead of the stream because Symbolics does")

                                (AND (\IOMODEP STREAM (QUOTE OUTPUT)
                                            T)
                                     T))

(DEFUN FILE-STREAM-POSITION (STREAM) (GETFILEPTR STREAM))

(DEFUN MAKE-SYNONYM-STREAM (SYMBOL) 
          
          (* * "A CommonLisp function for shadowing a stream.  See CLtL p.  329")
 (OPENSTREAM (QUOTE {SYNONYM-STREAM-DEVICE})
        (QUOTE BOTH)
        NIL NIL (BQUOTE ((SYMBOL (\, SYMBOL))))))

(DEFUN MAKE-BROADCAST-STREAM (&REST STREAMS) 
          
          (* * "CommonLisp function to make a `splitter' stream.  See CLtL p329")
 (OPENSTREAM (QUOTE {BROADCAST-STREAM-DEVICE})
        (QUOTE OUTPUT)
        NIL NIL (BQUOTE ((STREAMS (\, STREAMS))))
        NIL))

(DEFUN MAKE-CONCATENATED-STREAM (&REST STREAMS) 
          
          (* * A CommonLisp function for concatenating several input streams together.
          See CLtL p. 329)
 (OPENSTREAM (QUOTE {CONCATENATED-STREAM-DEVICE})
        (QUOTE INPUT)
        NIL NIL (BQUOTE ((STREAMS (\, STREAMS))))
        NIL))

(DEFUN MAKE-TWO-WAY-STREAM (INPUT-STREAM OUTPUT-STREAM) 
          
          (* * "A CommonLisp function for splicing together two streams.  See CLtL p.  329")
 (OPENSTREAM (QUOTE {TWO-WAY-STREAM-DEVICE})
        (QUOTE BOTH)
        NIL NIL (BQUOTE ((INPUT-STREAM (\, INPUT-STREAM))
                         (OUTPUT-STREAM (\, OUTPUT-STREAM))))))

(DEFUN MAKE-ECHO-STREAM (INPUT-STREAM OUTPUT-STREAM) 
          
          (* * "A CommonLisp function for splicing together two streams.  See CLtL p.  329")
 (OPENSTREAM (QUOTE {ECHO-STREAM-DEVICE})
        (QUOTE BOTH)
        NIL NIL (BQUOTE ((INPUT-STREAM (\, INPUT-STREAM))
                         (OUTPUT-STREAM (\, OUTPUT-STREAM))))))

(DEFUN MAKE-STRING-INPUT-STREAM (STRING &OPTIONAL (START 0 STARTP)
                                       (END NIL ENDP)) 
          
          (* * "A CommonLisp function for producing a stream from a string.  See CLtL p.  330")
 (OPENSTRINGSTREAM (if (OR STARTP ENDP)
                       then (SUBSEQ STRING START (if ENDP
                                                     then END
                                                   else (CL:LENGTH STRING)))
                     else STRING)
        (QUOTE INPUT)))

(DEFUN %%MAKE-INITIAL-STRING-STREAM-CONTENTS NIL (MAKE-ARRAY 128 :ELEMENT-TYPE (QUOTE STRING-CHAR)
                                                        :ADJUSTABLE T :FILL-POINTER 0))

(DECLARE: DOCOPY 
(DEFMACRO WITH-OPEN-STREAM ((VAR STREAM)
                            &BODY
                            (BODY DECLS)) (LET ((ABORTP (GENSYM)))
                                               (BQUOTE (LET (((\, VAR)
                                                              (\, STREAM))
                                                             ((\, ABORTP)
                                                              T))
                                                            (\,@ DECLS)
                                                            (UNWIND-PROTECT
                                                             (MULTIPLE-VALUE-PROG1
                                                              (PROGN (\,@ BODY))
                                                              (SETQ (\, ABORTP)
                                                               NIL))
                                                             (CLOSE (\, VAR)
                                                                    :ABORT
                                                                    (\, ABORTP)))))))

(DEFMACRO WITH-INPUT-FROM-STRING ((VAR STRING &KEY (INDEX NIL INDEXP)
                                       (START 0 STARTP)
                                       (END NIL ENDP))
                                  &BODY
                                  (BODY DECLS))
   (BQUOTE (LET (((\, VAR)
                  (MAKE-STRING-INPUT-STREAM (\, STRING)
                         (\,@ (if STARTP
                                  then (if ENDP
                                           then (LIST START END)
                                         else (LIST START))
                                else (if ENDP
                                         then (LIST NIL END)))))))
                (\,@ DECLS)
                (UNWIND-PROTECT (PROG1 (PROGN (\,@ BODY))
                                       (\,@ (if INDEXP
                                                then (BQUOTE ((SETF (\, INDEX)
                                                                    (+ (\, START)
                                                                       (GETFILEPTR (\, VAR))))))
                                              else NIL)))
                       (CLOSE (\, VAR))))))

(DEFMACRO WITH-OUTPUT-TO-STRING ((VAR &OPTIONAL (STRING NIL STRINGP))
                                 &BODY
                                 (FORMS DECLS))
   (if STRINGP
       then (BQUOTE (LET (((\, VAR)
                           (MAKE-FILL-POINTER-OUTPUT-STREAM (\, STRING))))
                         (\,@ DECLS)
                         (UNWIND-PROTECT (PROGN (\,@ FORMS))
                                (CLOSE (\, VAR)))))
     else (BQUOTE (LET (((\, VAR)
                         (MAKE-STRING-OUTPUT-STREAM)))
                       (\,@ DECLS)
                       (UNWIND-PROTECT (PROGN (\,@ FORMS)
                                              (GET-OUTPUT-STREAM-STRING (\, VAR)))
                              (CLOSE (\, VAR)))))))

(DEFMACRO WITH-OPEN-FILE ((VAR &REST OPEN-ARGS)
                          &BODY
                          (FORMS DECLS)) 
          
          (* * "Bindspec is of the form (Stream File-Name . Options). The file whose name is File-Name is opened using the Options and bound to the variable Stream. The Forms are executed, and when they terminate, normally or otherwise, the file is closed.")
 (LET ((ABORTP (GENSYM)))
      (BQUOTE (LET (((\, VAR)
                     (OPEN (\,@ OPEN-ARGS)))
                    ((\, ABORTP)
                     T))
                   (\,@ DECLS)
                   (UNWIND-PROTECT (MULTIPLE-VALUE-PROG1 (PROGN (\,@ FORMS))
                                          (SETQ (\, ABORTP)
                                           NIL))
                          (CL:WHEN (\, VAR)
                                 (CLOSE (\, VAR)
                                        :ABORT
                                        (\, ABORTP))))))))

)
(DEFUN MAKE-STRING-OUTPUT-STREAM NIL 
          
          (* * "A function for producing a string stream. See also the function get-output-stream-string.  Also, see CLtL p.  330")

                                     (MAKE-FILL-POINTER-OUTPUT-STREAM))

(DEFUN MAKE-FILL-POINTER-OUTPUT-STREAM (&OPTIONAL (STRING (%%MAKE-INITIAL-STRING-STREAM-CONTENTS)))
   (DECLARE (GLOBALVARS \FILL-POINTER-STREAM-DEVICE))
   (if (NOT (ARRAY-HAS-FILL-POINTER-P STRING))
       then (\ILLEGAL.ARG STRING)
     else (LET ((STREAM (create STREAM
                               DEVICE ← \FILL-POINTER-STREAM-DEVICE
                               F1 ← STRING
                               ACCESS ← (QUOTE OUTPUT))))
               (STREAMPROP STREAM (QUOTE STRING-OUTPUT-STREAM)
                      T)
               (replace (STREAM OUTCHARFN) of STREAM with (if (ADJUSTABLE-ARRAY-P STRING)
                                                              then (FUNCTION 
                                                                  \ADJUSTABLE-STRING-STREAM-OUTCHARFN
                                                                    )
                                                            else (FUNCTION \STRING-STREAM-OUTCHARFN))
                      )
               (replace (STREAM STRMBOUTFN) of STREAM with (FUNCTION \OUTCHAR))
               STREAM)))

(DEFUN GET-OUTPUT-STREAM-STRING (STRING-OUTPUT-STREAM) 
          
          (* * "A CommonLisp function for getting the contents of the buffer created by a call to make-string-output-stream.  See CLtL p.  330")
 (if (NOT (STREAMPROP STRING-OUTPUT-STREAM (QUOTE STRING-OUTPUT-STREAM)))
     then (ERROR "Stream not a string-output-stream" STRING-OUTPUT-STREAM)
   else (PROG1 (fetch (STREAM F1) of STRING-OUTPUT-STREAM)
               (replace (STREAM F1) of STRING-OUTPUT-STREAM with (
                                                                %%MAKE-INITIAL-STRING-STREAM-CONTENTS
                                                                  )))))

(DEFUN \STRING-STREAM-OUTCHARFN (STREAM CHAR) (IF (EQ CHAR (CHARCODE EOL))
                                                  THEN (REPLACE (STREAM CHARPOSITION) OF STREAM
                                                          WITH 0)
                                                ELSE (ADD (FETCH (STREAM CHARPOSITION) OF STREAM)
                                                          1))
                                              (VECTOR-PUSH (CL:CHARACTER CHAR)
                                                     (FETCH (STREAM F1) OF STREAM)))

(DEFUN \ADJUSTABLE-STRING-STREAM-OUTCHARFN (STREAM CHAR) (IF (EQ CHAR (CHARCODE EOL))
                                                             THEN (REPLACE (STREAM CHARPOSITION)
                                                                     OF STREAM WITH 0)
                                                           ELSE (ADD (FETCH (STREAM CHARPOSITION)
                                                                        OF STREAM)
                                                                     1))
                                                         (VECTOR-PUSH-EXTEND (CL:CHARACTER CHAR)
                                                                (FETCH (STREAM F1) OF STREAM)))




(* "helpers")

(DEFUN %%NEW-FILE (FILENAME) (CLOSEF (OPENSTREAM FILENAME (QUOTE OUTPUT)
                                            (QUOTE NEW))))

(DEFUN PREDICT-NAME (PATHNAME) (LET ((PATH (PROBE-FILE PATHNAME)))
                                    (IF PATH
                                        THEN (NAMESTRING PATH))))




(* "methods for the special devices")

(DEFINEQ

(%%BROADCAST-STREAM-DEVICE-BOUT
  [LAMBDA (STREAM BYTE)                                      (* hdj "17-Apr-86 18:08")
          
          (* * The BOUT method for the broadcast-stream device)

    (for S in (fetch F1 of STREAM) do (\BOUT S BYTE))
    BYTE])

(%%BROADCAST-STREAM-DEVICE-CLOSEFILE
  [LAMBDA (STREAM)                                                         (* hdj 
                                                                           "26-Mar-86 16:28")
            
            (* * The CLOSEFILE method for the broadcast-stream device)

    (replace ACCESS of STREAM with NIL)
    (replace F1 of STREAM with NIL)
    STREAM])

(%%BROADCAST-STREAM-DEVICE-FORCEOUTPUT
  [LAMBDA (stream waitForFinish?)                            (* smL "14-Aug-85 15:55")

          (* * The FORCEOUTPUT method for the broadcast-stream device)


    (for s in (fetch F1 of stream) do (FORCEOUTPUT s waitForFinish?])

(%%BROADCAST-STREAM-DEVICE-OPENFILE
  [LAMBDA (NAME ACCESS RECOG PARAMETERS DEVICE)              (* hdj "17-Apr-86 18:07")
          
          (* * The OPENFILE method for the broadcast-stream device)

    (SELECTQ ACCESS
        ((INPUT BOTH APPEND) 
             NIL)
        (create STREAM
               DEVICE ← DEVICE
               F1 ←(CADR (ASSOC (QUOTE STREAMS)
                                PARAMETERS])
)
(DEFINEQ

(%%CONCATENATED-STREAM-DEVICE-BIN
  [LAMBDA (stream)                                           (* smL "14-Aug-85 16:52")

          (* * The BIN method for the concatenated-stream device)


    (while (fetch F1 of stream) do [if (EOFP (CAR (fetch F1 of stream)))
				       then (CLOSEF (pop (fetch F1 of stream)))
				     else (RETURN (\BIN (CAR (fetch F1 of stream]
       finally                                               (* the EOF case)
	       (\EOF.ACTION stream])

(%%CONCATENATED-STREAM-DEVICE-CLOSEFILE
  [LAMBDA (stream)                                           (* smL "14-Aug-85 16:53")

          (* * The CLOSEFILE method for the concatenated-stream device)


    (replace ACCESS of stream with NIL)
    (for s in (fetch F1 of stream) do (CLOSEF s))
    (replace F1 of stream with NIL)
    stream])

(%%CONCATENATED-STREAM-DEVICE-EOFP
  [LAMBDA (stream)                                           (* smL "14-Aug-85 16:53")

          (* * The EOFP method for the concatenated-stream device)


    (while (fetch F1 of stream) do (if (EOFP (CAR (fetch F1 of stream)))
				       then (CLOSEF (pop (fetch F1 of stream)))
				     else (RETURN NIL))
       finally                                               (* the EOF case)
	       (RETURN T])

(%%CONCATENATED-STREAM-DEVICE-OPENFILE
  [LAMBDA (NAME ACCESS RECOG PARAMETERS DEVICE)              (* hdj "21-Apr-86 14:33")
          
          (* * The OPENFILE method for the concatenated-stream device)

    (SELECTQ ACCESS
        ((OUTPUT BOTH APPEND) 
             NIL)
        (create STREAM
               DEVICE ← DEVICE
               F1 ←(CADR (ASSOC (QUOTE STREAMS)
                                PARAMETERS])

(%%CONCATENATED-STREAM-DEVICE-PEEKBIN
  [LAMBDA (stream noErrorFlg?)                               (* smL "14-Aug-85 16:53")

          (* * The PEEKBIN method for the concatenated-stream device)


    (while (fetch F1 of stream) do [if (EOFP (CAR (fetch F1 of stream)))
				       then (CLOSEF (pop (fetch F1 of stream)))
				     else (RETURN (\PEEKBIN (CAR (fetch F1 of stream]
       finally                                               (* the EOF case)
	       (if noErrorFlg?
		   then (RETURN NIL)
		 else (\EOF.ACTION stream])
)
(DEFINEQ

(%%ECHO-STREAM-DEVICE-BIN
  [LAMBDA (STREAM)                                           (* hdj "21-Apr-86 18:33")
          
          (* * The BIN method for the echo-stream device)

    (LET ((BYTE (%%TWO-WAY-STREAM-DEVICE-BIN STREAM)))
         (\BOUT STREAM BYTE)
     BYTE])
)
(DEFINEQ

(%%SYNONYM-STREAM-DEVICE-BIN
  [LAMBDA (STREAM)                                                         (* hdj 
                                                                           "19-Mar-86 17:19")
            
            (* * The BIN method for the synonym-stream device.)

    (\BIN (%%SYNONYM-STREAM-DEVICE-GET-STREAM STREAM])

(%%SYNONYM-STREAM-DEVICE-BOUT
  [LAMBDA (STREAM BYTE)                                                    (* hdj 
                                                                           "19-Mar-86 17:20")
            
            (* * The BOUT method for the synonym-stream device.)

    (\BOUT (%%SYNONYM-STREAM-DEVICE-GET-STREAM STREAM)
           BYTE])

(%%SYNONYM-STREAM-DEVICE-CLOSEFILE
  [LAMBDA (STREAM)                                                         (* hdj 
                                                                           "19-Mar-86 17:14")
            
            (* * the CLOSEFILE method for the synonym-stream device)

    (replace F1 of STREAM with NIL)
    STREAM])

(%%SYNONYM-STREAM-DEVICE-EOFP
  [LAMBDA (STREAM)                                                         (* hdj 
                                                                           "19-Mar-86 17:20")
            
            (* * The EOFP method for the synonym-stream device.)

    (\EOFP (%%SYNONYM-STREAM-DEVICE-GET-STREAM STREAM])

(%%SYNONYM-STREAM-DEVICE-FORCEOUTPUT
  [LAMBDA (STREAM WAITFORFINISH)                                           (* hdj 
                                                                           "19-Mar-86 17:09")
            
            (* * The FORCEOUTPUT method for the synonym-stream device.)

    (FORCEOUTPUT (%%SYNONYM-STREAM-DEVICE-GET-STREAM STREAM)
           WAITFORFINISH])

(%%SYNONYM-STREAM-DEVICE-GETFILEINFO
  [LAMBDA (STREAM ATTRIBUTE DEVICE)                                        (* hdj 
                                                                           "19-Mar-86 17:10")
            
            (* * The GETFILEINFO method for the synonym-stream device.)

    (GETFILEINFO (%%SYNONYM-STREAM-DEVICE-GET-STREAM STREAM)
           ATTRIBUTE])

(%%SYNONYM-STREAM-DEVICE-OPENFILE
  [LAMBDA (NAME ACCESS RECOG PARAMETERS DEVICE)                            (* hdj 
                                                                           "19-Mar-86 17:14")
            
            (* * the OPENFILE method for the synonym-stream device)

    (create STREAM
           DEVICE ← DEVICE
           F1 ←(CADR (ASSOC (QUOTE SYMBOL)
                            PARAMETERS])

(%%SYNONYM-STREAM-DEVICE-PEEKBIN
  [LAMBDA (STREAM NOERRORFLG?)                                             (* hdj 
                                                                           "19-Mar-86 17:12")
            
            (* * The PEEKBIN method for the synonym-stream device)

    (\PEEKBIN (%%SYNONYM-STREAM-DEVICE-GET-STREAM STREAM)
           NOERRORFLG?])

(%%SYNONYM-STREAM-DEVICE-READP
  (LAMBDA (STREAM FLG)
    (READP (%%SYNONYM-STREAM-DEVICE-GET-STREAM STREAM)
           FLG)))

(%%SYNONYM-STREAM-DEVICE-BACKFILEPTR
  (LAMBDA (STREAM)                                           (* hdj "26-Aug-86 17:35")
    (\BACKFILEPTR (%%SYNONYM-STREAM-DEVICE-GET-STREAM STREAM))))

(%%SYNONYM-STREAM-DEVICE-SETFILEINFO
  [LAMBDA (STREAM ATTRIBUTE VALUE DEVICE)                                  (* hdj 
                                                                           "19-Mar-86 17:17")
            
            (* * The SETFILEINFO method for the synonym-stream device.)

    (SETFILEINFO (%%SYNONYM-STREAM-DEVICE-GET-STREAM STREAM)
           ATTRIBUTE VALUE])
)
(DEFINEQ

(%%TWO-WAY-STREAM-DEVICE-BIN
  [LAMBDA (stream)                                           (* smL "14-Aug-85 16:44")

          (* * The BIN method for the two-way-stream device)


    (\BIN (fetch F1 of stream])

(%%TWO-WAY-STREAM-DEVICE-BOUT
  [LAMBDA (stream byte)                                      (* smL "14-Aug-85 16:45")

          (* * The BOUT method for the two-way-stream device)


    (\BOUT (fetch F2 of stream)
	   byte])

(%%TWO-WAY-STREAM-DEVICE-CLOSEFILE
  [LAMBDA (stream)                                           (* smL "14-Aug-85 17:02")

          (* * The CLOSEFILE method for the two-way-stream device)


    (replace ACCESS of stream with NIL)
    (CLOSEF? (fetch F1 of stream))
    (replace F1 of stream with NIL)
    (CLOSEF? (fetch F2 of stream))
    (replace F2 of stream with NIL)
    stream])

(%%TWO-WAY-STREAM-DEVICE-EOFP
  [LAMBDA (stream)                                           (* smL "14-Aug-85 16:47")

          (* * The EOFP method for the two-way-stream device)


    (\EOFP (fetch F1 of stream])

(%%TWO-WAY-STREAM-DEVICE-BACKFILEPTR
  (LAMBDA (STREAM)                                           (* hdj "15-Sep-86 15:02")
    (\BACKFILEPTR (fetch (STREAM F1) of STREAM))))

(%%TWO-WAY-STREAM-DEVICE-FORCEOUTPUT
  [LAMBDA (stream waitForFinish?)                            (* smL "14-Aug-85 16:49")

          (* * the FORCEOUTPUT method for the two-way-stream device)


    (FORCEOUTPUT (fetch F2 of stream)
		 waitForFinish?])

(%%TWO-WAY-STREAM-DEVICE-OPENFILE
  [LAMBDA (NAME ACCESS RECOG PARAMETERS DEVICE)              (* hdj "21-Apr-86 18:17")
          
          (* * The OPENFILE method for the two-way-stream device)

    (SELECTQ ACCESS
        ((INPUT OUTPUT APPEND) 
             NIL)
        (create STREAM
               DEVICE ← DEVICE
               F1 ←(CADR (ASSOC (QUOTE INPUT-STREAM)
                                PARAMETERS))
               F2 ←(CADR (ASSOC (QUOTE OUTPUT-STREAM)
                                PARAMETERS])

(%%TWO-WAY-STREAM-DEVICE-PEEKBIN
  [LAMBDA (stream noErrorFlg?)                               (* smL "14-Aug-85 16:46")

          (* * The PEEKBIN method for the two-way-stream device)


    (\PEEKBIN (fetch F1 of stream)
	      noErrorFlg?])
)
(DEFUN %%FILL-POINTER-STREAM-DEVICE-CLOSEFILE (STREAM) 
          
          (* * "the CLOSEFILE method for the fill-pointer-string-stream device")
 (replace F1 of STREAM with NIL)
 STREAM)

(DEFUN %%FILL-POINTER-STREAM-DEVICE-GETFILEPTR (STREAM) (CL:LENGTH (fetch (STREAM F1) of STREAM)))




(* "helper stuff")

(DEFINEQ

(%%SYNONYM-STREAM-DEVICE-GET-STREAM
  [LAMBDA (stream)                                                         (* hdj 
                                                                           "19-Mar-86 14:59")
            
            (* * given a synonym-stream, find out what it is currently tracking)
            
            (* * this should be a macro)

    (SYMBOL-VALUE (fetch (STREAM F1) of stream])
)



(* "package initialization")

(DEFVAR *TRACE-OUTPUT* )

(DEFVAR *DEBUG-IO* )

(DEFVAR *QUERY-IO* )

(DEFVAR *TERMINAL-IO* )

(DEFVAR *ERROR-OUTPUT* )

(DEFVAR *STANDARD-OUTPUT* )

(DEFVAR *STANDARD-INPUT* )

(DEFUN %%INITIALIZE-SYNONYM-IMAGEOPS NIL (SETQ \SYNONYM-STREAM-IMAGEOPS
                                          (create IMAGEOPS
                                                 IMAGETYPE ← (QUOTE SYNONYM)
                                                 IMCLOSEFN ← (FUNCTION (LAMBDA (STREAM)
                                                                         (LET ((SYN-STREAM
                                                                                (
                                                                   %%SYNONYM-STREAM-DEVICE-GET-STREAM
                                                                                 STREAM)))
                                                                              (IMAGEOP (QUOTE 
                                                                                            IMCLOSEFN
                                                                                              )
                                                                                     SYN-STREAM 
                                                                                     SYN-STREAM))))
                                                 IMXPOSITION ← (FUNCTION (LAMBDA (STREAM XPOSITION)
                                                                           (LET ((SYN-STREAM
                                                                                  (
                                                                   %%SYNONYM-STREAM-DEVICE-GET-STREAM
                                                                                   STREAM)))
                                                                                (IMAGEOP (QUOTE
                                                                                          IMXPOSITION
                                                                                          )
                                                                                       SYN-STREAM 
                                                                                       SYN-STREAM 
                                                                                       XPOSITION))))
                                                 IMYPOSITION ← (FUNCTION (LAMBDA (STREAM YPOSITION)
                                                                           (LET ((SYN-STREAM
                                                                                  (
                                                                   %%SYNONYM-STREAM-DEVICE-GET-STREAM
                                                                                   STREAM)))
                                                                                (IMAGEOP (QUOTE
                                                                                          IMYPOSITION
                                                                                          )
                                                                                       SYN-STREAM 
                                                                                       SYN-STREAM 
                                                                                       YPOSITION))))
                                                 IMFONT ← (FUNCTION (LAMBDA (STREAM FONT)
                                                                      (LET ((SYN-STREAM (
                                                                   %%SYNONYM-STREAM-DEVICE-GET-STREAM
                                                                                         STREAM)))
                                                                           (IMAGEOP (QUOTE IMFONT)
                                                                                  SYN-STREAM 
                                                                                  SYN-STREAM FONT))))
                                                 IMLEFTMARGIN ← (FUNCTION (LAMBDA (STREAM XPOSITION)
                                                                            (LET
                                                                             ((SYN-STREAM
                                                                               (
                                                                   %%SYNONYM-STREAM-DEVICE-GET-STREAM
                                                                                STREAM)))
                                                                             (IMAGEOP (QUOTE 
                                                                                         IMLEFTMARGIN
                                                                                             )
                                                                                    SYN-STREAM 
                                                                                    SYN-STREAM 
                                                                                    XPOSITION))))
                                                 IMRIGHTMARGIN ← (FUNCTION (LAMBDA (STREAM YPOSITION)
                                                                             (LET
                                                                              ((SYN-STREAM
                                                                                (
                                                                   %%SYNONYM-STREAM-DEVICE-GET-STREAM
                                                                                 STREAM)))
                                                                              (IMAGEOP (QUOTE 
                                                                                        IMRIGHTMARGIN
                                                                                              )
                                                                                     SYN-STREAM 
                                                                                     SYN-STREAM 
                                                                                     YPOSITION))))
                                                 IMLINEFEED ← (FUNCTION (LAMBDA (STREAM DELTAY)
                                                                          (LET ((SYN-STREAM
                                                                                 (
                                                                   %%SYNONYM-STREAM-DEVICE-GET-STREAM
                                                                                  STREAM)))
                                                                               (IMAGEOP (QUOTE 
                                                                                           IMLINEFEED
                                                                                               )
                                                                                      SYN-STREAM 
                                                                                      SYN-STREAM 
                                                                                      DELTAY))))
                                                 IMDRAWLINE ←
                                                 (FUNCTION (LAMBDA (STREAM X1 Y1 X2 Y2 WIDTH 
                                                                          OPERATION COLOR DASHING)
                                                             (LET ((SYN-STREAM (
                                                                   %%SYNONYM-STREAM-DEVICE-GET-STREAM
                                                                                STREAM)))
                                                                  (IMAGEOP (QUOTE IMDRAWLINE)
                                                                         SYN-STREAM SYN-STREAM X1 Y1 
                                                                         X2 Y2 WIDTH OPERATION COLOR 
                                                                         DASHING))))
                                                 IMDRAWCURVE ←
                                                 (FUNCTION (LAMBDA (STREAM KNOTS CLOSED BRUSH DASHING
                                                                          )
                                                             (LET ((SYN-STREAM (
                                                                   %%SYNONYM-STREAM-DEVICE-GET-STREAM
                                                                                STREAM)))
                                                                  (IMAGEOP (QUOTE IMDRAWCURVE)
                                                                         SYN-STREAM SYN-STREAM KNOTS 
                                                                         CLOSED BRUSH DASHING))))
                                                 IMDRAWCIRCLE ←
                                                 (FUNCTION (LAMBDA (STREAM CENTERX CENTRY RADIUS 
                                                                          BRUSH DASHING)
                                                             (LET ((SYN-STREAM (
                                                                   %%SYNONYM-STREAM-DEVICE-GET-STREAM
                                                                                STREAM)))
                                                                  (IMAGEOP (QUOTE IMDRAWCIRCLE)
                                                                         SYN-STREAM SYN-STREAM 
                                                                         CENTERX CENTRY RADIUS BRUSH 
                                                                         DASHING))))
                                                 IMDRAWELLIPSE ←
                                                 (FUNCTION (LAMBDA (STREAM CENTERX CENTERY 
                                                                          SEMIMINORRADIUS 
                                                                          SEMIMAJORRADIUS ORIENTATION 
                                                                          BRUSH DASHING)
                                                             (LET ((SYN-STREAM (
                                                                   %%SYNONYM-STREAM-DEVICE-GET-STREAM
                                                                                STREAM)))
                                                                  (IMAGEOP (QUOTE IMDRAWELLIPSE)
                                                                         SYN-STREAM SYN-STREAM 
                                                                         CENTERX CENTERY 
                                                                         SEMIMINORRADIUS 
                                                                         SEMIMAJORRADIUS ORIENTATION 
                                                                         BRUSH DASHING))))
                                                 IMFILLCIRCLE ←
                                                 (FUNCTION (LAMBDA (STREAM CENTERX CENTERY RADIUS 
                                                                          TEXTURE)
                                                             (LET ((SYN-STREAM (
                                                                   %%SYNONYM-STREAM-DEVICE-GET-STREAM
                                                                                STREAM)))
                                                                  (IMAGEOP (QUOTE IMFILLCIRCLE)
                                                                         SYN-STREAM SYN-STREAM 
                                                                         CENTERX CENTERY RADIUS 
                                                                         TEXTURE))))
                                                 IMBLTSHADE ←
                                                 (FUNCTION (LAMBDA (TEXTURE STREAM DESTINATIONLEFT 
                                                                          DESTINATIONBOTTOM WIDTH 
                                                                          HEIGHT OPERATION 
                                                                          CLIPPINGREGION)
                                                             (LET ((SYN-STREAM (
                                                                   %%SYNONYM-STREAM-DEVICE-GET-STREAM
                                                                                STREAM)))
                                                                  (IMAGEOP (QUOTE IMBLTSHADE)
                                                                         SYN-STREAM TEXTURE 
                                                                         SYN-STREAM DESTINATIONLEFT 
                                                                         DESTINATIONBOTTOM WIDTH 
                                                                         HEIGHT OPERATION 
                                                                         CLIPPINGREGION))))
                                                 IMBITBLT ←
                                                 (FUNCTION (LAMBDA (SOURCEBM SOURCELEFT SOURCEBOTTOM 
                                                                          STREAM DESTINATIONLEFT 
                                                                          DESTINATIONBOTTOM WIDTH 
                                                                          HEIGHT SOURCETYPE OPERATION 
                                                                          TEXTURE CLIPPINGREGION 
                                                                          CLIPPEDSOURCELEFT 
                                                                          CLIPPEDSOURCEBOTTOM)
                                                             (LET ((SYN-STREAM (
                                                                   %%SYNONYM-STREAM-DEVICE-GET-STREAM
                                                                                STREAM)))
                                                                  (IMAGEOP (QUOTE IMBITBLT)
                                                                         SYN-STREAM SOURCEBM 
                                                                         SOURCELEFT SOURCEBOTTOM 
                                                                         STREAM DESTINATIONLEFT 
                                                                         DESTINATIONBOTTOM WIDTH 
                                                                         HEIGHT SOURCETYPE OPERATION 
                                                                         TEXTURE CLIPPINGREGION 
                                                                         CLIPPEDSOURCELEFT 
                                                                         CLIPPEDSOURCEBOTTOM))))
                                                 IMNEWPAGE ← (FUNCTION (LAMBDA (STREAM)
                                                                         (LET ((SYN-STREAM
                                                                                (
                                                                   %%SYNONYM-STREAM-DEVICE-GET-STREAM
                                                                                 STREAM)))
                                                                              (IMAGEOP (QUOTE 
                                                                                            IMNEWPAGE
                                                                                              )
                                                                                     SYN-STREAM))))
                                                 IMMOVETO ← (FUNCTION (LAMBDA (STREAM X Y)
                                                                        (LET ((SYN-STREAM
                                                                               (
                                                                   %%SYNONYM-STREAM-DEVICE-GET-STREAM
                                                                                STREAM)))
                                                                             (IMAGEOP (QUOTE IMMOVETO
                                                                                             )
                                                                                    SYN-STREAM 
                                                                                    SYN-STREAM X Y)))
                                                             )
                                                 IMSCALE ← (FUNCTION (LAMBDA (STREAM SCALE)
                                                                       (LET ((SYN-STREAM (
                                                                   %%SYNONYM-STREAM-DEVICE-GET-STREAM
                                                                                          STREAM)))
                                                                            (IMAGEOP (QUOTE IMSCALE)
                                                                                   SYN-STREAM 
                                                                                   SYN-STREAM SCALE))
                                                                       ))
                                                 IMTERPRI ← (FUNCTION (LAMBDA (STREAM)
                                                                        (LET ((SYN-STREAM
                                                                               (
                                                                   %%SYNONYM-STREAM-DEVICE-GET-STREAM
                                                                                STREAM)))
                                                                             (IMAGEOP (QUOTE IMTERPRI
                                                                                             )
                                                                                    SYN-STREAM 
                                                                                    SYN-STREAM))))
                                                 IMTOPMARGIN ← (FUNCTION (LAMBDA (STREAM YPOSITION)
                                                                           (LET ((SYN-STREAM
                                                                                  (
                                                                   %%SYNONYM-STREAM-DEVICE-GET-STREAM
                                                                                   STREAM)))
                                                                                (IMAGEOP (QUOTE
                                                                                          IMTOPMARGIN
                                                                                          )
                                                                                       SYN-STREAM 
                                                                                       SYN-STREAM 
                                                                                       YPOSITION))))
                                                 IMBOTTOMMARGIN ← (FUNCTION (LAMBDA (STREAM YPOSITION
                                                                                           )
                                                                              (LET
                                                                               ((SYN-STREAM
                                                                                 (
                                                                   %%SYNONYM-STREAM-DEVICE-GET-STREAM
                                                                                  STREAM)))
                                                                               (IMAGEOP (QUOTE 
                                                                                       IMBOTTOMMARGIN
                                                                                               )
                                                                                      SYN-STREAM 
                                                                                      SYN-STREAM 
                                                                                      YPOSITION))))
                                                 IMSPACEFACTOR ← (FUNCTION (LAMBDA (STREAM FACTOR)
                                                                             (LET
                                                                              ((SYN-STREAM
                                                                                (
                                                                   %%SYNONYM-STREAM-DEVICE-GET-STREAM
                                                                                 STREAM)))
                                                                              (IMAGEOP (QUOTE 
                                                                                        IMSPACEFACTOR
                                                                                              )
                                                                                     SYN-STREAM 
                                                                                     SYN-STREAM 
                                                                                     FACTOR))))
                                                 IMFONTCREATE ← (QUOTE SYNONYM)
                                                 IMOPERATION ← (FUNCTION (LAMBDA (STREAM OPERATION)
                                                                           (LET ((SYN-STREAM
                                                                                  (
                                                                   %%SYNONYM-STREAM-DEVICE-GET-STREAM
                                                                                   STREAM)))
                                                                                (IMAGEOP (QUOTE
                                                                                          IMOPERATION
                                                                                          )
                                                                                       SYN-STREAM 
                                                                                       SYN-STREAM 
                                                                                       OPERATION))))
                                                 IMCOLOR ← (FUNCTION (LAMBDA (STREAM COLOR)
                                                                       (LET ((SYN-STREAM (
                                                                   %%SYNONYM-STREAM-DEVICE-GET-STREAM
                                                                                          STREAM)))
                                                                            (IMAGEOP (QUOTE IMCOLOR)
                                                                                   SYN-STREAM 
                                                                                   SYN-STREAM COLOR))
                                                                       ))
                                                 IMSTRINGWIDTH ←
                                                 (FUNCTION (LAMBDA (STREAM STRING RDTBL)
                                                             (LET ((SYN-STREAM (
                                                                   %%SYNONYM-STREAM-DEVICE-GET-STREAM
                                                                                STREAM)))
                                                                  (IMAGEOP (QUOTE IMSTRINGWIDTH)
                                                                         SYN-STREAM SYN-STREAM STRING 
                                                                         RDTBL))))
                                                 IMCHARWIDTH ← (FUNCTION (LAMBDA (STREAM CHARCODE)
                                                                           (LET ((SYN-STREAM
                                                                                  (
                                                                   %%SYNONYM-STREAM-DEVICE-GET-STREAM
                                                                                   STREAM)))
                                                                                (IMAGEOP (QUOTE
                                                                                          IMCHARWIDTH
                                                                                          )
                                                                                       SYN-STREAM 
                                                                                       SYN-STREAM 
                                                                                       CHARCODE))))
                                                 IMCHARWIDTHY ←
                                                 (FUNCTION (LAMBDA (STREAM A B CHARCODE)
                                                             (LET ((SYN-STREAM (
                                                                   %%SYNONYM-STREAM-DEVICE-GET-STREAM
                                                                                STREAM)))
                                                                  (IMAGEOP (QUOTE IMCHARWIDTHY)
                                                                         SYN-STREAM SYN-STREAM A B 
                                                                         CHARCODE))))
                                                 IMBACKCOLOR ← (FUNCTION (LAMBDA (STREAM COLOR)
                                                                           (LET ((SYN-STREAM
                                                                                  (
                                                                   %%SYNONYM-STREAM-DEVICE-GET-STREAM
                                                                                   STREAM)))
                                                                                (IMAGEOP (QUOTE
                                                                                          IMBACKCOLOR
                                                                                          )
                                                                                       SYN-STREAM 
                                                                                       SYN-STREAM 
                                                                                       COLOR))))
                                                 IMBITMAPSIZE ← (FUNCTION (LAMBDA (STREAM BITMAP 
                                                                                         DIMENSION)
                                                                            (LET
                                                                             ((SYN-STREAM
                                                                               (
                                                                   %%SYNONYM-STREAM-DEVICE-GET-STREAM
                                                                                STREAM)))
                                                                             (IMAGEOP (QUOTE 
                                                                                         IMBITMAPSIZE
                                                                                             )
                                                                                    SYN-STREAM 
                                                                                    SYN-STREAM BITMAP 
                                                                                    DIMENSION))))
                                                 IMCLIPPINGREGION ← (FUNCTION (LAMBDA (STREAM REGION)
                                                                                (LET
                                                                                 ((SYN-STREAM
                                                                                   (
                                                                   %%SYNONYM-STREAM-DEVICE-GET-STREAM
                                                                                    STREAM)))
                                                                                 (IMAGEOP
                                                                                  (QUOTE 
                                                                                     IMCLIPPINGREGION
                                                                                         )
                                                                                  SYN-STREAM 
                                                                                  SYN-STREAM REGION))
                                                                                ))
                                                 IMRESET ← (FUNCTION (LAMBDA (STREAM)
                                                                       (LET ((SYN-STREAM (
                                                                   %%SYNONYM-STREAM-DEVICE-GET-STREAM
                                                                                          STREAM)))
                                                                            (IMAGEOP (QUOTE IMRESET)
                                                                                   SYN-STREAM 
                                                                                   SYN-STREAM))))
                                                 IMDRAWPOLYGON ←
                                                 (FUNCTION (LAMBDA (STREAM POINTS CLOSED BRUSH 
                                                                          DASHING)
                                                             (LET ((SYN-STREAM (
                                                                   %%SYNONYM-STREAM-DEVICE-GET-STREAM
                                                                                STREAM)))
                                                                  (IMAGEOP (QUOTE IMDRAWPOLYGON)
                                                                         SYN-STREAM SYN-STREAM POINTS 
                                                                         CLOSED BRUSH DASHING))))
                                                 IMFILLPOLYGON ←
                                                 (FUNCTION (LAMBDA (STREAM POINTS TEXTURE OPERATION 
                                                                          WINDINGNUMBER)
                                                             (LET ((SYN-STREAM (
                                                                   %%SYNONYM-STREAM-DEVICE-GET-STREAM
                                                                                STREAM)))
                                                                  (IMAGEOP (QUOTE IMFILLPOLYGON)
                                                                         SYN-STREAM SYN-STREAM POINTS 
                                                                         TEXTURE OPERATION 
                                                                         WINDINGNUMBER))))
                                                 IMSCALEDBITBLT ←
                                                 (FUNCTION (LAMBDA (STREAM SOURCE SOURCELEFT 
                                                                          SOURCEBOTTOM DESTINATION 
                                                                          DESTINATIONLEFT 
                                                                          DESTINATIONBOTTOM WIDTH 
                                                                          HEIGHT SOURCETYPE OPERATION 
                                                                          TEXTURE CLIPPINGREGION 
                                                                          CLIPPPEDSOURCELEFT 
                                                                          CLIPPEDSOURCEBOTTOM SCALE)
                                                             (LET ((SYN-STREAM (
                                                                   %%SYNONYM-STREAM-DEVICE-GET-STREAM
                                                                                STREAM)))
                                                                  (IMAGEOP (QUOTE IMSCALEDBITBLT)
                                                                         STREAM SYN-STREAM SOURCE 
                                                                         SOURCELEFT SOURCEBOTTOM 
                                                                         DESTINATION DESTINATIONLEFT 
                                                                         DESTINATIONBOTTOM WIDTH 
                                                                         HEIGHT SOURCETYPE OPERATION 
                                                                         TEXTURE CLIPPINGREGION 
                                                                         CLIPPPEDSOURCELEFT 
                                                                         CLIPPEDSOURCEBOTTOM SCALE)))
                                                  )
                                                 IMWRITEPIXEL ←
                                                 (FUNCTION (LAMBDA (STREAM STREAM X Y VALUE)
                                                             (LET ((SYN-STREAM (
                                                                   %%SYNONYM-STREAM-DEVICE-GET-STREAM
                                                                                STREAM)))
                                                                  (IMAGEOP (QUOTE IMWRITEPIXEL)
                                                                         SYN-STREAM SYN-STREAM X Y 
                                                                         VALUE))))
                                                 IMCHARSET ← (FUNCTION (LAMBDA (STREAM CHARSET)
                                                                         (LET ((SYN-STREAM
                                                                                (
                                                                   %%SYNONYM-STREAM-DEVICE-GET-STREAM
                                                                                 STREAM))))
                                                                         (IMAGEOP (QUOTE IMCHARSET)
                                                                                SYN-STREAM SYN-STREAM 
                                                                                CHARSET)))
                                                 IMROTATE ← (FUNCTION (LAMBDA (STREAM ROTATION)
                                                                        (LET ((SYN-STREAM
                                                                               (
                                                                   %%SYNONYM-STREAM-DEVICE-GET-STREAM
                                                                                STREAM)))
                                                                             (IMAGEOP (QUOTE IMROTATE
                                                                                             )
                                                                                    SYN-STREAM 
                                                                                    SYN-STREAM 
                                                                                    ROTATION))))
                                                 IMDRAWARC ←
                                                 (FUNCTION (LAMBDA (STREAM CENTERX CENTERY RADIUS 
                                                                          STARTANGLE DEGREES BRUSH 
                                                                          DASHING)
                                                             (LET ((SYN-STREAM (
                                                                   %%SYNONYM-STREAM-DEVICE-GET-STREAM
                                                                                STREAM)))
                                                                  (IMAGEOP (QUOTE IMDRAWARC)
                                                                         SYN-STREAM SYN-STREAM 
                                                                         CENTERX CENTERY RADIUS 
                                                                         STARTANGLE DEGREES BRUSH 
                                                                         DASHING))))
                                                 IMTRANSLATE ← (FUNCTION (LAMBDA (STREAM TX TY)
                                                                           (LET ((SYN-STREAM
                                                                                  (
                                                                   %%SYNONYM-STREAM-DEVICE-GET-STREAM
                                                                                   STREAM)))
                                                                                (IMAGEOP (QUOTE
                                                                                          IMTRANSLATE
                                                                                          )
                                                                                       SYN-STREAM 
                                                                                       SYN-STREAM TX 
                                                                                       TY))))
                                                 IMSCALE2 ← (FUNCTION (LAMBDA (STREAM SX SY)
                                                                        (LET ((SYN-STREAM
                                                                               (
                                                                   %%SYNONYM-STREAM-DEVICE-GET-STREAM
                                                                                STREAM)))
                                                                             (IMAGEOP (QUOTE IMSCALE2
                                                                                             )
                                                                                    SYN-STREAM 
                                                                                    SYN-STREAM SX SY)
                                                                             )))
                                                 IMPUSHSTATE ← (FUNCTION (LAMBDA (STREAM)
                                                                           (LET ((SYN-STREAM
                                                                                  (
                                                                   %%SYNONYM-STREAM-DEVICE-GET-STREAM
                                                                                   STREAM))))
                                                                           (IMAGEOP (QUOTE 
                                                                                          IMPUSHSTATE
                                                                                           )
                                                                                  SYN-STREAM 
                                                                                  SYN-STREAM)))
                                                 IMPOPSTATE ← (FUNCTION (LAMBDA (STREAM)
                                                                          (LET ((SYN-STREAM
                                                                                 (
                                                                   %%SYNONYM-STREAM-DEVICE-GET-STREAM
                                                                                  STREAM)))
                                                                               (IMAGEOP (QUOTE 
                                                                                           IMPOPSTATE
                                                                                               )
                                                                                      SYN-STREAM 
                                                                                      SYN-STREAM))))
                                                 IMDEFAULTSTATE ← (FUNCTION (LAMBDA (STREAM)
                                                                              (LET
                                                                               ((SYN-STREAM
                                                                                 (
                                                                   %%SYNONYM-STREAM-DEVICE-GET-STREAM
                                                                                  STREAM)))
                                                                               (IMAGEOP (QUOTE 
                                                                                       IMDEFAULTSTATE
                                                                                               )
                                                                                      SYN-STREAM 
                                                                                      SYN-STREAM)))))
                                          ))

(DEFUN %%INITIALIZE-STANDARD-STREAMS NIL                     (*)
                                         (SETQ *QUERY-IO* (MAKE-TWO-WAY-STREAM (MAKE-SYNONYM-STREAM
                                                                                (QUOTE \LINEBUF.OFD))
                                                                 (MAKE-SYNONYM-STREAM (QUOTE 
                                                                                            \TERM.OFD
                                                                                             ))))
                                         (SETQ *DEBUG-IO* *QUERY-IO*)
                                         (SETQ *TERMINAL-IO* *QUERY-IO*)
                                         (SETQ *ERROR-OUTPUT* (MAKE-SYNONYM-STREAM (QUOTE \TERM.OFD))
                                          )
                                         (SETQ *STANDARD-OUTPUT* (MAKE-SYNONYM-STREAM (QUOTE 
                                                                                         \PRIMOUT.OFD
                                                                                             )))
                                         (SETQ *STANDARD-INPUT* (MAKE-SYNONYM-STREAM (QUOTE 
                                                                                          \PRIMIN.OFD
                                                                                            )))
                                         (SETQ *TRACE-OUTPUT* (MAKE-SYNONYM-STREAM (QUOTE \TERM.OFD))
                                          ))

(DEFINEQ

(%%INITIALIZE-CLSTREAM-TYPES
  (LAMBDA NIL                                                (* hdj "15-Sep-86 15:11")
          
          (* * "Initialize the CLSTREAMS package.  This sets up some file devices for the functions make-two-way-stream-device, etc.  See CLtL chapter 21")

    (DECLARE (GLOBALVARS \FILL-POINTER-STREAM-DEVICE))
    (\DEFINEDEVICE (QUOTE BROADCAST-STREAM-DEVICE)
           (create FDEV
                  DEVICENAME ← (QUOTE BROADCAST-STREAM-DEVICE)
                  RESETABLE ← NIL
                  RANDOMACCESSP ← NIL
                  NODIRECTORIES ← T
                  BUFFERED ← NIL
                  PAGEMAPPED ← NIL
                  FDBINABLE ← NIL
                  FDBOUTABLE ← NIL
                  FDEXTENDABLE ← NIL
                  DEVICEINFO ← NIL
                  HOSTNAMEP ← (FUNCTION NILL)
                  EVENTFN ← (FUNCTION NILL)
                  DIRECTORYNAMEP ← (FUNCTION NILL)
                  OPENFILE ← (FUNCTION %%BROADCAST-STREAM-DEVICE-OPENFILE)
                  REOPENFILE ← (FUNCTION NILL)
                  CLOSEFILE ← (FUNCTION %%BROADCAST-STREAM-DEVICE-CLOSEFILE)
                  GETFILENAME ← (FUNCTION NILL)
                  DELETEFILE ← (FUNCTION NILL)
                  GENERATEFILES ← (FUNCTION \GENERATENOFILES)
                  RENAMEFILE ← (FUNCTION NILL)
                  BIN ← (FUNCTION NILL)
                  BOUT ← (FUNCTION %%BROADCAST-STREAM-DEVICE-BOUT)
                  PEEKBIN ← (FUNCTION NILL)
                  READP ← (FUNCTION NILL)
                  EOFP ← (FUNCTION TRUE)
                  BLOCKIN ← (FUNCTION \GENERIC.BINS)
                  BLOCKOUT ← (FUNCTION NILL)
                  FORCEOUTPUT ← (FUNCTION %%BROADCAST-STREAM-DEVICE-FORCEOUTPUT)
                  GETFILEINFO ← (FUNCTION NILL)
                  SETFILEINFO ← (FUNCTION NILL)))
    (\DEFINEDEVICE (QUOTE CONCATENATED-STREAM-DEVICE)
           (create FDEV
                  DEVICENAME ← (QUOTE CONCATENATED-STREAM-DEVICE)
                  RESETABLE ← NIL
                  RANDOMACCESSP ← NIL
                  NODIRECTORIES ← T
                  BUFFERED ← NIL
                  PAGEMAPPED ← NIL
                  FDBINABLE ← NIL
                  FDBOUTABLE ← NIL
                  FDEXTENDABLE ← NIL
                  DEVICEINFO ← NIL
                  HOSTNAMEP ← (FUNCTION NILL)
                  EVENTFN ← (FUNCTION NILL)
                  DIRECTORYNAMEP ← (FUNCTION NILL)
                  OPENFILE ← (FUNCTION %%CONCATENATED-STREAM-DEVICE-OPENFILE)
                  REOPENFILE ← (FUNCTION NILL)
                  CLOSEFILE ← (FUNCTION %%CONCATENATED-STREAM-DEVICE-CLOSEFILE)
                  GETFILENAME ← (FUNCTION NILL)
                  DELETEFILE ← (FUNCTION NILL)
                  GENERATEFILES ← (FUNCTION \GENERATENOFILES)
                  RENAMEFILE ← (FUNCTION NILL)
                  BIN ← (FUNCTION %%CONCATENATED-STREAM-DEVICE-BIN)
                  BOUT ← (FUNCTION NILL)
                  PEEKBIN ← (FUNCTION %%CONCATENATED-STREAM-DEVICE-PEEKBIN)
                  READP ← (FUNCTION \GENERIC.READP)
                  EOFP ← (FUNCTION %%CONCATENATED-STREAM-DEVICE-EOFP)
                  BLOCKIN ← (FUNCTION \GENERIC.BINS)
                  BLOCKOUT ← (FUNCTION NILL)
                  FORCEOUTPUT ← (FUNCTION NILL)
                  GETFILEINFO ← (FUNCTION NILL)
                  SETFILEINFO ← (FUNCTION NILL)))
    (\DEFINEDEVICE (QUOTE TWO-WAY-STREAM-DEVICE)
           (create FDEV
                  DEVICENAME ← (QUOTE TWO-WAY-STREAM-DEVICE)
                  RESETABLE ← NIL
                  RANDOMACCESSP ← NIL
                  NODIRECTORIES ← T
                  BUFFERED ← NIL
                  PAGEMAPPED ← NIL
                  FDBINABLE ← NIL
                  FDBOUTABLE ← NIL
                  FDEXTENDABLE ← NIL
                  DEVICEINFO ← NIL
                  HOSTNAMEP ← (FUNCTION NILL)
                  EVENTFN ← (FUNCTION NILL)
                  DIRECTORYNAMEP ← (FUNCTION NILL)
                  OPENFILE ← (FUNCTION %%TWO-WAY-STREAM-DEVICE-OPENFILE)
                  REOPENFILE ← (FUNCTION NILL)
                  CLOSEFILE ← (FUNCTION %%TWO-WAY-STREAM-DEVICE-CLOSEFILE)
                  GETFILENAME ← (FUNCTION NILL)
                  DELETEFILE ← (FUNCTION NILL)
                  GENERATEFILES ← (FUNCTION \GENERATENOFILES)
                  RENAMEFILE ← (FUNCTION NILL)
                  BIN ← (FUNCTION %%TWO-WAY-STREAM-DEVICE-BIN)
                  BOUT ← (FUNCTION %%TWO-WAY-STREAM-DEVICE-BOUT)
                  PEEKBIN ← (FUNCTION %%TWO-WAY-STREAM-DEVICE-PEEKBIN)
                  READP ← (FUNCTION \GENERIC.READP)
                  BACKFILEPTR ← (FUNCTION %%TWO-WAY-STREAM-DEVICE-BACKFILEPTR)
                  EOFP ← (FUNCTION %%TWO-WAY-STREAM-DEVICE-EOFP)
                  BLOCKIN ← (FUNCTION \GENERIC.BINS)
                  BLOCKOUT ← (FUNCTION \GENERIC.BOUTS)
                  FORCEOUTPUT ← (FUNCTION %%TWO-WAY-STREAM-DEVICE-FORCEOUTPUT)
                  GETFILEINFO ← (FUNCTION NILL)
                  SETFILEINFO ← (FUNCTION NILL)))
    (\DEFINEDEVICE (QUOTE ECHO-STREAM-DEVICE)
           (create FDEV using (\GETDEVICEFROMNAME (QUOTE TWO-WAY-STREAM-DEVICE))
                              DEVICENAME ← (QUOTE ECHO-STREAM-DEVICE)
                              BIN ← (FUNCTION %%ECHO-STREAM-DEVICE-BIN)))
    (\DEFINEDEVICE (QUOTE SYNONYM-STREAM-DEVICE)
           (create FDEV
                  DEVICENAME ← (QUOTE SYNONYM-STREAM-DEVICE)
                  RESETABLE ← NIL
                  RANDOMACCESSP ← NIL
                  NODIRECTORIES ← T
                  BUFFERED ← NIL
                  PAGEMAPPED ← NIL
                  FDBINABLE ← NIL
                  FDBOUTABLE ← NIL
                  FDEXTENDABLE ← NIL
                  DEVICEINFO ← NIL
                  HOSTNAMEP ← (FUNCTION NILL)
                  EVENTFN ← (FUNCTION NILL)
                  DIRECTORYNAMEP ← (FUNCTION NILL)
                  OPENFILE ← (FUNCTION %%SYNONYM-STREAM-DEVICE-OPENFILE)
                  REOPENFILE ← (FUNCTION NILL)
                  CLOSEFILE ← (FUNCTION %%SYNONYM-STREAM-DEVICE-CLOSEFILE)
                  GETFILENAME ← (FUNCTION NILL)
                  DELETEFILE ← (FUNCTION NILL)
                  GENERATEFILES ← (FUNCTION \GENERATENOFILES)
                  RENAMEFILE ← (FUNCTION NILL)
                  BIN ← (FUNCTION %%SYNONYM-STREAM-DEVICE-BIN)
                  BOUT ← (FUNCTION %%SYNONYM-STREAM-DEVICE-BOUT)
                  PEEKBIN ← (FUNCTION %%SYNONYM-STREAM-DEVICE-PEEKBIN)
                  READP ← (FUNCTION %%SYNONYM-STREAM-DEVICE-READP)
                  BACKFILEPTR ← (FUNCTION %%SYNONYM-STREAM-DEVICE-BACKFILEPTR)
                  EOFP ← (FUNCTION %%SYNONYM-STREAM-DEVICE-EOFP)
                  BLOCKIN ← (FUNCTION \GENERIC.BINS)
                  BLOCKOUT ← (FUNCTION \GENERIC.BOUTS)
                  FORCEOUTPUT ← (FUNCTION %%SYNONYM-STREAM-DEVICE-FORCEOUTPUT)
                  GETFILEINFO ← (FUNCTION %%SYNONYM-STREAM-DEVICE-GETFILEINFO)
                  SETFILEINFO ← (FUNCTION %%SYNONYM-STREAM-DEVICE-SETFILEINFO)))
    (SETQ \FILL-POINTER-STREAM-DEVICE
     (create FDEV
            DEVICENAME ← (QUOTE FILL-POINTER-STREAM-DEVICE)
            RESETABLE ← NIL
            RANDOMACCESSP ← NIL
            NODIRECTORIES ← T
            BUFFERED ← NIL
            PAGEMAPPED ← NIL
            FDBINABLE ← NIL
            FDBOUTABLE ← NIL
            FDEXTENDABLE ← NIL
            DEVICEINFO ← NIL
            HOSTNAMEP ← (FUNCTION NILL)
            EVENTFN ← (FUNCTION NILL)
            DIRECTORYNAMEP ← (FUNCTION NILL)
            OPENFILE ← (FUNCTION NILL)
            REOPENFILE ← (FUNCTION NILL)
            CLOSEFILE ← (FUNCTION %%FILL-POINTER-STREAM-DEVICE-CLOSEFILE)
            GETFILENAME ← (FUNCTION NILL)
            DELETEFILE ← (FUNCTION NILL)
            GENERATEFILES ← (FUNCTION \GENERATENOFILES)
            RENAMEFILE ← (FUNCTION NILL)
            BIN ← (FUNCTION \ILLEGAL.DEVICEOP)
            BOUT ← (FUNCTION NILL)
            PEEKBIN ← (FUNCTION \ILLEGAL.DEVICEOP)
            READP ← (FUNCTION \ILLEGAL.DEVICEOP)
            EOFP ← (FUNCTION NILL)
            BLOCKIN ← (FUNCTION \ILLEGAL.DEVICEOP)
            BLOCKOUT ← (FUNCTION \GENERIC.BOUTS)
            FORCEOUTPUT ← (FUNCTION NILL)
            GETFILEPTR ← (FUNCTION %%FILL-POINTER-STREAM-DEVICE-GETFILEPTR)
            SETFILEINFO ← (FUNCTION \ILLEGAL.DEVICEOP)))))
)
(DECLARE: DONTEVAL@LOAD DOCOPY 
(%%INITIALIZE-CLSTREAM-TYPES)
(%%INITIALIZE-STANDARD-STREAMS)
(* (%%INITIALIZE-SYNONYM-IMAGEOPS))
)

(PUTPROPS CLSTREAMS FILETYPE COMPILE-FILE)
(DEFSETF FILE-STREAM-POSITION SETFILEPTR)

(PUTPROPS CLSTREAMS COPYRIGHT ("Xerox Corporation" 1985 1986))
(DECLARE: DONTCOPY
  (FILEMAP (NIL (24043 25525 (%%BROADCAST-STREAM-DEVICE-BOUT 24053 . 24348) (
%%BROADCAST-STREAM-DEVICE-CLOSEFILE 24350 . 24777) (%%BROADCAST-STREAM-DEVICE-FORCEOUTPUT 24779 . 
25084) (%%BROADCAST-STREAM-DEVICE-OPENFILE 25086 . 25523)) (25526 28155 (
%%CONCATENATED-STREAM-DEVICE-BIN 25536 . 26116) (%%CONCATENATED-STREAM-DEVICE-CLOSEFILE 26118 . 26518)
 (%%CONCATENATED-STREAM-DEVICE-EOFP 26520 . 27050) (%%CONCATENATED-STREAM-DEVICE-OPENFILE 27052 . 
27496) (%%CONCATENATED-STREAM-DEVICE-PEEKBIN 27498 . 28153)) (28156 28466 (%%ECHO-STREAM-DEVICE-BIN 
28166 . 28464)) (28467 32359 (%%SYNONYM-STREAM-DEVICE-BIN 28477 . 28835) (%%SYNONYM-STREAM-DEVICE-BOUT
 28837 . 29215) (%%SYNONYM-STREAM-DEVICE-CLOSEFILE 29217 . 29588) (%%SYNONYM-STREAM-DEVICE-EOFP 29590
 . 29951) (%%SYNONYM-STREAM-DEVICE-FORCEOUTPUT 29953 . 30360) (%%SYNONYM-STREAM-DEVICE-GETFILEINFO 
30362 . 30765) (%%SYNONYM-STREAM-DEVICE-OPENFILE 30767 . 31209) (%%SYNONYM-STREAM-DEVICE-PEEKBIN 31211
 . 31604) (%%SYNONYM-STREAM-DEVICE-READP 31606 . 31740) (%%SYNONYM-STREAM-DEVICE-BACKFILEPTR 31742 . 
31946) (%%SYNONYM-STREAM-DEVICE-SETFILEINFO 31948 . 32357)) (32360 34838 (%%TWO-WAY-STREAM-DEVICE-BIN 
32370 . 32605) (%%TWO-WAY-STREAM-DEVICE-BOUT 32607 . 32855) (%%TWO-WAY-STREAM-DEVICE-CLOSEFILE 32857
 . 33315) (%%TWO-WAY-STREAM-DEVICE-EOFP 33317 . 33551) (%%TWO-WAY-STREAM-DEVICE-BACKFILEPTR 33553 . 
33747) (%%TWO-WAY-STREAM-DEVICE-FORCEOUTPUT 33749 . 34026) (%%TWO-WAY-STREAM-DEVICE-OPENFILE 34028 . 
34567) (%%TWO-WAY-STREAM-DEVICE-PEEKBIN 34569 . 34836)) (35189 35639 (
%%SYNONYM-STREAM-DEVICE-GET-STREAM 35199 . 35637)) (80292 88782 (%%INITIALIZE-CLSTREAM-TYPES 80302 . 
88780)))))
STOP