16 <DEFINE GET-DEFAULT (ATM)
17 <COND (<BOUND? .ATM> <COND (<ASSIGNED? .ATM> ..ATM) (T <>)>)
18 (<GASSIGNED? .ATM> ,.ATM)>>
20 <DEFINE DO-TERMINATE (STR:STRING NEW?:<OR ATOM FALSE> "AUX" NS)
21 <SET STR <PARSE-FILE-NAME .STR T>>
24 <COND (<SET NS <FILE-EXISTS? .STR>> .STR)
25 (T <CHTYPE (.STR !.NS) FALSE>)>)>>
27 <DEFINE GET-FILE (STR:STRING FLEN:<OR
29 "OPT" (NEW?:<OR ATOM FALSE> <>)
32 FIX>> <GET-DEFAULT NM1>)
35 FIX>> <GET-DEFAULT NM2>)
38 FIX>> <GET-DEFAULT DEV>)
41 FIX>> <GET-DEFAULT SNM>)
42 "AUX" (LEN:FIX <COND (.FLEN .FLEN) (T <LENGTH .STR>)>)
43 (RS <STACK <ISTRING .LEN>>) NS
44 (TS <STACK <ISTRING <+ .LEN 1>>>))
45 <SUBSTRUC .STR 0 .LEN .RS>
47 (<==? .OPER TERMINATE> <DO-TERMINATE .RS .NEW?>)
49 <COND (<OR <==? .OPER COMPLETE> <==? .OPER COMPLETE-TERMINATE>>
50 <COND (<DO-TERMINATE .RS .NEW?>)
52 <SUBSTRUC .STR 0 .LEN .TS>
53 <PUT .TS <LENGTH .TS> !\*>
54 <COND (<SET NS <DO-COMPLETE .TS .NEW?>>
55 <COND (<==? .OPER COMPLETE-TERMINATE>
56 <DO-TERMINATE .NS .NEW?>)
58 (<==? .OPER FILE-MENU>
59 <SUBSTRUC .STR 0 .LEN .TS>
60 <PUT .TS <LENGTH .TS> !\*>
61 <FILE-MENU .TS ,RETURN-ALL>)>)>>
63 <DEFINE DO-COMPLETE (STR:STRING NEW?:<OR
69 (<SET CH <CHANNEL-OPEN GNJFN .STR ,RETURN-ALL>>
70 <REPEAT (NCH:<CHANNEL 'PARSE> (OS <>) (CT 0) NAMSTR TS (DIR? <>)
71 (N2 <AND <ASSIGNED? NM2> .NM2>) (N2S <>) (NC 0))
72 <SET NAMSTR <CHANNEL-OP .CH NAME>>
73 <COND (<AND .N2 <=? <CHANNEL-OP .CH NM2> .N2>>
75 <COND (<NOT .N2S> <SET N2S <STRING .NAMSTR>>)
77 <SET N2S <GET-COMMON .N2S <STRING .NAMSTR>>>)>)>
79 <SET DIR? <CHANNEL-OP .CH DIR?>>
80 <COND (<NOT .OS> <SET OS .NAMSTR>)
81 (T <SET OS <GET-COMMON .OS .NAMSTR>>)>
83 (<NOT <CHANNEL-OP .CH NEXT-FILE>>
88 <RETURN <GET-FILE <STRING .OS !\/> <> COMPLETE .NEW?>>)>
90 (<0? .CT> <RETURN <CHTYPE (<STRING .STR> "no matches") FALSE>>)
93 <COND (<1? .NC> <RETURN .N2S>)>
94 <RETURN <CHTYPE (.N2S "ambiguous") FALSE>>)
95 (<AND <MEMQ !\. .OS:STRING> .N2>
96 <SET NCH <CHANNEL-OPEN PARSE .OS>>
97 <COND (<OR <NOT <SET TS <CHANNEL-OP .NCH NM2>>>
98 <AND <SET TS <MEMBER .TS .N2>> <==? .TS .N2>>>
99 <SET TS <CHANNEL-OP .NCH NAME 28>>
100 <COND (<SET TS <DO-TERMINATE .TS .NEW?>>
104 <RETURN <CHTYPE (.OS "ambiguous") FALSE>>)>)>>)
105 (<CHTYPE (<STRING .STR> !.CH) FALSE>)>>
107 <DEFINE GET-COMMON (STR1:STRING STR2:STRING "AUX" TEMP)
108 <COND (<G? <LENGTH .STR1> <LENGTH .STR2>>
114 <COND (<N==? <1 .S1> <1 .S2>>
115 <MAPLEAVE <SUBSTRUC .STR2
117 <- <LENGTH .STR2> <LENGTH .S2>>
118 <REST .STR2 <LENGTH .S2>>>>)
120 <COND (<1? <LENGTH .S2>> <MAPLEAVE .STR2>)>
121 <MAPLEAVE <SUBSTRUC .STR1
126 <LENGTH .STR1>>>>>)>>
130 <DEFINE CP (ST:<PRIMTYPE VECTOR> SNM DEV)
134 <DEFINE FILE-MENU (ISTR:STRING
135 "OPTIONAL" (F-OR-D:FIX ,RETURN-FILES)
137 <CHANNEL 'GNJFN> FALSE> FILES:VECTOR
138 FILE:<OR STRING FALSE> NAME1:<OR
140 NAME2:<OR STRING FALSE> (DIR? <>)
141 FULL?:<OR ATOM FALSE>
143 (ST:<PRIMTYPE VECTOR> <STACK <IVECTOR 2>>))
144 <COND (<OR <EMPTY? .STR>
147 <COND (<BOUND? NM1> <AND <ASSIGNED? NM1> .NM1>)
148 (<GASSIGNED? NM1> ,NM1)>>
150 <COND (<BOUND? NM2> <AND <ASSIGNED? NM2> .NM2>)
151 (<GASSIGNED? NM2> ,NM2)>>
153 <COND (.NAME2 <SET STR <STRING .NAME1 !\. .NAME2>>)
154 (T <SET STR <STRING .NAME1 !\. !\*>>)>)
155 (.NAME2 <SET STR <STRING !\* !\. .NAME2>>)
157 <CP .ST !<GET-CONNECTED-DIR>>
159 (<SET CH <CHANNEL-OPEN GNJFN .STR .F-OR-D>>
160 <COND (<OR <N=? <CHANNEL-OP .CH DEV> <1 .ST>>
161 <N=? <CHANNEL-OP .CH SNM> <2 .ST>>>
169 <SET FILE <CHANNEL-OP .CH NAME>>)
171 <SET FILE <CHANNEL-OP .CH SHORT-NAME>>)>
172 <COND (<N==? .F-OR-D ,RETURN-FILES>
173 <SET DIR? <CHANNEL-OP .CH DIR?>>)>
174 <COND (<NOT <CHANNEL-OP .CH NEXT-FILE>>
179 <COND (<AND <1? <LENGTH .FILES>> .DIR?>
180 <PUT .ISTR <LENGTH .ISTR> !\/>
181 <GET-FILE .ISTR <> FILE-MENU>)
183 <COND (<EMPTY? .FILES>)
184 (T <SET FILES <SORT <> .FILES>>)>
188 <GDECL (FLIST DIRS) LIST>
190 <DEFINE GET-ALL-FILES (STR "OPTIONAL" (F-OR-D ,RETURN-FILES))
191 #DECL ((STR) STRING (F-OR-D) FIX)
192 <COND (<==? .F-OR-D ,RETURN-ALL>
195 <GET-ALL-FILES-R .STR ,RETURN-ALL>
196 <VECTOR <REST ,FLIST> <REST ,DIRS>>)
197 (<==? .F-OR-D ,RETURN-DIRS>
199 <GET-ALL-FILES-R .STR ,RETURN-DIRS>
203 <GET-ALL-FILES-R .STR ,RETURN-FILES>
206 <DEFINE GET-ALL-FILES-R (STR F-OR-D "AUX" CH DIR (DLIST ()) FILES FILE)
207 #DECL ((STR DIR) STRING (F-OR-D) FIX (CH) <OR FALSE CHANNEL>
208 (DLIST FILES) LIST (FILE) <OR FALSE STRING>)
210 (<COND (<==? .F-OR-D ,RETURN-DIRS>
211 <SET CH <CHANNEL-OPEN GNJFN .STR ,RETURN-DIRS>>)
212 (T <SET CH <CHANNEL-OPEN GNJFN .STR ,RETURN-ALL>>)>
213 <SET DIR <CHANNEL-OP .CH DIR>>
215 (<==? .F-OR-D ,RETURN-DIRS>
219 <COND (<SET FILE <CHANNEL-OP .CH SHORT-NAME>>
220 <CHANNEL-OP .CH NEXT-FILE>
221 <SET FILE <STRING .DIR .FILE>>)
227 <COND (<SET FILE <CHANNEL-OP .CH SHORT-NAME>>
228 <SET FILE <STRING .DIR .FILE>>
229 <COND (<CHANNEL-OP .CH DIR?>
230 <SET DLIST (.FILE !.DLIST)>
231 <CHANNEL-OP .CH NEXT-FILE>
233 (T <CHANNEL-OP .CH NEXT-FILE> .FILE)>)
236 <COND (<==? .F-OR-D ,RETURN-FILES>
237 <PUTREST <REST ,FLIST <- <LENGTH ,FLIST> 1>> .FILES>)
238 (<==? .F-OR-D ,RETURN-DIRS>
239 <PUTREST <REST ,DIRS <- <LENGTH ,DIRS> 1>> .DLIST>)
241 <PUTREST <REST ,FLIST <- <LENGTH ,FLIST> 1>> .FILES>
242 <PUTREST <REST ,DIRS <- <LENGTH ,DIRS> 1>> .DLIST>)>
245 <GET-ALL-FILES-R <STRING .DIRECT !\/ !\*> .F-OR-D>>