Machine-Independent MDL for TOPS-20 and VAX.
[pdp10-muddle.git] / mim / development / mim / vax / tty / ttydesc.mud
1 "The following functions parse a terminal description file into
2  the format used by the rest of the TTY package.  If GC-READ and
3  friends ever exist, they will probably replace this.  PARSE-SPEC-FILE,
4  the top-level, takes a channel (which it will close) to the description
5  file, and returns a TTY-DESC.  Other information is needed to make the
6  TTY object."
7
8 <DEFINE PARSE-SPEC-FILE (CH "AUX" BYTE NAME HEIGHT WIDTH PAD CRPAD LFPAD
9                          OPCNT OPMAX TTY BUFSTR OPVEC LEN)
10   #DECL ((CH) CHANNEL (BYTE) CHARACTER (NAME) STRING
11          (CRPAD LFPAD LEN HEIGHT WIDTH OPCNT OPMAX) FIX
12          (PAD) CHARACTER (TTY) TTY-DESC
13          (OPVEC) VECTOR (BUFSTR) STRING)
14   <COND (<NOT <GASSIGNED? BUFSTR>>
15          <SETG BUFSTR <ISTRING 256>>)>
16   <SET BUFSTR ,BUFSTR>
17   <SET LEN <CHTYPE <FCHANNEL-OP .CH READ-BYTE> FIX>>
18   <SET NAME <ISTRING .LEN>>
19   <FCHANNEL-OP .CH READ-BUFFER .NAME>
20   <SET HEIGHT <CHTYPE <FCHANNEL-OP .CH READ-BYTE> FIX>>
21   <SET WIDTH <CHTYPE <FCHANNEL-OP .CH READ-BYTE> FIX>>
22   <SET PAD <FCHANNEL-OP .CH READ-BYTE>>
23   <SET CRPAD <CHTYPE <FCHANNEL-OP .CH READ-BYTE> FIX>>
24   <SET LFPAD <CHTYPE <FCHANNEL-OP .CH READ-BYTE> FIX>>
25   <SET OPMAX <CHTYPE <FCHANNEL-OP .CH READ-BYTE> FIX>>
26   <SET OPCNT <CHTYPE <FCHANNEL-OP .CH READ-BYTE> FIX>>
27   <SET OPVEC <IVECTOR .OPMAX <>>>
28   <SET TTY <CHTYPE [.NAME .HEIGHT .WIDTH .PAD
29                     .CRPAD .LFPAD .OPVEC] TTY-DESC>>
30   <REPEAT ()
31     <COND (<0? .OPCNT>
32            <CHANNEL-CLOSE .CH>
33            <RETURN .TTY>)>
34     <SET LEN <CHTYPE <FCHANNEL-OP .CH READ-BYTE> FIX>>
35     <COND (<G? .LEN 0>
36            <FCHANNEL-OP .CH READ-BUFFER .BUFSTR .LEN>
37            <PUT .OPVEC <CHTYPE <1 .BUFSTR> FIX>
38                 <PARSE-SPEC <REST .BUFSTR> <- .LEN 1>>>)>
39     <SET OPCNT <- .OPCNT 1>>>>
40
41 "PARSE-SPEC parses the specification for a single terminal operation,
42  and returns an appropriate structure."
43
44 <DEFINE PARSE-SPEC (SPECSTR LEN "AUX" NP VEC)
45   #DECL ((SPECSTR) STRING (LEN) FIX)
46   <SET NP <CHTYPE <1 .SPECSTR> FIX>>
47   <SET SPECSTR <REST .SPECSTR>>
48   <COND (<0? .NP> <>)
49         (<1? .NP>
50          <GET-TTY-OP .SPECSTR>)
51         (T
52          <SET VEC <IVECTOR .NP <>>>
53          <MAPR <>
54            <FUNCTION (VV)
55              #DECL ((VV) VECTOR)
56              <1 .VV <GET-TTY-OP .SPECSTR>>
57              <SET SPECSTR <REST .SPECSTR <+ <CHTYPE <2 .SPECSTR> FIX>
58                                             2>>>>
59            .VEC>
60          .VEC)>>
61
62 <DEFINE NEW-STRING (STR LEN "AUX" (NS <ISTRING .LEN>))
63   #DECL ((STR NS) STRING (LEN) FIX)
64   <MAPR <>
65     <FUNCTION (X Y)
66       <1 .X <1 .Y>>>
67     .NS .STR>
68   .NS>
69
70 <DEFINE GET-TTY-OP (STR "AUX" PAD ELTS NS)
71   #DECL ((STR) STRING (PAD) FIX)
72   <SET PAD <CHTYPE <1 .STR> FIX>>
73   <SET ELTS <CHTYPE <3 .STR> FIX>>
74   <COND (<AND <1? .ELTS>
75               <L? <CHTYPE <4 .STR> FIX> *200*>>
76          ; "JUST A STRING"
77          <SET NS <NEW-STRING <REST .STR 4> <CHTYPE <4 .STR> FIX>>>)
78         (T
79          <SET NS <CHTYPE <IVECTOR .ELTS 0> TTY-ELT>>
80          <SET STR <REST .STR 3>>
81          ; "Rest off all but element descriptions"
82          <MAPR <>
83            <FUNCTION (NNS "AUX" NUM)
84              #DECL ((NNS) <PRIMTYPE VECTOR>)
85              <COND (<G=? <SET NUM <CHTYPE <1 .STR> FIX>> *200*>
86                     <1 .NNS .NUM>
87                     <SET STR <REST .STR>>)
88                    (T
89                     <1 .NNS <NEW-STRING <REST .STR> .NUM>>
90                     <SET STR <REST .STR <+ .NUM 1>>>)>>
91            .NS>)>
92   <COND (<0? .PAD> .NS)
93         (<CHTYPE [.NS .PAD] TTY-OUT>)>>