IMD 1.18: 6/11/2012 10:57:40 carousel microtools carousel toolkits version 2.0 builder toolbook files - cp/m-80 disk b 1 of 3 televideo 1983                AR AR AR AR  AR AR [CMTLIB 336oCMTLIB 344p !"#$LIBDEFS %&PUBLIB RAT'()*+,-.PUBLIB RAT/0123456er common /carch/ fname, fstat, fcount, errcnt, verbos, chead, typef, sizef, seeksz, ccount, intrls, rswich character fname (FILENAMESIZE, MAXFILES) # list of archive members integer fstat (MAXFILES) # mark meCHARS if count chars; # CSEEK if seek to end; # CLINES if await trailer integer intrls # YES if trailer required; # NO if trailer p3 ascii 08/30/83 12:30:00 # define(byte,integer*2) define(ON,) define(OFF,#) define(FOLDF,ON) # if on, fold file names to lower case ifdef(CPM,define(BIN,OFF)) # process binary files if on ifnotdef(CPM,define(BIN,ON)) iPUBLIB RAT789:;<=>PUBLIB RAT8?@ABR AR +CDERATDEF 8FGHIRATLIB 336JKLMNOPQRATLIB 336RSTUVWXYRATLIB 336CZ[\]^RATLIB 344_`abcdefmber when processed integer fcount # number of members integer errcnt # running error count integer verbos # verbose flag character chead (MAXLINE) # holds current header integer typerohibited; # DONT_KNOW if still optional integer rswich # YES if -r on command line #-t- carch 9_38 ascii 08/30/83 12:30:00 #-h- binbuf 0_102 ascii 08/30/83 12:30:00 ## bifdef(CPM,define(NOTBIN,ON)) ifnotdef(CPM,define(NOTBIN,OFF)) define(MAXFILES,200) # maximum number of files processable # Values for ccount: how to find end of archive element define(CCHARS,1) # use character countRATLIB 344ghijklmnRATLIB 344opqrstuvRATLIB 344%wxyREADME-B8SD)z{|RUNSYS 336}~RUNSYS 344#-h- list 0_31 ascii 08/30/83 12:30:00 carch binbuf ar.rat ar.doc #-t- list 0_31 ascii 08/30/83 12:30:00 #-h- carch 9_38 ascii 08/30/83 12:30:00 ## carch - common blocks for the archivf # holds current member type integer sizef # holds current member size integer seeksz(2) # size of member as a seek # offset integer ccount # Cnbuf - buffer for binary file reads (archiver) common /binbuf/ buf(BINARY_BUFSIZE) byte buf #-t- binbuf 0_102 ascii 08/30/83 12:30:00 #-h- ar.rat 248_107 ascii 08/30/83 12:30:00 #-h- defns 12_ define(CSEEK,2) # use seek offset define(CLINES,3) # check each line for trailer # Value for intrls: whether trailers expected on input define(DONT_KNOW,2) # alternative to YES or NO define(DELETE_CMD,LETD) # de   lete member from archive (by name only) define(PRINT_CMD,LETP) # print archive members define(READ_CMD,LETR) # ignore file sizes while # reading, use trailers only define(TABLE_CMD,LETT) # print table of contents dee of buffer for binary reads #-t- defns 12_3 ascii 08/30/83 12:30:00 #-h- ar 19_101 ascii 08/30/83 12:30:00 ## ar - archive file maintainer # This archiver can read archives in various formats. When # insisting upon it. # Option 'r' forces the archiver to ignore file sizes and to # infer file boundaries from header-trailer matchups alone. # It is assumed that if ANY archive element carries a trailer # then ALL of them do. Exceptions triggerand, 2, cmd, 1) # without MINUS else call scopy (comand, 1, cmd, 1) call fold (cmd) if (index(cmd, VERBOSE_CMD) > 0) { ifv = 1 verbos = YES } else verbos = NO if (index(cmd, READ_CMD) > 0) { ) call update (aname) else if (ift == 1) call table (aname) else if (ifx == 1) call extrac (aname, EXTRACT_CMD) else if (ifp == 1) call extrac (aname, PRINT_CMD) else if (ifd == 1) call delete (aname) , fdi) == EOF) { acopy = EOF break } if (fdo != ERR) call putch (c, fdo) } return end #-t- acopy 3_27 ascii 08/30/83 12:30:00 #-h- addfil 7_57 ascii 0fine(UPDATE_CMD,LETU) # update archive member define(VERBOSE_CMD,LETV) # controls amount of output define(EXTRACT_CMD,LETX) # extract archive member define(USAGE_MESSAGE,"usage: ar (dptux)[v][r] archive [files].") define(HEADER_it finds a file size in a header (either a character # count or a seek offset in local format), it uses that # size to read or to skip over the archive element. Then # it expects either an end of file, a valid header, or a # trailer to error messages. DRIVER(ar) include carch character aname (FILENAMESIZE), comand (MAXARG), cmd(MAXARG) integer ifd, ifp, ift, ifu, ifx, ifv, ifr data ifd, ifp, ift, ifu, ifx, ifv, ifr / 7*0 / integer getarg, length, index  ifr = 1 rswich = YES ccount = CLINES intrls = YES } else { rswich = NO intrls = DONT_KNOW } if (index(cmd, DELETE_CMD) > 0) ifd = 1 if (index(cmd, PRINT_CMD) > 0) ifp = 1 if (indeelse call error ("error in main: can't happen.") if (errcnt != 0) call error (".") DRETURN end #-t- ar 19_101 ascii 08/30/83 12:30:00 #-h- acopy 3_27 ascii 08/30/83 12:30:00 ## ac8/30/83 12:30:00 ## addfil - add file 'name' to archive open on 'fd' subroutine addfil (name, fd) character name (ARB) filedes fd include carch character head(MAXLINE), trail(MAXLINE) integer seksz(2), cpin filedes nfd STRING,"#-h-") define(TRAILER_STRING,"#-t-") define(NAMESIZE,20) # size of name allowed in header define(ASCII_STRING,"ascii") define(LOCAL_STRING,"local") define(BINARY_STRING,"binary") define(BINARY_BUFSIZE,1024) # siz match this element's header. If there is no # no file size recorded in the header, then it simply scans # for the proper matching trailer. In this way the # archiver exploits any available file size information # without necessarily string usage USAGE_MESSAGE errcnt = 0 call query (usage) if (getarg (1, comand, MAXARG) == EOF | getarg (2, aname, FILENAMESIZE) == EOF) call error (usage) call getfns if (comand(1) == MINUS) call scopy (comx(cmd, TABLE_CMD) > 0) ift = 1 if (index(cmd, UPDATE_CMD) > 0) ifu = 1 if (index(cmd, EXTRACT_CMD) > 0) ifx = 1 if (ifd + ifp + ift + ifu + ifx != 1 | ifr + ifv + 1 != length(cmd)) call error (usage) if (ifu == 1opy - copy size characters from fdi to fdo # NOTE - if fdo == ERR, copy to null integer function acopy (fdi, fdo, size) character getch character c integer fdi, fdo, i, size acopy = YES for (i=1; i <= size; i=i+1) { if (getch (c filedes open nfd = open (name, READ) if (nfd == ERR) { call putlin (name, ERROUT) call remark (": can't add.") errcnt = errcnt + 1 return } if (errcnt == 0) { call makhdr (head, nam   e, seksz) if (errcnt == 0) { if (verbos == YES) { call putlin (name, STDOUT) call putch (NEWLINE, STDOUT) } call putlin (head, fd) if (cpin (nfd, fd, seksz) == EOF) { errcnt = errcnt + 1 + (t1/128) return # total is already properly normalized. end #-t- addsek 1_127 ascii 08/30/83 12:30:00 #-h- bncopy 5_14 ascii 08/30/83 12:30:00 BIN ## bncopy - copy binary archive member BIN integer functiuf, len, fd2) BIN j = j - i BIN } BIN BIN return BIN end #-t- bncopy 5_14 ascii 08/30/83 12:30:00 #-h- cmpsek 5_18 ascii 08/30/83 12:30:00 ## cmpsek -- compare seek offsets, return -1, 0, or  lb(1)) cmpsek = isign(1, la(1) - lb(1)) else cmpsek = 0 return end #-t- cmpsek 5_18 ascii 08/30/83 12:30:00 #-h- cpin 1_76 ascii 08/30/83 12:30:00 ## cpin --- copy a file into an archiv 2_121 ascii 08/30/83 12:30:00 ## ctosek -- decode seek offset from string, increment i subroutine ctosek (in, i, offset) character in(ARB) integer i, offset(2) integer isseek, ctoi if (isseek(in(i)) == NO) call ejunk integer remove, amove, mkuniq string tprefx "arctemp" if (fcount <= 0) call error ("delete by name only.") afd = open (aname, READ) if (afd == ERR) call cant (aname) junk = mkuniq (tprefx, tname) tfd = call putlin (name, ERROUT) call remark (": unexpected end of file.") } call maktrl (head, trail) call putlin (trail, fd) } } call close (nfd) return end #-t- addfil 7_57 ascii 08/30/83 1on bncopy (fd1, fd2, size) BIN # Note: if fd2 == ERR, copy to NULL BIN filedes fd1, fd2 BIN integer size, i, j, len BIN integer readf, writef, junk BIN BIN include binbuf BIN BIN bncopy = YES BIN j = size BIN for (i=min(j,BINARY_BUFSIZE); i >1 # returns -1 if ab, 0 if a=b. integer function cmpsek (a, b) integer a(2), b(2) integer la(2), lb(2), a2, b2 la(1) = a(1) la(2) = a(2) lb(1) = b(1) lb(2) = b(2) call seknrm(la) call seknrm(lb) a2 = la(2) b2 e integer function cpin (fd, afd, seksz) filedes fd, afd integer seksz(2) integer sekcpy cpin = sekcpy (fd, afd, seksz) return end #-t- cpin 1_76 ascii 08/30/83 12:30:00 #-h- cpout rror ("ctosek: invalid seek offset.") offset(2) = ctoi(in,i) i = i + 1 # skip past UNDERLINE offset(1) = ctoi(in,i) call seknrm (offset) return end #-t- ctosek 2_121 ascii 08/30/83 12:30:00 #-h- delete  create (tname, READWRITE) if (tfd == ERR) call cant (tname) call replac (afd, tfd, DELETE_CMD) call notfnd call close (afd) call close (tfd) if (errcnt == 0) { if (amove (tname, aname) == ERR) { errcnt = 2:30:00 #-h- addsek 1_127 ascii 08/30/83 12:30:00 ## addsek -- add seek offsets subroutine addsek (a, b, total) integer a(2), b(2), total(2) integer t1 t1 = a(1) + b(1) total(1) = mod(t1, 128) total(2) = a(2) + b(2)  0; i = min (j, BINARY_BUFSIZE) ) BIN { BIN len = readf (buf, i, fd1) BIN if (len == EOF) BIN { BIN bncopy = EOF BIN break BIN } BIN if (fd2 != ERR) BIN junk = writef(b= lb(2) if (a2 >= 0 & b2 < 0) # Compare a2 & b2 as unsigned integers cmpsek = -1 else if (a2 < 0 & b2 >= 0) cmpsek = 1 else if (a2 != b2) # a2 & b2 have the same sign cmpsek = isign(1, a2 - b2) else if (la(1) != 1_18 ascii 08/30/83 12:30:00 ## cpout --- copy a file out of an archive subroutine cpout (afd, fd) filedes afd, fd call fromar (afd, fd) return end #-t- cpout 1_18 ascii 08/30/83 12:30:00 #-h- ctosek  7_57 ascii 08/30/83 12:30:00 ## delete - delete files from the archive subroutine delete (aname) character aname (ARB) include carch character tname (FILENAMESIZE) filedes afd, tfd filedes create, open integer errcnt + 1 call remark ("can't rename/move temp file.") } } else { call remark ("fatal errors - archive not altered.") junk = remove (tname) } return end #-t- delete 7_   57 ascii 08/30/83 12:30:00 #-h- done 2_31 ascii 08/30/83 12:30:00 ## done - see if all files have been extracted/printed integer function done (junk) integer i include carch if (fcount <= 0) return (NO) for (i=1;tring if (tstr(i) != str(i) ) return(NO) call skipbl (str, i) return ( equal(str(i), chead) ) end #-t- elend 3_20 ascii 08/30/83 12:30:00 #-h- extrac 9_13 ascii 08/30/83 12:30 call putlin (name, STDOUT) call putch (NEWLINE, STDOUT) } if (cmd == PRINT_CMD) call cpout (afd, STDOUT) else { fd = create (name, WRITE) if (fd != ERR) { /83 12:30:00 ## filarg - see if name is present in argument list integer function filarg (name) character name (ARB) include carch integer i integer equal if (fcount <= 0) return (YES) for (i = 1; i <= fcount;  character text (MAXLINE) string hdrstr HEADER_STRING string blanks " " string astr ASCII_STRING string lstr LOCAL_STRING BIN string bstr BINARY_STRING i = 1 call stcopy (hdrstr, 1, head, i) call stcopy (blanks, 1, headall stcopy (lstr, 1, head, i) head(i) = NEWLINE i = i + 1 head(i) = EOS return end #-t- formhd 8_93 ascii 08/30/83 12:30:00 #-h- fromar 15_69 ascii 08/30/83 12:30:00 ## fromar -- general rou i <= fcount; i=i+1) { if (fstat(i) == NO) return (NO) } return (YES) end #-t- done 2_31 ascii 08/30/83 12:30:00 #-h- elend 3_20 ascii 08/30/83 12:30:00 ## elend --:00 ## extrac - extract files from archive subroutine extrac (aname, cmd) character aname (ARB), cmd include carch character name (FILENAMESIZE), hdr (MAXLINE) filedes afd, fd filedes create, open integer filarg, geth call cpout (afd, fd) call close (fd) } else { call putlin (name, ERROUT) call remark (": can't create.") errcnt = errcnt + 1 call skipf (ai = i + 1) if (equal (name, fname (1, i)) == YES) { fstat (i) = YES return (YES) } return (NO) end #-t- filarg 3_5 ascii 08/30/83 12:30:00 #-h- formhd 8_93 ascii 08/3, i) call stcopy (name, 1, head, i) for (l = length(name) + 1; l <= NAMESIZE; l = l+1) { head(i) = BLANK i = i + 1 } for (l = sektoc(seksz, text, MAXLINE) ; l <= 10 ; l = l + 1) { heatine to read or copy an archive element subroutine fromar (fromfd, tofd) filedes fromfd, tofd # tofd == ERR if output to be discarded include carch character line(MAXLINE) integer getlin, elend, here(2), ans integer sekcpy, acopy BIN in- see if string is end of archive element integer function elend (str) character str (ARB) integer i integer equal include carch string tstr TRAILER_STRING for (i=1; tstr(i) != EOS; i=i+1) # look for trailer sdr integer done afd = open (aname, READ) if (afd == ERR) call cant (aname) while (gethdr (afd, hdr, name) != EOF) if (filarg (name) == NO) call skipf (afd) else { if (verbos == YES) { fd) } } if (done(junk) == YES) break } call notfnd return end #-t- extrac 9_13 ascii 08/30/83 12:30:00 #-h- filarg 3_5 ascii 08/300/83 12:30:00 ## formhd - form version-specific portion of header line subroutine formhd (head, i, name, type, seksz) character head (ARB), name (ARB) integer i, type integer seksz(2) integer l integer length integer sektocd(i) = BLANK i = i + 1 } call stcopy (text, 1, head, i) call stcopy (blanks, 1, head, i) if (type == ASCII) call stcopy (astr, 1, head, i) BIN else if (type == BINARY) BIN call stcopy (bstr, 1, head, i) else cteger bncopy if (ccount != CLINES) { # then we can copy without scanning for trailer if (ccount == CSEEK) ans = sekcpy (fromfd, tofd, seeksz) else { ifelse(BIN,ON, if (typef == BINARY) ans = bncopy (fromfd, tofd, sizef)     else ,) # ifelse ans = acopy (fromfd, tofd, sizef) } if (ans == EOF) { errcnt = errcnt + 1 call remark ("unexpected end of archive file.") } switch (intrls) # handle any trailer { case YES: # must find a trailerence of trailers is strictly monitored by # the cases YES and NO above. case DONT_KNOW: # might find a trailer { call note (here, fromfd) if (getlin(line, fromfd) == EOF) return if (elend(line) == YES) intrls = YES el 11_90 ascii 08/30/83 12:30:00 ## getfns - get file names into 'fname', check for duplicates subroutine getfns include carch integer ap, fp, len, i integer getarg, getlin, equal character line (MAXLINE) fp = 1  call error ("too many file names.") } else { FOLDF call fold (fname (1, fp)) fp = fp + 1 if (fp > MAXFILES) if (getarg (ap + 1, line, MAXLINE) != EOF) call error ("too many file d #-t- getfns 11_90 ascii 08/30/83 12:30:00 #-h- gethdr 17_0 ascii 08/30/83 12:30:00 ## gethdr - read archive header, prepare output header integer function gethdr (fd, ohdr, name) filedes fd characte errcnt = errcnt + 1 return (EOF) } call savhdr (hdr) len = getwrd (hdr, i, name) # pick up member name savei = i len = getwrd (hdr, i, text) # try to find member size if (type(text(1)) != DIGIT) {  { if (getlin(line,fromfd) != EOF) { if (elend(line) == YES) return # found correct trailer } } # fall through means trailer missing case NO: # trailer prohibited on input return # Note: this case DONT_KNOWse { intrls = NO call seek (here, fromfd) } return } } } else # copy while scanning for trailer { while (getlin(line, fromfd) != EOF) { if (elend(line) == YES) return else {  for (ap = 3; getarg (ap, fname (1, fp), FILENAMESIZE) != EOF; ap = ap + 1) if (fname (1, fp) == MINUS & fname (2, fp) == EOS) { while (fp <= MAXFILES) { len = getlin (fname (1, fp), STDIN) if (len == EOF) names.") } fcount = fp - 1 for (fp = 1; fp <= fcount; fp = fp + 1) fstat (fp) = NO for (fp = 1; fp < fcount; fp = fp + 1) for (i = fp + 1; i <= fcount; i = i + 1) if (equal (fname (1, fp), fname (1, i)) == r ohdr (ARB), name (ARB) include carch character text (FILENAMESIZE), hdr(MAXLINE) character type integer i, savei, j, len integer getwrd, equal, getlin, ctoi integer isseek string hdrstr HEADER_STRING string astr ASCI i = savei # back up: that wasn't a size # no valid size => must find trailer # Note: rswich makes no difference here. switch (intrls) # trailer already required? { case YES: # ok, no problem case NO: # trailer prohibited {  occurs at most once, that # is, at the end of the first archive element. It is # assumed that either all or none of the elements # carry a trailer. Therefore case DONT_KNOW # always resets intrls to YES or to NO. From then on, # the presif (tofd != ERR) call putlin (line, tofd) } } } call remark ("archive integrity in doubt - missing trailer.") errcnt = errcnt + 1 return end #-t- fromar 15_69 ascii 08/30/83 12:30:00 #-h- getfns  break fname (len, fp) = EOS # remove the NEWLINE FOLDF call fold (fname (1, fp)) fp = fp + 1 } if (fp > MAXFILES) if (getlin (line, STDIN) != EOF) YES) { call putlin (fname (1, i), ERROUT) call remark (": duplicate file name.") errcnt = errcnt + 1 } if (errcnt != 0) call error ("fatal errors - archive not altered.") return enI_STRING string bstr BINARY_STRING if (getlin (hdr, fd) == EOF) return (EOF) FOLDF call fold (hdr) i = 1 len = getwrd (hdr, i, text) if (equal (text, hdrstr) == NO) { call remark ("archive not in proper format.") errcnt = errcnt + 1 call putlin (name, ERROUT) call remark (": missing size.") return (EOF) } case DONT_KNOW: intrls = YES } ccount = CLINES sizef = 0 } else # there is a size here    { if (rswich == NO) { # take note of the size if (isseek(text) == YES) { j = 1 call ctosek (text, j, seeksz) ccount = CSEEK } else { j = 1 sizef = ctoi(text, j) ccount = CCHARS } } } len = -t- gethdr 17_0 ascii 08/30/83 12:30:00 #-h- isseek 3_66 ascii 08/30/83 12:30:00 ## isseek -- check whether next word is a seek offset integer function isseek (text) character text(ARB) integer i, ctoi, hdr (head, name, seksz) character head (ARB), name (ARB) integer type integer seksz(2) include carch integer i, now (7) integer gettyp character text (MAXLINE) string blanks " " type = gettyp (name) NOTBIN if (typ), 1, head, i) head (i) = NEWLINE head (i + 1) = EOS return end #-t- makhdr 7_28 ascii 08/30/83 12:30:00 #-h- maktrl 3_19 ascii 08/30/83 12:30:00 ## maktrl - make trailer line for an archive message if member isn't in archive subroutine notfnd include carch integer i for (i = 1; i <= fcount; i = i + 1) if (fstat (i) == NO) { call putlin (fname (1, i), ERROUT) call remark (": not in archive.") ave the file name len = getwrd(hdr, i, save) # skip the file size len = getwrd(hdr, i, save) # skip the file type call scopy (hdr, i, save, 1) # save all the rest call formhd (hdr, i, name, typef, offset) call scopy (save, 1, hdr, i - 1) # replacgetwrd (hdr, i, text) # pick up member type if (equal (text, astr) == YES) typef = ASCII else if (equal (text, bstr) == YES) { BIN typef = BINARY BIN if (ccount == CLINES) { errcnt = errcnt + 1 call putlin (name, ERROUT) j character type j = 1 call skipbl (text, j) if (type(text(j)) != DIGIT & text(j) != MINUS) return NO i = ctoi(text, j) if (text(j) != UNDERLINE) return NO j = j + 1 # skip past UNDERLINE if (type(text(j)) != DIGIT e == BINARY){ NOTBIN errcnt = errcnt + 1 NOTBIN call putlin (name, ERROUT) NOTBIN call remark (": binary file, can't handle.") NOTBIN return} call szseek (name, seksz) call formhd (head, i, name, type, seksz) mber subroutine maktrl (head, trail) character trail (ARB), head (ARB) integer i, j, len integer getwrd include carch string tstr TRAILER_STRING i = 1 len = getwrd (head, i, trail) # skip over header string  errcnt = errcnt + 1 } return end #-t- notfnd 2_95 ascii 08/30/83 12:30:00 #-h- remkhd 4_98 ascii 08/30/83 12:30:00 ## remkhd -- put file size (as seek offset) into existing hdr subre the rest return end #-t- remkhd 4_98 ascii 08/30/83 12:30:00 #-h- replac 10_17 ascii 08/30/83 12:30:00 ## replac - replace or delete archive members subroutine replac (afd, tfd, cmd) filedes afd,  call remark (": binary element, can't handle.") return (EOF) } } else typef = LOCAL call formhd (ohdr, j, name, typef, seeksz) call scopy (hdr, i, ohdr, j - 1) # copy rest of header return (YES) end #& text(j) != MINUS) return NO return YES end #-t- isseek 3_66 ascii 08/30/83 12:30:00 #-h- makhdr 7_28 ascii 08/30/83 12:30:00 ## makhdr - make header line for an archive member subroutine mak i = i - 1 # overwrite the NEWLINE left by formhd call stcopy (blanks, 1, head, i) call getnow (now) call fmtdat (text(1), text(25), now, 0) call stcopy (text(1), 1, head, i) call stcopy (blanks, 1, head, i) call stcopy (text(25 j = 1 call stcopy (tstr, 1, trail, j) call stcopy (head, i, trail, j) return end #-t- maktrl 3_19 ascii 08/30/83 12:30:00 #-h- notfnd 2_95 ascii 08/30/83 12:30:00 ## notfnd - print 'not found' meoutine remkhd (hdr, offset) character hdr(ARB) integer offset(2) include carch character save(MAXLINE), name(FILENAMESIZE) integer len, getwrd, i i = 1 len = getwrd(hdr, i, save) # skip the header string len = getwrd(hdr, i, name) # stfd character cmd include carch character hdr (MAXLINE), trl(MAXLINE), name (FILENAMESIZE) integer bfrhed(2), bfrfil(2), after(2), diff(2), afthed(2) integer gethdr, filarg, subsek, cmpsek while (gethdr (afd, hdr, name) != EOF   ) if (filarg (name) == YES) { if (cmd == UPDATE_CMD) call addfil (name, tfd) if (verbos == YES & cmd == DELETE_CMD) { call putlin (name, STDOUT) call putch (NEWLINE, STDOUT) } OUT) call error (": can't position new header.") } call seek (after, tfd) call maktrl (hdr, trl) call putlin (trl, tfd) } return end #-t- replac 10_17 ascii 08/30/83 12:30:00 #-h- savhdr fd, tofd, seeksz) filedes fromfd, tofd # tofd == ERR if output discarded integer seeksz(2) include binbuf integer readf, writef, len, here(2), target(2) integer subsek, sektoi, j, yet(2) sekcpy = YES call note (here, fromfd) calinput data call seek (target, fromfd) return end #-t- sekcpy 7_25 ascii 08/30/83 12:30:00 #-h- seknrm 2_6 ascii 08/30/83 12:30:00 ## seknrm -- normalize seek offset subroutine seknrm (offset) ter str(ARB) integer gitoc, addset sektoc = gitoc(offset(2), str, len, -10) + 1 if (addset(UNDERLINE, str, sektoc, len) == YES) sektoc = sektoc + gitoc(offset(1), str(sektoc), len - sektoc + 1, -10) sektoc = sektoc - 1 return e 1_22 ascii 08/30/83 12:30:00 ## skipf --- skip current archive element on file afd subroutine skipf (afd) filedes afd call fromar (afd, ERR) return end #-t- skipf 1_22 ascii 08/30/83 12:30:00 #-h- subsek call skipf (afd) } else { call note (bfrhed, tfd) call putlin (hdr, tfd) call note (bfrfil, tfd) call cpout (afd, tfd) call note (after, tfd) if (subsek(after, bfrfil, diff) < 0) { call putlin (na 2_4 ascii 08/30/83 12:30:00 ## savhdr - save current header subroutine savhdr (head) include carch character head(ARB) integer i, len integer getwrd i = 1 len = getwrd (head, i, chead) call skipbl (head, i) call scl addsek (here, seeksz, target) if (tofd != ERR) { # there's really a file to copy to for(;subsek(target,here,yet)>0;call note(here,fromfd)) { j = sektoi(yet) if (j == ERR | j > BINARY_BUFSIZE) j integer offset(2) integer o1 o1 = offset(1) if (o1 > 127) { offset(2) = offset(2) + (o1/128) offset(1) = mod(o1, 128) # maximum of 127 } return end #-t- seknrm 2_6 ascii 08/30/83 12:30:00 #nd #-t- sektoc 3_71 ascii 08/30/83 12:30:00 #-h- sektoi 2_37 ascii 08/30/83 12:30:00 ## sektoi - convert seek offset to positive integer if possible integer function sektoi(offset) integer offset(2) integ 4_11 ascii 08/30/83 12:30:00 ## subsek -- subtract seek offsets integer function subsek(subtrh, minuen, differ) integer subtrh(2), minuen(2), differ(2) integer top(2), bottom(2), cmpsek top(1) = subtrh(1) top(2) = subme, ERROUT) call error (": inconsistent seek offsets.") } call remkhd (hdr, diff) call seek (bfrhed, tfd) call putlin (hdr, tfd) call note (afthed, tfd) # check placement if (cmpsek(afthed, bfrfil) != 0) { call putlin (name, ERRopy (head, i, chead, 1) return end #-t- savhdr 2_4 ascii 08/30/83 12:30:00 #-h- sekcpy 7_25 ascii 08/30/83 12:30:00 ## sekcpy - copy file using seek offset to know when done integer function sekcpy (from= BINARY_BUFSIZE len = readf(buf, j, fromfd) if (len == EOF) { sekcpy = EOF break } len = writef(buf, len, tofd) } } else # just skipping (discarding) the -h- sektoc 3_71 ascii 08/30/83 12:30:00 ## sektoc -- convert seek offset to character string integer function sektoc (offset, str, len) # return no. of chars needed integer offset(2), len characer o2 o2 = offset(2) if (o2 >= 256 | o2 < 0) # that is, if some bit 8-15 is set sektoi = ERR else sektoi = (o2 * 128) + offset(1) return end #-t- sektoi 2_37 ascii 08/30/83 12:30:00 #-h- skipf trh(2) bottom(1) = minuen(1) bottom(2) = minuen(2) call seknrm (top) call seknrm (bottom) if (top(1) < bottom(1)) { # then borrow from top(2) top(2) = top(2) - 1 top(1) = top(1) + 128 } differ(1) = top(1) - bottom(1) differ(2) =    top(2) - bottom(2) return (cmpsek(subtrh, minuen)) end #-t- subsek 4_11 ascii 08/30/83 12:30:00 #-h- szseek 2_59 ascii 08/30/83 12:30:00 ## szseek - find size of file in terms of a seek offset subroutine szaracter hdr (MAXLINE), name (FILENAMESIZE) integer gethdr, filarg integer done afd = open (aname, READ) if (afd == ERR) call cant (aname) while (gethdr (afd, hdr, name) != EOF) { if (filarg (name) == YES) ilename call putlin (name, STDOUT) if (verbos == YES) { # print other info only if asked for (; chead(i) != NEWLINE & chead(i) != EOS; i = i + 1) call putch (chead(i), STDOUT) } call putch (NEWLINE, STDOU # try to create a new archive afd = create (aname, READ) # afd = create (aname, WRITE) # if (afd == ERR) # call cant (aname) # call close (afd) # close and reopen to mark EOF # afd = open (aname, READ) i(amove (tname, aname) == ERR) { errcnt = errcnt + 1 call remark ("can't rename/move temp file.") } } else { call remark ("fatal errors - archive not altered.") junk = remove (tname) } returnd versions, and data about the contents can be listed. If a minus sign ('-') is given as a file name, further file names are read from the standard input, one file name per line. Files that are to be added to an archive must exist as files with tseek (name, offset) character name(ARB) integer offset(2) filedes fd, open fd = open(name, READ) if (fd == ERR) call cant (name) call seek (END_OF_FILE, fd) call note (offset, fd) call close (fd) return end #-t- szseek call tprint if (done(junk) == YES) break call skipf (afd) } call close (afd) call notfnd return end #-t- table 4_37 ascii 08/30/83 12:30:00 #-h- tprint 4_7 ascii 0T) return end #-t- tprint 4_7 ascii 08/30/83 12:30:00 #-h- update 10_117 ascii 08/30/83 12:30:00 ## update - update existing files, add new ones at end subroutine update (aname) character aname f (afd == ERR) call cant (aname) } junk = mkuniq (tprefx, tname) tfd = create (tname, READWRITE) if (tfd == ERR) call cant (tname) call replac (afd, tfd, UPDATE_CMD) # update existing members for (fp end #-t- update 10_117 ascii 08/30/83 12:30:00 #-t- ar.rat 248_107 ascii 08/30/83 12:30:00 #-h- ar.doc 82_80 ascii 08/30/83 12:30:00 .so manhdr .hd AR (1) 06/06/83 archive file maintainer .she name given. Files that are extracted from an archive will be put onto files with the name given. Files that are added to archives can, of course, be archive files themselves. There is no (theoretical) limit to the number of files that can be nest 2_59 ascii 08/30/83 12:30:00 #-h- table 4_37 ascii 08/30/83 12:30:00 ## table - print table of archive contents subroutine table (aname) character aname (ARB) filedes afd filedes open ch8/30/83 12:30:00 ## tprint - print table entry for one archive member subroutine tprint include carch character name (FILENAMESIZE) integer i, len integer getwrd i = 1 len = getwrd (chead, i, name) # grab the f(ARB) include carch filedes afd, tfd filedes open, create integer fp, junk integer remove, amove, mkuniq character tname (FILENAMESIZE) string tprefx "arctemp" afd = open (aname, READ) if (afd == ERR) {  = 1; fp <= fcount; fp = fp + 1) # add new members if (fstat (fp) == NO) { call addfil (fname (1, fp), tfd) fstat (fp) = YES } call close (afd) call close (tfd) if (errcnt == 0) { if y ar [-](d|p|t|u|x)[v][r] arcname [files] .ds Ar collects sets of arbitrary files into one big file and maintains that file as an 'archive'. Files can be extracted from the archive, new ones can be added, old ones can be deleted or replaced by updateed this way. Thus ar provides the utility necessary to maintain tree-structured file directories. Ar is invoked by the command line .ti +10 ar command arcname [optional filenames] where 'command' is any one of 'dptux', optionally concatenated    with 'v' and/or with 'r', specifying what operation to perform on the archive file named 'arcname'. (For consistency with other tools, the command may be preceded with a minus "-" sign.) The possible commands are: .in +10 u - Update named archivechive. p - Print named files on standard output. Using the 'v' option will cause the file name to precede the file. r - Read a (possibly) damaged archive. This option causes the archiver to try harder than usual to read a spoiled archive. (Editithe above commands, and will cause the archiver to print additional information, generally file names, on the standard output. Its specific action for each command has already been described. .in -10 The optional filenames in the command line specand chap3 .sp .ti -5 ar -xv source rtnA rtnB .br From the archive file "source", extract the members "rtnA" and "rtnB" and put them into files with the same name. Print the member names as they are extracted. (The minus sign "-" preceding the "xv"e (possibly invalid) format information stored in "arc". .in -5 .fl A file whose exact name is based on 'arctemp' is created and subsequently deleted for each run. .sa The Unix commands 'ar' and 'ls' in the Unix manual .di archive not in proper fominate each file by a special line called a "trailer". The message is caused by the lack of a trailer line when one was expected. This archiver can read old-style archives a la Kernighan & Plauger, which lack trailers. However, if ANY archive elemen by replacing existing files or adding new ones at end. If the 'v' option is used, file names will be printed on the standard output as files are written to the new archived file. x - Extract named files from archive. Put onto file of the same nameng an archive can spoil its format. Some other archivers create archives in formats that this archiver has trouble reading.) Archives created or updated by this archiver will not need this special handling unless they are later spoiled. t - Print tify individual files that may participate in the action. If no files are named, the action is done on ALL files in the archive, but if any files are explicitly named, they are the ONLY ones that take part in the action. (The 'd' command is an except is optional.) .sp .ti -5 ar t library .br List all the members of the archive file "library". .sp .ti -5 ar p book | format .br Extract all the members from the archive "book" and send them to the formatter. .sp .ti -5 ar uv somefile a b c |rmat .in +10 The basic problem is that archive didn't find a header line where one was expected. Typical reasons include misspelling the file name, using an existing file (not in archive format) on a creation run, and referencing an archive file that is found to have a trailer, then this archiver reports an error unless ALL elements have a proper trailer. .in -10 binary element, can't handle .br binary file, can't handle .in +10 This version of the archiver isn't built to handle binary fil. If the 'v' option is added, file names will be printed on the standard output as files are extracted. d - Delete named files from archive. If the 'v' option is used, file names will be printed on the standard output as they are deleted from the arable of archive contents. Normally, the table will contain only the file name. If the 'v' option is used, the table will also contain the file's length, type, and date and time of last change. v - Verbose. This command may be concatenated to any of ion--files may be deleted only by specifying their names.) .sp Binary files are NOT allowed in an archive. .ex .in +5 .fi .ti -5 ar u book chap1 chap2 chap3 .br Create an archive file called "book" and insert 3 members into it -- chap1, chap2,  rm - .br Update members "a", "b", and "c" in archive file "somefile", and then delete them from the file system. .sp .ti -5 ar uvr arc one two three .br Insert three members into the archive file "arc", while ignoring (and correcting) some of tht has been modified directly (say with the editor). For the latter case, try again using the 'r' option. .in -10 archive integrity in doubt - missing trailer .in +10 Some archives (including all those produced by this version of the archiver) teres, and it distrusts archive elements marked "binary". .in -10 can't rename/move temp file .in +10 The scratch file named above was successfully generated but could not be renamed or copied to its final destination. Possibly there isn't enough room    for the new file, or there is some other file system problem. .in -10 ctosek: invalid seek offset .in +10 This indicates a logical error in the portion of code which extracts seek offsets from header records. .in -10 delete by name only .in . An archive is never altered unless EVERYTHING has run properly. .in -10 too many file names .in +10 The maximum number of files that can be handled is set by the parameter "MAXFILES" in the source code. .in -10 unexpected end of archive file the archiver is in error. Possibly the command is wrong or the archive file name has not been given. .in -10 'filename': can't add .in +10 The file specified by 'filename' doesn't exist or can't be opened (e. g. is locked). .in -10 'filename' After processing an archive element without a trailer, this archiver insists that ALL elements in this archive must lack trailers, and therefore that they must have proper sizes recorded. But now it has found an element with no size recorded. This cDavid Hanson (University of Arizona). .bu With this version only TEXT files can be archived. When the update and print commands are used, the files are updated or printed in the order they appear on the archived file, NOT the order listed on the ecorded sizes and to rely strictly on header-trailer matchups to delimit elements when reading an archive. In any event, it is assumed that either ALL or NONE of the elements in an archive carry a trailer, and exceptions are treated as format errors. +10 For user protection, files are allowed to be deleted from an archive only by specifying each file name. .in -10 duplicate file name .in +10 A file was listed more than once when calling the archiver .in -10 error in main: can't happen .in .in +10 The last element in the archive had a size recorded, but the archive ended before the whole element was read. This may reflect a truncated archive or an incorrect notation of file size. Try option 'r' to aid reading the archive: if it works: can't create .in +10 The archiver could not generate a local file by the name of 'filename'. Probably the archiver's internal file buffer space has been exceeded. .in -10 'filename': can't position new header .br 'filename': inconsistent seean result from concatenating archives of differing styles, or from otherwise monkeying with archive internals. .in -10 'filename': not in archive .in +10 The archiver could not locate the file specified by 'filename' in the archived file. .in -10 command line. This version creates archives having headers and trailers. Each header records the file size in terms of seek offsets in a format peculiar to this archiver and to the CP/M-80 implementation of the tools. Other archivers attempting to r The Unix archiver allows files to be positioned in the archive, rather than simply added at the end as ar does. This is done by adding the following commands: .br .in +10 m - Move specified files to end of archive ma posname - Move specified f +10 This indicates a logical error in the portion of code which parses the command line. See the main program. .in -10 fatal errors-archive not altered .in +10 This message is generated whenever one or more of the other errors have been detected, then the cause was the latter. Something indeed may have removed data from the archive to cause the invalid format, but if so it wasn't mere archive truncation. .in -10 usage: ar (dptux)[v][r] arcname [files] .in +10 The command line passed tok offsets .in +10 The archiver was navigating around an existing archive or the scratch file using seek offsets, and detected a mistake. This is a profound malfunction, probably reflecting a coding error. .in -10 'filename': missing size .in +10 .au Original code from Kernighan and Plauger's 'Software Tools', with rewrites by Allen Akin (Georgia Institute of Technology), Debbie Scherrer (Lawrence Berkeley Laboratory), Philip Davidson (for Carousel MicroTools), and minor changes suggested by ead these archives should ignore the file sizes and use only the header-trailer pairs to delimit the elements. This version uses the file size (if any) recorded in the header, and reports resulting discrepancies. The 'r' option forces it to ignore riles to position after file 'posname' mb posname - Move specified files to position before file 'posname' r - Replace specified files and place at end of archive ra posname - Replace files and place after file 'posname' rb posname - Replace fil   es and place before file 'posname' .br .in -10 There are some discrepancies between the Unix version of ar and this version. Unix uses 'r'--replace instead of 'u'--update. Unix also requires the user to specify an additional command 'n' when creat^2 v!S94+Pn:*r';M!95O3@!g:Z5)x0-@&b / %?3@%@W1h,a 0b*Ġfx0?@ %%`h}\X݄0 G4@,N>  q83lhsփֱ>/f5-` |^2 v>(  X,aLX*S)xǘcz1ÀMf!,;1b@0Š cBè`!f CĜDT˘ CTOID5D8pGETLINdtUEu$HEQUAL0!bXFH*za$e("Fj2ZJde 'aQ9ZpTd#3X( G@2rz$RT dԴ$rHy=I1% (QSDX\AK@R0 pPZ. 9@%h4A-%`; M57Pȋp(47q`Pp:8< U@",``0`h*`,+udE@X<* Xa0V?5` |C8 p4`0HGO31EtXbj* ڂɔFN2rbJr\ed"))"W#I1MRpSP dT5Hy=I1% (QSDX$"`H hFf7B0v"j*o fcxϠukS[V f,1/`E8ps֍` |^2` v.7Ny@m2M#ȺZing a new archive. #-t- ar.doc 82_80 ascii 08/30/83 12:30:00 n. Unix uses 'r'--replace instead of 'u'--update. Unix also requires the user to specify an additional command 'n' when creatUSdtUDThy=I1% )ӑQ/ %>(S"`M!95N(ӕ@9X\RTK2 qX Z.,K@%ŠIh-e\b K qZ.4*K@%ƠYhA-e \rXK qZ.<+K@%Ǡ h-%\Lp fj?e u` |^2 vĠ(; =9%0 5M` |^2 v*Ġ/ %?DY`4d~* LG@GXkS`[eX`[#7qHGDY#@0^Jf`X0g!# VX`uF>/ EU4y=I1%E@b,*`Bh:X$&P)HjQPUSH 5y=I1% (QSDX$"`H hFf7B0v"j*o fcxK0|U@XTX,* E@8D &P.0 H(j 5?5 SS e$THy=I1% (QSDXU[f?", 8p(f:!L_`ư@&5 @ƘETT,ɩɨd ꪊdpHd0Pkvɩh*H䓀PR d5Hy=I1% (QSDX$B3@ >֮cѬOX<n%3 NtMyt2 q! b  UiSy8g>֮cz?XlnX\Fa0ȋ B?2"À&)b?Xg!VLc@X\E@2ɨILENTE4tUHERRORTĔPt$%"NP eE$5Hy=I1% (QSDX$"`3@V ?Xfcy*o='Kr rZ.D(K@%Ƞh-#%\EK  rXRZ.LK@%ɠh8-'et\DK r2Z.T$@%ʠ9hX-+%\EK R r Z.\'@%ˠ9hx-/%79X Yn3e\fbP Pvzr2J? ap$kZe |AiʊI|Lm@GXkS`[V%xi)2" #a#$Vaf01b@OYnX#ᤧPȋ0nFONFIG`ͼ`,0c:Ā `CX݄ (F IOa; =9%À 60 @ Ff7X$7sj?e 1,`h"2ɘUNLINKdDHDSFREEG@2*jrz$ dDHy=I1% (QSDX$U@31RQSd#3X( G@2r¢rz$ e%dHy=I1% (QSDX$U@31RQSxd '3Z:! b6*+hi2"Šb*`bV uxFrb fc{U@b3&Pfh誓@2BQTԦ 8S de$T5Hy=I1% (QSDXU@31RQSd#3X Ub~紩3@W1hXn :Z5)x-@`LU31RQSxd#3XLF}\X݄ hFf7B<2"D&HU H4a01_a0Xfcy*o=' :ZZe@ U31E&5EX\*`3@W1h=k,:a.#uhFf7DXlU"   [U@",<*` fc{Ub3 X\p@&;V`L2019Q"2U& 1 8PSSՑ`TdXy=I1%E@b,!~X#X$ G X6 Yu6>!̠ ax3-@2f' XOYnXde@8dO",:̠zo QSDX$#ᤧ V f,:` a` c?݄_dJ?H 4d:!S4Ai(pUa)@a8D@d#!@A -962nI#( 2f 8UV dtE$Uy=I1% (QSb/ %p(4;d.30s֍` |e U@Ў:`Pm-X!Ā (E@IOј.)Ȉ(c FC@" d*%&LJ@0CTOC@hih*X2Pf@1 8`dtE%$y=I1% (QSDX$"`~␌4ȀCD$d$D2D|5bdtUDDYUT dtUEEy=I1% )0SX$#ᤧ V f,: bkX`kX88L! ax-@x`Lu@ư>2')}QOppC@[" `L@U@1 5dtUEEd͡ ͠X=k,ao ,  C@`4o .3(s֍` |^2Ƞ v.FK[@90 X@fpx]>g tE@5#^8`X# t2~7q`Pm` 7pOXm@6C@u GpVGfg.3(l3j^s֍` |^2Ƞ v!L1`p0  \.r6~@GXx2@ ;j1d&:` f8 &$Lo` 1#8 Y9]1%:2,US4`YAUQ%9R3SPT)LkTSd4Ty=I1% )0SX$#ᤧ ifp4%3-@LbXdx2 :1a5OYnX1f@>/fPh:@|kSe[>h" x" H4aPF}\X(݄ &cX,F#>֮cѬOYnX1 f@>2̠9L/f`%<\`RK@ q>Z.3KC%ƀ hxA-p|<\pWK@ qZ.;KC%ǀ9hx-<U@31RQSxdE8$UDh#b  dX3@! Eb1s֍` |^2@ v! b*Ā'+>֮cѬOXn"`odE Ub3 C,D1H`oy dEX! HFf7B<2" b ho ,L}\]>/b,ɘ̀ 0R)B`ˬU@312" xG x4X#@",^X,*  RS TTHy=I1% )0S⚀ =9%(QSe ih(-%\sK pxZ.2K@% YhH- %@$\*rK pZ.;@% )hh- %\:nK2 pZ. 6K@% h-%@tRo`P pf7qHGDY| #3o8#",!"* .:@|)@ȋ#iHF86.3B>2""ͩ#o ␏ 8k#3k@8#",@!* !,81t` 0|` kV f `Xp݄_dE?H&P$*i đ 5*d4T`d44y=I1% )ӑQX$"`U@sփֱ>2À~k -,:aUbb," [ "  @ `!4#0vzr2J?!pf 0b~*&)`"4ͷ. 2e `0cFB@r* ,g'"FVr*jz$g`)" FH2 Zrle !!,FUj2ze'[@c5=Ypd44E(y=I1%E@X2e`p 5 d44E)PTT5tD(y=I1% )ӑQ/ %>('#b`*&f,D#b V"j?c|e UnV @*qV"LjXV`Pȋ +Y*Ā fcx B0v"j*o Dd0h@8@W1hYnXMVf 0b*BhG (6GEXR@E@20 PfHdQ Hjq 1c #9UA-94c:M}#IAI6pU`dtUDDXy=I1% (QSb/ %)Pm`0HGO31Ϯg!i`Fp(6@@`pq>֮cz?YnX Rf,"}\X݄_da@X,5)x-@D`h*` E@&3"#a[U",<! b"{JI8q:X$O@b"a`mJ݄0 L~&+X,&PDjqpq誊H Ɉ I13    &!f$Lh FOLD@2bzzlRST`dԵTy=I1% )ӑQX$"`t\ $K@p pZ.KA  X K0hL ONFIG UX`\4@%0ͣ"À -7)m/`X2e2fTPQU$TDhy=I1%E@b,`4ha VuXFf7Ҧp}\O݄ hCXa@a 0 baPaP XHD&) $+>֮cѬOXPn/ 0 XHc*@,ɔ FO2:*A$P:TPQSSՑ`e$TdXy=I1% )0pRZ."@%àhx-%\BMK2 qbZ.$"K@%ĠYh-%\RPK2 qXRZ.,$K@%Š h-eĴ\bTK qZ.4!@%ƠIh-%\rK q&Z.<)@%ǠIhCC@b~:ְ>/dpP?fԀf3@LbFA2* , e$T$8EXITUDĔPPUTINTUtĔ`PUTCH44Y t)"+NUS e4UDHy=I1% )0SX$"`X$#30^J xkS,"*>! ax  d$4Hy=I1% )0SX"`X #30^J e 1"`oz d#3X#X5)x-@fcx#",* )Ff7X$#9 Ff7B>2"`*`1U31R V 9B~`UXF" :@b,1`0U@nV U+>&P>/*sP2>f1 I8QTTutD(y=I1% )ӑQX"`; =9%΀8@h#`@ȋ *@qVPȋ B(wa U~Ys֍` |^2 v* 8SdTE(y=I1% (QSb =9%E@b,.A%h8D- 0\(?K@p pZ.A%h8d- %:X,#9:ϠukS[ " fcx#a)ȋ@ Xg!V ?HGDXxUbS@ M54E@0^J`hXTn/2f"X0ZAXaPaPV pȋ +XX* fcx B0v"j*o fcx U@iSy8g>֮cѬO݄ #",,!b,sXLRoa0dp`4a IO@ OX-,\RKR r>Z.D)@%ȠYh-;M!95O3@g:Z5)x#-@ a7 ΂eMcIn6MAtC44d~0o ,8#@@8p(4PfӠ"`|':ZZ#-@ -@`LU3>2 g:Z5)S XHnX$#3?2"U~?Ze@ U@31#@",> xc *`x]>g`LŌU@31#",~s>X<*  X,"a~`U" @e4$*,p1Jd@#'QH2Q#71UM"kHi $SSI e$THy=I1%E@b,!b`*V f* WpU@b82ep HD0bhMQ@#I94pTӓI eUHy=I1%E@b,* x]>ga g>X f, f 0bX! bɔ FF"Jz(P jsXGWDIRI d4Hy=I1% (QSb =9%)0SX$"`/ %? H4kS,Pa dF_l kS,Pa!]>/bW ,1F`Lİ|?}eX,#3!aVb q-t! B&PH1x#!`MRdDLB `PACKNMU44ht'"")NT e$Hy=I1%E@b,`4h3@Ys֍` |^2 v* bD*V f,ɔ FL2:*bJtd@$*,J*z$:T'P0* ͨREMOV$d4HPPACKNMT44Yt)""USe4UDThy=I1% )ӑQM!9X(ST  9QI1\TK2 pX Z. K@% h8-e\"EK pZ.*K@% YhX- %\2K2 B< 2" Y|QX F"` :1sPmLP!fPh! 4(ʹ` ! v! d4͸ ! ۦ! ۔Rͻ ! ! ^; !` ! :ӕOYn8C0C@HbB:ӑQ(OYn8B*2"zY$:US'SU eE$UHy=I1%E@X2e`p 5 eE$UIԒUQeu$DThy=I1%E@b,`4h`VuXFf7Ҧp}\O݄ x* `X 3@VxLLX,#3X(eUD4It+$"NI(X,!€ F",0+uXdEXHϮ`y"AO4waXDXp|:ab,>2[7wX X$2~sXD kS[`0e`Ƥu>/a`[U",0> U@b,> U@nV  UFXh|ae,D*QSx E hG@hS 3i([1ax]>gE"HD FXtObbR E @W1hOXnXT#@",R~sX~ke U@8t2" V);A@EXTF"  ;1@,>   pxONFIG` ZAX@݄q4aK([#h+>֮cѬOXnX|O@݄ XFf7bb* f`)x-@2  LWXuc:ÀaҰ $2@ ; 1aOXn,ᤧz?,aE@`dBĈU@2 pt$*,TRSeDU$Ԕy=I1%E@%`Ih-e``Դ \@Vup4d#! Q=bMD#QI5%:pRU dԵDy=I1%E@b,!X" 4`j?c|^2 v>USdtUDThy=I1% )ӑQ/ %>(S"`M!95N(ӕ@9X\RTK2 qX Z.,K@%ŠIh-e\b K qZ.4*K@%ƠYhA-e \rXK qZ.<+K@%Ǡ h-%\Lp fj?e u` |^2 vĠ(; =9%0 5M` |^2 v*Ġ/ %?DY`4d~* LG@GXkS`[eX`[#7qHGDY#@0^Jf`X0g!# VX`uF>/ZpT EU4y=I1%E@b,*`Bh:X$&P)HjQPUSH 5y=I1% (QSDX$"`H hFf7B0v"j*o fcxK0|U@XTX,* E@8D &P.0 H(j 5?5 SS e$THy=I1% (5` |C[f?", 8p(f:!L_`ư@&5 @Ƙ#" A.c" IKii*I@ I h H1 t&#NPR d5Hy=I1% (QSDX$B3@ >֮cѬOX<n%3 N&<#L{@GX(+̀@p5誊H Hds xcFa2"z"$4dd2Hh UPPERр5D9t&'NT d4Hy=I1% )0S@ M54E@  xE @W1h=k,*aSd,*a 0bd* fcx B8`PVX2"z@X8B0:X<o 紩3@W1h=c S݄ 8*``P[U@'V;8EXF" :z1y`p[U",>xUb,*V =MZ@|^2 v*XDX<U@nV X<*1`P0hbRKr rZ.D(K@%Ƞh-#%\EK  rXRZ.LK@%ɠh8-'et\DK r2Z.T$@%ʠ9hX-+%\EK R r Z.\'@%ˠ9hx-/%79X Yn3e\fbP Pvzr2J? ap$kZe |AiʊI|Lm@GXkS`[V%xi)2" #a#$Vaf01b@OYnX#ᤧPȋ0nFONFIG`ͼ`,0c:Ā `CX݄ (F IOa; =9%À 60 QSDXU@ Ff7X$7sj?e 1,`h"2ɘUNLINKdDHDSFREEG@2*jrz$ dDHy=I1% (QSDX$U@31RQSd#3X( G@2r¢rz$ e%dHy=I1% (QSDX$U@31RtMyt2 qd '3Z:! b6*+hi2"Šb*`bV uxFrb fc{U@b3&Pfh誓@TU%$)t&)NS de$T5Hy=I1% (QSDXU@31RQSd#3X Ub~紩#,!X4U@/7dZ@|^2  v*XDXXU!; M57DX`#@X` 8T,Xhn,1`0Řu` |^2  v*,ɘLM@X<F" :1_,ɔ Fa2jzJ$H:T'TU`d4EEy=I1% )0SX$U@31#*`V x ba T`pTzNXPXH* (TDUp9jsSMKPATHU@'V;8EXF" :z1y`p[U",>xUb,*V =MZ@|^2 v*XDX<U@nV X<*1`P0hbR^2 v!S94+Pn:*r';M!95O3@!g:Z5)x0-@&b / %?3@%@W1h,a 0b*Ġfx0?@ %%`h}\X݄0 G4@,N>  q83lhsփֱ>/f5-` |^2 v>(  X,aLX*S)xǘcz1ÀMf!,;1b@0Š cBè`!f CĜ#%=A:2c&Q Q=2US8 Q]I3QTUPS&%@ 1 `PFH*za$e("Fj2ZJde 'cQ9QSxd#3X( G@2rz$RT dԴ$rHy=I1% (QSDX\AK@R0 pPZ. 9@%h4A-%`; M57Pȋp(47q`Pp:8< U@",``0`h*`,+udE@X<* Xa0V?3@W1hXn8 p4`0HGO31EtXbj* ڂɔFN2rbJr\ed"))"W#I1MRpSP dT5Hy=I1% (QSDX$"`H hFf7B0v"j*o fcxϠukS[V f,1/`E8ps֍` |^2` v.    7Ny@m2M#ȺZ! b  UiSy8g>֮cz?XlnX\Fa0ȋ B?2"À&)b?Xg!VLc@X\E@2ɨILENTE4tUHERRORTĔPt$%"NP eE$5Hy=I1% (QSDX$"`3@V O",:̠zo ifp4%3-@LbXdx2 :1a5OYnX1f@>/fPh:@|kSe[>h" x" H4aPF}\X(݄ &cX,F#>֮cѬOYnX1 f@>2̠/ %p(4%<\`RK@ q>Z.3KC%ƀ hxA-p|<\pWK@ qZ.;KC%ǀ9hx-<U@31RQSxdE8$UDh#b  dX3@! Eb1s֍` |1% (QSDX$"`~␌'+>֮cѬOXn"`odE Ub3 C,D1H`oy dEX! HFf7B<2" b ho ,L}\]>/b,ɘ̀ 0R)B`ˬU@312" xG x" `L@U@1 5dtUEE RS TTHy=I1% )0S⚀ =9%(QSe ih(-%\sK pxZ.2K@% YhH- %@$\*rK pZ.;@% )hh- %\:nK2Pm` 7pOXm@6C@u tRo`P pf7qHGDY| #3o8#",!"* .:@|)@ȋ#iHF86.3B>2""ͩ#o ␏ 8k#3k@8#",@!?Xfcy*o=' :Z5)x-@`LU31RQSxd#3XLF}\X݄ hFf7B<2"D&HU H4a01_a0Xfcy*o=' :ZZe@ U31E&5EX\*`3@W1h=k,:a.#u9L/f`pf 0b~*&)`"4ͷ. 2e `0@d$!""y@"z*teh)"Fv2*r i$d( &Rrz$eP!,Xjbz,:PSSՑgd44E(y=I1%E@X2e`p 5 d44E)PTT5tD(y=^2@ v! b*Ā'#b`*&f,D#b V"j?c|e UnV @*qV"LjXV`Pȋ +Y*Ā fcx B0v"j*o Dd0h@8@W1hYnXMVf 0b*BhG (64X#@",^X,* E@20 PFY2"z"f!"'!z"zgD""LX@3TӓI&9`5dtE%$U`dtUDDXy=I1% (QSb/ %)Pm`0HGO31Ϯg!i`Fp(hFf7DXlU"[U@",<*` fc{Ub3 X\p@&;V`L2019Q"2U& 1 8PSSՑ`TdXy=I1%E@b,!~X#X$ G X6 Yu6>!̠ ax3-@2f' XOYnXde@8dI1% )ӑQ/ %>(QSDX$#ᤧ V f,:` a` c?݄_dJ?H 4d:!S4Ai(pUa)@a8D@d#!@A -962nI#( 2f 8UV dtE$Uy=I1% (QSbGEXR@;d.30s֍` |e U@Ў:`Pm-X!Ā (E@e&$FS"z*tf$$'K*Jr"* &= d*P I1(0CTOC@e!*FZrzr #.`5 1=MkH*`dtE%$y=I*0}s?7X DX8E@2@PEEKe4ȀCD$d$D2D|MY#Q9pUT dtUEEy=I1% )0SX$#ᤧ V f,: bkX`kX88L! ax-@x`Lu@ư>2')}QOppC@[)h-!@B3@hd͡ ͠X=k,ao ,  C@`4o .3(s֍` |^2Ƞ v.FK[@90 X@fpx]>g tE@5#^8`X# t2~7q`6@@`pq>֮cz?YnX RGpVGfg.3(l3j^s֍` |^2Ƞ v!L1`p0  \.r6~@GXx2@ ;j1d&:` ɩ(d ` #8 Y9]1%:2,US4`YAUQ%9R3SPT)L    kTSd4Ty=I1% )0SX$#ᤧ V f `Xp݄_dE?H&P$*i đ 5*d4T`d44y=I1% )ӑQX$"`U@sփֱ>2À~k -,:aUbb," "À -7)m/`X2ee5D4xt&$SdTE(y=I1% (QSb =9%E@b,.A%h8D- 0\(?K@p pZ.A%h8d- %:X,#9:ϠukS[ "  XHc*@,ɔ FO2:*A$P:TPQSSՑ`e$TdXy=I1% )0S@ M54E@0^J`hXTn/2f"X0ZAXaPaPV pȋ +XX* fcx B0v"j*o fcx U@iSy8g>֮cѬO݄ #.4!@%ƠIh-%\rK q&Z.<)@%ǠIh-,\RKR r>Z.D)@%ȠYh-;M!95O3@g:Z5)x#-@ a7 ΂eMcIn6MAtC44d~0o ,Hy=I1% )0SX$"`X$#30^J xkS,"*>! ax -@`LU3>2 g:Z5)S XHnX$#3?2"U~?Ze@ U@31#@",> xc *`x]>g`LŌU@31#",~s>X<*`1U31R V 9B~`UXF" :p1Jd@#'QH2Q#71UM"kHi $SSI e$THy=I1%E@b,!b`*V f* WpU@b82ep HD0[ "  @ `!4#0vzr2J?!f,"}\X݄_da@X,5)x-@D`h*` E@&3"#a[U",<! b"{JI8q:X$O@b"a`mJ݄0 L~&+X,&PD fcx#a)ȋ@ Xg!V ?HGDXxUbX,#3!aVb q-t! B&PH1xXDSGET #+A -962Tf` 8T e$Hy=I1%E@b,`4h3@Ys֍` |^2 v*",,!b,sXLRoa0dp`4a IO@ OXP0* ͨREMOV$d4HPPACKNMT44Yt)""USe4UDThy=I1% )ӑQM!9X(ST  9QI1\TK2 pX Z. K@% h8-e\"8#@@8p(4PfӠ"`|':ZZ#-@ B< 2" Y|QX F"` :1sPmLP!fPh! 4(ʹ` ! v! d4͸ ! ۦ! ۔Rͻ ! ! ^; !` ! *  X,"a~`U" @e4$*,B*2"zY$:US'SU eE$UHy=I1%E@X2e`p 5 eE$UIԒUQeu$DThy=I1%E@b,`4h`VuXFf7Ҧp}\O݄ x* $:SSI'TӓI eUHy=I1%E@b,* x]>ga g>X f,(X,!€ F",0+uXdEXHϮ`y"AO4waXDXp|:ab,>2[7wX X$2~sXD kS[`0e`Ƥjqpq誊H Ɉ I13 @Fi*:"Jƀ # 1=1j2ɉhi鳀RST`dԵTy=I1% )ӑQX$"`t\ $K@p pZ.KA  X K0hL ONFIG UX`\4@%0ͣ bD*V f,ɔ FL2:*bJtd@$*,J*z$:T'TPQU$TDhy=I1%E@b,`4ha VuXFf7Ҧp}\O݄ hCXa@a 0 baPaP XHD&) $+>֮cѬOXPn/ 0 EK pZ.*K@% YhX- %\2K2 pRZ."@%àhx-%\BMK2 qbZ.$"K@%ĠYh-%\RPK2 qXRZ.,$K@%Š h-eĴ\bTK qZ:ӕOYn8C0C@HbB:ӑQ(OYn8CC@b~:ְ>/dpP?fԀf3@Lbp 1 REMARKDUH0PUTLINeUDH`NEWLINUUD4ː CLOSE@2**rUS e4UD`X 3@VxLLX,#3X(eUD4It+$"NI d$4Hy=I1% )0SX"`X #30^J e 1"`oz d#3X#X5)x-@fcx#",* )Ff7X$#9 Ff7B>2"`u>/a`[U",0> U@b,> U@nV  U@b,1`0U@nV U+>&P>/*sP2DCH t*%&NQTTutD(y=I1% )ӑQX"`; =9%΀8@h#`    @ȋ *@qVPȋ B(wa U~Ys֍` |^2 v* f 0bX! bɔ FF"Jz(&"@0uɩj*P5TutD)I d4Hy=I1% (QSb =9%)0SX$"`/ %? H4kS,Pa@2  LWXuc:ÀaҰ $2@ ; 1aOXn,&<#L{@GX(+̀@eFM@r:*$d8( &c@2"z"&80Hddd2Hh UPPERр5D9@t&'NT d4Hy=I1% )0QPTERMINRU dԵDy=I1%E@b,!X" 4`j?c|^2 v>B8`PVX2"z@X8B0:X<o 紩3@W1h=c S݄ 8*``P[U@'V;8EXF" :z1y`p[U",>definitions for the pattern matching routines define(ANY,QMARK) # symbol for matching any character define(BOL,PERCENT) # symbol for referring to beginning of line define(CCL,LBRACK) # symbol for start of character class define(CCLEND,Rer class define(PREVCL,2) #offset in stack; index of previous closure #in pattern define(START,3) #offset in stack; index in input line where #match starts # Symbol definitions fofine(NEXTBUF,0) # link forward define(PREVBUF,1) # link backward define(LISTDATA,2) # queue start of data # Symbol definitions for the io primitives define(MAXARGS,15) #Max nbr command line arguments allowed define(MAXCDEV,6) # number of ch dF_l kS,Pa!]>/bW ,1F`Lİ|?}eFXh|ae,D*QSx E hG@hS 3i([1ax]>gE"HD FXtObbR E @W1hOS@ M54E@  xE @W1h=k,*aSd,*a 0bd* fcx #,!X4U@/7dZ@|^2  v*XDXXU!; M57DX`#@X` 8T,Xhn,1`0Řu` |^2  v*,ɘxUb,*V =MZ@|^2 v*XDX<U@nV X<*1`P0hbR*`V x ba T`pTzNXPXH* (TDUpFN@bz:RU'@'V;8EXF" :z1y`p[U",>BRACK) # symbol for terminating character class define(CHAR,LETA) # symbol in list for character define(CLOSIZE,4) # dummy closure size returned by patsiz # (an unimplemented feature) define(CLOSURE,STAR) # symbr string conversion routines define(RADIX,PERCENT) #Radix indicator for 'gctoi' # Symbol definitions for memory management define(DS_MEMEND,1) # pointer to end of available memory define(DS_FIRST,2) # pointer to start of available memory definearacter devices define(ARGBUFSIZE,129) #Size of buffer to hold command line args define(IOBUFSIZE,128) #Size of buffer for terminal/disk io define(FCBSIZE,36) #size of CP/M fcb for BDOS calls define(IFCBSIZE,20) #fcb + queue head size in ints deXnXT#@",R~sX~ke U@8t2" V);A@EXTF"  ;1@,>pxONFIG` ZAX@݄q4aK([#h+>֮cѬOXnX|O@݄ XFf7bb* f`)x-LM@X<F" :1_,ɔ Fa2jzJ$H:T'TU`d4EEy=I1% )0SX$U@31#ᤧz?,aE@`dBĈU@2 pt$*,TRSeDU$Ԕy=I1%E@%`Ih-e``Դ \@Vup4d#! Q=b # Symbol definitions for the hash table routines define(ST_LINK,0) # offset of link field in symbol table node define(ST_DATA,1) # offset of data field in symbol table node define(ST_HTABSIZE,43) # should be a prime number # Symbol ol for defining a closure define(COUNT,1) #offset in stack for repeat count for matches define(EOL,DOLLAR) # symbol for referring to end-of-line define(LAMBDA,0) # end of list marker define(NCCL,LETN) # flag for negated charact(DS_CLOSE,8) # threshhold for smallest allowed blocks define(DS_LINK,1) # block link pointer address define(DS_SIZE,0) # block size address define(DS_OHEAD,2) # block administration overhead # Symbol definitions for queue management routines define(IOBUFNEED,68) #io buffer size + links in ints define(CONBUFSIZE,125) #for CPM console buffered input define(DIRBUFSIZE,83) define(CPMEOF,26) define(DISK,0) define(CONSOLE,1) define(PRINTER,3) define(PUNCH,4) define(READER,4) define(N    ULLDEV,5) define(USERDEV,6) define(BUFBLOCK,2) # block of buffer in cache define(BUFSTATE,3) # dirty of buffer in cache define(BUFDATA,4) # start of data of buffer in cache define(CLOSED,0) # free file descriptor define(READABLE,READ) # access DISK,25) define(CPM_SETDMA,26) define(CPM_GETRO,29) define(CPM_GETDPB,31) define(CPM_USER,32) define(CPM_READ,33) define(CPM_WRITE,40) define(CPM_GETSIZE,35) #-h- libincld 0_58 ascii 06/10/83 15:35:00 # include standard libdefs file include "/1/c/libdefs" #-t- libincld 0_58 ascii 06/10/83 15:35:00 #-h- addstr 2_17 ascii 06/10/83 15:35:00 ## addstr - unction atodat (str, date) character str(ARB) integer date(7) # date(1) = year # date(2) = month # date(3) = day # date(4) = hour # date(5) = minute # date(6) = second # date(7) = millisecond integer ctoi, gmonth, chkdat, sktok inte3) = 1 Skipx if (type(str(loc)) == DIGIT) { Nextx if (i <= 31) { date(3) = i #day Skipx if (type(str(loc)) == DIGIT) { Nextx date(1) = i #year } } else date(1) = i #year } } else if (i >  { date(2) = i #month if (str(loc) == SLASH) loc = loc + 1 Nextx date(3) = i #day if (str(loc) == SLASH) loc = loc + 1 Nextx date(1) = i #year } Skipx Nextx date(4) = i #hour if (str(loc) == LETH | str(loc) == Bbit flag define(RAWMODE,4) # " " " # CPM BDOS call function codes: define(CPM_CONIN,1) define(CPM_CONOUT,2) define(CPM_READER,3) define(CPM_PUNCH,4) define(CPM_LIST,5) define(CPM_DIRECT,6) define(CPM_CONBUFIN,10) define(CPM_CONSadd s to str(j) if it fits, increment j integer function addstr(s, str, j, maxsiz) character s(ARB), str(ARB) integer j, maxsiz integer i, ctoc i = ctoc (s, str(j), maxsiz) j = j+i if (i == 0) return(NO) return(YES) ger i, loc character type string tseps " .:,-" # BLANK,TAB,.,:,-,,, define(Skipx, loc = sktok(str,loc,tseps)) define(Nextx, i = ctoi(str, loc)) define(get_month, date(2) = gmonth(str(loc)) if (date(2) == ERR) return (ERR) while (31) # y m d { date(1) = i #year date(2) = 1 #month date(3) = 1 #day Skipx if (type(str(loc)) == DIGIT) { Nextx date(2) = i #month } else if (type(str(loc)) == LETTER) { get_month } Skipx if (type(str(lIGH) loc = loc + 1 Skipx Nextx date(5) = i #minute if (str(loc) == LETM | str(loc) == BIGM) loc = loc + 1 Skipx Nextx date(6) = i #second if (str(loc) == LETS | str(loc) == BIGS) loc = loc + 1 Skipx Nextx date(7) = i TAT,11) define(CPM_RESET,37) define(CPM_RESET_ALL,13) define(CPM_CD,14) define(CPM_OPEN,15) define(CPM_CLOSE,16) define(CPM_SFIRST,17) define(CPM_SNEXT,18) define(CPM_DELETE,19) define(CPM_MAKE,22) define(CPM_RENAME,23) define(CPM_GETend #-t- addstr 2_17 ascii 06/10/83 15:35:00 #-h- atodat 17_45 ascii 06/10/83 15:35:00 ## atodat - convert ascii characters to integer dates # Copyright 1981 by Unicorn Systems, Castro Valley, CA 94546 integer ftype(str(loc)) == LETTER) loc = loc + 1 ) for (i=1; i<=7; i=i+1) #zero date array date(i) = 0 loc = 1 Skipx Nextx if (i == 0) #mon d y { if (type(str(loc)) == LETTER) { get_month } else #string not date return(ERR) date(oc)) == DIGIT) { Nextx date(3) = i #day } } else if (str(loc) != SLASH) #d mon y { date(3) = i #day Skipx if (type(str(loc)) == LETTER) { get_month } Skipx Nextx date(1) = i #year } else #m d y  #millisecond return (chkdat (date)) end #-t- atodat 17_45 ascii 06/10/83 15:35:00 #-h- concat 3_4 ascii 06/10/83 15:35:00 ## concat - concatenate two strings together subroutine concat (buf1, buf2, outstr)     character buf1(ARB), buf2(ARB), outstr(ARB) integer len integer length call scopy(buf1, 1, outstr, 1) len = length(outstr) j = 1 for (i=len+1; buf2(j) != EOS; i=i+1) { call scopy(buf2, j, outstr, i) j = j + 1, BIGX, EOS, BIGE, BIGT, BIGX, EOS, BIGE, BIGO, BIGT, EOS, BIGE, BIGN, BIGQ, EOS, BIGA, BIGC, BIGK, EOS, BIGB, BIGE, BIGL, EOS, BIGB, BIGS, EOS, EOS, BIGH, BIGT, EOS, EOS, BIGL, BIGF, EOS, EOS,  BIGF, BIGS, EOS, EOS, BIGG, BIGS, EOS, EOS, BIGR, BIGS, EOS, EOS, BIGU, BIGS, EOS, EOS, BIGS, BIGP, EOS, EOS, BIGD, BIGE, BIGL, EOS/ # i = and (c, 127) i = c & 127 if (0 <= i & i <= 32) # non-printi line argument subroutine delarg (n) integer n, i integer nbrarg integer ptr character arg common /args/ nbrarg, ptr(MAXARGS), arg(ARGBUFSIZE) if (n > nbrarg) #check for valid argument return for (i=n; i 16) base = radix else i = j + 2 } for (; str (i) != EOS; i = i + 1) { routine gdate (date,time) character date(ARB), time(ARB) integer now (7), dummy call getnow (now) call fmtdat (date, time, now, dummy) return end #-t- gdate 2_19 ascii 06/10/83 15:35:00 #-h- getc 1_1) { len = length(buf) + 1 buf(len) = BLANK } buf(len) = EOS return end #-t- getcl 2_49 ascii 06/10/83 15:35:00 #-h- getdir 2_51 ascii 06/10/83 15:35:00 ## getdir - get associated directory name # C getpat = makpat(str, 1, EOS, pat) return end #-t- getpat 1_50 ascii 06/10/83 15:35:00 #-h- getwrd 3_50 ascii 06/10/83 15:35:00 ## getwrd - get non-blank word from in(i) into out, increment i integer functie from the argument list # NOTE: This routine was provided by Georgia Tech. Their # installation allows multiple standard inputs and outputs. # Those sections of the code have been commented out in this version. integer function gfnarg (name, staelse if (state (1) == 2) { if (getarg (state (2), name, MAXARG) != EOF) { state (1) = 2 # stay in same state state (2) = state (2) + 1 # bump argument count if (name (1) != MINUS) { stat if (IS_DIGIT(str (i))) d = str (i) - DIG0 else d = index (digits, clower (str (i))) - 1 if (d < 0 | d >= base) break v = v * base + d } if (neg) return (-v) else return 4 ascii 06/10/83 15:35:00 ## getc - get character from STDIN character function getc(c) character c character getch getc = getch(c, STDIN) return end #-t- getc 1_14 ascii 06/10/83 15:35:00 #-h- getcl opyright 1981 by Unicorn Systems, Castro Valley, CA 94546 subroutine getdir (type, buf) integer type character buf(ARB) string homedr "/0/a/" if (type == HOME_DIRECTORY) call ctoc (homedr, buf, FILENAMESIZE) else buf(1) = EOS return on getwrd (in, i, out) character in(ARB), out(ARB) integer i, j while (in(i) == BLANK | in(i) == TAB) i = i + 1 j = 1 while (in(i) != EOS & in(i) != BLANK & in(i) != TAB & in(i) != NEWLINE) { out(j) = in(i) te) character name (ARB) integer state (4) integer l integer getarg, getlin, length filedes fd filedes open string in1 "STDIN" # string in1 "/dev/stdin1" # string in2 "/dev/stdin2"" # string in3 "/dev/stdin3" e (4) = state (4) + 1 # bump input file count return (OK) } else if (name (2) == EOS) { call scopy (in1, 1, name, 1) state (4) = state (4) + 1 # bump input file count      return (OK) } # else if (name (2) == DIG1 & name (3) == EOS) { # call scopy (in1, 1, name, 1) # state (4) = state (4) + 1 # bump input file count # return (OK) #  state (1) = 3 # new state if (name (3) == EOS) state (3) = STDIN # else if (name (3) == DIG1 & name (4) == EOS) # state (3) = STDIN1 # else if (name (3) == return (ERR) } else state (1) = 4 # EOF state } else if (state (1) == 3) { l = getlin (name, state (3)) if (l != EOF) { name (l) = EOS state (4)  state (1) value.") } # end of infinite repeat name (1) = EOS return (EOF) end #-t- gfnarg 29_10 ascii 06/10/83 15:35:00 #-h- gitoc 16_59 ascii 06/10/83 15:35:00 ## gitoc --- convert single pan unsign conversion if (unsign) { # make pos. but keep high-order bits intact n = (int/2 & MAX_INTEGER) # n = and(int / 2, # make pos. but keep high-order bits intact # MAX_INTEGER) # carry = and (int, 1) # if (d >= radix) { # check for generated carry d = d - radix carry = 1 } else carry = 0 } i = i + 1 str (i) = digits (d + 1) # convert to character and store  } # else if (name (2) == DIG2 & name (3) == EOS) { # call scopy (in2, 1, name, 1) # state (4) = state (4) + 1 # bump input file count # return (OK) # } # else if (name (2) = DIG2 & name (4) == EOS) # state (3) = STDIN2 # else if (name (3) == DIG3 & name (4) == EOS) # state (3) = STDIN3 else { state (3) = open (name (3), READ) = state (4) + 1 # bump input file count return (OK) } if (fd != ERR & fd != STDIN) call close (state (3)) state (1) = 2 } else if (state (1) == 4) { state (1) = 5 recision integer to any radix string integer function gitoc (int, str, size, base) integer int, size, base character str (size) integer carry, d, i, radix, n logical unsign string digits "0123456789ABCDEF" if (size <=  get initial carry carry = int & 1 if (int == -1) n = MAX_INTEGER # the oddball case else if (carry == 1 & int < 0) n = n - 1 # division by 2 rounds up, so this #  n = n / radix } until (n == 0 | i >= size) if (unsign) { if (carry != 0 & i < size) { # check for final carry i = i + 1 str (i) = DIG1 } } else if (int < 0 & i < size) { # add sign if nee= DIG3 & name (3) == EOS) { # call scopy (in3, 1, name, 1) # state (4) = state (4) + 1 # bump input file count # return (OK) # } else if (name (2) == LETN | name (2) == BIGN) {  if (state (3) == ERR) { call putlin (name, ERROUT) call remark (": can't open.") state (1) = 2 } } } else  if (state (4) == 0) {# no input files call scopy (in1, 1, name, 1) return (OK) } break } else if (state (1) == 5) break else call error ("in gfnarg: bad1) return (0) str (1) = EOS # digit string is generated backwards, then reversed radix = iabs (base) # get actual conversion radix if (radix < 2 | radix > 16) radix = 10 unsign = (base < 0) # negative radices me corrects } else n = int i = 1 repeat { d = iabs (mod (n, radix)) # generate next digit if (unsign) { # this is only half of actual digit value d = 2 * d + carry # get actual digit value ded i = i + 1 str (i) = MINUS } gitoc = i - 1 # will return length of string for (d = 1; d < i; d = d + 1) { # reverse digits carry = str (d) str (d) = str (i) str (i) = carry i = i - 1      } return end #-t- gitoc 16_59 ascii 06/10/83 15:35:00 #-h- hshfcn 3_53 ascii 06/10/83 15:35:00 ## hshfcn - hash function # # This is a portable version of the hash function. It takes the scapes) integer function isin (str, c) character c, str(ARB) character toggle, tc for (isin = 1; ; isin=isin+1) { tc = str(isin) if (tc == EOS) break if (tc == c) { if (isin == 1) return if (str(isin-1) != ESCAPE) retuf) pointer head, buf DS_DECLARE pointer nxtp nxtp = Mem(head+NEXTBUF) Mem(buf+NEXTBUF) = nxtp Mem(buf+PREVBUF) = head Mem(head+NEXTBUF) = buf Mem(nxtp+PREVBUF) = buf return end #-t- linkq 2_92 ascii 06/10 NO return } nodsiz = Mem (st) j = node + ST_DATA ifdef(CPM, j = j + ilen(Mem(j)) ) ifnotdef(CPM, j = j + slen (Mem(j)) ) if (nodsiz == CHAR_DEFN) i = unpack (Mem(j), info) else #pick up integer data { foratch - find match anywhere on line integer function match(lin, pat) character lin(MAXLINE), pat(MAXPAT) integer amatch integer i for (i = 1; lin(i) != EOS; i = i + 1) if (amatch(lin, i, pat) > 0) { mat { st = st + 1 Mem (st) = LAMBDA # null link } return end #-t- mktabl 3_22 ascii 06/10/83 15:35:00 #-h- putdec 3_5 ascii 06/10/83 15:35:00 ## putdec - put decimal integ # first and last characters of the string, sums them, and then # returns the (sum modulo n) + 1. # integer function hshfcn(strng, n) character strng(ARB) integer n, i, length, i1, i2 i = length(strng) i = max(i, 1) i1 rn } else if (tc == SQUOTE | tc == DQUOTE) #skip quoted strgs { toggle = tc repeat { isin = isin+1 tc = str(isin) if (tc == EOS | tc == toggle) break } if (tc == EOS) break } } return (0) end #-t- isi/83 15:35:00 #-h- lookup 6_52 ascii 06/10/83 15:35:00 ## lookup - find a symbol in the symbol table, return its data integer function lookup (symbol, info, st) character symbol (ARB) integer info (ARB) #may actually be  (i = 1; i <= nodsiz; i = i + 1) { info (i) = Mem (j) j = j + 1 } } lookup = YES return end #-t- lookup 6_52 ascii 06/10/83 15:35:00 #-h- lower 1_3 ascii 06/10/83 15:35:00 ## ch = YES return } match = NO return end #-t- match 2_89 ascii 06/10/83 15:35:00 #-h- mktabl 3_22 ascii 06/10/83 15:35:00 ## mktabl - make a new (empty) symbol table er n in field width >= w subroutine putdec(n,w) character chars(MAXCHARS) integer itoc integer i,n,nd,w nd = itoc(n,chars,MAXCHARS) for(i = nd+1; i <= w; i = i+1) call putc(BLANK) = strng(1) i2 = strng(i) hshfcn = mod(i1+i2, n) + 1 return end #-t- hshfcn 3_53 ascii 06/10/83 15:35:00 #-h- isin 4_45 ascii 06/10/83 15:35:00 ## isin - find character 'c' in string (knows about en 4_45 ascii 06/10/83 15:35:00 #-h- linkq 2_92 ascii 06/10/83 15:35:00 ## linkq - link buffer into circular queue at head # Copyright 1981 by Unicorn Systems, Castro Valley, CA 94546 subroutine linkq(head,bua character pointer st integer i integer nodsiz, j integer stlu, unpack ifdef(CPM, integer ilen) ifnotdef(CPM, integer slen) pointer node, pred DS_DECL(Mem, 1) if (stlu (symbol, node, pred, st) == NO) { lookup =lower - fold all letters to lower case subroutine lower (token) character token(ARB) call fold(token) return end #-t- lower 1_3 ascii 06/10/83 15:35:00 #-h- match 2_89 ascii 06/10/83 15:35:00 ## m pointer function mktabl (nodsiz) integer nodsiz DS_DECL(Mem, 1) pointer st pointer dsget integer i st = dsget (ST_HTABSIZE + 1) # +1 for record of nodsiz Mem (st) = nodsiz mktabl = st do i = 1, ST_HTABSIZE; for(i = 1; i <= nd; i = i+1) call putc(chars(i)) return end #-t- putdec 3_5 ascii 06/10/83 15:35:00 #-h- putint 2_24 ascii 06/10/83 15:35:00 ## putint - output integer i    n specified field subroutine putint(n, w, fd) character chars(MAXCHARS) integer itoc integer n, w, fd, junk junk = itoc(n,chars,MAXCHARS) call putstr(chars, w, fd) return end #-t- (node) } } call dsfree (st) return end #-t- rmtabl 3_80 ascii 06/10/83 15:35:00 #-h- sctabl 12_19 ascii 06/10/83 15:35:00 ## sctabl - scan symbol table, returning next entry or EOF chain } bucket = Mem (posn) # recover previous position walker = Mem (posn + 1) nodsiz = Mem (table) repeat # until the next symbol, or none are left { if (walker != LAMBDA) # symbol available? { ZE) break j = table + bucket walker = Mem (j) } } call dsfree (posn) # throw away position information posn = 0 sctabl = EOF return end #-t- sctabl 12_19 ascii end #-t- sdrop 3_57 ascii 06/10/83 15:35:00 #-h- sindex 3_50 ascii 06/10/83 15:35:00 ## sindex - find tok in str separared by sep # Copyright 1981 by Unicorn Systems, Castro Valley, CA 94546 integer funr each system integer function slen (int) integer int(ARB) character buf(MAXLINE) integer pack, unpack integer junk # Here's a quick-and-dirty way to do it; rewrite for your system junk = unpack(int, buf) return (pack(buf, int)) end #-putint 2_24 ascii 06/10/83 15:35:00 #-h- rmtabl 3_80 ascii 06/10/83 15:35:00 ## rmtabl - remove a symbol table, deleting all entries subroutine rmtabl (st) pointer st integer i pointer walker, b integer function sctabl (table, sym, info, posn) pointer table, posn character sym (ARB) integer info (ARB) integer unpack, ilen pointer bucket, walker pointer dsget integer i integer nodsiz, j DS_DECL(Mem, 1)  j = walker + ST_DATA i = unpack(Mem(j), sym) j = j + ilen(sym) if (nodsiz == CHAR_DEFN) i = unpack (Mem(j), info) else #pick up integers { for (i=1; i<= nodsiz; i=i+1) { info(i) = Mem(j) j = j + 1 } }  06/10/83 15:35:00 #-h- sdrop 3_57 ascii 06/10/83 15:35:00 ## sdrop --- drop characters from a string APL-style integer function sdrop (from, to, chars) character from (ARB), to (ARB) integer chars integer len, stction sindex (str, tok, sep) character str(ARB), tok(MAXTOK), sep(ARB) character t(MAXTOK) integer gettok, equal, sktok integer i, j j = 1 for (i=sktok(str,1,sep); gettok(str,i,t,sep) != 0; i=sktok(str,i,sep)) { if (equal(t, tok) == YES) t- slen 2_73 ascii 06/10/83 15:35:00 #-h- slstr 4_78 ascii 06/10/83 15:35:00 ## slstr --- slice a substring from a string integer function slstr (from, to, first, chars) character from (ARB), to (ARB) ucket, node DS_DECL(Mem, 1) bucket = st do i = 1, ST_HTABSIZE; { bucket = bucket + 1 walker = Mem (bucket) while (walker != LAMBDA) { node = walker walker = Mem (node + ST_LINK) call dsfree if (posn == 0) { # just starting scan? posn = dsget (2) # get space for position info Mem (posn) = 1 # get index of first bucket Mem (posn + 1) = Mem (table + 1) # get pointer to first  Mem (posn) = bucket # save position of next symbol Mem (posn + 1) = Mem (walker + ST_LINK) sctabl = 1 # not EOF return } else { bucket = bucket + 1 if (bucket > ST_HTABSIart integer ctoc, length integer i len = length (from) if (chars < 0) return (ctoc (from, to, len + chars + 1)) else { start = min0 (chars, len) i = start + 1 return (ctoc (from (i), to, len + 1)) }  return (j) else j = j + 1 } return (0) end #-t- sindex 3_50 ascii 06/10/83 15:35:00 #-h- slen 2_73 ascii 06/10/83 15:35:00 ## slen - determine number words taken up by packed string # Different fo integer first, chars integer len, i, j, k integer length len = length (from) i = first if (i < 1) i = i + len + 1 if (chars < 0) { i = i + chars + 1 chars = - chars } j = i + chars - 1      if (i < 1) i = 1 if (j > len) j = len for (k = 0; i <= j; k = k + 1) { to (k + 1) = from (i) i = i + 1 } to (k + 1) = EOS return (k) end #-t- slstr 4_78 ascii 06/10/83 15:33_28 ascii 06/10/83 15:35:00 #-h- stcopy 1_112 ascii 06/10/83 15:35:00 ## stcopy - copy string updates dest. subroutine stcopy(in, i, out, j) character in(ARB), out(ARB) integer i, j, k for (k=i; in(k) != EOS; k=k+1) { } return end #-t- stdel 2_73 ascii 06/10/83 15:35:00 #-h- strcmp 3_104 ascii 06/10/83 15:35:00 ## strcmp - compare 2 strings integer function strcmp (str1, str2) character str1(ARB), str2(ARB) integerim trailing blanks and tabs from a string integer function strim (str) character str (ARB) integer lnb, i lnb = 0 for (i = 1; str (i) != EOS; i = i + 1) if (str (i) != BLANK & str (i) != TAB) lnb = i str (lnunlink 2_86 ascii 06/10/83 15:35:00 #-h- upper 1_79 ascii 06/10/83 15:35:00 ## upper - fold all alphas to upper case subroutine upper (token) character token(ARB), cupper integer i for (i=1; token(i<= 0) { lmonth = lmonth + 12 lyear = lyear - 1 } wkday = mod (lday + (26 * lmonth - 2) / 10 + lyear + lyear / 4 - 34, 7) + 1 return end #-t- wkday 3_116 ascii 06/10/83 15:35:00 #-h- type 5:00 #-h- stake 3_28 ascii 06/10/83 15:35:00 ## stake --- take characters from a string APL-style integer function stake (from, to, chars) character from (ARB), to (ARB) integer chars integer len, start intege out(j) = in(k) j = j + 1 } out(j) = EOS return end #-t- stcopy 1_112 ascii 06/10/83 15:35:00 #-h- stdel 2_73 ascii 06/10/83 15:35:00 ## stdel - delete substring of 'len' chars, starting at  i for (i=1; str1(i) == str2(i); i=i+1) { if (str1(i) == EOS) { strcmp = 0 return } } if (str1(i) == EOS) strcmp = -1 else if (str2(i) == EOS) b + 1) = EOS return (lnb) end #-t- strim 2_56 ascii 06/10/83 15:35:00 #-h- unlink 2_86 ascii 06/10/83 15:35:00 ## unlink - remove buffer from any circular queue it may be in # Copyright 1981 by Unicorn) != EOS; i=i+1) token(i) = cupper(token(i)) return end #-t- upper 1_79 ascii 06/10/83 15:35:00 #-h- wkday 3_116 ascii 06/10/83 15:35:00 ## wkday --- get day-of-week corresponding to month,day,year  2_12 ascii 06/10/83 15:35:00 ## type - determine type of character character function type (c) character c if ( (c >= LETA & c <= LETZ) | ( c >= BIGA & c <= BIGZ)) type = LETTER else if (c >= DIG0 & c <= DIG9) r length, ctoc len = length (from) if (chars < 0) { start = max0 (len + chars, 0) return (ctoc (from (start + 1), to, len + 1)) } else return (ctoc (from, to, chars + 1)) end #-t- stake 'from' subroutine stdel (str, from, len) character str (ARB) integer from, len integer length, i, j j = length(str) + 1 i = from + len if (j < i) i = j for (j=from; i > j; j=j+1) { str(j) = str(i) if (str(j) == EOS) break i = i + 1  strcmp = + 1 else if (str1(i) < str2(i)) strcmp = -1 else strcmp = +1 return end #-t- strcmp 3_104 ascii 06/10/83 15:35:00 #-h- strim 2_56 ascii 06/10/83 15:35:00 ## strim --- tr Systems, Castro Valley, CA 94546 pointer function unlink(buf) pointer buf DS_DECLARE pointer prev, nxtp prev = Mem(buf+PREVBUF) nxtp = Mem(buf+NEXTBUF) Mem(prev+NEXTBUF) = nxtp Mem(nxtp+PREVBUF) = prev return(prev) end #-t-  # NOTE: 20th century is assumed, no matter what is passed integer function wkday (month, day, year) integer month, day, year integer lmonth, lday, lyear lmonth = month - 2 lday = day lyear = mod (year, 100) if (lmonth  type = DIGIT else type = c return end #-t- type 2_12 ascii 06/10/83 15:35:00 #-h- chkdat 9_104 ascii 06/10/83 15:35:00 ## chkdat - check date and time for out-of-range # Copyright 1981 by    Unicorn Systems, Castro Valley, CA 94546 integer function chkdat (date) integer date(7) # date(1) = year # date(2) = month # date(3) = day # date(4) = hour # date(5) = minute # date(6) = second # date(7) = millisecond integer mlen(1date(1),4) != 0 | ((mod(date(1),100) == 0) & (mod(date(1),400) != 0) )) return (ERR) # check hour if (date(4) < 0 | date(4) > 23) return (ERR) # check minute if (date(5) < 0 | date(5) > 59) return (ERR) str,1,month,1,3) month(4) = EOS call fold(month) for (i=1; i<=12; i=i+1) if (stncmp(month,months(3*i-2),3) == 0) return(i) return(ERR) end #-t- gmonth 2_125 ascii 06/10/83 15:35:00 #-h- ctoi 4_14 asUS) ctoi = (-ctoi) return end #-t- ctoi 4_14 ascii 06/10/83 15:35:00 #-h- delete 2_97 ascii 06/10/83 15:35:00 ## delete - remove a symbol from the symbol table subroutine delete (symbol, st) charne fmtdat (date, time, now, form) character date(ARB), time(ARB) integer now(7), form, year integer itoc #note:'form' selects the format of #the character representation #right now the only one used is: # MM/DD/YY HH:MM:SS if (itoc time(i+2) = COLON i = i + 3 } time(9) = EOS return end #-t- fmtdat 7_71 ascii 06/10/83 15:35:00 #-h- getnow 1_111 ascii 06/10/83 15:35:00 ## getnow - get current time and date (in integers) # Copyrig2) data mlen(1), mlen(2), mlen(3), mlen(4), mlen(5), mlen(6), mlen(7), mlen(8), mlen(9), mlen(10), mlen(11), mlen (12) /31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 / # check year if (date(1) < 0 ) return (ERR) if (date(1) <  # check second if (date(6) < 0 | date(6) > 59) return (ERR) # check millisecond if (date(7) < 0 | date(7) > 999) return (ERR) return (OK) end #-t- chkdat 9_104 ascii 06/10/83 15:35:00 #-h- gmonth 2cii 06/10/83 15:35:00 ## ctoi - convert string at in(i) to integer, increment i integer function ctoi (in, i) character in (ARB) integer index, mul10 character sign integer d, i string digits "0123456789" call skipbl (in, i) sign = PLUacter symbol (ARB) pointer st DS_DECL(Mem, 1) integer stlu pointer node, pred if (stlu (symbol, node, pred, st) == YES) { Mem (pred + ST_LINK) = Mem (node + ST_LINK) call dsfree (node) } return end (now(2), date(1), 3) == 1) #only needed 1 character { date(2) = date(1) date(1) = DIG0 } date(3) = SLASH if (itoc (now(3), date(4), 3) == 1) { date(5) = date(4) date(4) = DIG0 } date(6) = SLASH year = now(1) if (year > 99) yearht 1981 by Unicorn Systems, Castro Valley, CA 94546 subroutine getnow (now) integer now(7) include config for (i=1; i<=7; i=i+1) now(i) = ddate(i) return end #-t- getnow 1_111 ascii 06/10/83 15:35:00 #-h- makpat 100) date(1) = date(1) + 1900 # check month if (date(2) < 1 | date(2) > 12) return (ERR) # check day m = date(2) if (date(3) < 1 | date(3) > mlen(m)) return (ERR) if (m == 2 & date(3) == 29) # make sure it's a leap year if ( mod(_125 ascii 06/10/83 15:35:00 ## gmonth - get month number associated with name integer function gmonth (str) character str(ARB) character buf(MAXPAT), month(4) integer stncmp string months "janfebmaraprmayjunjulaugsepoctnovdec" call stncpy(S if (in(i) == MINUS) { sign = MINUS i = i + 1 } else if (in(i) == PLUS) i = i + 1 for (ctoi = 0; in(i) != EOS; i = i + 1) { d = index (digits, in(i)) if (d == 0) #non-digit break ctoi = mul10(ctoi) + d - 1 } if (sign == MIN #-t- delete 2_97 ascii 06/10/83 15:35:00 #-h- fmtdat 7_71 ascii 06/10/83 15:35:00 ## fmtdat - convert date information to character string # Copyright 1981 by Unicorn Systems, Castro Valley, CA 94546 subrouti = mod(year, 100) if (itoc (year, date(7), 3) == 1) { date(8) = date(7) date(7) = DIG0 } date(9) = EOS # get time i = 1 for (j=4; j<=6; j=j+1) { if (itoc(now(j), time(i), 3) == 1) { time(i+1) = time(i) time(i) = DIG0 } 10_121 ascii 06/10/83 15:35:00 ## makpat - make pattern from arg(from), terminate at delim integer function makpat(arg, from, delim, pat) character esc character arg(MAXARG), delim, pat(MAXPAT) integer addset, getccl,    stclos integer from, i, j, junk, lastcl, lastj, lj j = 1 # pat index lastj = 1 lastcl = 0 for (i = from; arg(i) != delim & arg(i) != EOS; i = i + 1) { lj = j if (arg(i) == ANY) junk = add = stclos(pat, j, lastj, lastcl) } else { junk = addset(CHAR, pat, j, MAXPAT) junk = addset(esc(arg, i), pat, j, MAXPAT) } lastj = lj } if (arg(i) != delim) # terminated ear break if (c == NEWLINE) call putch$ (13,fd) call putch$ (c,fd) } return end #-t- putlin 2_80 ascii 06/10/83 15:35:00 #-h- scopy 2_47 ascii 06/10/83 15:35:00 ## scopy - copy stcharacter line(ARB) integer i integer fd character getch for (i=1; ;i=i+1) { if (getch(line(i), fd) == NEWLINE) { line(i+1) = EOS d #-t- getlin 6_107 ascii 06/10/83 15:35:00 #-h- amatch 10_100 ascii 06/10/83 15:35:00 ## amatch (non-recursive) - look for match starting at lin(from) integer function amatch(lin, from, pat) character eak pat(stack+COUNT) = i - offset pat(stack+START) = offset offset = i # character that made us fail } else if (omatch(lin, offset, pat, j) == NO) { # non-closure for ( ; stack > 0set(ANY, pat, j, MAXPAT) else if (arg(i) == BOL & i == from) junk = addset(BOL, pat, j, MAXPAT) else if (arg(i) == EOL & arg(i + 1) == delim) junk = addset(EOL, pat, j, MAXPAT) else if (arg(i) == CCL) { ly makpat = ERR else if (addset(EOS, pat, j, MAXPAT) == NO) # no room makpat = ERR else makpat = i return end #-t- makpat 10_121 ascii 06/10/83 15:35:00 #-h- putlin ring at from(i) to to(j) subroutine scopy(from, i, to, j) character from(ARB), to(ARB) integer i, j, k1, k2 k2 = j for (k1 = i; from(k1) != EOS; k1 = k1 + 1) { to(k2) = from(k1) k2 = k2 + 1 } to(k2)  getlin = i return } if (line(i) == EOF) { getlin = EOF line(i) = EOS return lin(MAXLINE), pat(MAXPAT) integer omatch, patsiz integer from, i, j, offset, stack stack = 0 offset = from # next unexamined input character for (j = 1; pat(j) != EOS; j = j + patsiz(pat, j)) if (pat(j) == CL; stack = pat(stack+PREVCL)) if (pat(stack+COUNT) > 0) break if (stack <= 0) { # stack is empty amatch = 0 # return failure return } pat(stack+C if (getccl(arg, i, pat, j) == ERR) break } else if (arg(i) == CLOSURE & i > from) { lj = lastj if (pat(lj)==BOL | pat(lj)==EOL | pat(lj)==CLOSURE) break lastcl 2_80 ascii 06/10/83 15:35:00 ## putlin - put out line by repeated calls to putch subroutine putlin (line, fd) character line(ARB) integer fd character c integer i for (i=1; ; i=i+1) { c = line(i) if (c == EOS)= EOS return end #-t- scopy 2_47 ascii 06/10/83 15:35:00 #-h- getlin 6_107 ascii 06/10/83 15:35:00 ## getlin - get line by repeated calls to getch integer function getlin (line, fd)  } if (i >= MAXLINE-1) { line(i+1) = EOS getlin = i return } } enOSURE) { # a closure entry stack = j j = j + CLOSIZE # step over CLOSURE for (i = offset; lin(i) != EOS; ) # match as many as if (omatch(lin, i, pat, j) == NO) # possible brOUNT) = pat(stack+COUNT) - 1 j = stack + CLOSIZE offset = pat(stack+START) + pat(stack+COUNT) } # else omatch succeeded amatch = offset return # success end #-t- amatch     10_100 ascii 06/10/83 15:35:00 #-h- putc 0_118 ascii 06/10/83 15:35:00 ## putc - put character onto STDOUT subroutine putc (c) character c call putch (c, STDOUT) return end #-t- putc 0_118 ascii /10/83 15:35:00 #-h- ilen 2_76 ascii 06/10/83 15:35:00 ## ilen - determine number integer words need to pack char string # Copyright 1981 by Unicorn Systems, Castro Valley, CA 94546 integer function ilen (str) character str(ARBeat { c = buf(i) if (c == EOS) break for (j=1; tok(j) != EOS; j=j+1) if (c == tok(j)) break if (tok(j) == EOS) break i = i+1 } return(i) end #-t- sktok 3_24 ascii 06/10/83 15:35:00 #-h- gettok end #-t- gettok 3_90 ascii 06/10/83 15:35:00 #-h- unpack 3_50 ascii 06/10/83 15:35:00 ## unpack - unpack characters from integers into character strings # Copyright 1981 by Unicorn Systems, Castro Valley, CA 9454t 1981 by Unicorn Systems, Castro Valley, CA 94546 # CP/M version - change for different systems integer function pack (str, int) character str(ARB) # integer int(ARB) character int(ARB) #Microsoft Fortran allows this - 'twill do #the right thii + 1) to (i) = from (i) to (i) = EOS return (i - 1) end #-t- ctoc 2_54 ascii 06/10/83 15:35:00 #-h- cupper 2_1 ascii 06/10/83 15:35:00 ## cupper - change letter to upper case 06/10/83 15:35:00 #-h- putstr 3_2 ascii 06/10/83 15:35:00 ## putstr - output character string in specified field subroutine putstr(str, w, fd) character str(ARB) integer length integer w, fd, len len = length(str) for) integer length # CP/M version - rewrite for your system: return ( (length(str) + 2) / 2) #don't forget to count #the EOS marker end #-t- ilen 2_76 ascii 06/10/83 15:35:00 #-h- sktok 3_24 as 3_90 ascii 06/10/83 15:35:00 ## gettok - get token delimited by any of sep, return size # Copyright 1981 by Unicorn Systems, Castro Valley, CA 94546 integer function gettok (buf,i,tok,sep) character buf(ARB), tok(ARB), sep(ARB) inte6 # CP/M version - change for different systems integer function unpack (int, str) character str(ARB) # integer int(ARB) character int(ARB) #fool CP/M and Microsoft Fortran integer i for (i=1; ; i=i+1) { str(i) = int(i) ifng integer i for (i=1; ; i=i+1) { int(i) = str(i) if (str(i) == EOS) break } return ( (i+1) / 2 ) #return the number of integers used end #-t- pack 3_114 ascii 06/10/83 15:35:00 #-h- ctoc 2 character function cupper(c) character c, k if (c >= LETA & c <= LETZ) cupper = c + (BIGA - LETA) else cupper = c return end #-t- cupper 2_1 ascii 06/10 (i = len+1; i <= w; i=i+1) call putch(BLANK, fd) for (i = 1; i <= len; i=i+1) call putch(str(i), fd) for (i = (-w) - len; i > 0; i = i - 1) call putch(BLANK, fd) return end #-t- putstr 3_2 ascii 06cii 06/10/83 15:35:00 ## sktok - skip past chars in token # Copyright 1981 by Unicorn Systems, Castro Valley, CA 94546 integer function sktok(buf,loc,tok) character buf(ARB), tok(ARB) integer loc integer i,j character c i = loc repger i integer j,k character c for (j = 1; buf(i) != EOS; i = i+1) { c = buf(i) for (k = 1; sep(k) != EOS; k = k+1) if (c == sep(k)) { tok(j) = EOS return(j-1) } tok(j) = c j = j+1 } tok(j) = EOS return(j-1)  (str(i) == EOS) break } return(i-1) end #-t- unpack 3_50 ascii 06/10/83 15:35:00 #-h- pack 3_114 ascii 06/10/83 15:35:00 ## pack - pack characters into integer words; return nbr words needed # Copyrigh_54 ascii 06/10/83 15:35:00 ## ctoc --- convert EOS-terminated string to EOS-terminated string integer function ctoc (from, to, len) integer len character from (ARB), to (len) integer i for (i = 1; i < len & from (i) != EOS; i = /83 15:35:00 #-h- fold 1_75 ascii 06/10/83 15:35:00 ## fold - fold all letters to lower case subroutine fold (token) character token(ARB), clower integer i for (i=1; token(i) != EOS; i=i+1) token(i) = clower(tok   en(i)) return end #-t- fold 1_75 ascii 06/10/83 15:35:00 #-h- stncpy 2_39 ascii 06/10/83 15:35:00 ## stncpy - copy n characters from in(i) to out(j) subroutine stncpy(in, i, out, j, n) character in(ARB (i == n | str1(i) == EOS) { stncmp = 0 return } } else break } if (str1(i) == EOS) stncmp = -1 else if (str2(i) == EOS) stncmp = +1 else if (str1(i) < str2(i)) stncmp = -1 else stncmp = +1 return end #-t- stnnode, pred, st) character symbol (ARB) pointer node, pred, st integer hash, j, nodsiz integer i integer equal ifnotdef(CPM, integer unpack; character buf(MAXLINE) ) DS_DECL(Mem, 1) nodsiz = Mem (st) hash = 0 0/83 15:35:00 #-h- itoc 5_62 ascii 06/10/83 15:35:00 ## itoc - convert integer int to char string in str integer function itoc(int, str, size) character d integer i, int, intval, j, k, size character str(size end #-t- itoc 5_62 ascii 06/10/83 15:35:00 #-h- stclos 5_19 ascii 06/10/83 15:35:00 ## stclos - insert closure entry at pat(j) integer function stclos(pat, j, lastj, lastcl) character pat(MAXP return end #-t- stclos 5_19 ascii 06/10/83 15:35:00 #-h- getccl 5_26 ascii 06/10/83 15:35:00 ## getccl - expand char class at arg(i) into pat(j) integer function getccl(arg, i, pat, j) c), out(ARB) integer i,j,n integer k,l,m character c l = j + n m = i for (k=j; k= size) if (int < 0AT) integer addset integer j, jp, jt, junk, lastcl, lastj for (jp = j - 1; jp >= lastj; jp = jp - 1) { # make a hole jt = jp + CLOSIZE junk = addset(pat(jp), pat, jt, MAXPAT) } j = j + CLOSIZE haracter arg(MAXARG), pat(MAXPAT) integer addset integer i, j, jstart, junk i = i + 1 # skip over [ if (arg(i) == NOT) { junk = addset(NCCL, pat, j, MAXPAT) i = i + 1 } else junk = cmp 3_66 ascii 06/10/83 15:35:00 ## stncmp - compare first n chars of strings integer function stncmp (str1, str2, n) character str1(ARB), str2(ARB) integer n,i for (i=1; i<=n; i=i+1) { if (str1(i) == str2(i)) { if | lin(i) == TAB) i = i + 1 return end #-t- skipbl 1_67 ascii 06/10/83 15:35:00 #-h- stlu 6_30 ascii 06/10/83 15:35:00 ## stlu - symbol table lookup primitive integer function stlu (symbol,  == YES) return(YES) ) ifnotdef(CPM, i = unpack(Mem(j), buf(1)) if (equal(symbol, buf) == YES) return(YES) ) pred = node node = Mem (pred + ST_LINK) } return (NO) end #-t- stlu 6_30 ascii 06/1 & i < size) { # then sign i = i + 1 str(i) = MINUS } itoc = i - 1 for (j = 1; j < i; j = j + 1) { # then reverse k = str(i) str(i) = str(j) str(j) = k i = i - 1 } returnstclos = lastj junk = addset(CLOSURE, pat, lastj, MAXPAT) # put closure in it junk = addset(0, pat, lastj, MAXPAT) # COUNT junk = addset(lastcl, pat, lastj, MAXPAT) # PREVCL junk = addset(0, pat, lastj, MAXPAT) # STARTaddset(CCL, pat, j, MAXPAT) jstart = j junk = addset(0, pat, j, MAXPAT) # leave room for count call filset(CCLEND, arg, i, pat, j, MAXPAT) pat(jstart) = j - jstart - 1 if (arg(i) == CCLEND) getccl = OK else    getccl = ERR return end #-t- getccl 5_26 ascii 06/10/83 15:35:00 #-h- patsiz 4_19 ascii 06/10/83 15:35:00 ## patsiz - returns size of pattern entry at pat(n) integer function patsiz(p- omatch 8_57 ascii 06/10/83 15:35:00 ## omatch - try to match a single pattern at pat(j) integer function omatch(lin, i, pat, j) character lin(MAXLINE), pat(MAXPAT) character lini, patj integer locate intCCL) { if (locate(lini, pat, j + 1) == YES) bump = 1 } else if (patj == NCCL) { if (lini != NEWLINE & locate(lini, pat, j + 1) == NO) bump = 1 } else call error('in omatch: ca 2_115 ascii 06/10/83 15:35:00 ## clower - change letter to lower case character function clower(c) character c, k if (c >= BIGA & c <= BIGZ) { #avoid integer overflow in byte machines { equal = YES return } equal = NO return end #-t- equal 2_84 ascii 06/10/83 15:35:00 #-h- filset 8_84 ascii 06/10/83 15:35:00 ## filset - expand set at ar (array(i) != DASH) junk = addset(array(i), set, j, maxset) else if (j <= 1 | array(i+1) == EOS) # literal - junk = addset(DASH, set, j, maxset) else if (index(digits, set(j-1)) > 0) call dodash(digits, arat, n) character pat(MAXPAT) integer n character patn patn = pat(n) if (patn == CHAR) patsiz = 2 else if (patn == BOL | patn == EOL | patn == ANY) patsiz = 1 else if (patn == CCL | patn == NCCL)eger bump, i, j omatch = NO lini = lin(i) patj = pat(j) if (lini == EOS) return bump = -1 if (patj == CHAR) { if (lini == pat(j + 1)) bump = 1 } else if (patj == BOL) { nt happen.') if (bump >= 0) { i = i + bump omatch = YES } return end #-t- omatch 8_57 ascii 06/10/83 15:35:00 #-h- length 1_56 ascii 06/10/83 15:35:00 ## length - com k = LETA - BIGA clower = c + k } else clower = c return end #-t- clower 2_115 ascii 06/10/83 15:35:00 #-h- equal 2_84 ascii ray(i) into set(j), stop at delim subroutine filset(delim, array, i, set, j, maxset) character esc integer addset, index integer i, j, junk, maxset character array(ARB), delim, set(maxset) string digits '0123456789' sray, i, set, j, maxset) else if (index(lowalf, set(j-1)) > 0) call dodash(lowalf, array, i, set, j, maxset) else if (index(upalf, set(j-1)) > 0) call dodash(upalf, array, i, set, j, maxset) else junk patsiz = pat(n + 1) + 2 else if (patn == CLOSURE) # optional patsiz = CLOSIZE else call error('in patsiz: cant happen.') return end #-t- patsiz 4_19 ascii 06/10/83 15:35:00 #-h if (i == 1) bump = 0 } else if (patj == ANY) { if (lini != NEWLINE) bump = 1 } else if (patj == EOL) { if (lini == NEWLINE) bump = 0 } else if (patj == pute length of string integer function length (str) character str(ARB) for (length=0; str(length+1) != EOS; length = length + 1) ; return end #-t- length 1_56 ascii 06/10/83 15:35:00 #-h- clower 06/10/83 15:35:00 ## equal - compare str1 to str2; return YES if equal, NO if not integer function equal (str1, str2) character str1(ARB), str2(ARB) integer i for (i=1; str1(i) == str2(i); i=i+1) if (str1(i) == EOS) tring lowalf 'abcdefghijklmnopqrstuvwxyz' string upalf 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' for ( ; array(i) != delim & array(i) != EOS; i = i + 1) if (array(i) == ESCAPE) junk = addset(esc(array, i), set, j, maxset) else if = addset(DASH, set, j, maxset) return end #-t- filset 8_84 ascii 06/10/83 15:35:00 #-h- locate 3_22 ascii 06/10/83 15:35:00 ## locate - look for c in char class at pat(offset) integer function l   ocate(c, pat, offset) character c, pat(MAXPAT) integer i, offset # size of class is at pat(offset), characters follow for (i = offset + pat(offset); i > offset; i = i - 1) if (c == pat(i)) { locate = YES  = index(valid, esc(array, i)) for (k = index(valid, set(j)); k <= limit; k = k + 1) junk = addset(valid(k), set, j, maxset) return end #-t- dodash 3_96 ascii 06/10/83 15:35:00 #-h- index ) integer j, maxsiz character c, str(maxsiz) if (j > maxsiz) addset = NO else { str(j) = c j = j + 1 addset = YES } return end #-t- addset 2_44 ascii 06/10/83 15:3 esc = TAB else esc = array(i) } return end #-t- esc 4_24 ascii 06/10/83 15:35:00 0 #-h- reset.r 1_96 ascii 08/30/83 12:30:00 DRIVER(reset) character args(MAXLINE) string pmpt "'return' when ready " call mkarg$ (args) if (args(1) != EOS) { call outl$ (args) call prompt (pmpt, args, STDIN) } call return } locate = NO return end #-t- locate 3_22 ascii 06/10/83 15:35:00 #-h- dodash 3_96 ascii 06/10/83 15:35:00 ## dodash - expand array(i-1)-array(i+1) into set(j)... fr 1_127 ascii 06/10/83 15:35:00 ## index - find character c in string str integer function index(str, c) character c, str(ARB) for (index = 1; str(index) != EOS; index = index + 1) if (str(index) == c) return 5:00 #-h- esc 4_24 ascii 06/10/83 15:35:00 ## esc - map array(i) into escaped character if appropriate character function esc (array, i) character array(ARB) integer i if (array(i) != ESCAPE) esc = array(i) e bdos$d (13, 0) DRETURN end #-t- reset.r 1_96 ascii 08/30/83 12:30:00 #-t- reset.rat 2_92 ascii 08/30/83 12:30:00 #-t- reset.ar 4_95 ascii 09/02/83 09:15:00 #-h- rev.ar 12_80 om valid subroutine dodash(valid, array, i, set, j, maxset) character esc integer addset, index integer i, j, junk, k, limit, maxset character array(ARB), set(maxset), valid(ARB) i = i + 1 j = j - 1 limitindex = 0 return end #-t- index 1_127 ascii 06/10/83 15:35:00 #-h- addset 2_44 ascii 06/10/83 15:35:00 ## addset - put c in string(j) if it fits, increment j integer function addset (c, str, j, maxsizlse if (array(i+1) == EOS) # @ not special at end esc = ESCAPE else { i = i + 1 if (array(i) == LETN | array(i) == BIGN) esc = NEWLINE else if (array(i) == LETT | array(i) == BIGT) #-h- reset.ar 4_95 ascii 09/02/83 09:15:00 #-h- list 0_11 ascii 08/30/83 12:30:00 reset.rat #-t- list 0_11 ascii 08/30/83 12:30:00 #-h- reset.rat 2_92 ascii 08/30/83 12:30:0ascii 09/02/83 09:15:00 #-h- list 0_9 ascii 08/30/83 12:30:00 rev.rat #-t- list 0_9 ascii 08/30/83 12:30:00 #-h- rev.rat 10_79 ascii 08/30/83 12:30:00 #-h- defns 0_62    ascii 08/30/83 12:30:00 # include general symbol definitions # include ratdef #-t- defns 0_62 ascii 08/30/83 12:30:00 #-h- rev 4_111 ascii 08/30/83 12:30:00 # rev - reverse lines DRIVER character iles given, read STDIN call revl(STDIN) DRETURN end #-t- rev 4_111 ascii 08/30/83 12:30:00 #-h- revl 2_46 ascii 08/30/83 12:30:00 ## revl - reverse lines in file 'fd' subroutine revl(fd) int 0_8 ascii 08/30/83 12:30:00 rm.rat #-t- list 0_8 ascii 08/30/83 12:30:00 #-h- rm.rat 20_73 ascii 08/30/83 12:30:00 #-h- rm 10_97 ascii 08/30/83 12:30:00 # rm - remove (delete) filepen users terminal for prompting ttyin = open(trmin, READ) #open users terminal for prompting ttyout = open(trmout, WRITE) if (ttyin == ERR | ttyout == ERR) call error ("can't open users terminal.") } == EOF) break } DRETURN end #-t- rm 10_97 ascii 08/30/83 12:30:00 #-h- kill 7_112 ascii 08/30/83 12:30:00 ## kill - remove file; asking permission if requested integ(1) == LETQ | line(1) == BIGQ) # quit return(EOF) else if ((line(1) ^= LETY) & (line(1) ^= BIGY)) return(OK) } if (remove(name) == ERR) { call putlin(name, ERROUT) call remark(lin(MAXLINE) integer i, fd integer getarg, open call query ("usage: rev [files].") for (i=1; getarg(i, lin, FILENAMESIZE) != EOF; i=i+1) { if (lin(1) == MINUS & lin(2) == EOS) fd = STDIN else eger fd, i integer getlin character lin(MAXLINE) for (i = getlin(lin, fd); i ^= EOF; i = getlin(lin, fd)) { for (i = i - 1; i > 0; i = i - 1) call putc(lin(i)) call putc(NEWLINE) } return end #-t- revl s DRIVER character arg(MAXLINE) integer i, j, vflag, aflag, ttyin, ttyout, len integer getarg, open, getlin, kill string trmin TERMINAL_IN string trmout TERMINAL_OUT vflag = NO aflag = NO for (i = 1; getarg(i, arg, MAXLI else if (arg(1) == QMARK & arg(2) ==EOS) call error ("usage: rm [-v] [-a] [files].") else if (arg(1) == MINUS & arg(2) == EOS) { for (len=getlin(arg,STDIN); len!=EOF; len=getlin(arg,STDIN)) { er function kill (name, aflag, vflag, ttyin, ttyout) character name(ARB), line(MAXLINE) integer aflag, vflag, ttyin, ttyout integer getlin, remove if (aflag == YES) { call putlin(name, ttyout) call putch(BLANK, ttyout) ": can't remove.") } else if (vflag == YES) { call putlin(name, ERROUT) call putch(NEWLINE, ERROUT) } return(OK) end #-t- kill 7_112 ascii 08/30/83 12:30:00 #-t- rm.rat  { fd = open(lin, READ) if (fd == ERR) call cant(lin) } call revl(fd) if (fd != STDIN) call close(fd) } if (i == 1) # no f 2_46 ascii 08/30/83 12:30:00 #-t- rev.rat 10_79 ascii 08/30/83 12:30:00 #-t- rev.ar 12_80 ascii 09/02/83 09:15:00 #-h- rm.ar 22_73 ascii 09/02/83 09:15:00 #-h- list NE) ^= EOF; i = i + 1) { if (arg(1) == MINUS & (arg(2) == LETV | arg(2) == BIGV)) vflag = YES else if (arg(1) == MINUS & (arg(2) == LETA | arg(2) == BIGA)) { aflag = YES call termin(arg) #o arg(len) = EOS # remove NEWLINE char if ( kill (arg, aflag, vflag, ttyin, ttyout) == EOF) break } } else if ( kill (arg, aflag, vflag, ttyin, ttyout) call putch(QMARK, ttyout) call putch(BLANK, ttyout) call flush (ttyout) if (getlin(line, ttyin) == EOF) return(EOF) if (line(1) == LETG | line(1) == BIGG) aflag = NO else if (line 20_73 ascii 08/30/83 12:30:00 #-t- rm.ar 22_73 ascii 09/02/83 09:15:00 WLINE, ERROUT) } return(OK) end #-t- kill 7_112 ascii 08/30/83 12:30:00 #-t- rm.rat    T,8%04) # define(ENQ,8%05) # define(ACK,8%06) # define(BEL,8%07) # define(BS,8%10) # define(HT,8%11) # define(LF,8%12) # define(VT,8%13) # define(FF,8%14) # define(CR,8%15) # define(SO,8%16) # define(SI,8%17) # define(DLE,8%20) # ame as ampersand define(APPEND,4) define(ARB,100) define(ASCII,12) # flag for ascii character file define(ATSIGN,64) define(BACKSLASH,92) define(BACKSPACE,8) define(BANG,33) # exclamation mark define(BAR,12fine(BIGT,84) define(BIGU,85) define(BIGV,86) define(BIGW,87) define(BIGX,88) define(BIGY,89) define(BIGZ,90) define(BINARY,60) # flag for indicating binary file define(BLANK,32) define(CARET,94) define(CHAR_D # you need to do to start a software # tools program running. define(DRIVER, call initst ifelse($1,, call main, call $1) call endst(OK) end ifelse($1,, subroutine main, subroutineILENAMESIZE,20) #max characters in file name # (including EOS) define(FORMFEED,11) define(GREATER,62) define(HOME_DIRECTORY,1) # define(HUGE,30000) #some arbitrarily large number define(LBRACE,123)define(DC1,8%21) # define(DC2,8%22) # define(DC3,8%23) # define(DC4,8%24) # define(NAK,8%25) # define(SYN,8%26) # define(ETB,8%27) # define(CAN,8%30) # define(EM,8%31) # define(SUB,8%32) # define(ESC,8%33) # define(FS,8%34) # define4) define(BEGINNING_OF_FILE,-3) # flag to seek for positioning at # the beginning of a file define(BIGA,65) define(BIGB,66) define(BIGC,67) define(BIGD,68) define(BIGE,69) define(BIGF,70) defineEFN,-1) # flag for mktabl character data define(COLON,58) define(COMMA,44) define(COOKED,1) define(DASH,45) #same as MINUS define(DIG0,48) define(DIG1,49) define(DIG2,50) define(DIG3,51) define(DIG4,52) de $1) ) define(DRETURN,return) # this is the return statement from the # subroutine defined in DRIVER define(END_OF_FILE,-2) # flag to seek for positioning at # end of file define(EOF define(LBRACK,91) define(LESS,60) define(LETA,97) define(LETB,98) define(LETC,99) define(LETD,100) define(LETE,101) define(LETF,102) define(LETG,103) define(LETH,104) define(LETI,105) define(LETJ,106) de# General Symbols - include in every tool # CP/M environment define(CPM,) # CP/M version define(NEGDEF,) # ASCII control character definitions: # define(NUL,8%00) # define(SOH,8%01) # define(STX,8%02) # define(ETX,8%03) # define(EO(GS,8%35) # define(RS,8%36) # define(US,8%37) # define(SP,8%40) # define(DEL,8%177) # general symbols define(ACCENT,96) define(ALPHA,-9) define(AMPER,38) # ampersand define(AMPERSAND,38) define(AND,38) # s(BIGG,71) define(BIGH,72) define(BIGI,73) define(BIGJ,74) define(BIGK,75) define(BIGL,76) define(BIGM,77) define(BIGN,78) define(BIGO,79) define(BIGP,80) define(BIGQ,81) define(BIGR,82) define(BIGS,83) define(DIG5,53) define(DIG6,54) define(DIG7,55) define(DIG8,56) define(DIG9,57) define(DIGIT,2) define(DIRECTORY,2) define(DOLLAR,36) define(DQUOTE,34) # DRIVER is defined as those things ,-1) define(EOS,0) define(EQUALS,61) define(ERR,-3) define(ERROUT,3) #standard error file define(ESCAPE,ATSIGN) #escape character for ch, find, tr, ed, # and sh define(FILENAME,1) define(Ffine(LETK,107) define(LETL,108) define(LETM,109) define(LETN,110) define(LETO,111) define(LETP,112) define(LETQ,113) define(LETR,114) define(LETS,115) define(LETT,116) define(LETTER,1) define(LETU,117) define   (LETV,118) define(LETW,119) define(LETX,120) define(LETY,121) define(LETZ,122) define(LOCAL,6) # flag for local-type character file and pathnames define(LPAREN,40) define(MAXARG,128) # max size of strings to be e(MAXPAT,64) #max size of encoded patterns define(MAXPATH,50) # max chars in path pre- or suffix list # (used in string matching) define(MAXTOK,25) define(MINUS,45) define(NCHARS,33) # number of spe(QMARK,63) define(RARE,2) define(RAW,3) define(RBRACE,125) define(RBRACK,93) define(READ,1) # flag to open file at read access define(READWRITE,3) #flag to open file at read/write access define(RPAREN,41) deine(YES,1) # Definitions of language extensions define(character,byte) define(CHARACTER,character) define(short_int,byte) define(pointer,integer) define(POINTER,pointer) define(max,max0) define(min,min0) define(MAX,max) dncoded # for pattern matching define(MAXCHARS,20) # max nbr of chars when converting # from integers to characters # (used by putint, outnum, etc.) definecial characters define(NEWLINE,10) # character used to mark end-of-line define(NO,0) define(NOERR,0) #flag for successful completion define(NOT,BANG) #choose your favorite: ! ^ or ~ fine(SEMICOL,59) define(SHARP,35) define(SLASH,47) define(SQUOTE,39) define(STDERR,ERROUT) define(STDIN,1) #standard input file define(STDOUT,2) #standard output file define(STAR,42) define(TAB,9) defefine(MIN,min) define(andif,if) define(DS_DECLARE,integer Mem(5);common /cdsmem/Mem) define(DS_DECL,integer $1(5);common /cdsmem/$1) define(ABS,IABS) define(abs,iabs) define(filedes,integer) define(IS_DIGIT,(DIG0<=$1&$1<=DIG9)) # valUSdtUDThy=I1% )ӑQ- %>(S"`M!95N(ӕ@9X\RTK2 qX Z.,K@%ŠIh-e\b K qZ.4*K@%ƠYhA-e \rXK qZ.<+K@%Ǡ h-%\Le(MAXLINE,128) #normal size of line buffers; #must be at least 1 more than MAXCARD define(MAXNAME,FILENAMESIZE) #max size of file name define(MAXOFILES,10) #max nbr opened files allowed at a time define #(used in pattern matching) define(NULL,0) #empty pointer define(OK,0) # success flag define(OR,BAR) define(PATH,2) # flag for UNIX-style pathnames define(PERCENT,37) define(PERIOD,46) define(PLUS,43) definine(TERMINAL_IN,"CON:") #name of input channel to users console define(TERMINAL_OUT,"CON:") #name of output channel to users console define(TILDE,126) define(UNDERLINE,95) define(WRITE,2) # flag to open file at write access defid only for ASCII! define(IS_LETTER,(IS_UPPER($1)|IS_LOWER($1))) define(IS_LOWER,(LETA<=$1&$1<=LETZ)) define(IS_UPPER,(BIGA<=$1&$1<=BIGZ)) define(MAX_INTEGER,32767) #******* end of symbols ******* Kr rZ.D(K@%Ƞh-#%\EK  rXRZ.LK@%ɠh8-'et\DK r2Z.T$@%ʠ9hX-+%\EK R r Z.\'@%ˠ9hx-/%59X Yn3e\   ^2 v!S94+Pj:*r'9M!95O3@!g:Z5)x0-@&b - %?3@%@W1h,a 0b*Ġfx0?@ %%`h}\X݄0 G4@,N>  q83lhsփֱ>/f5-` |^2 v>(  X,aLX*S)xǘcz1ÀMf!,;1b@0Š cBè`!f CĜDT˘ CTOID5D8pGETLINdtUEu$HEQUAL0!bXFH*za$e("Fj2ZJde 'aQ9ZpTd#3X( G@2rz$RT dԴ$rHy=I1% (QSDX\AK@R0 pPZ. 9@%h4A-%`9 M57Pȋp(47q`Pp:8< U@",``0`h*`,+udE@X<* Xa0V?5` |C8 p4`0HGO31EtXbj* ڂɔFN2rbJr\ed"))"W#I1MRpSP dT5Hy=I1% (QSDX$"`H hFf7B0r"j*o fcxϠukS[V f,1/`E8ps֍` |^2` v.7Ny@m2M#ȺZ[U@",<*` fc{Ub3 X\p@&;V`L2019Q"2U& 1 8PSSՑ`TdXy=I1%E@b,!~X#X$ G X6 Yu6>!̠ ax3-@2f' XOYnXde@8dO",:̠zo QSDX$# V f,:` a` c?݄_dJ?H 4d:!S4Ai(pU!)@a8D@d#!@A -962nI#( 2f 8UV dtE$Uy=I1% (QSb- %p(4p fj?e u` |^2 vĠ(9 =9%0 5M` |^2 v*Ġ- %?DY`4d~* LG@GXkS`[eX`[#7qHGDY#@0ZJf`X0g!# VX`uF>/ EU4y=I1%E@b,*`Bh:X$&P)HjQPUSH 5y=I1% (QSDX$"`H hFf7B0r"j*o fcxK0|U@XTX,* E@8D &P.0 H(j 5?5 SS e$THy=I1% (QSDXU[f?", 8p(f:!L_`ư@&5 @ƘETT,ɩɨd ꪊdpHd0Pkvɩh*H䓀PR d5Hy=I1% (QSDX$B3@ >֮cѬOX<n%3 NtMyt2 q! b  UiSy8g>֮cz?XlnX\Fa0ȋ B?2"À&)b?Xg!VLc@X\E@2ɨILENTE4tUHERRORTĔPt$%"NP eE$5Hy=I1% (QSDX$"`3@V ?Xfcy*o='ifp4%3-@LbXdx2 :1a5OYnX1f@>/fPh:@|kSe[>h" x" H4aPF}\X(݄ &cX,F#>֮cѬOYnX1 f@>2̠9L/f`%<\`RK@ q>Z.3KC%ƀ hxA-p|<\pWK@ qZ.;KC%ǀ9hx-<U@31RQSxdE8$UDh#b  dX3@! Eb1s֍` |^2@ v! b*ĀfbP Przr2J? ap$kZe |AiʊI|Lm@GXkS`[V%hi)2" #!#$Vaf01b@OYnX#Pȋ0nFCONFIG`ͼ`,0c:Ā `CX݄ (F CIOa9 =9%À 60 @ Ff7X$7sj?e 1,`h"2ɘUNLINKdDHDSFREEG@2*jrz$ dDHy=I1% (QSDX$U@31RQSd#3X( G@2r¢rz$ e%dHy=I1% (QSDX$U@31RQSxd '3Z:! b6*+hi2"Šb*`bV uxFrb fc{U@b3&Pfh誓@2BQTԦ 8S de$T5Hy=I1% (QSDXU@31RQSd#3X Ub~紩3@W1hXn :Z5)x-@`LU31RQSxd#3XLF}\X݄ hFf7B<2"D&HU H4a01_a0Xfcy*o=' :ZZe@ U31E&5EX\*`3@W1h=k,:a.#uhFf7DXlU"pf 0b~*&)`"4ͷ. 2e `0cFB@r* ,g'"FVr*jz$g`)" FH2 Zrle !!,FUj2ze'[@c5=Ypd44E(y=I1%E@X2e`p 5 d44E)PTT5tD(y=I1% )ӑQ- %>('#b`*&f,D#b V"j?c|e UnV @*qV"LjXV`Pȋ +Y*Ā fcx B0r"j*o Dd0h@8@W1hYnXMVf 0b*BhG (6GEXR@   ;d.30s֍` |e U@Ў:`Pm-X!Ā (E@IOј.)Ȉ(c FC@" d*%&LJ@0CTOC@hih*X2Pf@1 8`dtE%$y=I1% (QSDX$"`~␌4ȀCD$d$D2D|5bdtUDDYUT dtUEEy=I1% )0SX$# V f,: bkX`kX88L! ax-@x`Lu@ư>2')}QOppC@[" `L@U@1 5dtUEEd͡ ͠X=k,ao ,  C@`4o .3(s֍` |^2Ƞ v.FK[@90 X@fpx]>g tE@5#^8`X# t2~7q`Pm` 7pOXm@6C@u GpVGfg.3(l3j^s֍` |^2Ƞ v!L1`p0  \.r6~@GXx2@ ;j1d&:` f8 &$Lo` 1#8 Y9]1%:2,US4`YAUQ%9R3SPT)LkTSd4Ty=I1% )0SX$#  &!f$Lh FOLD@2bzzlRST`dԵTy=I1% )ӑQX$"`t\ $K@p pZ.KA  X K0hL CONFIG UX`\4@%0ͣ"À -7)m/`X2e2fTPQU$TDhy=I1%E@b,`4ha VuXFf7Ҧp}\O݄ hCXa@a 0 baPaP XHD&) $+>֮cѬOXPn/ 0 XHc*@,ɔ FO2:*A$P:TPQSSՑ`e$TdXy=I1% )0'+>֮cѬOXn"`odE Ub3 C,D1H`oy dEX! HFf7B<2" b ho ,L}\]>/b,ɘ̀ 0R)B`ˬU@312" xG x4X#@",^X,*  RS TTHy=I1% )0S⚀ =9%(QSe ih(-%\sK pxZ.2K@% YhH- %@$\*rK pZ.;@% )hh- %\:nK2 pZ. 6K@% h-%@tRo`P pf7qHGDY| #3o8#",!"* .:@|)@ȋ#iHF86.3B>2""ͩ#o ␏ 8k#3k@8#",@!* !,81t` 0|` kV f `Xp݄_dE?H&P$*i đ 5*d4T`d44y=I1% )ӑQX$"`U@sփֱ>2À~k -,:aUbb," [ "  @ `!4#0rzr2J?! 8SdTE(y=I1% (QSb =9%E@b,.A%h8D- 0\(?K@p pZ.A%h8d- %:X,#9:ϠukS[ " fcx#!)ȋ@ Xg!V ?HGDXxUbS@ M54E@0ZJ`hXTn/2f"X0ZAXaPaPV pȋ +XX* fcx B0r"j*o fcx U@iSy8g>֮cѬO݄ #",,!b,sXLRoa0dp`4a CIO@ OXE@20 PfHdQ Hjq 1c #9UA-94c:M}#IAI6pU`dtUDDXy=I1% (QSb- %)Pm`0HGO31Ϯg!i`Fp(6@@`pq>֮cz?YnX Rf,"}\X݄_da@X,5)x-@D`h*` E@&3"#a[U",<! b"{JI8q:X$O@b"a`mJ݄0 L~&+X,&PDjqpq誊H Ɉ I13X,#3!aVb q-t! B&PH1x#!`MRdDLB `PACKNMU44ht'"")NT e$Hy=I1%E@b,`4h3@Ys֍` |^2 v* bD*V f,ɔ FL2:*bJtd@$*,J*z$:T'P0* ͨREMOV$d4HPPACKNMT44Yt)""USe4UDThy=I1% )ӑQM!9X(ST  9QI1\TK2 pX Z. K@% h8-e\"EK pZ.*K@% YhX- %\2K2    pRZ."@%àhx-%\BMK2 qbZ.$"K@%ĠYh-%\RPK2 qXRZ.,$K@%Š h-eĴ\bTK qZ.4!@%ƠIh-%\rK q&Z.<)@%ǠIhCC@b~:ְ>/dpP?fԀf3@LbFA2* , e$T$8EXITUDĔPPUTINTUtĔ`PUTCH44Y t)"+NUS e4UDHy=I1% )0SX$"`X$#30ZJ xkS,"*>! ax  d$4Hy=I1% )0SX"`X #30ZJ e 1"`oz d#3X#X5)x-@fcx#",* )Ff7X$#9 Ff7B>2"`*`1U31R V 9B~`UXF" :@b,1`0U@nV U+>&P>/*sP2>f1 I8QTTutD(y=I1% )ӑQX"`9 =9%΀8@h#`@ȋ *@qVPȋ B(wa U~Ys֍` |^2 v*pxCONFIG` ZAX@݄q4aK([#h+>֮cѬOXnX|O@݄ XFf7bb* f`)x-@2  LWXuc:ÀaҰ $2@ ; 1aOXn,z?,aE@`dBĈU@2 pt$*,TRSeDU$Ԕy=I1%E@%`Ih-e``Դ \@Vup4d#! Q=bMD#QI5%:pRU dԵDy=I1%E@b,!X" 4`j?c|^2 v>-,\RKR r>Z.D)@%ȠYh-9M!95O3@g:Z5)x#-@ a7 ΂eMcIn6MAtC44d~0o ,8#@@8p(4PfӠ"`|':ZZ#-@ -@`LU3>2 g:Z5)S XHnX$#3?2"U~?Ze@ U@31#@",> xc *`x]>g`LŌU@31#",~s>X<*  X,"a~`U" @e4$*,p1Jd@#'QH2Q#71UM"kHi $SSI e$THy=I1%E@b,!b`*V f* WpU@b82ep HD0bhMQ@#I94pTӓI eUHy=I1%E@b,* x]>ga g>X f, f 0bX! bɔ FF"Jz(P jsXGWDIRI d4Hy=I1% (QSb =9%)0SX$"`- %? H4kS,Pa dF_l kS,Pa!]>/bW ,1F`Lİ|?}e&<#L{@GX(+̀@p5誊H Hds xcFa2"z"$4dd2Hh UPPERр5D9t&'NT d4Hy=I1% )0S@ M54E@  xE @W1h=k,*aSd,*a 0bd* fcx B8`PVX2"z@X8B0:X<o 紩3@W1h=c S݄ 8*``P[U@'V;8EXF" :z1y`p[U",>xUb,*V =MZ@|^2 v*XDX<U@nV X<*1`P0hbRB< 2" Y|QX F"` :1sPmLP!fPh! 4(ʹ` ! v! d4͸ ! ۦ! ۔Rͻ ! ! ^; !` ! :ӕOYn8C0C@HbB:ӑQ(OYn8B*2"zY$:US'SU eE$UHy=I1%E@X2e`p 5 eE$UIԒUQeu$DThy=I1%E@b,`4h`VuXFf7Ҧp}\O݄ x* `X 3@VxLLX,#3X(eUD4It+$"NI(X,!€ F",0+uXdEXHϮ`y"AO4waXDXp|:ab,>2[7wX X$2~sXD kS[`0e`Ƥu>/a`[U",0> U@b,> U@nV  UFXh|ae,D*QSx E hG@hS 3i([1ax]>gE"HD FXtObbR E @W1hOXnXT#@",R~sX~ke U@8t2" V);A@EXTF"  ;1@,>#,!X4U@/7dZ@|^2  v*XDXXU!9 M57DX`#@X` 8T,Xhn,1`0Řu` |^2  v*,ɘLM@X<F" :1_,ɔ Fa2jzJ$H:T'TU`d4EEy=I1% )0SX$U@31#*`V x ba T`pTzNXPXH* (TDUp9jsSMKPATHQdDE5E(y=I1%E@b,>ph4`oX,2" D&U@:X4#3.V 9B"}\X݄@dT 2e d   *V0ADDSTRUU dDDHy=I1%E@b,.KA%`h8p]-d\>-Kp" *|':ZZ-@ EbXDXB:X#9 E@t4bF!X\8\U@ p3@>֮cѬOXnX\V`ȋ 4* &b`mke@ #X$oDXTB:X,2"@*b &)B.+uHdEXP@` |^2 v!bb VX$2"ĀHͶ@V"9B*`og:Z5)x-@`LPUnV 3l OXnX\F" ;1L\X\cTͯ`,*`1?u@8h#X$IX\#X$nXTB:X,2"@*b *XDX$5)!b@X8l/bap LG@8h#X$tX\#X$wXTB:X,2"@*b *XDX&)!b@X8l/b,.'I<) )P"ʀ)8 `!AP&P#H)$"! b"@! f"ƀq)I)P!I)4)H@)L#9L)L)! H7q j?d |e@ U@iSy8g>֮cz@:dL/i`HF"`"ӠļU@F`pȋLR%ÀTZ*,<À&* V}\X݄ (U@L_@8,s֍` |^2 v. 7Ny@m2M#Ⱥ[L! 1a0HGDXhB:Xh#9 #",\*`V.9B&#`HGDXUbX,*  `psXDX).bX@8l/b`oX,#90 U31V`ȋְ>2@X~k Z `+kS\x݄ XFf7bs2~,X#uHdEXV`ȋ `U@",h*ŀV :X$2"X+uHdEXV`)x-@uXdEX\V`ȋ 4uFrV fcxF#>֮cѬOXn/2f; .+uHdEXb@` |^2 v*1a  ʀ_dBD @U",D!bDs8h#X$UX\V`ȋ 65M` |^2 vͬ`,*8h#X$KX\V`ȋ 65M` |^2 vͪB,*!bb VuFr x b?5` |e@ B:X,2"@*b @.* "XDXU z,Ba*`"ap[U@",H*Ā Zb !b?F}ap L_@8h#X$LADX\#X$OADXTB :X,2"@*b *XDX))!b@X8l/bap Lx@8h#X$dDX\#X$gDXTB :X,2"@*b *` E@2,CTOItD6CHKDAT4D $TYPEG@2 z" ZӠ6! LQX4"OukS[V j uuDmaaV ? XB:X,2"` V;d@&,X(Q@ hi 3(krjӀSTdDT$xy=I1% )BTXU@31*T*o=' :ZZe@` |^2 v*  :X {X,LCD  XUiSy8g>֮cz?XdnX$R`HV`0Ff7Xh#9 HE@X,F"` :b1Me@P)ђ0h誑p H*IsX ENTERQ`Td4y=I1%E@b,* 9).V:?9*o=' :ZX)XUa+X0 9)=V4?9*o=' :ZX)XUaXcV0?5` |C|e U31EnV x]>g`V ?bXOa+XbaP b?5,\p':ZZ-@uXdEXT*@18\U@EnV 3j( X,Ba.* ڶ" V 9S01saPXg)H HL]XT"Oux-@ :X,#9@@XDXB:X#9@XDXB:X#9pG H6\X݄_dzX\V`ȋ 6́Ze@ Ub,.þsI8 p3lH p3i :X,#90 @uXdEXT*@1UnV >/bap LZ8\U@E@ @U",D* V"9B.+uHd)x-@ ӐU d44Hy=I1%E@b,`4(X4pXG 4`Ph"EXF" +udXLnXE%DZ€*` 8*1a0U@nV U@XdTuDSCOPYG@2zr PST5Dy=I1%E@b 1$`o`0Vu*o=' :Z[V0GDX U<2~V9B#`01 E2 t"" #QSTTTDU(y=I1% (QSDX"`H (Ff7B0r"j*o fcxϠukS[Vf,4* j#udE`fư>2 v*`f :1d#!Q "2HTU&@ 8Q`Tt5Dy=I1%E@b,`4hla-  e0\<3K qZ.!KC%@yh`q- eP 0\LbK r q@Z.)2C%@ih`- ,"*"~*(c\o 《xE @W1h=k,\*Ysցt-,^a~,&#B*#X,#9LJ1"~XO` |e U31V`ȋÑbb.3Ҧp}\Oqp^2 v*`+uHd8 0    fcx* ,bh2\!` V"`!Vux*o=' :Z.a0j?.[ Xnu8 b* Vf@X DXDU31F`çS01p݄ *oN%L,ɘ2e ɌTDUCLOWERDә`t'QU`TtDDXy=I1%P58dtUDD)UU dtUEHy=I1%E@b,.%" X$&P&1&Ad\& MH@#QARpUԑ dtUEu$Hy=I1%E@b,`4hfcx* ?5-` |eXD5)[ XPnX,#3nV 9L:18@,*`+uH`ȋfcx*1B&c!b?5)x-@0q0Gp4V Ff7b@s 2f""*  ?5` |eX75)[ Xn 0Ub3uHd,>a *` @V 9L0c!bb*`}':Z5)x-@SǠpf7NFqЀ@b03e "l:E@1=f@)ŨA&*@jV ;_d@&$``fp# #R:*bJtf'"Lz@` )hi 1H*Iqp*XJISV8GFNARGQUTtD8y=I1%E@b,>pJI9sցt-@ :X\7q@,"&+"E@&.3pV*`/a0 X* Vf0aPXfcy*o=' :Z-aj?-,\aQh݄ U@317sj?-aj?),\a*#aPX8OX<n`ČuX,,,a+>֮cѬOX<nX1M`X* XX<nX1hakpXN8<l/a` ` b? p%pXe Lp@vXc: ` |^2 väP pżU@E@b,! \*@%p &- PVu4d@#!`Q9=^20UU&` 8UDtUD8y=I1%E@ 3@d& d(!MD#QpQU TtUD4y=I1%E@b,!XB(:X2"~V=ME8<U@b g:Z5)dE@`Sa0V?5,g|eXD1aP0 )8LL/a``[U@","*`+uHd* qV ?Ub3X<T&3+uhdE@"w`X2e^GETWRDѓTdtd$xy=I1%E@b,.)A%@Ih8l-et\`ȋh3@Xg!`Ff7b3j?e " H4': )]-h!bs<31i_,ɘ0 huXFr0 fcxV+>֮cѬOX|n @U",@*V f,#>֮cѬO݄ h*  h4 %<\<2Kr qZ.!C%@ihxo-%P̴<\LAKR q@Z.)"KC%@Yhx-%~j?c|e@ B&bL`3@j?c|e@X\V+>֮c.e B ŔU31Z[U",^>xb0&<"*`o=MZ@|e@X$#3Ϡu 8L/baP bbU) XB :XT7sj?x-@ bb.3 X*`X*`3aV3;E@XLF"` ;1b,á" @׬:TSSS`TĔy=I1% (QSDX"`~␌'"~␏ 8:X#9 Ff7B<2" ~V 9B~␏ Xfc{Ub3 B<2"~V 9L@x:SSgT d[Vf1X2"XF" :&1N`p[U@",`&P$=誈*H@ 5TtUD4UTdtUDD(y=I1%E@b,.A% h8_-e|\ Ff7ϠukS [*`f 0b<`0ĸ( D5D9< XFf7ϠukS[`!bbb!bb  b !bb@b@&#~Ys֍` |^2 v!bb* V f3j?-@uXFrV Ff7b@sX$)[WB:X,2"@#uFr,ɘ ZF3>2*#Ϡuc?>P݄@XDXUB:X,#90 fcxE @W1h,>a(*`1B:X,2~:Z5)x-@G8#8dHD 2f"l0c@|e,Za~cXdU@31Ϯ` E@X$#3g:Z5)x-@a1`o>֮c.bV@W1h8L/baX L@&:@ 0c * " p" .! E8NXLu,Za&)udEb.{`L2@S#% 1% N2U#4 ,k*sӠd4d4y=I1%E@b,* E@ LE@X$o ,"*XO|"`V :8TX(DPMOD@ 5Sd4d4TSD4y=I1%E@b,!XU@nV Uy=I1% (QSDX$"`HK00U@X8lU@s֍` |^2` v!X1-`o`4E4T?a B?2"ĀHb&a0V@W1h,Fa&)ȋ XU0 `Vu*o=' :ZZ-@    EbXDXU!?Xg!VX<g&7@" A0dp)&*c2r \ep$"M|#1==-UBpSTTtU(y=I1%E@X2e`p5 TtU)SPU TD4y=I1%E@b,!X<UnV -@ * ZAX(pVf,:*Bh:82e2,U%AUQMQJjZ )ʓUP e$D$y=I1% (QSDXU@31E  8E!9 M57O31E@XZF>2` v*,)Ff7(3@& |+J Ǖ`mOd#,MIj!b@Vd#3bHs 2f6*#aPU>֮cz?,Ba 0c* V ?ȋ B?2~,.ôpVf*1B&PL1(#! 9U9A .3SS%`MR2U#=`9MIjhj(IT U4E$y=I1%E@b,`4h3@U45E(y=I1%E@b,>ph4`h" ~,&+>֮c.݄ *  xFf7@W1hOXlnXLF`o fcz*oN%LV9S@VU312" 8}\]>/a@,&1aPXҦp}\OXlnXDE@&0ĬU31V`Pȋ+X0ɔFC@" :gTS U5DDTy=I1%E@b,`4(3@ (Ff7X #3",*`V =MZ@|^2 v*`,1D`0o`V uX*o=' :ZZe@ Ub,`ȋ H* X hE@t<bB*`V U" @:TSgSSeTĔy=I1% (QSDX$U@31R"9 M57O31EX<#'")ȋ hU@b3 B<2"`a0*`,ɔ MV#U91%9.pUTTUUU(y=I1%E@  ݄@ dOX<F" :1,ɔ FK@2 j Dd:SPU'RP dԵD$y=I1% (QSDX$B3@ `4E4TaV ?Xg!V `"#`HGDXDB:XD#9 x|+J Ǖ+`LL2QU& h:RP'UPeI(IP e45D$y=I1% (QSDX$"`3@V?j?e@ B3@Xg'X#!)ȋ@ Xg!V?HGDXU@31Rou Fr xFf7DX#'" DoapV ?HGO31E@X\ZF>`o>֮c.݄ x*a`X3@dJ8<U@&h" 1X$2"@#a`X 3j82eɌDԔCTOCdTuD t)'NSV e4DUy=I1%E@b,`4hcV "B 3@.` i8`EXL* 3@W1h=k,6a.`ȋ * XLF"`.#ap U",8a &P<ɈH50U45E)TR`U5DXy=I1%E@b,`4h3@`o>֮c.݄ xU@312"C&h8* Xh݄0ƐU@b,*`1 a` 8&P$Ɉ[STDELT e5E$4y=I1%E@b,!X4U@b,`ȋ xU",&* VK5)x -@ b?5)x -@`L4U@b,áV X$2~kS[ " 0b* X```@[U@",* U#`@ 2e  5>UUU)UV`UtDy=I1%E@b,`4hfcxV"~,"X4@W1h=k,*a",*` B3@`X4f[B 3jE XX2UDDT8y=I1%E@b,8U@XlUb~紩3@W1h=k,>a Ethbt!XlUb:{JI9sփֱ>2 v*`bV fVL[2 @P*q1=& 8US eUDHy=I1%E@b,`42 v*1dEX,*@ EX,:X|2":#>֮cѬOXnX|R"`X3np 0 aVu*o=' :ZZ-@ EbXDXU!?Xg!V XlEf&`3V?HGDXU@bDsX<#3qp3@j?-@:8< ϠukS6[V0`L|Ub,`*BhG H6pLP 2e2fU)EU22T汀 8SE4Ty=I1%E@8,U@G HC2e p ʩ(isQSLENT" V XpX,*@ E@3V ? p:X$XX(`Le&LOȀLENGTHD5D9Xt `e5D4y=I1%E@b,>p(4`0o`V X2~kS,a~XDX0U@nV X0*#u8Fr`*XO` |^2  v!XLd@X4V"V :X,2"`"~a0]>/aP,&8E@&9 2e]STRCMPTS`U5E$y=I1%E@ @  `[U@'>2 v*XDX@aX@8<L/a ` a0ˬU@",08`J@b,ɔ Fdjz$ČHshd3YWKDAYT`EEXy=I1%E@X$-X HA `V ?5C2>2~kB)80l/`FXLQX$X H0 `݄C,&-~` 0u   @2 t*,"U d4DHy=I1%E@%`4:\&K@ p|.%`t>Z* }\]>/b0_,ɘ HFf7Ssցte U@31"l]bs'@* $?>֮cz?XU31V}\Ff7@W1hOq^2 v!~X1AV Ff7C/sփֱ>2`H~:ZF0݄_d` 2e`1`&(&@ ́G@2BZ" Sӕ dtDy=I1%E@% hH-)`@4 \eK R0 rZ.X0@% )hKp pZ.KA%àh8x-`X3@e@X,#3nV ְ>/a FXDU31F`&%~XOa[X݄ XFf7bs, `" ~XO` |e U31V`ȋ C @W1h,>aV hud*q `ȋ w@XDX4|/`fcxSsփֱ>/`X$c!b` z`X3l ZF>/`V h ud*q`ȋ wAXDX4^*q"€ EXX"%),Na4"@0+uHd)x-@ K\%@X<!0 bb@VuXFf7Ҧp}\Xb`V$?5` |C'[ q`K1P X<!E`UXV`ȋ U@'V K5)&cXHȠ G`XfѰ#j?e B L])Bɔ%LV@XESC$,G誈hi d*c%LE@D 5dIUSeUDĔy=I1%E@b,!XUnV XOX n`Ču@>/``]>!` ax-@`L B:X$2~,N!bb@V'pHdE@X#3bR~紩3@W1h=k,F*Ā+>֮c.0e B&c!b?>֮cѬO g:Z5)#S Xn 3@j?@V fӀj?h--%` \mK 20 rZ.`5K@% Yh-1`@ \lK 20 s8Z.h3@% 9h-5%`| \cK0 sxZ.p7@% ih-9e`@ \K2X \K@%@ 9U@e9, ;1h+udE@X,#3nV 9L:1aOX|nX^7q &PD)ȈP baii*IP CTOISU`dDTUDXy=I1% (QSDX"` -`0 `h+>֮cѬOX<nX$RQSdEXRouOu[VnV h ba aX3hZF>/`a@ udEX4V`0U+udEV;oEXPF`0ȋBwa@F"€,#a`mAXDX4^*vL`3S&>`@f$'C@" ƀG@22j" 8L/bpa hh KC@@8UbsXpLBEX`V`[kS&[Vc` qqG H4g:Z5)x-@LVX`UnV :X,#3iSy8g>֮cz?XUaSX`0e UXV`ȋ¦>2H~k 0Xf`Vup(6 0Et4bLɔFR2A$G@2bJtT`U44y=I1%E@b,>p(4`po`V? `[U@'>2 v*`XDX8U@nV X8*`1 `0UnV pU@d4 M]#M =Afp)X" H6@W1h8l/b_,ɘKD `U@",H~K2}\Ofcysցt-,LaE@3 `ȋfcxE @W1h=k,F*Ā}\]>!` ax-@`LB :X$2"Āb':ZZ @ |g>֮cz?YnY!G'DYY!` ZF>/ggdYYF"π :>15_,ɔ@LA ʘSTNCMP 鈑Hs5dtD`D5Dy=I1%E@b,.KA% h8Xe- \25Frph1)d#"MQ1V2єQf 8UU ddDDHy=I1%E@b,>p(4V h`X3@Ys֍` |^2 v!b`V? h|0`B:X2"x @U@", !ba a X3i(ZF>/`UdtUDxy=I1% )ӑQXB_/sփֱ>2 v*`b`Vi( 2~V9B#`0 2e@TGETNOWPRU dHy=I1%E@b,>ph4@,4!XBfcx * $?1&b@ %kSN`e Wf;2 @-a op3@aqː@1X<!`E8`U@K0@ \@%@*&fX@f#3@  X`J&<"0+uHd* f>2 v!~XLQhZ.IUSdtUDĔy=I1%E@b,!X4U@nV :X@5M` |^2@ v*V U" p b?e B baxX1[`>֮c.a `XDX@^*qV `L0U@b,á0VdH@*:*D:   USSPU dD4y=I1%E@b,`4haV ?@,** XO` |e U@nV ¦>/aaPaPaPVa0VX$2~kS,6a"À *-}`h}\X݄0`X&3`2"V  :X\7X!X,F@&' EX,* 3@W1h=k,a+udEX* چ*`1 aP :X #3*83X@W1h=k [Vuj6À XEvcvɔFD2b*r:Dg*!Lp t(*))NSSDTy=I1%E@X$@b,"*`#uXFraP X bapx XDV" @d4 Mw#QQ=.pSPeT4y=I1%E@b,!X4U@b,`ȋ xU@'V;xU'>/a0aV hLOX4V" @H:SPPE4y=I1%E@b,!#`@ 2e  5>DdI`e5D5y=I1%E@b,>p(4`ou8Ff7DX4U31EX#3X,Ub{JI9sցte UnV XDUnV  u@ -@X<b*`1 a` &P* d*Y Ub3LL2 @t)!&N`E5DXy=I1% (QSDX$"`3@V?HFCDSMEMoaP" EX\V`O݄ * .3XD2" .#ap.@f1uxFf7]bsb fc{Ub3fcys(+aXO¬0waXDXxuXx*a@ 0(U@2pMODD%9@(Qd3UITOCe5D48y=I1%E@b,>ph4`o :X4#3iSy8g>֮c.aa0aPVX$2"@ *-P`X 3@sXF#uhdEX\U&" 0b*,L.( 0&pV fpj?e U@ux -@ :X42~x -@JEXdF`OXd@f%`"2}\O݄@dTEXdEbb U2",**1U@"nX( dTuDȀ$D9G@"Jb*tTU4Dy=I1%E@b,`4hfcx x*  5)x -@ @ a[U@'>2€ v* XDXTuXT,,(a :1ga0ŨU@nV e K&1 #`X4U@b,`ȋ xU@'V;xU@'>/a0aV hLOX4F E@2@ʘ$D9G@" \D5D8y=I1%E@b,`4h`VX$2~c?,"*V ?TzNϠu 8DL/a `X :X,2" &`U@STNCPYT e5D4y=I1%E@b,`4h`VuhFf7Ҧp}\O݄ xEba@VuXdEXP* f>/a`[U@'>2 `o=MZF>! ax -@`LTLWtc>*1a  b?` |e U31F"` :X$ ϠukS[" fc{U@b3RouXFra (`Lx2S#8@EU22U&,` :gUDD8y=I1%E@b,`4h3@WXBX@"p4>x ba0X 0U31"]bsX4#3XU@X\D%@* ͫ`,.*,H.&@ $`Xfp`(b` m HUEX4E%[ŀڠmapVd &:ȸdDE4UHh$AT ^STCLOSU dtUD4,H*V X o ,.1p3@X DXTH&&." APg'!Fhr J:SPU'UEUD8y=I1%E@ 3@L bFB*D<:UUeUE5E(y=I1%E@b,`4(3@ X:X #3iSy8g>֮cz?X4n x2eYSKTOKUdtUEDy=I1%E@b,>ph4@,"*`+uHdXXnX,#3nV XTB b?5)[VX<2"** f>/a`a[U@",.ap X1ta0 0 XU@nV U#` x*`WUb,ɔ Ma# Q=pTTd5UU(y=I1%E@X$=X Ha h݄ HOb2}`1#`LMX(G@2* DdHy=I1%E@  * X```@[U@",* U5)x-@`1`[U'>/a@,&;+a XDXPUba`V? X.݄_a@" @(U@2 H t)'!NT e4$y=I1%E@b,*`+udE@`KX`pV?5 ` |C[V?ac X`*@(XHUb~紩3@W1hXhUukS4݅HX@*{JI9sցt HFf7@W1hOp^2` v*1X,2"h 8 +`"€(aTzNϠu ,4a +uXdE|"4y=I1%E@b,>ph4`oX,#9:nV >/ap` Ӑ`Xf,**`#uXFraVa pp: 6dU31EX<E%@x[ " "Ā"" D-@V u@h*`   XDXUnV?TzNSzq*g>`U31V`]kS[" 0c!~Xc* Ap$  d*pb[Fk22Jb*Ƭ@2:*dUVeE4y=I1%E@b,*`+uHd2 c Xp݄@@a0 kk -@aP  XH,.a"5)x -@aP  X,.a~1V up4@W1h,.aE@&(,0b4:@ csX݄ xFf7X`X4! d}\Xapk ),4aá" @՜:QTUPS'SU dd4UHy=I1%E@b,>p(4 %P<\,2Kr pZ.C%@ihxlo-%̴<\<K 2 qZ.!1C%@Ihx-P<<\LhK 2 q@Z.)5C%@hx-a 1`PoudY\U@31V}\Or^2 v* ,*`,  ۊ"@ 0c* +X2"ʠ@h}\OY\nXE@XEX$E@X,E9Ub(` U@31V+u8dE@YT! l}\OY\nE@b,>p(4`PoX#9 HFf7bsX*` e8`U@ HFf7baVu6 :XX7sj?c|e UnV  8U@ EubɔFM@*f ")FW*Jr"*d4 Mm#=LbX,#3nV pTkS,*ѬOph^2 v> XFf7b?  c$1S&P"54U49X[U@'aV ?XO` |^2 v>  XFf7bsbXDX8'5) `X84l/aXhXHX<u@V>! a[ X@n 0 5` |eX4[kSx݄ XFf7X$2~ctE@`u@¦>/`,&5`I@p0f@c0Ap2`f@ ŌbX* A@f)'Mp#AQM%jpPU dDE@&2,0b.4ic43 4N)]-h1Bf<  8 @W1hO݄ U312`!Xcl* Ae&'"C@" f)'Mu@c=5Q "pS dTuDy=I1%E@ U@'>2` v* 1aА 2eRLE|<\\pK2 qZ.19C%@Ihx-P<\lxK2 qZ.9KC%@hx-$<\|EK rZ.A$KC%@hx -"Pd<\MK r@>Z.I(KC%@hx,-&<\UKXE@XEX$E@X,E9Ub>ͭ,0c:* +X2"ʠm>֮cz?,a "Π"" "`*`:f 1`}`Vuh 6h c1pr&0@ ~7Xg&2e 3(hM"pRSV TDUy=I1%E@b,!XU@nV -@ b? XYOX4nX18`0h|B&P5OTDUQU dDE4UHy=I1%E@b,>ph4`ouxFf7Ҧp}\OXDn 0 fcx*`4y=I1%E@b,>ph4,*`+uHd2 ~XO,$: ` |^2 v* aPkZe U31*aVK5)x -@aP  XJ,.a~j?e BLeXH?kS[NGTHTd4tU(y=I1%E@X$-X HA h݄,* aa0V ? u@2 t!'NQTUPS TUTy=I1%E@b,!X4U@b,`ȋ xU",&* VK5)x -@ b?5)x -@`L4U@b, r^Z.Q,KC%@hxL-*% ~XDYTY\U@¬c?݄ (Ff7b?5 ` |^2 v*Vf,* ,*`, ph"@ 0b*+ud)W[V?[U",* ,*`,ˠePm| d*!h2.T&Q 8U`d4DXy=I1%E@b,`4hfcx*`.3X4#3",*V ?TzNϠux-@ ba V ? YOXDn 2f-@+`*@d& 8T dDD4y=I1%` X4#3nV 9BE@&'ɔ FC@" :QU'T4U48y=I1%E@b,*`+uHd 5) [V ?[U@'aV ?XO` |^2 v>  XFf7bsbXDX8'5) `X84l/aX   ^2 v!S94+Pj:*r'9M!95O3@!g:Z5)x0-@&b - %?3@%@W1h,a 0b*Ġfx0?@ %%`h}\X݄0 G4@,N>  q83lhsփֱ>/f5-` |^2 v>(  X,aLX*S)xǘcz1ÀMf!,;1b@0Š cBè`!f CĜ#%=A:2c&Q Q=2US8 Q]I3QTUPS&%@ 1 `PFH*za$e("Fj2ZJde 'cQ9QSxd#3X( G@2rz$RT dԴ$rHy=I1% (QSDX\AK@R0 pPZ. 9@%h4A-%`9 M57Pȋp(47q`Pp:8< U@",``0`h*`,+udE@X<* Xa0V?3@W1hXn8 p4`0HGO31EtXbj* ڂɔFN2rbJr\ed"))"W#I1MRpSP dT5Hy=I1% (QSDX$"`H hFf7B0r"j*o fcxϠukS[V f,1/`E8ps֍` |^2` v.USdtUDThy=I1% )ӑQ- %>(S"`M!95N(ӕ@9X\RTK2 qX Z.,K@%ŠIh-e\b K qZ.4*K@%ƠYhA-e \rXK qZ.<+K@%Ǡ h-%\Lp fj?e u` |^2 vĠ(9 =9%0 5M` |^2 v*Ġ- %?DY`4d~* LG@GXkS`[eX`[#7qHGDY#@0ZJf`X0g!# VX`uF>/ZpT EU4y=I1%E@b,*`Bh:X$&P)HjQPUSH 5y=I1% (QSDX$"`H hFf7B0r"j*o fcxK0|U@XTX,* E@8D &P.0 H(j 5?5 SS e$THy=I1% (5` |C[f?", 8p(f:!L_`ư@&5 @Ƙ#" A.c" IKii*I@ I h H1 t&#NPR d5Hy=I1% (QSDX$B3@ >֮cѬOX<n%3 N7Ny@m2M#ȺZ! b  UiSy8g>֮cz?XlnX\Fa0ȋ B?2"À&)b?Xg!VLc@X\E@2ɨILENTE4tUHERRORTĔPt$%"NP eE$5Hy=I1% (QSDX$"`3@V Kr rZ.D(K@%Ƞh-#%\EK  rXRZ.LK@%ɠh8-'et\DK r2Z.T$@%ʠ9hX-+%\EK R r Z.\'@%ˠ9hx-/%59X Yn3e\fbP Przr2J? ap$kZe |AiʊI|Lm@GXkS`[V%hi)2" #!#$Vaf01b@OYnX#Pȋ0nFCONFIG`ͼ`,0c:Ā `CX݄ (F CIOa9 =9%À 60 QSDXU@ Ff7X$7sj?e 1,`h"2ɘUNLINKdDHDSFREEG@2*jrz$ dDHy=I1% (QSDX$U@31RQSd#3X( G@2r¢rz$ e%dHy=I1% (QSDX$U@31RtMyt2 qd '3Z:! b6*+hi2"Šb*`bV uxFrb fc{U@b3&Pfh誓@TU%$)t&)NS de$T5Hy=I1% (QSDXU@31RQSd#3X Ub~紩?Xfcy*o=' :Z5)x-@`LU31RQSxd#3XLF}\X݄ hFf7B<2"D&HU H4a01_a0Xfcy*o=' :ZZe@ U31E&5EX\*`3@W1h=k,:a.#u   hFf7DXlU"[U@",<*` fc{Ub3 X\p@&;V`L2019Q"2U& 1 8PSSՑ`TdXy=I1%E@b,!~X#X$ G X6 Yu6>!̠ ax3-@2f' XOYnXde@8dI1% )ӑQ- %>(QSDX$# V f,:` a` c?݄_dJ?H 4d:!S4Ai(pU!)@a8D@d#!@A -962nI#( 2f 8UV dtE$Uy=I1% (QSbGEXR@;d.30s֍` |e U@Ў:`Pm-X!Ā (E@e&$FS"z*tf$$'K*Jr"* &= d*P I1(0CTOC@e!*FZrzr #.`5 1=MkH*`dtE%$y=I*0}s?7X DX8E@2@PEEKe4ȀCD$d$D2D|MY#Q9pUT dtUEEy=I1% )0SX$# V f,: bkX`kX88L! ax-@x`Lu@ư>2')}QOppC@[)h-!@B3@hd͡ ͠X=k,ao ,  C@`4o .3(s֍` |^2Ƞ v.FK[@90 X@fpx]>g tE@5#^8`X# t2~7q`6@@`pq>֮cz?YnX RGpVGfg.3(l3j^s֍` |^2Ƞ v!L1`p0  \.r6~@GXx2@ ;j1d&:` ɩ(d ` #8 Y9]1%:2,US4`YAUQ%9R3SPT)LO",:̠zo ifp4%3-@LbXdx2 :1a5OYnX1f@>/fPh:@|kSe[>h" x" H4aPF}\X(݄ &cX,F#>֮cѬOYnX1 f@>2̠- %p(4%<\`RK@ q>Z.3KC%ƀ hxA-p|<\pWK@ qZ.;KC%ǀ9hx-<U@31RQSxdE8$UDh#b  dX3@! Eb1s֍` |1% (QSDX$"`~␌'+>֮cѬOXn"`odE Ub3 C,D1H`oy dEX! HFf7B<2" b ho ,L}\]>/b,ɘ̀ 0R)B`ˬU@312" xG x" `L@U@1 5dtUEE RS TTHy=I1% )0S⚀ =9%(QSe ih(-%\sK pxZ.2K@% YhH- %@$\*rK pZ.;@% )hh- %\:nK2Pm` 7pOXm@6C@u tRo`P pf7qHGDY| #3o8#",!"* .:@|)@ȋ#iHF86.3B>2""ͩ#o ␏ 8k#3k@8#",@!kTSd4Ty=I1% )0SX$# V f `Xp݄_dE?H&P$*i đ 5*d4T`d44y=I1% )ӑQX$"`U@sփֱ>2À~k -,:aUbb," 9L/f`pf 0b~*&)`"4ͷ. 2e `0@d$!""y@"z*teh)"Fv2*r i$d( &Rrz$eP!,Xjbz,:PSSՑgd44E(y=I1%E@X2e`p 5 d44E)PTT5tD(y=^2@ v! b*Ā'#b`*&f,D#b V"j?c|e UnV @*qV"LjXV`Pȋ +Y*Ā fcx B0r"j*o Dd0h@8@W1hYnXMVf 0b*BhG (64X#@",^X,* E@20 PFY2"z"f!"'!z"zgD""LX@3TӓI&9`5dtE%$U`dtUDDXy=I1% (QSb- %)Pm`0HGO31Ϯg!i`Fp([ "  @ `!4#0rzr2J?!f,"}\X݄_da@X,5)x-@D`h*` E@&3"#a[U",<! b"{JI8q:X$O@b"a`mJ݄0 L~&+X,&PD   jqpq誊H Ɉ I13 @Fi*:"Jƀ # 1=1j2ɉhi鳀RST`dԵTy=I1% )ӑQX$"`t\ $K@p pZ.KA  X K0hL CONFIG UX`\4@%0ͣ bD*V f,ɔ FL2:*bJtd@$*,J*z$:T'TPQU$TDhy=I1%E@b,`4ha VuXFf7Ҧp}\O݄ hCXa@a 0 baPaP XHD&) $+>֮cѬOXPn/ 0 EK pZ.*K@% YhX- %\2K2 pRZ."@%àhx-%\BMK2 qbZ.$"K@%ĠYh-%\RPK2 qXRZ.,$K@%Š h-eĴ\bTK qZ:ӕOYn8C0C@HbB:ӑQ(OYn8CC@b~:ְ>/dpP?fԀf3@Lbp 1 REMARKDUH0PUTLINeUDH`NEWLINUUD4ː CLOSE@2**rUS e4UD`X 3@VxLLX,#3X(eUD4It+$"NI d$4Hy=I1% )0SX"`X #30ZJ e 1"`oz d#3X#X5)x-@fcx#",* )Ff7X$#9 Ff7B>2"`u>/a`[U",0> U@b,> U@nV  U@b,1`0U@nV U+>&P>/*sP2DCH t*%&NQTTutD(y=I1% )ӑQX"`9 =9%΀8@h#`"À -7)m/`X2ee5D4xt&$SdTE(y=I1% (QSb =9%E@b,.A%h8D- 0\(?K@p pZ.A%h8d- %:X,#9:ϠukS[ "  XHc*@,ɔ FO2:*A$P:TPQSSՑ`e$TdXy=I1% )0S@ M54E@0ZJ`hXTn/2f"X0ZAXaPaPV pȋ +XX* fcx B0r"j*o fcx U@iSy8g>֮cѬO݄ #.4!@%ƠIh-%\rK q&Z.<)@%ǠIh-,\RKR r>Z.D)@%ȠYh-9M!95O3@g:Z5)x#-@ a7 ΂eMcIn6MAtC44d~0o ,Hy=I1% )0SX$"`X$#30ZJ xkS,"*>! ax -@`LU3>2 g:Z5)S XHnX$#3?2"U~?Ze@ U@31#@",> xc *`x]>g`LŌU@31#",~s>X<*`1U31R V 9B~`UXF" :p1Jd@#'QH2Q#71UM"kHi $SSI e$THy=I1%E@b,!b`*V f* WpU@b82ep HD0@ȋ *@qVPȋ B(wa U~Ys֍` |^2 v* f 0bX! bɔ FF"Jz(&"@0uɩj*P5TutD)I d4Hy=I1% (QSb =9%)0SX$"`- %? H4kS,Pa fcx#!)ȋ@ Xg!V ?HGDXxUbX,#3!aVb q-t! B&PH1xXDSGET #+A -962Tf` 8T e$Hy=I1%E@b,`4h3@Ys֍` |^2 v*",,!b,sXLRoa0dp`4a CIO@ OXP0* ͨREMOV$d4HPPACKNMT44Yt)""USe4UDThy=I1% )ӑQM!9X(ST  9QI1\TK2 pX Z. K@% h8-e\"8#@@8p(4PfӠ"`|':ZZ#-@ B< 2" Y|QX F"` :1sPmLP!fPh! 4(ʹ` ! v! d4͸ ! ۦ! ۔Rͻ ! ! ^; !` ! *  X,"a~`U" @e4$*,B*2"zY$:US'SU eE$UHy=I1%E@X2e`p 5 eE$UIԒUQeu$DThy=I1%E@b,`4h`VuXFf7Ҧp}\O݄ x* $:SSI'TӓI eUHy=I1%E@b,* x]>ga g>X f,(X,!€ F",0+uXdEXHϮ`y"AO4waXDXp|:ab,>2[7wX X$2~sXD kS[`0e`Ƥ dF_l kS,Pa!]>/bW ,1F`Lİ|?}eFXh|ae,D*QSx E hG@hS 3i([1ax]>gE"HD FXtObbR E @W1hO   XnXT#@",R~sX~ke U@8t2" V);A@EXTF"  ;1@,>pxCONFIG` ZAX@݄q4aK([#h+>֮cѬOXnX|O@݄ XFf7bb* f`)x-LM@X<F" :1_,ɔ Fa2jzJ$H:T'TU`d4EEy=I1% )0SX$U@31#z?,aE@`dBĈU@2 pt$*,TRSeDU$Ԕy=I1%E@%`Ih-e``Դ \@Vup4d#! Q=b2" D&U@:X4#3.V 9B"}\X݄@dT 2e d*V0ADDSTRUU dDDHy=I1%E@b,.KA%`h8p]-d\>-Kp" *|':ZZ-@ EbXDXB:T"Oux-@ :X,#9@@XDXB:X#9@XDXB:X#9pG H6* &b`mke@ #X$oDXTB:X,2"@*b &)B.+uHdEXP@` |^2 v!bb VX$2"ĀHͶ@V"9nV >/bap LZ8\U@E@ @U",D* V"9B.+uHd)x-@ X\cTͯ`,*`1?u@8h#X$IX\#X$nXTB:X,2"@*b *XDX$5)!b@X8l/bap LGa0U@nV U@X#$@19Q"2Tf  8PST5Dy=I1%E@b,.'I<) )P"ʀ)8 `!AP&P#H)$"! b"@! f"ƀq)I)P!I)4)H@)L#9L)L)@2  LWXuc:ÀaҰ $2@ ; 1aOXn,&<#L{@GX(+̀@eFM@r:*$d8( &c@2"z"&80Hddd2Hh UPPERр5D9@t&'NT d4Hy=I1% )0QPTERMINRU dԵDy=I1%E@b,!X" 4`j?c|^2 v>B8`PVX2"z@X8B0:X<o 紩3@W1h=c S݄ 8*``P[U@'V;8EXF" :z1y`p[U",>X#9 E@t4bF!X\8\U@ p3@>֮cѬOXnX\V`ȋ 4)x-@uXdEX\V`ȋ 4uFrV fcxF#>֮cѬOXn/2f; .+uHdEXb@` |^2 v*1a  B*`og:Z5)x-@`LPUnV 3l OXnX\F" ;1L\8h#X$KX\V`ȋ 65M` |^2 vͪB,*!bb VuFr x b?5` |e@ B:X,2"@*b @.@8h#X$tX\#X$wXTB:X,2"@*b *XDX&)!b@X8l/bap L_@8h#X$LADX\#X$OADXTB :X,2"@*b *XDX))!b@X8l/bap Lx@8h#X$dDX\#X$! H7q j?d |e@ U@iSy8g>֮cz@:dL/i`HF"`"ӠZӠ6! LQX4"OukS[V j uuDmaaV ? XB:X,2"` V;d@&,X(Q@f&"S@ M54E@  xE @W1h=k,*aSd,*a 0bd* fcx #,!X4U@/7dZ@|^2  v*XDXXU!9 M57DX`#@X` 8T,Xhn,1`0Řu` |^2  v*,ɘxUb,*V =MZ@|^2 v*XDX<U@nV X<*1`P0hbR*`V x ba T`pTzNXPXH* (TDUpFN@bz:RU'QdDE5E(y=I1%E@b,>ph4`oX,ʀ_dBD @U",D!bDs8h#X$UX\V`ȋ 65M` |^2 vͬ`,*p':ZZ-@uXdEXT*@18\U@EnV 3j( X,Ba.* ڶ" V 9S01saPXg)H HL]X* "XDXU z,Ba*`"ap[U@",H*Ā Zb !b?F}\X݄_dzX\V`ȋ 6́Ze@ Ub,.þsI8 p3lH p3i :X,#90 @uXdEXT*@1UgDXTB :X,2"@*b *` E@2,CTOItD6CHKDAT4D $TYPEG@2 z" ӐU d44Hy=I1%E@b,`4(X4pXG 4`Ph"EXF" +udXLnXE%DZ€*` 8*1#$Fc*z  & 8STdDT$xy=I1% )BTXU@31*T*o=' :ZZe@ 1$`o`0Vu*o=' :Z[V0GDX U<2~V9B#`01 E2 t"" #QSTTTDU(y   =I1% (QSDX"`H (Ff7B0r"j*o fcxϠukS[Vf,4* j#udE`ļU@F`pȋLR%ÀTZ*,<À&* V}\X݄ (U@L_@8,s֍` |^2 v. 7Ny@m2M#Ⱥ[L! .!KC%@yh`q- eP 0\LbK r q@Z.)2C%@ih`- ,"*"~XDX).bX@8l/b`oX,#90 U31V`ȋְ>2@X~k Z `+kS\x݄ XFf7b31V`ȋÑbb.3Ҧp}\Oqp^2 v*`+uHd8 0 fcx* ,bh2\!` V"`!Vux*o=' :Z.a0j?.[ Xnu8 b* Vf@X DXDU31F`çSA% h8_-e|\ Ff7ϠukS [*`f 0b<`0ĸ( D5D9PMN#Q%JpUU dtUEHy=I1%E@b,.%" X$&P&1 xFE2j Z Ԕ:UU'Uԑ dtUEu$Hs֍` |^2 v!bb* V f3j?-@uXFrV Ff7b@sX$)[`ȋfcx*1B&c!b?5)x-@0q0Gp4V Ff7b@s 2f""* fcxE @W1h,>a(*`1B:X,2~:Z5)x-@G8#8dHD 2f"l0c*`}':Z5)x-@SǠpf7NFqЀ@b03e "l:E@1=f@)ŨA&*@jV ;_d@&$``誈*H1a0HGDXhB:Xh#9 #",\*`V.9B&#`HGDXUbX,*  `ps֍` |^2 v*  :X {X,LCD  XUiSy8g>֮cz?XdnX$R`HV`0Ff7Xh#9 HE@X,F"` :b1Ms2~,X#uHdEXV`ȋ `U@",h*ŀV :X$2"X+uHdEXV`9).V:?9*o=' :ZX)XUa+X0 9)=V4?9*o=' :ZX)XUaXcV0?5` |C01p݄ *oN%L,ɘ2e ɌTDUCLOWERDә`t'QU`TtDDXy=I1%E@b,! \*@%p &- PVu4d@#!`Q9=^20UU&` 8UDtUD8y=I1%E@ 3@d&  誈iQ@y=I1%E@b,`4hfcx* ?5-` |eXD5)[ XPnX,#3nV 9L:18@,*`+uHdE@`Sa0V?5,g|eXD1aP0 )8LL/a``[U@","*`+uHd* qV ?Ub3X<T&3 ?5` |eX75)[ Xn 0Ub3uHd,>a *` @V 9L0c!bb`ȋh3@Xg!`Ff7b3j?e " H4': )]-h!bs<31i_,ɘ0, d,{rbJtg)"%qbz,e`)'M]@9IpQUTtD8y=I1%E@b,>ph4 %<\<2Kr qZ.!C%@ihxo-%P̴<\LAKR q@Z.)"KC%@Yhx-%e@P)ђ0h誑p H*IsX ENTERQ`Td4y=I1%E@b,* fư>2 v*`f :1d#!Q "2HTU&@ 8Q`Tt5Dy=I1%E@b,`4hla-  e0\<3K qZ|e U31EnV x]>g`V ?bXOa+XbaP b?5,\*(c\o 《xE @W1h=k,\*Ysցt-,^a~,&#B*#X,#9LJ1"~XO` |e UGETCQU TtUD4y=I1%E@b,!XB(:X2"~V=ME8<U@b g:Z5)[Vf1X2"XF" :&1N`p[U@",`&P$=誈*H@ 5TtUD4UTdtUDD(y=I1%E@b,.+uhdE@"w`X2e^GETWRDѓTdtd$xy=I1%E@b,.)A%@Ih8l-et\< XFf7ϠukS[`!bbb!bb  b !bb@b@&#~Y huXFr0 fcxV+>֮cѬOX|n @U",@*V f,#>֮cѬO݄ h*  WB:X,2"@#uFr,ɘ ZF3>2*#Ϡuc?>P݄@XDXUB:X,#90 ~j?c|e@ B&bL`3@j?c|e@X\V+>֮c.e B ŔU31Z@|e,Za~cXdU@31Ϯ` E@X$#3g:Z5)x-@a1`o>֮c.bV   @W1h8L/baX L@&:@ 0c * " p" .! E8NXLu,Za&)udEb.{JI9sցt-@ :X\7q@,"&+"E@&.3pV*`/a0 X* Vf0aPXfcy*o=|"`V :8TX(DPMOD@d,&"#$MU@#!M! :pTSD4y=I1%E@b,!XU@nV X8OX<n`ČuX,,,a+>֮cѬOX<nX1M`X* XX<nX1hak B?2"ĀHb&a0V@W1h,Fa&)ȋ XU0 `Vu*o=' :ZZ-@ EbXDXU!?Xg!VX<g&7@" A0dp)&*c2r \ep$"M|#1==-UBpSTTtU(yփֱ>2 v*`bV fVL[2 @PFD@"Jze(*!O@k& sUS eUDHy=I1%E@b,`4(pVf,:*Bh:82eDD8@PUTSTRG@2JrUP e$D$y=I1% (QSDXU@31Vu*o=' :ZZ-@ EbXDXU!?Xg!V XlEf&`3V?HGDXU@bDsX<#3!b@Vd#3bHs 2f6*#aPU>֮cz?,Ba 0c* V ?ȋ B?2~,.ôpVdtUEDhEQUALU4Dpt)""NSE4Ty=I1%E@8,U@G HC2e p ʩ(isQSLENTU45E(y=I1%E@b,>ph4`h" ~,&+>֮c.݄ *  xFf7@W1hOXln' :Z-aj?-,\aQh݄ U@317sj?-aj?),\a*#aP[U",^>xb0&<"*`o=MZ@|e@X$#3Ϡu 8L/baP bbU) XBpXN8<l/a` ` b? p%pXe Lp@vXc: ` |^2 väP pżU@b,á" @׬:TSSS`TĔy=I1% (QSDX"`~␌'"~␏ 8:X#=I1%E@X2e`p5 TtU)SPU TD4y=I1%E@b,!X<UnV -@ * ZAX݄@ dOX<F" :1,ɔ FK@2 j Dd:SPU'RP dԵD$y=I1% (QSDX$B3@ `4E4TE  8E!9 M57O31E@XZF>2` v*,)Ff7(3@& |+J Ǖ`mOd#,MIjI(IP e45D$y=I1% (QSDX$"`3@V?j?e@ B3@Xg'X#!)ȋf*1B&PL1(HUNPACKDTXDSGET2DHXDSFREEG@2 dT U4E$y=I1%E@b,`4h3@`o>֮c.݄ x*a`X3@dJ8<U@&h" 1X$2"@#a`X 3XLF`o fcz*oN%LV9S@VU312" 8}\]>/a@,&1aPXҦp}\OXlnXDE@&8`EXL* 3@W1h=k,6a.`ȋ * XLF"`.#ap U",8a  :XT7sj?x-@ bb.3 X*`X*`3aV3;E@XLF"` ;1`L2@S#% 1% N2U#4 ,k*sӠd4d4y=I1%E@b,* E@ LE@X$o ,"*XO9 Ff7B<2" ~V 9B~␏ Xfc{Ub3 B<2"~V 9L@x:SSgT dUy=I1% (QSDX$"`HK00U@X8lU@s֍` |^2` v!X1-`o`4E4T?aaV ?Xg!V `"#`HGDXDB:XD#9 x|+J Ǖ+`LL2QU& 5\dԵD$UPeUDDT8y=I1%E@b,8U@XlUb~紩3@W1h=k,>a Ethbt!XlUb:{JI9s@ Xg!V?HGDXU@31Rou Fr xFf7DX#'" DoapV ?HGO31E@X\ZF>2 v*1dEX,*@ EX,:X|2":#>֮cѬOXnX|R"`X3np 0 aj82eɌDԔCTOCdTuD t)'NSV e4DUy=I1%E@b,`4hcV "B 3@.` iqp3@j?-@:8< ϠukS6[V0`L|Ub,`*BhG H6pLP 2e&P<ɈH50U45E)TR`U5DXy=I1%E@b,`4h3@`o>֮c.݄ xU@312"C&h" V XpX,*@ E@3V ? p:X$XX(`Le&LO2 S#/ Q=   kj)h`e5D4y=I1%E@b,>p(4`0o`V X2~kS,a~XDX0U@nV X0*#u8Fr`0ĬU31V`Pȋ+X0ɔFC@" :gTS U5DDTy=I1%E@b,`4(3@ ( 2e]STRCMPTS`U5E$y=I1%E@ @  `[U@'>2 v*XDX@aX@8<L/a ` hE@t<bB*`V U" @:TSgSSeTĔy=I1% (QSDX$U@31R"9 HA `V ?5C2>2~kB)80l/`FXLQX$X H0 `݄C,&-~` 0u@2 t*,"U d4DHy=I1%E@%`4:\&K@ p|.%`t>t-,LaE@3 `ȋfcxE @W1h=k,F*Ā}\]>!` ax-@`LB :X$2"Āb':ZZ Ff7@W1hOq^2 v!~X1AV Ff7C/sփֱ>2`H~:ZF0݄_F"π :>15_,ɔ@LA 2T&) 0 jj 1p?d3X`GMONTH`D5Dy=I1%E@b,.KA% h8Xe- \25Kp pZ.KA%àh8x-`X3@e@X,#3nV ְ>/a FXDU3V h`X3@Ys֍` |^2 v!b`V? h|0`B:X2"x @U@", !ba a X3i(ZF>/`V hud*q `ȋ w@XDX4|/`fcxSsփֱ>/`Ff7X #3",*`V =MZ@|^2 v*`,1D`0o`V uX*o=' :ZZe@ Ub,`ȋ H* X8* Xh݄0ƐU@b,*`1 a` 8&P$Ɉ[STDELT e5E$4y=I1%E@b,! M57O31EX<#'")ȋ hU@b3 B<2"`a0*`,ɔ MV#U91%9.pUTTUUU(y=I1%E@  * X```@[U@",* U#`@ 2e  5>UUU)UV`UtDy=I1%E@bZ* }\]>/b0_,ɘ HFf7Ssցte U@31"l]bs'@* $?>֮cz?XU31V}\]>!` ax-@`L B:X$2~,N!bb@V'pHdE@X#3bR~紩3@W1h=k,F*d` 2e`1` 8 LLRk>i h*Sӕ dtDy=I1%E@% hH-)`@4 \eK R0 rZ.X0@% )hh--%` \mK 20 rZ.`5K@% Yh-1`@ \lK 20 s8Z1F`&%~XOa[X݄ XFf7bs, `" ~XO` |e U31V`ȋ C @W1h,>a ;1h+udE@X,#3nV 9L:1aOX|nX^7q &PD)ȈX$c!b` z`X3l ZF>/`V h ud*q`ȋ wAXDX4^*q"€ EXX"Ou[VnV h ba aX3hZF>/`a@ uX4U@b,`ȋ xU",&* VK5)x -@ b?5)x -@`L4U@b,áV X$2~kS[ " 0b*XO` |^2  v!XLd@X4V"V :X,2"`"~a0]>/aP,&8E@&9,`4hfcxV"~,"X4@W1h=k,*a",*` B3@`X4f[B 3jE XX2a0ˬU@",08`J@b,ɔ Fdjz$Č&1@pqd1Hs5UtDT`EEXy=I1%E@X$-XĀ+>֮c.0e B&c!b?>֮cѬO g:Z5)#S Xn 3@j?@V fӀj?)X" H6@W1h8l/b_,ɘKD `U@",H~K2}\Ofcysց.h3@% 9h-5%`| \cK0 sxZ.p7@% ih-9e`@ \K2X \K@%@ 9U@e9,@ |g>֮cz?YnY!G'DYY!` ZF>/ggdYYP baii*IP CTOISU`dDTUDXy=I1% (QSDX"` -`0 `h+>֮cѬOX<nX$RQSdEXRouFrph1)d#"MQ1V2єQf 8UU ddDDHy=I1%E@b,>p(4dEX4V`0U+udEV;oEXPF`0ȋBwa@F"€,#a`mAXDX4^*vL`3S&>`@*qH1 Pt#&" NUdtUDxy=I1% )ӑQXB_/sփֱ>2 v*`b`V   i( 2~V9B#`0 2e@TGETNOWPRU dHy=I1%E@b,>ph4@,4!XBfcx * $?1&b@%),Na4"@0+uHd)x-@ K\%@X<!0 1X<!`E8`U@K0@ \@%@*&fX@f#3@  X`J&<"0+uHd* f>2 v!~XLQhZ.IȠ G`XfѰ#j?e B L])Bɔ%LV@2TI V U" p b?e B baxX1[`>֮c.a `XDX@^*qV `L0U@b,á0VdH@*:*D:USSPU dD4y=I1%E@b,`4haV ?@,** X!Fhr J:SPU'UEUD8y=I1%E@ 3@L b 5EUD9UeUE5E(y=I1%E@b,`4(3@ X:X #3iSy8g>֮cz?X4nX!X,F@&' EX,* 3@W1h=k,a+u"*`+uHdXXnX,#3nV XTB b?5)[VX<2"** f>/a`a[U@",.ap X1ta0 0 XU@nV U@b,"*`#uXFraP X bapx XDV" @d4 Mw#=I1%E@X$=X Ha h݄ HOb2}`1#`LMX(G@2* DdHy=I1%E@  * X```@[U@",* U#`@ 2e  5>DdI`e5D5y=I1%E@b, bb@VuXFf7Ҧp}\Xb`V$?5` |C'[ q`K1P X<!E`UXV`ȋ U@'V K5)&cXH8L/bpa hh KC@@8UbsXpLBEX`V`[kS&[Vc` q\(hpjiqH1z XLE@DcaY(MAKPATUSeUDĔy=I1%E@b,!XUnV XOX n`Ču@>/``0Xf`Vup(6 0Et4bLɔFR2A$&` 8TO` |e U@nV ¦>/aaPaPaPVa0VX$2~kS,6a"À *-}`h}\X݄0`X&3`2"V  :X\7sXF#uhdEX\U&" 0b*,L.( 0&pV fpdEX* چ*`1 aP :X #3*83X@W1h=k [Vuj6À XEvcvɔFD2b*r:Dg*!Lpk jSSSDTy=I1%E@X$nX( dTuDȀ$D9G@"Jb*tTU4Dy=I1%E@bQQ=.pSPeT4y=I1%E@b,!X4U@b,`ȋ xU@'V;xU'>/a0aV hLOX4V" @H:SPPE4y=I1%E@b,!X4U@b,`ȋ xU@'V;xU@'>/a0aV h>p(4`ou8Ff7DX4U31EX#3X,Ub{JI9sցte UnV XDUnV  u@ -@X<b*`1 a` &P* d*Y STNCPYT e5D4y=I1%E@b,`4h`VuhFf7ҦpqG H4g:Z5)x-@LVX`UnV :X,#3iSy8g>֮cz?XUaSX`0e UXV`ȋ¦>2H~k  %kSN`e Wf;2 @-a op3@aqː@`U44y=I1%E@b,>p(4`po`V? `[U@'>2 v*`XDX8U@nV X8*`1 `0UnV pU@d4 M]#M =AfpUSdtUDĔy=I1%E@b,!X4U@nV :X@5M` |^2@ v*j?e U@ux -@ :X42~x -@JEXdF`OXd@f%`"2}\O݄@dTEXdEbb U2",**1U@",H*V X o ,.1p3@X DXTH&&." APg',`4hfcx x*  5)x -@ @ a[U@'>2€ v* XDXTuXT,,(a :1ga0ŨU@nV e K&1 #` x2eYSKTOKUdtUEDy=I1%E@b,>ph4@,LOX4F E@2@ʘ$D9G@" \D5D8y=I1%E@b,`4h`VX$2~c?,"*V ?TzNϠu 8DL/a `X :X,2" &`U@#` x*`WUb,ɔ Ma# Q=pTTd5UU(y}\O݄ xEba@VuXdEXP* f>/a`[U@'>2 `o=MZF>! ax -@`LTLWtc>*1a  b?5)x-@`1`[U'>/a@,&;+a X   DXPUba`V? X.݄_a@" @(U@2 H t)'!NT e4$y=I1%E@b,*`+udE@`KX`pV?5 ` |C[V?Ub3LL2 @t)!&N`E5DXy=I1% (QSDX$"kS4݅HX@*{JI9sցt HFf7@W1hOp^2` v*1X,2"h 8 +`"€(aTzNϠu ,4a +uXdE|"(+aXO¬0waXDXxuXx*a@ 0(U@2define(DC1,8%21) # define(DC2,8%22) # define(DC3,8%23) # define(DC4,8%24) # define(NAK,8%25) # define(SYN,8%26) # define(ETB,8%27) # define(CAN,8%30) # define(EM,8%31) # define(SUB,8%32) # define(ESC,8%33) # define(FS,8%34) # define4) define(BEGINNING_OF_FILE,-3) # flag to seek for positioning at # the beginning of a file define(BIGA,65) define(BIGB,66) define(BIGC,67) define(BIGD,68) define(BIGE,69) define(BIGF,70) defineEFN,-1) # flag for mktabl character data define(COLON,58) define(COMMA,44) define(COOKED,1) define(DASH,45) #same as MINUS define(DIG0,48) define(DIG1,49) define(DIG2,50) define(DIG3,51) define(DIG4,52) de $1) ) define(DRETURN,return) # this is the return statement from the # subroutine defined in DRIVER define(END_OF_FILE,-2) # flag to seek for positioning at # end of file define(EOF`3@V?HFCDSMEMoaP" EX\V`O݄ * .3XD2" .#ap.@f1uxFf7]bsb fc{Ub3fcys֍` |e U31F"` :X$ ϠukS[" # General Symbols - include in every tool # CP/M environment define(CPM,) # CP/M version define(NEGDEF,) # ASCII control character definitions: # define(NUL,8%00) # define(SOH,8%01) # define(STX,8%02) # define(ETX,8%03) # define(EO(GS,8%35) # define(RS,8%36) # define(US,8%37) # define(SP,8%40) # define(DEL,8%177) # general symbols define(ACCENT,96) define(ALPHA,-9) define(AMPER,38) # ampersand define(AMPERSAND,38) define(AND,38) # s(BIGG,71) define(BIGH,72) define(BIGI,73) define(BIGJ,74) define(BIGK,75) define(BIGL,76) define(BIGM,77) define(BIGN,78) define(BIGO,79) define(BIGP,80) define(BIGQ,81) define(BIGR,82) define(BIGS,83) define(DIG5,53) define(DIG6,54) define(DIG7,55) define(DIG8,56) define(DIG9,57) define(DIGIT,2) define(DIRECTORY,2) define(DOLLAR,36) define(DQUOTE,34) # DRIVER is defined as those things ,-1) define(EOS,0) define(EQUALS,61) define(ERR,-3) define(ERROUT,3) #standard error file define(ESCAPE,ATSIGN) #escape character for ch, find, tr, ed, # and sh define(FILENAME,1) define(Ffc{U@b3RouXFra (`Lx2S#8@EU22U&,`5 E5DYUDD8y=I1%E@b,`4h3@WXBX@"p4>x bac X`*@(XHUb~紩3@W1hXhUuT,8%04) # define(ENQ,8%05) # define(ACK,8%06) # define(BEL,8%07) # define(BS,8%10) # define(HT,8%11) # define(LF,8%12) # define(VT,8%13) # define(FF,8%14) # define(CR,8%15) # define(SO,8%16) # define(SI,8%17) # define(DLE,8%20) # ame as ampersand define(APPEND,4) define(ARB,100) define(ASCII,12) # flag for ascii character file define(ATSIGN,64) define(BACKSLASH,92) define(BACKSPACE,8) define(BANG,33) # exclamation mark define(BAR,12fine(BIGT,84) define(BIGU,85) define(BIGV,86) define(BIGW,87) define(BIGX,88) define(BIGY,89) define(BIGZ,90) define(BINARY,60) # flag for indicating binary file define(BLANK,32) define(CARET,94) define(CHAR_D # you need to do to start a software # tools program running. define(DRIVER, call initst ifelse($1,, call main, call $1) call endst(OK) end ifelse($1,, subroutine main, subroutineILENAMESIZE,20) #max characters in file name # (including EOS) define(FORMFEED,11) define(GREATER,62) define(HOME_DIRECTORY,1) # define(HUGE,30000) #some arbitrarily large number define(LBRACE,123)    define(LBRACK,91) define(LESS,60) define(LETA,97) define(LETB,98) define(LETC,99) define(LETD,100) define(LETE,101) define(LETF,102) define(LETG,103) define(LETH,104) define(LETI,105) define(LETJ,106) dencoded # for pattern matching define(MAXCHARS,20) # max nbr of chars when converting # from integers to characters # (used by putint, outnum, etc.) definecial characters define(NEWLINE,10) # character used to mark end-of-line define(NO,0) define(NOERR,0) #flag for successful completion define(NOT,BANG) #choose your favorite: ! ^ or ~ fine(SEMICOL,59) define(SHARP,35) define(SLASH,47) define(SQUOTE,39) define(STDERR,ERROUT) define(STDIN,1) #standard input file define(STDOUT,2) #standard output file define(STAR,42) define(TAB,9) defefine(MIN,min) define(andif,if) define(DS_DECLARE,integer Mem(5);common /cdsmem/Mem) define(DS_DECL,integer $1(5);common /cdsmem/$1) define(ABS,IABS) define(abs,iabs) define(filedes,integer) define(IS_DIGIT,(DIG0<=$1&$1<=DIG9)) # valһԻ半©fine(LETK,107) define(LETL,108) define(LETM,109) define(LETN,110) define(LETO,111) define(LETP,112) define(LETQ,113) define(LETR,114) define(LETS,115) define(LETT,116) define(LETTER,1) define(LETU,117) definee(MAXLINE,128) #normal size of line buffers; #must be at least 1 more than MAXCARD define(MAXNAME,FILENAMESIZE) #max size of file name define(MAXOFILES,10) #max nbr opened files allowed at a time define #(used in pattern matching) define(NULL,0) #empty pointer define(OK,0) # success flag define(OR,BAR) define(PATH,2) # flag for UNIX-style pathnames define(PERCENT,37) define(PERIOD,46) define(PLUS,43) definine(TERMINAL_IN,"CON:") #name of input channel to users console define(TERMINAL_OUT,"CON:") #name of output channel to users console define(TILDE,126) define(UNDERLINE,95) define(WRITE,2) # flag to open file at write access defid only for ASCII! define(IS_LETTER,(IS_UPPER($1)|IS_LOWER($1))) define(IS_LOWER,(LETA<=$1&$1<=LETZ)) define(IS_UPPER,(BIGA<=$1&$1<=BIGZ)) define(MAX_INTEGER,32767) #******* end of symbols ******* Ԡ󍊻Š򩍊Ҡ半Ġ򍊻̠⩍(LETV,118) define(LETW,119) define(LETX,120) define(LETY,121) define(LETZ,122) define(LOCAL,6) # flag for local-type character file and pathnames define(LPAREN,40) define(MAXARG,128) # max size of strings to be e(MAXPAT,64) #max size of encoded patterns define(MAXPATH,50) # max chars in path pre- or suffix list # (used in string matching) define(MAXTOK,25) define(MINUS,45) define(NCHARS,33) # number of spe(QMARK,63) define(RARE,2) define(RAW,3) define(RBRACE,125) define(RBRACK,93) define(READ,1) # flag to open file at read access define(READWRITE,3) #flag to open file at read/write access define(RPAREN,41) deine(YES,1) # Definitions of language extensions define(character,byte) define(CHARACTER,character) define(short_int,byte) define(pointer,integer) define(POINTER,pointer) define(max,max0) define(min,min0) define(MAX,max) d򍊻кȻ򍊻Ơ̠Š̍ɬìҍĠƠήōȻ半ɬ󍊻ƍҺ̬덊捊󮍊嬠Ӡ󠲠荊半   䍊䮍󺠠 󍊻àנ䍊ĠֺȻû壠덊ɬ壍û半Íţû荊ɬû半ÍÍĻ렱ɬčڬҍĠƠήōĻɬ̬ı렱ōЬэҺȬ렰ƍѺƠ렱ЬҺɬڬҍĠƠήō̬ĵ렵Ơ렶ЬэҺɬڬҍĠƠήō̬Ķ렶Ơ렷Ьэàɬ»䍊Ļ䍊ԬԻ򍊻򠽠묠Ͳ󠴠半򠰠렰䍊Ļ䍊ƠԠĻȍ̬č̍ȍڬÍìҍĠƠήōĻ䍊Ȼ򍊻ƍҺ򍊻 򍊻ՠ􍊻Š򍊻̠󍊻ŬĬԩ򍊻􍊻󍊻󍊻󍊻ƠɬэҺɬڬҍĠƠήō̬ı렱Ơ렲ЬэҺɬڬҍĠƠήō̬IJ렲Ơ렳ЬҺɬڬҍĠƠήō̬ķ렷ŻЬэҺȻɬ렣半Ьλ䍊ƍѺ̬λ䍊򠣍䠣荊򍊻笠Ͳ󠰬򠰍䠰򠱠pMODD%9@(FT@"!H:Ue5D48y=I1%E@b,>ph4`o :X4#3iSy8g>֮c.aa0aPVX$2"@ *-P`X 3@a0X 0U31"]bsX4#3XU@X\D%@􍊻󺠠ìŠ䍊Š庠󍊻􍊻덊ҍĠƠήōƠàÍɬڬҍĠƠήōĻɬ半󍊻ƍҺƠĠΠэҺɬڬҍĠƠήō̬ij렳Ơ렴ЬэҺɬڬҍĠƠήō̬Ĵ렴Ơ렵Ь»Ի̬Ż덊»덊򠣠һ捊䍊Š󍊻Ϡ̠Ļ̠򠣍ȬčºčȬȍčččì؍ĠƠήōĻ* ͫ`,.*,H.&@ $`Xfp`(b` m HUEX4E%[ŀڠmapVd &:2. ADDSET2DIM{#MQ 1=NpU dtUD44y=I1%E@b,>ph4`oX,#9:nV >/ap   ` Ӑ`Xf,**`#uXFraVa pp: 6dU31EX<E%@x[ " "Ā"" D-@V u@h*`XDXUnV?TzNSzq*g>`U31V`]k~XO,$: ` |^2 v* aPkZe U31*aVK5)x -@aP  XJ,.a~j?e BLeXH?kS[k -@aP  XH,.aA h݄,* aa0V ? u@2 t!'NQTUPS TUTy=I1%E@b,!X4U@b,`ȋ xU",&* VK5)x -@ b?5)x -@`L4U@b,á" @՜:QTUPS'SU dd4UHyDYTY\U@¬c?݄ (Ff7b?5 ` |^2 v*Vf,* ,*`, ph"@ 0b*+ud)W[V?[U",* ,*`,ˠePm|a 1`PoudY\U@31V}\ODXy=I1%E@b,`4hfcx*`.3X4#3",*V ?TzNϠux-@ ba V ? YOXDn 2f-@+`*@d& 8T dDD4y=I1%E@b,>p(4`PoX#9 HFf7b:QU'T4U48y=I1%E@b,*`+uHd 5) [V ?[U@'aV ?XO` |^2 v>  XFf7bsbXDX8'5) `X84l/aXLbX,#3nV pTkS,*ѬOph^S[" 0c!~Xc* Ap$&E@(hH1A7 HlFk22Jb*Ƭ&`1 8UVeE4y=I1%E@b,*`+uHd2 c Xp݄@@a0 khXHX<u@V>! a[ X@n "5)x -@aP  X,.a~1V up4@W1h,.aE@&(,0b4:@ csX݄ xFf7X`X4! d}\Xapk ),4aE@&2,0b.4ic43 4N)]-h=I1%E@b,>p(4 %P<\,2Kr pZ.C%@ihxlo-%̴<\<K 2 qZ.!1C%@Ihx-P<<\LhK 2 q@Z.)5C%@hx-|<\\pK2 qZ.19C%@Ihx-r^2 v* ,*`,  ۊ"@ 0c* +X2"ʠ@h}\OY\nXE@XEX$E@X,E9Ub(` U@31V+u8dE@YT! l}\OY\nXE@XEX$E@X,E9Ub>ͭ,0c:*sX*` e8`U@ HFf7baVu6 :XX7sj?c|e UnV  8U@ EubɔFM@*f ")FW*Jr"*d4 Mm#=M"pRSV TDUy=I1%E@b,!XU@nV 2 v> XFf7b?  c$1S&P"54U49XLbX,#3nV pTkS,*ѬOph^ XFf7bsbXDX8'5) `X84l/aXLbX,#3nV pTkS,*ѬOph^0 5` |eX4[kSx݄ XFf7X$2~ctE@`u@¦>/`,&5`I@p0f@c0Ap2`f@ ŌbX* A@f)'Mp#AQM%jpPU dD4y=I1%E@b,>ph4,*`+uHd2 1Bf<  8 @W1hO݄ U312`!Xcl* Ae&'"C@" f)'Mu@c=5Q "pS dTuDy=I1%E@ U@'>2` v* 1aА 2eRLENGTHTd4tU(y=I1%E@X$-X HP<\lxK2 qZ.9KC%@hx-$<\|EK rZ.A$KC%@hx -"Pd<\MK r@>Z.I(KC%@hx,-&<\UK r^Z.Q,KC%@hxL-*% ~X +X2"ʠm>֮cz?,a "Π"" "`*`:f 1`}`Vuh 6h c1pr&0@ ~7Xg&2e 3(h d*!hdDD4xt#$)NU`d4 -@ b? XYOX4nX18`0h|B&P5OTDUQU dDE4UHy=I1%E@b,>ph4`ouxFf7Ҧp}\OXDn 0 fcx*`` X4#3nV 9BE@&'ɔ FC@"    equire fo buildin th tool an fo usin th Carouse Shel Tool Suc relocatabl binar file ar amon thos tha ar copyrighte an ar proprietar t Carouse MicroTools Othe files thos wit th .aie an use th sourc cod provide her a his/he ow risk. Th file o thi ToolBoo ar provide o standar 8-inc single-sided single-densit diskette fo transpor t system tha ca us suctains: cmtlib.336 proprietary relocatable binary files cmtlib.344 ratlib.336 public domain relocatable binary files ratlib.344 runsys.336 load shell of run.com  expand 1 ed.ar source for ed(e) f.a sourc fo fb field find form fsort format.ar source for format i.ar  Version 2.0 CAROUSEL TOOLKITS(tm) CP/M-80 Disk-B, BUILDER TOOLBOOK (tm) Certai file o thes diskette ar copyrighte (c) 1983 b Carouse MicroTools Inc  an .ra designators ar th sourc cod fo th Soft- war Too program an librarie commonl understoo t b i th publi domain Carouse MicroTools Inc doe no clai an proprietar right t th sourc  format Effectiv us o thes disk require tha th use hav cop o th MicroSof Fortran-8 Compile an Linker Sinc ther ar difference i th Linke forma betwee F-8 version 3.3 an 3.44 re runsys.344 libdefs standard compilation definitions ratdef publib.rat public library source ar.ar source for ar r.ar source for reset, rev, rm  source for includ, isam l.ar source for lam, ld, ll, logout, ls Disk B3 contains: k.ar source for kwic m.ar source for macro, mcol, mv n.ar san ma b use onl i accordanc wit dul execute softwar licens fro Carouse MicroTools Inc. Thes thre diskette contai th file o th Builde ToolBook Som o th file contai relocatabl binar module rcod publishe i suc files Carouse doe no warran tha th cod provide i correc o fre o defects No doe Carouse warran tha th sourc cod liste i no proprietar t som othe party Th use coplocatabl librar file fo bot version o th Linke ar provided. I thi forma th ful se o Builde file ar containe o thre diskettes Th file o thes diskette ar th following: Dis B conDisk B2 contains: c.ar source for cat, cd, ch, cmp, comm, cp, cpress, crt, crypt d.ar source for date, dc, detab, diff e.ar source for echo, entab,ource for number o.ar source for os p.ar source for pl, pr, pwd ratfor.ar source for ratfor s.ar source for sedit, set, show, sort, split t.ar     source for tail, tee, tr, tsort u.ar source for uniq, unrot w.ar source for wc, which x.ar source for xref SPECIAL INSTRUCTIONS 1 D them. 4 Th CMTLI file contai relocatabl librar routine tha ar proprietar t Carouse MicroTools Inc The ar necessar fo buildin program o tool tha interfac t th Carouse S i establishin reasonabl arrangements. 2  Carouse MicroTools Inc directl abou th specia licensin requirements W wil gladl wor wit yo hd^0EZ/!y^%0ql fh\Z/K@% hxK  }bZ/% KG% i(ZV-.KM%Ӡ iZ-FKS% j`Z-^KY%֠ khZ-vK_% l( [-ȀKe%٠ l[F-ԀKk% m[v-Kq%ܠ nh@[-Kwv ov ov ov ov ov ov ov NO writ o thes diskettes D no eras o renam an o th file o them Mak workin copie o thes disk an the pu thes disk i saf place The ar you MASTE DISKS Kee the safe!! hell You single-use licens permit yo t us thes routine fo buildin ne tool fo you ow use bu i doe no allo yo t incorporat thes routine i ne tool o program tha yo inten t distributSS# 559LFORLIB<e4TbHSHNAMSd4E4TإARGSdE4drHCNTRLCe4$UBHCHARIOTtTbH CIOjd4dx9M!9X^fHKfi3AR G1`a9Χ3)@M4Fl9q\,Mr4  .BZ)' L @Z\X2DT8%=1SHDEL$ TUT2HIJ$EXISU DUHILBDOS$Ad$D2D8 =LGD$I TT-%11OUTC$SU TUE2H=UQ90MOVB$SՐI dd2H5=Y5 PEEK`UDBHA%9PCANTP`d5$TDX Q=CTOITTdE4dHMIDSGETSU  ov ov ov ov ov ov ov ov ov ov ov ov ov ov ov ov ov oBʹ :* #y +NG3I2DT8 $ERR2DUP$INITbDdxADDRS$d$D2DBDOS$Bd$D2D8BDOS$DD4HCD$ 2 Relocatabl librar file ar i on o th tw differen Microsof Fortran-8 Linke format Us th cop tha fit yo versio o th compiler. 3 Sourc file ar i archiv format Us too a t extrac  o sel t others. I yo wis t buil portabl softwar fo distributio base o thi library contac Carouse MicroTools Inc directl abou th specia licensin requirements W wil gladl wor wit yo / #k @-.2K̀A @ 29M!IP^AĒ^Ahi)@ @  h/xKZ/ (K@%@K@%TTE5HEU2ERRORVPTdDH1UM"GETARGQU dtUD4HQ1%:GETR$UT dtUEu$H%9bINITSTTSdTuD1%9-FMKLOCL`DTA -96PUTCHU eUDĔEUIfREMARKSSՉ E4TTM-%A 2STDELSSUUU(9]1%:P5BKA%Р hh@Z&-T44X@CREATED5D8pCTOId5UU(DSFINDdE4e$TXDSGETdE4HENDSTTUT0ERRORDUT8HEXEC$DUHxFDOK$TdU4GD$dtUD$xGETCHdtUD4HGETLINTtUE"H8GETTYPdtUEu$HhGU$TDUINITSTD4KILL   EDdTuDLINKQdԴ4(MOVB$dd4HXMOVIC$dd2HMUL10dUtĔNOTEDTOUTC$TUDHOUTNL$TUE2HHPACKNMETTxPINT$EXPUTCHڀeUD4HPUTLINUTU%REMARKe$TbH8SEEKe4DTHhSKIPBLU5DD/ #k @-.2K̀A @ 29M!IP^AĒ^Ahi)@ @  h/xKZ/ (K@%@K@%TTE5HEU2ERRORVPTdDH1UM"GETARGQU dtUD4HQ1%:GETR$UT dtUEu$H%9bINITSTTSdTuD1%9-FMKLOCL`DTA -96PUTCHU eUDĔEUIfREMARKSSՉ E4TTM-%A 2STDELSSUUU(9]1%:P5BKA%Р hh@Z&-T44X@CREATED5D8pCTOId5UU(DSFINDdE4e$TXDSGETdE4HENDSTTUT0ERRORDUT8HEXEC$DUHxFDOK$TdU4GD$dtUD$xGETCHdtUD4HGETLINTtUE"H8GETTYPdtUEu$HhGU$TDUINITSTD4KILLTTINT$eTĔUPPER\\ bDT%@ZG@1"j*jTU%REMARKe$TbH8SEEKe4DTHhSKIPBLU5DDTUE2HHPACKNMETTxPINT$EXPUTCHڀeUD4HPUTLINUTU%REMARKe$TbH8SEEKe4DTHhSKIPBLU5DDhd^0EZ/!y^%0ql fh\Z/K@% hxK  }bZ/% KG% i(ZV-.KM%Ӡ iZ-FKS% j`Z-^KY%֠ khZ-vK_% l( [-ȀKe%٠ l[F-ԀKk% m[v-Kq%ܠ nh@[-Kwv ov ov ov ov ov ov ovEDdTuDLINKQdԴ4(MOVB$dd4HXMOVIC$dd2HMUL10dUtĔNOTEDTOUTC$TUDHOUTNL$TUE2HHPACKNMETTxPINT$EXPUTCHڀeUD4HPUTLINUTU%REMARKe$TbH8SEEKe4DTHhSKIPBLU5DDSS# 559LFORLIB<e4TbHSHNAMSd4E4TإARGSdE4drHCNTRLCe4$UBHCHARIOTtTbH CIOjd4dx9M!9X^fHKfi3AR G1`a9Χ3)@M4Fl9q\,Mr4  .BZ)' L @Z\X2DT8%=1SHDEL$ TUT2HIJ$EXISU DUHILBDOS$Ad$D2D8 =LGD$I TT-%11OUTC$SU TUE2H=UQ90MOVB$SՐI dd2H5=Y5 PEEK`UDBHA%9PCANTP`d5$TDX Q=CTOITTdE4dHMIDSGETSU  ov ov ov ov ov ov ov ov ov ov ov ov ov ov ov ov ov oBʹ :* #y +NG3I2DT8 $ERR2DUP$INITbDdxADDRS$d$D2DBDOS$Bd$D2D8BDOS$DD4HCD$TTINT$eTĔUPPER\\ bDT%@ZG@1"j*jTU%REMARKe$TbH8SEEKe4DTHhSKIPBLU5DDTUE2HHPACKNMETTxPINT$EXPUTCHڀeUD4HPUTLINUTU%REMARKe$TbH8SEEKe4DTHhSKIPBLU5DD                 !   !   "   "   #   #   $   $   %   %   &   &   '   '