1 <USE "NEWSTRUC" "MISC-IO" "JCL">
5 <DEFINE SAVE-MUDCOM ("AUX" A)
6 #DECL ((A) <OR FALSE VECTOR>)
7 <COND (<=? <SAVE "MUDCOM.SAVE"> "RESTORED">
8 <COND (<SET A <READARGS>>
11 <PRINC "mudcom [oldfile] newfile
15 <DEFINE MUDCOM (OLDFILE "OPT" NEWFILE
16 "AUX" NEWCHAN OLDCHAN OLDREST NEWSTART L OLD (NM2 "MIMA")
18 #DECL ((NEWFILE OLDFILE NEWSTART OLDREST) STRING (OUTCHAN) CHANNEL
19 (NEWCHAN OLDCHAN) <OR FALSE CHANNEL>
20 (NM2) <SPECIAL STRING> (L) <OR LIST FALSE> (OLD) <OR FALSE STRING>)
22 <COND (<AND <NOT <ASSIGNED? NEWFILE>>
23 <NOT <MEMBER ".BAK" .OLDFILE>>>
24 <COND (<NOT <MEMBER !\. .OLDFILE>>
25 <SET OLDFILE <STRING .OLDFILE ".MUD">>)>
27 <OPEN "READ" <STRING .OLDFILE ".BAK">>>)
29 <SET OLDREST .OLDFILE>
31 <COND (<SET TMP <MEMQ !\/ .OLDFILE>>
32 <SET OLDREST <REST .TMP>>)
34 <COND (<G? <LENGTH .OLDREST> 10>
37 <STRING <SUBSTRUC .OLDFILE 0 10>
39 (ELSE <SET OLDCHAN <OPEN "READ" .OLDFILE>>)>)
41 <SET OLDCHAN <OPEN "READ" .OLDFILE>>)>
43 <COND (<NOT <ASSIGNED? NEWFILE>>
45 <CHANNEL-OP .OLDCHAN NAME %<+ 16 8 4>>>
46 <SET NEWFILE <STRING .NEWSTART ".MUD">>)>
48 <COND (<SET NEWCHAN <OPEN "READ" .NEWFILE>>
49 <SET OLDFILE <CHANNEL-OP .OLDCHAN NAME>>
52 <COND (<N=? <CHANNEL-OP .OLDCHAN NAME 2> ".MUD">
53 <COND (<SET OLD <FIND-OLD .OLDCHAN .NEWCHAN>>
55 <COND (<SET OLDCHAN <OPEN "READ" .OLD>>
57 <CHANNEL-OP .OLDCHAN NAME>>)
62 <SET OLDCHAN .OLD>)>)>)>
66 <PRINC <CHANNEL-OP .NEWCHAN NAME>>
69 <SET L <FILE-COMPARE .NEWCHAN .OLDCHAN>>
70 <COND (,VERBOSE? <MUDCOM-PRINT .L> T)
75 (ELSE <OPEN-FAILED .NEWCHAN>)>)
77 <OPEN-FAILED .OLDCHAN>)>>
79 <DEFINE OPEN-FAILED (F "AUX" (OUTCHAN .OUTCHAN))
80 #DECL ((F) FALSE (OUTCHAN) CHANNEL)
87 <DEFINE FIND-OLD (OLDCHAN NEWCHAN
88 "AUX" (CMPDATE 0) (CMPFILE #FALSE ("No older file"))
89 (R T) C OLDDATE NEWDATE NEW)
90 #DECL ((OLDCHAN NEWCHAN) <OR CHANNEL FALSE> (CMPDATE OLDDATE NEWDATE) FIX)
91 <COND (<L? <SET OLDDATE <CHANNEL-OP .OLDCHAN WRITE-DATE>>
92 <SET NEWDATE <CHANNEL-OP .NEWCHAN WRITE-DATE>>>
93 <SET NEW <STRING <CHANNEL-OP .NEWCHAN NAME %<+ 16 8 4 2>>
95 <SET C <CHANNEL-OPEN GNJFN .NEW .NEW>>
101 (<AND <L? <SET NEWDATE <CHANNEL-OP .C WRITE-DATE>>
103 <G? .NEWDATE .CMPDATE>>
104 <SET CMPFILE <CHANNEL-OP .C NAME>>
105 <SET CMPDATE .NEWDATE>)
107 <SET R <CHANNEL-OP .C NEXT-FILE>>)>>>)
110 <DEFINE MUDCOM-PRINT (L "AUX" (OUTCHAN .OUTCHAN))
111 #DECL ((L) <OR FALSE <LIST [REST <VECTOR STRING ATOM ANY>]>>
117 (<EMPTY? .L> <PRINC "No differences."> <CRLF>)
121 #DECL ((V) <VECTOR STRING ATOM ANY>)
122 <PRINC <COND (<==? <3 .V> 'N==?> "Changed ")
123 (<==? <3 .V> '+> "Added ")
124 (<==? <3 .V> '-> "Removed ")>>
131 <DEFINE FILE-COMPARE (NEWCHAN OLDCHAN
132 "AUX" NEW OLD (NEWNAME <CHANNEL-OP .NEWCHAN NAME>)
133 (OLDNAME <CHANNEL-OP .OLDCHAN NAME>))
134 #DECL ((NEW OLD) <OR FALSE LIST> (NEWNAME OLDNAME) STRING)
135 <COND (<AND <SET NEW <FILE-HASH .NEWCHAN>>
136 <SET OLD <FILE-HASH .OLDCHAN>>>
139 #DECL ((N) <OR <VECTOR STRING ATOM ANY> FALSE>)
141 <COND (<EMPTY? .OLD> <MAPSTOP>)
144 <SET OLD <REST .OLD>>
151 <SET NEW <REST .NEW>>
152 <COND (<DIFF? .N .OLD>
154 (ELSE <MAPRET>)>)>>>)
155 (.NEW <CHTYPE (.OLDNAME .OLD) FALSE>)
156 (ELSE <CHTYPE (.NEWNAME .NEW) FALSE>)>>
159 #DECL ((N) <VECTOR STRING ATOM ANY> (OL) LIST)
161 <FUNCTION (OL "AUX" (O <1 .OL>))
162 #DECL ((OL) LIST (O) <OR FALSE <VECTOR STRING ATOM ANY>>)
163 <COND (<AND .O <=? <1 .N> <1 .O>>>
165 <COND (<AND <==? <2 .N> <2 .O>>
176 <SETG BUFFER <REST <SETG TOPBUFFER <ISTRING 1000>> 1000>>
180 <SETG BRACKETS <ISTRING 100>>
181 <GDECL (TOPBUFFER BUFFER BLANKS BRACKETS) STRING (N) FIX>
187 <DEFINE FILE-HASH (FIL "AUX" CHAN (ITEM-LIST ()) ITEM
188 (BLANKS ,BLANKS) (QUOTE? <>) (STR? <>) (BLANK? <>)
189 (WAS-BLANK? <>) (BRACKETS ,BRACKETS) LEFT
190 (BUFFER ,BUFFER) (LEVEL 0) (HASH? <>) CHR)
191 #DECL ((BUFFER BLANKS BRACKETS) STRING (CHAN) <OR FALSE CHANNEL>
192 (FIL) <OR STRING CHANNEL> (ITEM-LIST) LIST (LEFT) CHARACTER
193 (ITEM) <OR FALSE VECTOR> (QUOTE? STR? BLANK?) <OR ATOM FALSE>
194 (LEVEL) FIX (HASH?) <OR FALSE FIX> (CHR) <OR CHARACTER FALSE>)
196 <COND (<TYPE? .FIL STRING> <OPEN "READ" .FIL>)
198 <SETG BUFFER <REST .BUFFER <LENGTH .BUFFER>>>
202 <PROG ((BUFFER ,BUFFER) (N ,N))
203 #DECL ((BUFFER) STRING (N) FIX)
204 <COND (<EMPTY? .BUFFER>
205 <SET BUFFER <SETG BUFFER ,TOPBUFFER>>
211 (ELSE <RETURN <SET CHR <>>>)>)
212 (<0? .N> <RETURN <SET CHR <>>>)>
213 <SET CHR <1 .BUFFER>>
214 <SETG BUFFER <REST .BUFFER>>
219 <COND (<N==? .BRACKETS ,BRACKETS>
220 <CHTYPE ("EOF" <1 <BACK .BRACKETS>> .ITEM)
223 <CHTYPE ("UNTERMINATED STRING" <> .ITEM)
225 (ELSE .ITEM-LIST)>>)>
226 <COND (<AND <NOT .STR?>
229 <COND (.BLANK? <AGAIN>)
234 <SET WAS-BLANK? .BLANK?>
237 <SET HASH? <XORB <ASCII .CHR> <ROT .HASH? 5>>>)>
238 <COND (.QUOTE? <SET QUOTE? <>>)
239 (<==? .CHR %<ASCII 92>> <SET QUOTE? T>)
240 (<==? .CHR !\"> <SET STR? <NOT .STR?>>)
243 <SET BRACKETS <REST <PUT .BRACKETS 1 .CHR>>>
244 <COND (<AND <==? .LEVEL 0> <==? .CHR !\<>>
245 <COND (<SET ITEM <DO-TLF>>
247 (<AND .HASH? <NOT .WAS-BLANK?>>
249 <XORB <ASCII !\ > <ROT .HASH? 5>>>)>
250 <SET LEVEL <+ .LEVEL 1>>)
252 <COND (<==? .BRACKETS ,BRACKETS>
254 <RETURN <CHTYPE ("EXTRA" .CHR .ITEM) FALSE>>)
258 <CALL BACKU .BRACKETS 1>>>>)>
259 <COND (<OR <AND <==? .LEFT !\<>
269 <RETURN <CHTYPE (.LEFT .CHR .ITEM) FALSE>>)>
270 <COND (<AND .HASH? <NOT .WAS-BLANK?>>
272 <XORB <ASCII !\ > <ROT .HASH? 5>>>)>
273 <COND (<==? <SET LEVEL <- .LEVEL 1>> 0>
275 <ITEM-CODE .ITEM .HASH?>
276 <SET ITEM-LIST (.ITEM !.ITEM-LIST)>)>
277 <SET HASH? <>>)>)>>)>>
279 <DEFINE DO-TLF ("AUX" (TYP <>) BUF NAM)
280 #DECL ((TYP) <OR ATOM FALSE> (BUF) <OR FIX FALSE>
281 (NAM) <OR STRING FALSE>)
282 <COND (<SET BUF <CHECK-FOR "SET">>
284 (<SET BUF <CHECK-FOR "SETG">>
286 (<SET BUF <CHECK-FOR "MSETG">>
288 (<SET BUF <CHECK-FOR "DEFINE">>
290 (<SET BUF <CHECK-FOR "DEFMAC">>
292 <COND (<AND .TYP <SET NAM <NEXT-TOKEN .BUF>>>
293 <VECTOR .NAM .TYP 0>)>>
295 <DEFINE CHECK-FOR (STR "AUX" BUF N (BUFFER ,BUFFER) (M ,N) BLANKS)
296 #DECL ((STR BUFFER BLANKS BUF) STRING (N M) FIX)
298 <COND (<L=? .M <LENGTH .STR>>
299 <SUBSTRUC .BUFFER 0 .M
300 <SETG BUFFER ,TOPBUFFER>>
302 <SET BUF <REST .BUFFER .M>>
303 <COND (<G? <SET N <CHANNEL-OP ,CHAN READ-BUFFER .BUF>>
306 (ELSE <RETURN <>>)>)>
307 <COND (<AND <FIRST? .STR .BUFFER>
308 <MEMQ <NTH .BUFFER <+ 1 <SET N <LENGTH .STR>>>>
309 <SET BLANKS ,BLANKS>>>
312 <DEFINE NEXT-TOKEN (O "AUX" N (START? <>) (M ,N) (BUFFER ,BUFFER)
314 #DECL ((BUF BUFFER BLANKS) STRING
315 (START?) <OR ATOM FALSE> (M O N) FIX)
320 <SETG BUFFER ,TOPBUFFER>>
322 <SET BUF <REST .BUFFER .M>>
323 <COND (<G? <SET N <CHANNEL-OP ,CHAN READ-BUFFER .BUF>>
325 <SETG N <+ .N .M>>)>)
326 (ELSE <SET BUF ,BUFFER>)>
327 <SET BUF <REST .BUFFER .O>>
330 #DECL ((CHR) CHARACTER)
332 <COND (<MEMQ .CHR <SET BLANKS ,BLANKS>>
337 (<MEMQ .CHR <SET BLANKS ,BLANKS>>
343 <DEFINE FIRST? (STR BUF)
344 #DECL ((STR BUF) STRING)