Machine-Independent MDL for TOPS-20 and VAX.
[pdp10-muddle.git] / mim / development / mim / vax / mimlib / press.mud
diff --git a/mim/development/mim/vax/mimlib/press.mud b/mim/development/mim/vax/mimlib/press.mud
new file mode 100644 (file)
index 0000000..5fd28ed
--- /dev/null
@@ -0,0 +1,450 @@
+<PACKAGE "PRESS">
+
+<USE-WHEN <COMPILING? "PRESS"> "BACKQUOTE">
+<USE "NEWSTRUC">
+
+<ENTRY PRESS SET-X SET-Y SHOW-CHARACTERS FONT FONT-NUMBER SHOW-RECTANGLE
+       SHOW-OBJECT SET-SPACE-X SET-SPACE-Y RESET-SPACE SPACE ONLY-ON-COPY
+       SHOW-CHARACTER-IMMEDIATE NEW-ENTITY NEW-PAGE MOVETO DRAWTO DRAWCURVE> 
+
+<NEW-CHANNEL-TYPE PRESS                                DEFAULT
+                  OPEN                         PRESS-OPEN
+                  CLOSE                                PRESS-CLOSE
+                  SET-X                                PRESS-SET-X
+                  SET-Y                                PRESS-SET-Y
+                  SHOW-CHARACTERS              PRESS-SHOW-CHARACTERS
+                  SHOW-CHARACTER-IMMEDIATE     PRESS-SHOW-CHARACTER-IMMEDIATE
+                  FONT                         PRESS-FONT
+                  SHOW-RECTANGLE               PRESS-SHOW-RECTANGLE
+                  ;"These operations not implemented by stupid dover."
+                  ;SHOW-OBJECT                 ;PRESS-SHOW-OBJECT
+                  ;SET-SPACE-X                 ;PRESS-SET-SPACE-X
+                  ;SET-SPACE-Y                 ;PRESS-SET-SPACE-Y
+                  ;RESET-SPACE                 ;PRESS-RESET-SPACE
+                  SPACE                                PRESS-SPACE
+                  ONLY-ON-COPY                 PRESS-ONLY-ON-COPY
+                  NEW-ENTITY                   PRESS-NEW-ENTITY
+                  NEW-PAGE                     PRESS-NEW-PAGE>
+
+<NEWSTRUC PRESS-CHAN   VECTOR
+          DISK-CHAN    <CHANNEL 'DISK>
+          FONTS                <VECTOR [16 <OR FALSE VECTOR>]>
+          DATA-START   FIX
+          PAGE-START   FIX
+          COMMANDS     QUEUE
+          ENTITIES     QUEUE
+          PAGES                QUEUE>
+
+<DEFINE PRINT-PRESS-CHAN (PC)
+   #DECL ((PC) PRESS-CHAN)
+   <PRIN1 <DISK-CHAN .PC>>>
+
+<COND (<GASSIGNED? PRINT-PRESS-CHAN>
+       <PRINTTYPE PRESS-CHAN ,PRINT-PRESS-CHAN>)>
+
+<NEWSTRUC QUEUE                VECTOR
+          LIST-Q       LIST
+          LAST-Q       LIST>
+
+<DEFINE NEW-Q () <CHTYPE [() ()] QUEUE>>
+
+<DEFINE ENQ (Q OBJ "AUX" LQ) 
+   #DECL ((Q) QUEUE (LQ) <LIST ANY>)
+   <SET LQ (.OBJ)>
+   <COND (<EMPTY? <LIST-Q .Q>> <LIST-Q .Q .LQ> <LAST-Q .Q .LQ>)
+         (ELSE <PUTREST <LAST-Q .Q> .LQ> <LAST-Q .Q .LQ>)>
+   .Q>
+
+<DEFINE RESET-Q (Q) #DECL ((Q) QUEUE) <LIST-Q .Q ()> <LAST-Q .Q ()> .Q>
+
+<NEWTYPE BYTE FIX>
+<NEWTYPE LONG FIX>
+
+<DEFINE PRESS-OPEN (STYPE OPR NAME) 
+   #DECL ((NAME) STRING)
+   <CHTYPE [<CHANNEL-OPEN DISK .NAME "CREATE" "8BIT">
+            <IVECTOR 16 %<>>
+            0
+            0
+            <NEW-Q>
+            <NEW-Q>
+            <NEW-Q>]
+           PRESS-CHAN>>
+
+<DEFINE PRESS-SET-X (CHAN OPER NUM
+                     "AUX" (CMDS <COMMANDS <CHANNEL-DATA .CHAN>>))
+   #DECL ((CHAN) <CHANNEL 'PRESS> (NUM) FIX (CMDS) QUEUE)
+   <ENQ .CMDS #BYTE *000000000356*>
+   <ENQ .CMDS <CHTYPE .NUM WORD>>
+   .NUM>
+
+<DEFINE PRESS-SET-Y (CHAN OPER NUM
+                     "AUX" (CMDS <COMMANDS <CHANNEL-DATA .CHAN>>))
+   #DECL ((CHAN) <CHANNEL 'PRESS> (NUM) FIX (CMDS) QUEUE)
+   <ENQ .CMDS #BYTE *000000000357*>
+   <ENQ .CMDS <CHTYPE .NUM WORD>>
+   .NUM>
+
+<DEFINE PRESS-SHOW-CHARACTER-IMMEDIATE (CHAN OPER CHAR
+                                        "AUX"
+                                        (CMDS <COMMANDS <CHANNEL-DATA .CHAN>>))
+   #DECL ((CHAN) <CHANNEL 'PRESS> (CHAR) <OR CHARACTER FIX> (CMDS) QUEUE)
+   <ENQ .CMDS #BYTE *363*>
+   <ENQ .CMDS <CHTYPE .CHAR BYTE>>
+   .CHAR>
+
+<DEFINE PRESS-SHOW-CHARACTERS (CHAN OPER STR "OPT" LEN
+                               "AUX" 
+                               (DATA <CHANNEL-DATA .CHAN>)
+                               (CMDS <COMMANDS .DATA>)
+                               (DCHAN:<CHANNEL 'DISK> <DISK-CHAN .DATA>))
+   #DECL ((CHAN) <CHANNEL 'PRESS> (STR) <OR STRING BYTES>
+          (CMDS) QUEUE (LEN) FIX)
+   <COND (<NOT <ASSIGNED? LEN>>
+          <COND (<TYPE? .STR STRING>
+                 <SET LEN <LENGTH .STR>>)
+                (ELSE
+                 <SET LEN <LENGTH .STR>>)>)>
+   <COND (<0? .LEN>)
+         (<1? .LEN>
+          <ENQ .CMDS #BYTE *363*>
+          <ENQ .CMDS <CHTYPE .CHAR BYTE>>)
+         (ELSE
+          <WRITE-STRING .DCHAN .STR .LEN>
+          <COND (<L=? .LEN 32>
+                 <ENQ .CMDS <CHTYPE <- .LEN 1> BYTE>>)
+                (ELSE
+                 <ENQ .CMDS #BYTE *000000000360*>
+                 <ENQ .CMDS <CHTYPE .LEN BYTE>>)>)>
+   .LEN>
+
+<DEFINE PRESS-FONT (CHAN OPER FONT
+                    "AUX" (CMDS <COMMANDS <CHANNEL-DATA .CHAN>>))
+   #DECL ((CHAN) <CHANNEL 'PRESS> (FONT) STRING (CMDS) QUEUE)
+   <ENQ .CMDS <CHTYPE <+ 112 <FONT-NUMBER .CHAN .FONT>> BYTE>>
+   .FONT>
+
+;<DEFINE PRESS-SET-SPACE-X (CHAN OPER NUM
+                            "AUX" (CMDS <COMMANDS <CHANNEL-DATA .CHAN>>))
+    #DECL ((CHAN) <CHANNEL 'PRESS> (NUM) FIX (CMDS) QUEUE)
+    <ENQ .CMDS #BYTE *000000000364*>
+    <ENQ .CMDS <CHTYPE .NUM WORD>>
+    .NUM>
+
+;<DEFINE PRESS-SET-SPACE-Y (CHAN OPER NUM
+                            "AUX" (CMDS <COMMANDS <CHANNEL-DATA .CHAN>>))
+    #DECL ((CHAN) <CHANNEL 'PRESS> (NUM) FIX (CMDS) QUEUE)
+    <ENQ .CMDS #BYTE *000000000365*>
+    <ENQ .CMDS <CHTYPE .NUM WORD>>
+    .NUM>
+
+;<DEFINE PRESS-RESET-SPACE (CHAN OPER
+                            "AUX" (CMDS <COMMANDS <CHANNEL-DATA .CHAN>>))
+    #DECL ((CHAN) <CHANNEL 'PRESS> (CMDS) QUEUE)
+    <ENQ .CMDS #BYTE *000000000366*>
+    T>
+
+<DEFINE PRESS-SPACE (CHAN OPER) 
+   #DECL ((CHAN) <CHANNEL 'PRESS>)
+   <ENQ <COMMANDS <CHANNEL-DATA .CHAN>> #BYTE *000000000367*>
+   T>
+
+<DEFINE PRESS-SHOW-RECTANGLE (CHAN OPER WIDTH HEIGHT
+                              "AUX" (CMDS <COMMANDS <CHANNEL-DATA .CHAN>>))
+   #DECL ((CHAN) <CHANNEL 'PRESS> (WIDTH HEIGHT) FIX (CMDS) QUEUE)
+   <ENQ .CMDS #BYTE *000000000376*>
+   <ENQ .CMDS <CHTYPE .WIDTH WORD>>
+   <ENQ .CMDS <CHTYPE .HEIGHT WORD>>
+   T>
+
+;<DEFINE PRESS-SHOW-OBJECT (CHAN OPER "TUPLE" MOVES
+                            "AUX" 
+                            (DATA <CHANNEL-DATA .CHAN>)
+                            (CMDS <COMMANDS .DATA>)
+                            (DCHAN:<CHANNEL 'DISK> <DISK-CHAN .DATA>)
+                            START)
+    #DECL ((CHAN) <CHANNEL 'PRESS> (MOVES) <TUPLE [REST <LIST ATOM>]>
+           (CMDS) QUEUE (START) FIX)
+    <SET START <MY-ACCESS .DCHAN>>
+    <MAPF %<>
+          <FUNCTION (MV "AUX" (ATM <1 .MV>))
+             #DECL ((MV) <LIST ATOM> (ATM) ATOM)
+             <COND (<==? .ATM MOVETO>
+                    <WRITE-WORD .DCHAN 0>
+                    <WRITE-WORD .DCHAN <2 .MV>>
+                    <WRITE-WORD .DCHAN <3 .MV>>)
+                   (<==? .ATM DRAWTO>
+                    <WRITE-WORD .DCHAN 1>
+                    <WRITE-WORD .DCHAN <2 .MV>>
+                    <WRITE-WORD .DCHAN <3 .MV>>)
+                   (<==? .ATM DRAWCURVE>
+                    <WRITE-WORD .DCHAN 2>
+                    <WRITE-FLOAT .DCHAN <2 .MV>>
+                    <WRITE-FLOAT .DCHAN <3 .MV>>
+                    <WRITE-FLOAT .DCHAN <4 .MV>>
+                    <WRITE-FLOAT .DCHAN <5 .MV>>
+                    <WRITE-FLOAT .DCHAN <6 .MV>>
+                    <WRITE-FLOAT .DCHAN <7 .MV>>)>>
+          .MOVES>
+    <ENQ .CMDS #BYTE *373*>
+    <ENQ .CMDS <CHTYPE <- <MY-ACCESS .DCHAN> .START> WORD>>
+    T>
+
+<DEFINE PRESS-ONLY-ON-COPY (CHAN OPER "OPT" (NUM 0)
+                            "AUX" (CMDS <COMMANDS <CHANNEL-DATA .CHAN>>))
+   #DECL ((CHAN) <CHANNEL 'PRESS> (CMDS) QUEUE)
+   <ENQ .CMDS #BYTE *355*>
+   <ENQ .CMDS <CHTYPE .NUM BYTE>>
+   .NUM>
+
+<DEFINE FONT-NUMBER (CHAN STR "AUX" (FONT <PARSE-FONT-NAME .STR>)) 
+   #DECL ((CHAN) <CHANNEL 'PRESS> (STR) STRING (FONT) VECTOR)
+   <MAPR %<>
+         <FUNCTION (RFN "AUX" (THIS <1 .RFN>)) 
+            #DECL ((RFN) <VECTOR [REST <OR VECTOR FALSE>]>
+                   (THIS) <OR VECTOR FALSE>)
+            <COND (<NOT .THIS>
+                   <1 .RFN .FONT>
+                   <MAPLEAVE <- 16 <LENGTH .RFN>>>)
+                  (<=? .THIS .FONT>
+                   <MAPLEAVE <- 16 <LENGTH .RFN>>>)>>
+         <FONTS <CHANNEL-DATA .CHAN>>>>
+
+<DEFINE PRESS-NEW-ENTITY (CHAN OPER
+                          "AUX" (DATA <CHANNEL-DATA .CHAN>)
+                          (DCHAN:<CHANNEL 'DISK> <DISK-CHAN .DATA>)
+                          (CMDS <COMMANDS .DATA>) (EL <ENTITIES .DATA>)
+                          BCMDS BTRLR END-OF-DATA)
+   #DECL ((CHAN) <CHANNEL 'PRESS> (DATA) PRESS-CHAN (EL CMDS) QUEUE
+          (BCMDS BTRLR) BYTES (END-OF-DATA) FIX)
+   <COND (<NOT <EMPTY? <LIST-Q .CMDS>>>
+          <COND (<1? <MOD <BYTE-LENGTH <LIST-Q .CMDS>> 2>>
+                 <ENQ .CMDS #BYTE *000000000377*>)>
+          <SET END-OF-DATA <MY-ACCESS .DCHAN>>
+          <SET BCMDS <MAKE-BYTES !<LIST-Q .CMDS!>>>
+          <SET BTRLR
+               <MAKE-BYTES #BYTE *000000000000*
+                           #BYTE *000000000000*
+                           <CHTYPE <- <PAGE-START .DATA>
+                                      <DATA-START .DATA>> LONG>
+                           <CHTYPE <- .END-OF-DATA <DATA-START .DATA>>
+                                   LONG>
+                           #WORD *000000000000*
+                           #WORD *000000000000*
+                           #WORD *000000000000*
+                           #WORD *000000000000*
+                           #WORD *000000052126*
+                           #WORD *000000066444*
+                           <CHTYPE </ <+ <LENGTH .BCMDS> 24> 2> WORD>>>
+          <ENQ .EL .BCMDS>
+          <ENQ .EL .BTRLR>
+          <DATA-START .DATA .END-OF-DATA>
+          <RESET-Q .CMDS>)>
+   T>
+
+<DEFINE PRESS-NEW-PAGE (CHAN OPER "AUX" (DATA <CHANNEL-DATA .CHAN>)
+                        (DCHAN:<CHANNEL 'DISK> <DISK-CHAN .DATA>)
+                        (EL <ENTITIES .DATA>) PAGE-END END-OF-EL) 
+   #DECL ((CHAN) <CHANNEL 'PRESS> (PAGE-END END-OF-EL) FIX)
+   <PRESS-NEW-ENTITY .CHAN .OPER>
+   <COND (<NOT <EMPTY? <LIST-Q .EL>>>
+          <COND (<1? <MOD <MY-ACCESS .DCHAN> 2>> <WRITE-BYTE .DCHAN 0>)>
+          <WRITE-WORD .DCHAN 0>
+          <MAPF %<>
+                <FUNCTION (BUF) #DECL ((BUF) BYTES)
+                   <WRITE-BYTES .DCHAN .BUF>>
+                <LIST-Q .EL>>
+          <SET END-OF-EL <MY-ACCESS .DCHAN>>
+          <SET PAGE-END <NEXT-RECORD .DCHAN>>
+          <ENQ <PAGES .DATA>
+               <MAKE-BYTES #WORD *000000000000*
+                           <CHTYPE </ <PAGE-START .DATA> 512> WORD>
+                           <CHTYPE </ <- .PAGE-END <PAGE-START .DATA>>
+                                      512>
+                                   WORD>
+                           <CHTYPE </ <- .PAGE-END .END-OF-EL> 2>
+                                   WORD>>>
+          <PAGE-START .DATA .PAGE-END>
+          <DATA-START .DATA .PAGE-END>
+          <RESET-Q .EL>)>
+   T>
+
+<SETG PADDING <IBYTES 117 255>>
+
+<DEFINE PRESS-CLOSE (CHAN OPER "AUX" (DATA <CHANNEL-DATA .CHAN>)
+                     (DCHAN:<CHANNEL 'DISK> <DISK-CHAN .DATA>)
+                     FONT-DIR-START PART-DIR-START
+                     DOC-DIR-START (PAGE-COUNT 0))
+   #DECL ((CHAN) <CHANNEL 'PRESS>)
+   <PRESS-NEW-PAGE .CHAN .OPER>
+   <SET FONT-DIR-START <MY-ACCESS .DCHAN>>
+   <COND (<NOT <1 <FONTS .DATA>>>
+          <1 <FONTS .DATA> '["HELVETICA" 12 0]>)>
+   <MAPR %<>
+         <FUNCTION (RFONTS "AUX" (FONT <1 .RFONTS>))
+            #DECL ((FONT) <OR FALSE <VECTOR STRING FIX FIX>>)
+            <COND (.FONT
+                   <WRITE-WORD .DCHAN 16>
+                   <WRITE-BYTE .DCHAN 0>
+                   <WRITE-BYTE .DCHAN <- 16 <LENGTH .RFONTS>>>
+                   <WRITE-BYTE .DCHAN 0>
+                   <WRITE-BYTE .DCHAN 255>
+                   <WRITE-BCPL .DCHAN <1 .FONT>>
+                   <MY-ACCESS .DCHAN
+                              <+ <MY-ACCESS .DCHAN>
+                                 <- 19 <LENGTH <1 .FONT>>>>>
+                   <WRITE-BYTE .DCHAN <3 .FONT>>
+                   <WRITE-BYTE .DCHAN 0>
+                   <WRITE-WORD .DCHAN <2 .FONT>>
+                   <WRITE-WORD .DCHAN 0>)
+                  (ELSE <MAPLEAVE>)>>
+         <FONTS .DATA>>
+   
+   <SET PART-DIR-START <NEXT-RECORD .DCHAN>>
+   <MAPF %<>
+         <FUNCTION (PAGE)
+            <SET PAGE-COUNT <+ .PAGE-COUNT 1>>
+            <WRITE-BYTES .DCHAN .PAGE>>
+         <LIST-Q <PAGES .DATA>>>
+   <WRITE-WORD .DCHAN 1>
+   <WRITE-WORD .DCHAN </ .FONT-DIR-START 512>>
+   <WRITE-WORD .DCHAN </ <- .PART-DIR-START .FONT-DIR-START> 512>>
+   <WRITE-WORD .DCHAN 0>
+   
+   <SET DOC-DIR-START <NEXT-RECORD .DCHAN>>
+   <WRITE-WORD .DCHAN 27183>
+   <WRITE-WORD .DCHAN <+ </ .DOC-DIR-START 512> 1>>
+   <WRITE-WORD .DCHAN <+ .PAGE-COUNT 1>>
+   <WRITE-WORD .DCHAN </ .PART-DIR-START 512>>
+   <WRITE-WORD .DCHAN </ <- .DOC-DIR-START .PART-DIR-START> 512>>
+   <WRITE-WORD .DCHAN </ .DOC-DIR-START 512>>
+   <WRITE-LONG .DCHAN 0>
+   <WRITE-WORD .DCHAN 1>
+   <WRITE-WORD .DCHAN 1>
+   <WRITE-WORD .DCHAN -1>
+   <WRITE-WORD .DCHAN -1>
+   <WRITE-WORD .DCHAN -1>
+   <WRITE-BYTES .DCHAN ,PADDING>
+   <WRITE-BCPL .DCHAN "FOO.PRESS">
+   <MY-ACCESS .DCHAN <+ .DOC-DIR-START 154>>
+   <WRITE-BCPL .DCHAN "SAM">
+   <MY-ACCESS .DCHAN <+ .DOC-DIR-START 170>>
+   <WRITE-BCPL .DCHAN "TODAY">
+   <MY-ACCESS .DCHAN <+ .DOC-DIR-START 511>>
+   <WRITE-BYTE .DCHAN 0>
+   <CLOSE <DISK-CHAN .DATA>>
+   .CHAN>
+
+<DEFMAC MY-ACCESS ('DCHAN "OPT" 'NUM)
+   <COND (<ASSIGNED? NUM>
+          `<CHANNEL-OP ~.DCHAN ACCESS ~.NUM>)
+         (ELSE
+          `<CHANNEL-OP ~.DCHAN ACCESS>:FIX)>>
+
+<DEFINE NEXT-RECORD (DCHAN "AUX" N) 
+   #DECL ((DCHAN) <CHANNEL 'DISK> (N) FIX)
+   <SET N <* <+ </ <MY-ACCESS .DCHAN> 512> 1> 512>>
+   <MY-ACCESS .DCHAN .N>
+   .N>
+
+<DEFMAC WRITE-BYTE ('DCHAN 'NUM) 
+   `<CHANNEL-OP ~.DCHAN WRITE-BYTE ~.NUM>>
+
+<DEFMAC WRITE-WORD ('DCHAN 'NUM) 
+   `<BIND ((DCHAN ~.DCHAN) (NUM ~.NUM))
+       #DECL ((DCHAN) <CHANNEL 'DISK> (NUM) FIX)
+       <CHANNEL-OP .DCHAN WRITE-BYTE <LSH .NUM -8>>
+       <CHANNEL-OP .DCHAN WRITE-BYTE .NUM>>>
+
+<DEFMAC WRITE-LONG ('DCHAN 'NUM) 
+   `<BIND ((DCHAN ~.DCHAN) (NUM ~.NUM))
+       #DECL ((DCHAN) <CHANNEL 'DISK> (NUM) FIX)
+       <CHANNEL-OP .DCHAN WRITE-BYTE <LSH .NUM -24>>
+       <CHANNEL-OP .DCHAN WRITE-BYTE <LSH .NUM -16>>
+       <CHANNEL-OP .DCHAN WRITE-BYTE <LSH .NUM -8>>
+       <CHANNEL-OP .DCHAN WRITE-BYTE .NUM>>>
+
+<DEFINE WRITE-FLOAT (DCHAN NUM "AUX" (FX <CHTYPE .NUM FIX>))
+   #DECL ((DCHAN) <CHANNEL 'DISK> (NUM) FLOAT
+          (FX) FIX)
+   <CHANNEL-OP .DCHAN WRITE-BYTE <LSH .FX -28>>
+   <CHANNEL-OP .DCHAN WRITE-BYTE <LSH .FX -20>>
+   <CHANNEL-OP .DCHAN WRITE-BYTE <LSH .FX -12>>
+   <CHANNEL-OP .DCHAN WRITE-BYTE <LSH .FX -4>>>
+
+<DEFMAC WRITE-BYTES ('DCHAN 'B) 
+   `<CHANNEL-OP ~.DCHAN WRITE-BUFFER ~.B>>
+
+<DEFINE WRITE-STRING (DCHAN S "OPT" LEN)
+   #DECL ((DCHAN) <CHANNEL 'DISK> (S) <OR STRING BYTES> (LEN))
+   <COND (<TYPE? .S BYTES>
+          <COND (<NOT <ASSIGNED? LEN>> <SET LEN <LENGTH .S>>)>
+          <CHANNEL-OP .DCHAN WRITE-BUFFER .S .LEN>)
+         (ELSE
+          <REPEAT ((I 1))
+             #DECL ((I) FIX)
+             <CHANNEL-OP .DCHAN WRITE-BYTE <CHTYPE <1 .S> FIX>>
+             <COND (<G? <SET I <+ .I 1>> .LEN> <RETURN>)>>)>>
+
+<DEFMAC WRITE-BCPL ('DCHAN 'S) 
+   `<BIND ((DCHAN ~.DCHAN) (S ~.S))
+       #DECL ((DCHAN) <CHANNEL 'DISK> (S) STRING)
+       <CHANNEL-OP .DCHAN WRITE-BYTE <LENGTH .S>>
+       <MAPF %<>
+             <FUNCTION (C) 
+                #DECL ((C) CHARACTER)
+                <CHANNEL-OP .DCHAN WRITE-BYTE <ASCII .C>>>
+             .S>>>
+
+<DEFINE MAKE-BYTES ("TUPLE" T) 
+   #DECL ((T) <TUPLE [REST <OR BYTE WORD LONG>]>)
+   <MAPF ,BYTES
+         <FUNCTION (N) 
+            <COND (<TYPE? .N BYTE> <MAPRET <CHTYPE .N FIX>>)
+                  (<TYPE? .N WORD>
+                   <MAPRET <LSH .N -8> <CHTYPE .N FIX>>)
+                  (<TYPE? .N LONG>
+                   <MAPRET <LSH .N -24>
+                           <LSH .N -16>
+                           <LSH .N -8>
+                           <CHTYPE .N FIX>>)>>
+         .T>>
+
+<DEFINE BYTE-LENGTH (L) 
+   #DECL ((L) <LIST [REST <OR BYTE WORD LONG>]>)
+   <MAPF ,+
+         <FUNCTION (N) 
+            <COND (<TYPE? .N BYTE> 1)
+                  (<TYPE? .N WORD> 2)
+                  (<TYPE? .N LONG> 4)>>
+         .L>>
+
+<DEFINE PARSE-FONT-NAME (STR "AUX" (SIZE 0))
+   #DECL ((STR) STRING (SIZE) FIX)
+   [<MAPR ,STRING
+          <FUNCTION (RSTR "AUX" (C <1 .RSTR>) (N <ASCII .C>)) 
+             <COND (<AND <G=? .N 48> <L=? .N 57>>
+                    <SET STR .RSTR>
+                    <MAPSTOP>)
+                   (<AND <G=? .N 97> <L=? .N 122>>
+                    <MAPRET <ASCII <+ .N -32>>>)
+                   (ELSE <MAPRET .C>)>>
+          .STR>
+    <MAPR %<>
+          <FUNCTION (RSTR "AUX" (C <1 .RSTR>) (N <ASCII .C>)) 
+             <COND (<AND <G=? .N 48> <L=? .N 57>>
+                    <SET STR .RSTR>
+                    <SET SIZE <+ <* 10 .SIZE> <- .N 48>>>)
+                   (ELSE <SET STR .RSTR> <MAPLEAVE .SIZE>)>>
+          .STR>
+    <MAPF ,+
+          <FUNCTION (C) 
+             <COND (<OR <==? .C !\B> <==? .C !\b>> 2)
+                   (<OR <==? .C !\L> <==? .C !\l>> 4)
+                   (<OR <==? .C !\I> <==? .C !\i>> 1)
+                   (<OR <==? .C !\C> <==? .C !\c>> 6)
+                   (<OR <==? .C !\E> <==? .C !\e>> 12)
+                   (ELSE 0)>>
+          .STR>]>
+
+<ENDPACKAGE>