t=j=jQN=j ) \$ DMIh   L'(-,5<=>,@DGIJK,NtOX lcityD} |$  l LD  !T&'*+,,4-,./40\1l23<4T5<67l89<:;<=TFtNRS4T|U,VX]D_e,jntyl|$~ |< tld4$ |=j%" 407 zzzupack 407 danbcmds 407 ucmds =j0, 407 danbcmds 407 ucmds ated 2002 9 25 22 3 34gr(Ч(ack 407 danbcmds 407 ucmds gr=js@ =jt =j`@ =jDDUSER-DEFINED COMMANDS FILE, Version 3.12, created 2002 9 17 22 50 18=j=j=j=j] #=jxpv(=jb =j RLP COMPACK RP;io;N1;N2;R1;R2;C1;C2;I;C;N;M;LIM;SHOW;OBJ;T;S;ANY;O [1] DANB 880325 PACKAGE COMPARISON [2] [3] FIRST, FIND ALL OBJ NAMES IN EACH PACKAGE [4] show: 1=SHOW NAMES ;2=CONTENTS ;3=BOTH ;0=NOTHING [5] io1 ANY0 [6] SHOW, 2 2 3show R03fd 'O s',cr,'[1](0s)/0RR,,cr,s' [7] R21C2N2pnames RP [8] R11C1N1pnames LP [9] I1C1 I0,I1C2 N1(IC1)N1 N2(IC2)N2 ADJUST DIMENSIONS [10] [11] NAMES KNOWN, DISPLAY HEADER [12] OBJ' OUTSTANDING OBJECTS IN ' OBJECTS NOT APPEARING IN THE OTHER OBJ [13] (^/C1~I0=N2 matiota N1)/S4 [14] O '***',(4 0 +/I),OBJ,'LEFT' SHOW[4]/'O VM FIT IN1' [15] SHOW[1]S4 NCI/I I~ANY1 SHOW INDIVIDUAL OBJECTS [16] B3:(N [18] [19] S4:(^/C2~I0=N1 matiota N2)/S5 [20] O '***',(4 0 +/I),OBJ,'RIGHT' SHOW[5]/'O VM FIT IN2' [21] SHOW[2]S5 NCI/I I~ANY1 SHOW INDIVIDUAL OBJECTS [22] B4:(NII+1)L1 [22] (0=Y1Z)END Y IS THE NUMBER OF MATCHES [23] ZN1B I1+''B INITIALISE LOOP [24] L4:FZS(ZB[I;]+\X[I;])Y [25] X[I;](-S)NF Z(1*F)Z,S II-1 (0YY-F)L4 [26] X[I+1;]0 [27] L8:XBFIXX [28] SB M[R+S[0];C++S[1]]B [29] END:MBRBC\M =jS CF1 COMPFN F2 [1] DANB 84/5/30 - COMPARE 2 FNS [2] (F1F2)C'' [3] C0,1(F1)F2 F1(CF1)F1 F2(CF2)F2 [4] CF1 MCOMP F2 =j4 NCOMPIND B [1] RETURN NOS. FROM 1 TO +/B FOR EACH ELEMENT OF B SUCH THAT [2] N IS STRICTLY INCREASING AND B/N IS +/B(IO=1) [3] N1+\N/N(1N)-1NB/B1,B,1 e ]=j rsa COMPV sb;l [1] compare VECTORS [2] r'' (sasb)/0 [3] r'lISTS'' LENGTH: ',(1l),(/l)/' AND ',1l(sa),sb l/l [4] rr,CR,'tHEY ARE THE SAME FOR THE FIRST ',+/^\(lsa)=lsb [5] rr,' AND THE LAST ',(+/^\(lsa)=lsb),' ELEMENTS.' dst=j}} CV1 COMPVAR V2;I;N;S;io [1] DANB 84/5/30 - COMPARE 2 VARIABLES. C'' IF V1V2 [2] io0 (V1V2)C'' [3] ((pchk V1)=Npchk V2)/ST C''[N],' OBJECT IS A PACKAGE' 0 [4] ST:NNP CV1 COMPACK V2 0 [5] NP:(=/N(V1),V2)SR C'g' [6] C,C fmt 100N END [7] SR:(1=N''N)/VEC SAME RANK [8] ((V1)V2)SD C'oBJECTS DIFFER IN SHAPE: ',(V1),' AND ',V2 [9] SD:((S10V1)=10V2)SC CC,(0=C)';OBJECTS DIFFER IN TYPE' END [10] SC:((C),2N)/END,SIMPL [11] C'oBJECTS ARE OF RANK >2; THEY DIFFER AT ',(+/,V1V2),' PLACES' END [12] SIMPL:C'OBJECTS ARE ',(50=S)'CHAR ',,svm[N;] (SCL,VEC,MAT)[N] [13] SCL:CC,cr,V1,V2 0 [14] MAT:CC,cr,VM(V1)COMPFNV2 0 [15] VEC:CV1 COMPV V2 [16] END:(1000<+/size 'V1 V2')0 [17] CC,cr,('vAR1:',cr,VMV1),cr,cr,'vAR2:',cr,VMV2 .=j pp CREP DISPLAY OBJ;SEP;L;D;S;io [1] DANB 840629 DISPLAY OBJECT FROM PACKAGE [2] io1 SEP2cr (VAR,FN,PAK,DONNO)['vfp'1OBJ] [3] VAR:(2SDREP)/L1 [4] LD1'}{ ',(S),'D STRUCTURE: ',1,('<>,r<',av[255+io],'>i8')fmt D L2 [5] L1:SLL/Lcr=D(VMREP),cr LL[nlinesS]nlinespw [6] L2:CSEP,1OBJ,(4010REP)' [C]',cr,(LD),(LD)/' ...[MORE]' 0 [7] FN:CSEP,C,(0=CVM('r< >p<[>q<]>bli5' fmt 1+1REP),REP)/1OBJ,'' 0 [8] PAK:(1 2 (S1OBJ)pnc REP)/DONNO,P1 REPS FNCR REP FN [9] P1:REPS pval REP VAR [10] DONNO:CSEP,1OBJ,' IS UNDEFINED !' o si=jh MATFIT MAT;io;W;P;F;DIM [1] DANB 840614 RESHAPE CHAR MAT TO FIT PW [2] W:WIDTH; F:NO OF FOLDS; P:PAGE LENGTH [3] FpwW1DIM 0 2 +MAT [4] DIM[io0]FP(1DIM)F [5] MAT(P,FW) 1 0 2 (F,P,W)DIMMAT =j RObJ FNCR PaK;F [1] return cr of FN in PacKage [2] 3fd 'F;',ObJ,CR,'[1]pdef ObJ psel PaKRCR ObJ' <(=jX [30 BA JDMR1 W;I;N [1] JOT-DOT-MATCH-RANK 1 FOR RANK 2 A AND W [2] SORT OF A.R1 W [3] N1A BA over W I(30=10A)'avB' BB[I;] [4] I[I]+\/B1B [5] BI[N].=NI =j DM1 MCOMP M2;X;R;C;io [1] MATRIX COMPARISON [2] DISPLAY THE OBJECT M1 TOGETHER WITH THE LINES FROM M2 WHICH ARE [3] note 2=(M1)=M2 AND (1M1)=1M2 [4] io0 XCOMPBOOL M1 JDMR1 M2 R/X C~X [5] D' '[R],'[,q]li4' fmtR ROW NOS, =LEFT, =RIGHT [6] R(COMPIND R),C/COMPIND~C ORDER OF DISPLAY [7] XM1CM2 DD((+/C),6)' ' D(D,X)[R;] [8] X(1+2zone)-zone ZONE OF DISPLAY [9] RR/RD[;2].=' ' RUNIQUE(/R.<0,1D)/R,R.+X [10] DD[R;] \=j WWelpr VUNIQUE V [1] DANB ELIMINATE DOUBLES FROM LIST V [2] V((VV)=V)/V =j1  cmd cmddebug a;io;b;c;d;e;i;l;n;s;t;x;S [1] Activates or deactivates stops and traces for a set of functions [2] Syntax: ]DEBUG {fcn names} /STOP /TRACE /LINE=line nums [3] /OFF /ON [4] io1 S'A'165av SAX? [5] Parse the command line [6] s1a SS '/s' scan for /STOP option [7] t1a SS '/t' scan for /TRACE option [8] c1a SS '/of' scan for /OFF option [9] We don't have to scan for the /ON option; it's the default [10] l2048 default is to list all lines [11] We are assuming here that no function will have more than 2048 lines [12] ba SS '/l' [13] (~1b)/1 If /LINES= option used, [14] x(b1)a x(1+x'/')x x(x'=')x get value [15] l,x as numbers [16] 1:a(1+a'/')a strip options [17] amatrify a [18] (~0a)/2 If no names were specified, [19] anl 3 do it to all names [20] a(~0 shadowed a)a remove names of cmd processor fns [21] 2:c/'l0' If /OFF option used, clear settings [22] (~ts)/'ts1' If neither /STOP nor /TRACE, select both of them [23] Change stop and trace settings [24] ni0 [25] 3:((1a)1f)/2 aa,' ',f[i;] [12] 1:ii+1 (i>1f)/2 [13] bf[i;] (~(1b)'0123456789')/3 [14] ii+1 (i>1f)/2 bb,' ',f[i;] [15] 3 [16] 2:ER 'yOU MUST PROVIDE TWO FILE NAMES' [17] 3:(i1f)/2 [18] adeb a bdeb b [19] [20] mAKE SURE FILES ARE NOT ALREADY TIED [21] untie(at0)/atftnum a [22] untie(bt0)/btftnum b [23] [24] gENERATE A dos-STYLE FILE NAME FROM THE apl SOURCE FILE NAME [25] naa,(~'.'a)/'.asf' IF NO EXTENSION PROVIDED, COPY apl FILE [26] (/':\'na)/5 SKIP AHEAD IF ALREADY NATIVE-STYLE NAME [27] l'' [28] (~(vi na) 1 0)/4 iF LIB NUM PROVIDED, [29] llibd 1fi na l(l' ')/l [30] ll,(~(1l)':\')/'\' CONVERT TO PATH [31] 4:mmatrify na [32] mm[''m;] THE SOURCE FILE NAME [33] nal,m FULL PATH AND NAME OF SOURCE FILE [34] 5: [35] [36] dO THE SAME FOR THE TARGET FILE [37] nbb,(~'.'b)/'.asf' IF NO EXTENSION PROVIDED, COPY apl FILE [38] (/':\'nb)/7 SKIP AHEAD IF ALREADY NATIVE-STYLE NAME [39] l'' [40] (~(vi nb) 1 0)/6 [41] llibd 1fi nb l(l' ')/l [42] ll,(~(1l)':\')/'\' [43] 6:mmatrify nb [44] mm[''m;] THE TARGET FILE NAME [45] nbl,m FULL PATH AND NAME OF TARGET FILE [46] 7: [47] [48] cOPY THE FILES USING NATIVE FILE OPERATIONS [49] na ntie x-1+0/-nnums [50] y-1+0/-nnums [51] g'' WILL BE EMPTY IF NO ERROR, OR MESSAGE IF ERROR [52] (~iferrin 'nb ncreate y')/8 [53] (~'file name error'errmsg)/11 [54] g'fILE ',b,' ALREADY EXISTS; NOT REPLACED' [55] (~r)/10 g'' [56] (iferrin 'nb ntie y nb nerase y nb ncreate y')/11 [57] 8:i-q24576 ensize x [58] 9:(eii+q)/10 lOOP FOR EACH BLOCK, COPYING THE FILE [59] (~iferrin '(nread x,82,(qe-i),i)nappend y')/9 [60] 11:gerrmsg [61] 10:nuntie x,y [62] [63] (ats)/'a stie at' RETIE FILES THAT WERE TIED BEFORE CMD [64] (bts)/'b stie bt' [65] ER g SIGNAL AN ERROR IF ONE OCCURRED [66] out 'fILE ',a,' COPIED TO ',b ELSE, PRINT CONFIRMATION MESSAGE =jb;f;r; cmdferase a;io;c;e;f;i;l;n;s;t;errmsg [1] eRASES apl OR dos FILES [2] io1 amatrify a n'' [3] i0 t1+0/nums ec0 [4] 1:((1a)1a)/'MISSING FILE NAME' [8] ff,' ',a[i;] NEXT ONE IS THE NAME [9] 2:fdeb f [10] (/':.'f)/3 JUMP IF NATIVE FILE NAME [11] eRASE apl FILE [12] (iferrin 'f stie t')/5 [13] (iferrin 'ferase t')/5 [14] ee+1 [15] 1 [16] eRASE dos FILE [17] 3:lfi f [18] (2l)/4 iF LIBRARY NUMBER WAS SPECIFIED WITH NATIVE FILE, [19] llibd 1l ll,(~(1l)':\')/'\' CONVERT TO dos PATH [20] fl,(f' ')f [21] f(f' ')/f [22] 4:(iferrin 'f ntie -t')/5 [23] (iferrin 'f nerase -t')/5 [24] ee+1 [25] 1 [26] eXAMINE ERRORS [27] 5:s11>('file name''file tie''access')>1a)/20 lOOP FOR EACH PAIR OF NAMES [31] xa[i;] ya[i+1;] OLD AND NEW NAMES [32] x(x' ')/x y(y' ')/y DEBLANK [33] (xy)/18 ERR IF NAMES IDENTICAL [34] ii+2 v0 [35] (0f)/8 JMP IF USING FILE [36] [37] wORKSPACE CASE [38] (2 3 =nc x)/5,6 17 [39] 5:(~r0=nc y)/16 [40] vex y ERASE FIRST IN CASE DEFINED AS FCN [41] y,'',x ss+1 7 RENAME VARIABLE [42] 6:v1 fd x [43] (0=v)/14 [44] (~r0=nc y)/16 [45] vy renamevr v RENAME FUNCTION [46] tex y ERASE FIRST IN CASE DEFINED AS VAR [47] t3d v [48] (~ty)/19 ss+1 [49] 7:tex(~c)/x ERASE ORIGINAL UNLESS /copy WAS USED [50] 4 [51] [52] fILE CASE [53] 8:juna matiota x (j=0)/17 ERR IF NOT DEFINED [54] (uni[j;1]=5)/14 ERR IF LOCKED FCN IN PKG [55] (~uni[j;1] 2 3)/15 ERR IF UNKNOWN TYPE [56] kuna matiota y [57] (k=0)/9 iF TARGET ALREADY DEFINED, [58] (~r)/16 AND /replace WAS USED, [59] delete utn,uni[k;2] DELETE OLD VALUE [60] una(k1una)una uni(k1uni)uni [61] jj-j>k CORRECT INDEX FOR DELETED OBJECT [62] 9:(2 3 =uni[j;1])/10,12 [63] [64] rENAME VARIABLE IN FILE [65] 10:ss+1 c/11 iF /copy NOT USED, [66] una((0,y)una)una [67] una[j;](1una)y CHANGE NAME IN DIRECTORY [68] 4 eLSE, /copy WAS USED, [69] 11:vread utn,uni[j;2] GET VALUE OF VARIABLE [70] y putval v WRITE NEW VALUE [71] 4 [72] [73] rENAME FUNCTION IN FILE [74] 12:ss+1 c/13 iF /copy NOT USED, [75] una((0,y)una)una [76] una[j;](1una)y CHANGE NAME IN DIRECTORY [77] 13:vread utn,uni[j;2] [78] vy renamevr v [79] ('',y) putval v [80] 4 [81] [82] 14:out 'cANNOT BE RENAMED; LOCKED: ',x 4 [83] 15:out 'cANNOT BE RENAMED: ',x 4 [84] 16:out 'aLREADY DEFINED; NOT REPLACED: ',y 4 [85] 17:out 'nOT DEFINED: ',x 4 [86] 18:out 'tHE OLD AND NEW NAME MUST NOT BE IDENTICAL: ',x 4 [87] 19:ER(1=1t)/'ws full' ER(4=1t)/'symbol table full' [88] out 'cANNOT DEFINE FUNCTION ',y,' (PERHAPS PENDENT)' [89] 4 [90] [91] 20: eNDLOOP [92] [93] ((s=0)0=f)/21 iF SOMETHING WAS SAVED IN A FILE, [94] closeuf '' UPDATE THE DIRECTORIES [95] 21:out(s),' OBJECT',((s1)/'S'),((~c)/' RENAMED.'),c/' COPIED.' [96] untie nums~p UNTIE FILES WE TIED =jx)) cmdties p;io;h;i;m;n;s;t;v;z [1] Displays names, tie numbers, and sizes of tied files [2] [3] io1 h'-' horizontal line [4] ndeb names [5] tnums [6] pt sort by tie number [7] nn[p;] tt[p] [8] m'Tie' rover ' 'debt.+,0 m[2;]h [9] z(0 3 +m)m [10] m'File Name' over ' 'n m[2;]h [11] zz,m [12] s((t),2)Ң1 [13] i0 [14] 1:((t)0)/2 [16] s[i;1]nsize t[i] get size of native file [17] 1 [18] 2:vsize t[i] [19] s[i;]v[3],-/v[2 1] get size and num comps of APL file [20] 1 [21] 3: [22] m'Size' rover ' 'deb 'ci20' fmt s[;1] m[2;]h [23] zz,(- 0 4 +m)m [24] m'Comps' rover ' 'deb 'ci10' fmt s[;2] m[2;]h [25] zz,(- 0 4 +m)m [26] out ' 'z =jPv U UWERE cmducomp p;io;a1;a2;a;b;f;h;i;j;m;n1;n2;t1;t2;t;v1;v2 [1] Compares two user command files [2] Syntax: ]UCOMP file1 file2 [3] io1 [4] Extract the A and B file names [5] pmatrify p [6] i1 (i>1p)/l8 [7] ap[i;] EX ' ' ii+1 [8] (~vi a)/l10 (i>1p)/l8 [9] aa,' ',(p[i;] EX ' ') ii+1 [10] l10:(i>1p)/l8 [11] bp[i;] EX ' ' ii+1 [12] (~vi b)/l9 (i>1p)/l8 [13] bb,' ',p[i;] EX ' ' [14] l9 [15] l8:ER 'you must provide two file names' [16] [17] Read the file directories [18] l9:tnums [19] t1fopen a [20] hread t1,2 [21] a1read t1,h[2] [22] n1read t1,h[3] [23] a1a1[iava1;] n1n1[i;] [24] t2fopen b [25] hread t2,2 [26] a2read t2,h[2] [27] n2read t2,h[3] [28] a2a2[iava2;] n2n2[i;] [29] SCMDUCOMP35 40 [30] Find new and missing objects [31] f0 flag set if any differences [32] ja2 matiota a1 [33] (~0j)/l3 [34] CR,' objects found only in file ',a,':' [35] telprint(j=0)a1 [36] f1 [37] l3:ja1 matiota a2 [38] (~0j)/l4 [39] CR,' objects found only in file ',b,':' [40] telprint(j=0)a2 [41] f1 [42] l4: [43] [44] aa,':' bb,':' a((a)b)a b(a)b [45] i0 [46] l1:((j)I3,i3,2p<:>I3' fmt 1 6 100ftimerep n1[j[i];3]) [55] ' in file ',b,' dr=',(DR v2),', shape=',(v2),', last mod=',(,'i2,2pI3,i3,2p<:>I3' fmt 1 6 100ftimerep n2[i;3]) [56] [57] (^/(2(v1),v2),82=(DR v1),DR v2)/l5 [58] CR,' ' [59] l1 skip comparison if not char vector or matrix [60] [61] l5:(2=v1)/l6 [62] (3=N1[J[I];1])/'V11 PCVRFMT V1' /II only ? [63] v1vtom((CR1v1)/CR),v1 [64] l6:(3n1[j[i];1])/'v1(''lp<[>q<]>i6''fmt1+1v1),v1' [65] [66] (2=v2)/l7 [67] (3=N2[I;1])/'V21 PCVRFMT V2' /II only ? [68] v2vtom((CR1v2)/CR),v2 [69] l7:(3n2[i;1])/'v2(''lp<[>q<]>i6''fmt1+1v2),v2' [70] [71] CR,' lines found only in file ',a [72] m(0=(0 6 v2) matiota 0 6 v1)v1 [73] (0=1m)/'m1 6''''' [74] 1mtov m [75] [76] CR,' lines found only in file ',b [77] m(0=(0 6 v1) matiota 0 6 v2)v2 [78] (0=1m)/'m1 6''''' [79] 1mtov m [80] [81] l1 [82] l2:untie(t1,t2) EX t [83] (~f)/'no differences.',CR [84] 0 PCVRFMT accessed thru k[=j1   cmd cmducopy p;io;a;b;c;f;i;j;k;m;n;q;r;sa;sh;sn;st;s;ta;tn;tt;v;y;udr;uhd;urum [1] COPIES OBJECTS FROM A ucmds FILE INTO THE CURRENT FILE [2] syntax: ]ucopy SOURCEFILE OBJECTS /f=TARGETFILE /r /s [3] if the /r option is used, the objects being copied [4] will be replaced and existing objects in the target file [5] if the /f= option is used, objects are copied into the specified [6] file instead of the current ucmds file [7] iF THE /s OPTION IS USED, THE COMMAND ALSO COPIES THE SYSTEM [8] COMPONENTS (NUMBERS 3-10) FROM THE SOURCE TO TARGET FILE. [9] if an object name is prefixed with a period (as in .grpfoo), the [10] named variable and all objects named in its value are copied. [11] io1 qnums [12] get the source file name and object names [13] mmatrify(^\p'/')/p [14] ER(0=1m)/'YOU MUST SPECIFY A SOURCE FILE NAME' [15] sm[1;] m 1 0 m [16] (~(1s)'0123456789')/1 if the first item is lib num, [17] ER(0=1m)/'YOU MUST SPECIFY A SOURCE FILE NAME' [18] ss,' ',m[1;] m 1 0 m the next item is the filename [19] 1:sdeb s [20] get the target file name [21] y1p SS '/s' 1 IF /s OPTION USED (COPY SYSTEM RECS) [22] r1p SS '/r' 1 if /r option used [23] fufiles[1;] [24] (~1bp SS '/f')/2 [25] f(1+b1)p f(~^\f' =')/f f(^\f'/')/f [26] 2:fdeb f [27] open the files; begin transaction [28] nnums [29] sttieuf s shuhd open source file [30] saread st,sh[2] snread st,sh[3] names&positions [31] cONVERT DATES FROM OLD TO NEW FORMAT- removed [32] b(sn[;3]0)^sn[;3]<10000000000000 MARK PACKED DECIMAL DATES [33] bb/b [34] c(6100)sn[b;3] c[;1]c[;1]+1900 UNPACK DATES [35] sn[b;3]ftimebase c,0 REPACK USING ftimebase [36] b(sn[;4]0)^sn[;4]<10000000000000 MARK PACKED DECIMAL DATES [37] bb/b [38] c(6100)sn[b;4] c[;1]c[;1]+1900 [39] sn[b;4]ftimebase c,0 [40] tt1 tieuf f begin transaction on target file [41] taread tt,uhd[2] tnread tt,uhd[3] [42] get the names of objects to copy [43] (~0m)/3 msa copy all objects if none named [44] 3:(~/'*?'m)/4 iF PATTERN PROVIDED, [45] m(0(matrify m) patiota sa)sa COPY ALL OBJECTS IN SOURCE FILE THAT MATCH [46] 4:m((m matiota m)^.=1m)m eliminate duplicate names [47] mm[avm;] [48] copy them over [49] ic0 [50] 5:((1m)q<]>li5' fmt1z),deb z [14] 0 [15] 1:p1'/= /sys /new' parse p [16] DanB: changed original 'u' & 'y' vars to 'new' & 'sys' [17] with use of . Also removed some inconsistencies, [18] deleting all files is allowed since the main always appears... [19] p(('['1p)/'[.5]'),p if no [...], put file on top of list [20] p1p p(\p' ')/p [21] [22] fx>' rep ;trap''trap''21 e r''replace 0''r:(1e5+/size 1)resize 11't0 [23] NOTE: The main file ALWAYS appears... [24] ((1p)'~')/6 if inserting or replacing a file, [25] n(^\p']')/p pdeb(1+n)p line number file name [26] ER(^/p=' ')/'YOU MUST PROVIDE A FILE NAME' [27] (~(,1)vi n)/3 number must be a singleton [28] nfi n in [29] (n=i)/2 if insertion, [30] ((i<0)i>1+(1ufiles))/3 ensure number is in range [31] ii1 CHANGE 0 TO 1 [32] z(i1+1z)z insert line for file name [33] 4 else, replacing a file, [34] 2:((1i)^i(1ufiles)-t)/4 ensure number is in range [35] 3:ER 'INVALID NUMBER: ',n [36] 4:(~new)/5 if /new was used, [37] out sys makeufile p create a new file [38] 5:snums [39] newuftieuf p use the file a bit to insure sufficient access [40] z[i;]names[numsnew;] stick it in the search list [41] if this is a system file it is [presumably] used for the 1st time [42] and subsequently here. At any rate we should replace its search path [43] z rep new,4 [44] and make the new search path reflected properly (below) [45] untie((i=1)news)new keep tied if first file [46] 9 [47] delete files from the search list [48] 6:n1(^\p']')/p numbers of files to delete [49] p(2+n)p (^/p=' ')/7 out 'FILE NAME IGNORED: ',p [50] 7:(~^/vi n)/3 nfi n extract numeric value [51] b(nn)(n<1)n>(1z)-t MARK OUT-OF-RANGE NUMBERS [52] (~1b)/8 out 'CANNOT BE DELETED: ',b/n [53] n(~b)/n [54] 8:z(~(1z)n)z remove file names [55] SAVE THE NEW SEARCH LIST IN THE ucmds FILE [56] 9:z rep MT,4z(z)ztrap'19 c 10' [57] ufilesz [58] 10:out 'NOW USING FILE ',deb,1znames[numsMT;] =j( cmduhelp p;io;a;b;c;d;h;i;j;k;l;n;q;r;s;ttab;t;u;v;udr;uf;uhd;urum [1] displays help for commands in the file [2] syntax: [3] uhelp -- displays names of commands [4] uhelp + -- displays command abstracts [5] uhelp * -- displays info on all commands [6] uhelp CMD1 CMD2 -- displays info on specific commands [7] io1 snums c' ',(, 2 26 10varc),10varc [8] cc,(~avc)/av a nice collating sequence [9] select syntax case [10] (^/p=' ')/1 [11] (('+'p)^^/p' +')/4 [12] (('*'p)^^/p' *')/23 [13] 14 [14] help -- display all cmd... names for each file [15] 1:r 0 0 '' i0 [16] 2:((1ufiles)l)/12 if description is wider than pw [58] q(l)pw+1 [59] 10:(l[q]=' ')/11 qq-1 10 scan for a blank [60] 11:out(q-1)l l((5+1b)' '),ql output a line [61] 9 [62] 12:out l output last line of description [63] 6 [64] 13:untie(~ts)/t [65] 5 [66] help NAME -- display NAMEdoc [67] 14:pmatrify p [68] bd(1p)0 marks names found [69] hljust(rjust p),((1p),4)'doc' [70] iq0 [71] 15:((1ufiles) FILE TO USE [3] THE /G OPTION CAUSES GROUP DEFNS TO BE DISPLAYED [4] The /VARS and /FNS options restrict the output to vars and fns only [5] The /SINCE option restricts output to objects that have been changed [6] since the specified date, which must have the form: [7] DY MTH YR HR:MN:SC [8] io1 cvarc DIGITS, LETTERS, letters [9] c(, 2 26 10varc),10varc [10] cc,(~avc)/av NICE COLLATING SEQUENCE [11] p1'/since= /grps /fns /vars /file= /= ' parse p [12] ggrps SCAN FOR /G OPTION [13] vavars scan for /VARS option [14] fnfns scan for /FNS option [15] [16] Extract the /SINCE option [17] ts/'' (0since)3 [18] dbsince b[(b=':')/b]' ' [19] (~ 1 0 1 3vi b)/1 [20] m 12 3 'janfebmaraprmayjunjulaugsepoctnovdec' [21] fmatrify b [22] ts(fi f[3;]),(m matiota 3f[2;]),fi f[1;] get date [23] ts[1]ts[1]+1900ts[1]<1000 convert year to 1900s [24] (ts[2]=0)/1 [25] (~^/3vi b)/1 [26] tsts,3fi b get time [27] 2 [28] 1:ER 'Invalid date specification: ',d [29] 2:tsftimebase 7ts [30] GET THE NAME OF THE FILE TO USE [31] 3:fufiles[1;] DEFAULT FILE IS ON TOP OF STACK [32] (0tfile)4 [33] f(^\t'/')/t THE FILE NAME [34] 4:f(\f' ')/f DLB [35] PARSE REST OF COMMAND LINE [36] p(^\p'/')/p THE PATTERN TO MATCH [37] GET THE NAMES OF OBJECTS IN THE FILE [38] snums [39] uuftieuf f [40] hread uf,2 FILE HEAD [41] aread uf,uhd[2] NAMES OF OBJECTS IN FILE [42] nread uf,uhd[3] NUMERIC INFO [43] IF /G OPTION WAS USED, PRINT GROUP DISPLAY [44] (~g)/9 [45] b(n[;1]=2)^(((1a),3)a)^.='grp' GROUPS [46] aaba nnbn [47] ep patmatch aa 1'S MARK GRP NAMES MATCHING PATTERN [48] eep^.=' ' match all if pattern is empty [49] i0 d 0 0 '' [50] 5:((1aa)nn[i;3])/6 and group has been changed recently [54] tljust(rjust v),'?'[2 3 5 (0,n[;1])[1+a matiota v]] [55] out CR,' Group: ',aa[i;] [56] out telprint t DISPLAY NAME OF GROUP AND VALUE [57] 6:dd over(0=d matiota v)v ACCUMULATE LIST OF ALL NAMES [58] 5 ENDFOR [59] DISPLAY LIST OF UNGROUPED OBJECTS [60] 7:out CR,' OBJECTS NOT IN ANY GROUP:' [61] b(d over aa) matiota a [62] t'' (~0b)/8 [63] tdeb(b=0)a [64] tljust(rjust t),'?'[2 3 5 (0,n[;1])[1+a matiota t]] [65] ttelprint t[ct;] DISPLAY NAMES NOT IN ANY GROUP [66] 8:out t [67] 0 [68] ELSE, RETURN NAMES OF OBJECTS IN FILE [69] 9:bp patmatch a select names matching pattern [70] bbp^.=' ' match all if no pattern [71] bb^n[;3]ts and changed since date specified [72] aaba nnbn [73] (~vafn)/10 If /VARS or /FNS was used, [74] m(nn[;1](va/2),fn/ 3 5)aa list just variables or fns [75] 11 Else, [76] 10:mljust(rjust aa),'?'[2 3 5 nn[;1]] APPEND TYPE AFTER NAME [77] 11:(01m)/12 t 1 6 '' 13 display something, even if no names [78] FORM THE DISPLAY [79] 12:ttelprint m[cm;] [80] 13:resultt return it as an explicit result =j1  1 1 cmd cmdunsaved a;io;errmsg;f;g;i;j;m;q;sdr;setc;shd;sna;sni;srum;stn;t;v;w;x;z [1] Compares objects in the workspace with ones in the file [2] The optional argument is the name of the file to compare with the [3] workspace. The default is the current file. [4] The /Missing option causes the names of objects not found in the [5] file or saved copy of the workspace to be displayed. [6] [7] io1 qnums m1a SS '/M' look for /MISSING option [8] a(1+a'/')a strip options [9] (~^/a=' ')/1 If no argument, [10] aufiles[1;] use current file [11] 1:out 'Comparing the active workspace and file: ',(deb a) [12] 's' openuf a [13] Compare objects in file with objects in the ws [14] j5 ws sna [15] j0j[;(j)[2]] do only names which are defined globally [16] jj\~shadowed jsna and are unshadowed [17] jj/j [18] fg 0 0 '' [19] i0 [20] 2:((j)'.=1g gdg sans . prefix [27] (S' [26] (0=ia matiota m[j;])/3 [27] vread uf,n[i;2] [28] 3:out m[j;],' = ',v display name and value [29] 2 [30] 4:(/'='p)/5 IF REFERENCE, [31] (i=0)4b 'NOT DEFINED: ',v 40 [32] 4b:resultread uf,n[i;2] GET VALUE [33] 0 ELSE, ASSIGNMENT [34] 5:((1nc '',v)(1v)'0123456789')5b 'NOT A STATE VARIABLE: ',v 40 [35] 5b:uf1 tieuf f begin write transaction on UCMDS file [36] (^/x=' ')/11 IF VALUE IS MISSING, ERASE VARIABLE [37] (~^/b\bx='''')/6 xx STRIP QUOTES IF VALUE IS ONE LITERAL [38] 6:'',v [39] VALIDATE THE VALUE [40] 7:pwb 'PW INVALID VALUE: ',x 40 [41] pw:bpw pwfi x (iferrin '''pw OK''')/7 SEE IF IT'S A LEGAL VALUE FOR PW [42] 8 [43] ec:8xfi x [44] trap:8 [45] pl:xfi x [46] ((x=x)^x10)8 'PAGE LENGTH MUST BE AN INTEGER 10 OR LARGER' 40 [47] WRITE THE VALUE TO THE FILE [48] 8:(i0)/9 IF NEW VARIABLE, [49] aa over v nn0 make new directory entry [50] i''a [51] 10 ELSE, EXISTING VARIABLE, [52] 9:delete uf,n[i;2] delete old value [53] 10:n[i;3]2,(x append uf),(ftimebase ts) [54] 12 [55] NO VALUE PROVIDED; ERASE THE VARIABLE [56] 11:delete uf,n[(i0)/i;2] delete old value [57] xi1a axa nxn [58] Update the directories after any change [59] 12:delete uf,uhd[2 3] wipe out old directories [60] uhd[2 3](a append uf),n append uf write the new ones [61] commit uf update the file [62] 0 [63] 30:'' 0 [64] 40:result 0 0 0 =j1  cmd cmdwsloc p;io;a;b;c;d;fn;f;g;i;j;l;m;ns;n;s;t;udr;uf;uhd;urum;u;v;w [1] LOCATES A PHRASE IN OBJECTS IN THE WORKSPACE [2] the /fn= option can be used to restrict the search to specific objects [3] if /fn=* is used, both functions and variables are searched [4] if /fn is omitted, only functions are searched [5] the /n option causes only names to be found [6] the /f= option causes functions in the specified ucmds [7] file to be searched [8] ordinarily, the phrase is the text between the command name [9] and the first option. however, if the phrase needs leading [10] or trailing blanks, or if it contains the phrase ' /', it [11] must be represented as in: [12] ]wsloc.phrase. [13] where '.' may be any delimiter character not in the phrase. [14] note that there must not be a space between the command name [15] and the first delimiter. [16] [17] io1 (' '=1p)/1 if first char is not blank, [18] s(1+(1p)1p)1p the phrase to search for [19] p(2+s)p options (if any) [20] 2 else, string is the argument [21] 1:s(^\~p SS ' /')/p [22] p(s)p options (if any) [23] s((\b)^\bs' ')/s ignore leading + trailing blanks [24] 2:bp SS '/fn' p[b/b]' ' [25] gp SS '/f' p[g/g]' ' [26] cp SS '/n' p[c/c]' ' [27] (~'/'p)/3 [28] ER 'UNRECOGNIZED OPTION: ',(\p='/')/p [29] 3:p[(gbc)/p]'/' put the slashes back [30] c1c 1 if /n option was used [31] fna 0 0 '' [32] (~1b)/4 if /fn= was used, get names [33] a(b1)p a1(\a='=')/a fnamatrify(^\a'/')/a [34] 4:uf0 [35] (~1g)/7 if the /f= option was used, [36] t(g1)p t(^\t'/')/t t1(\t='=')/t [37] (^/t=' ')/'tufiles[1;]' if just /f, use current file [38] uuftieuf t tie the file [39] tread uf,uhd[2] dread uf,uhd[3] [40] tt[iavt;] dd[i;] search alphabetically [41] (~('*'a)0a)/5 at [42] ('*'fn)/8 search both fns and vars if /fn=* [43] a(d[;1]=3)a d(d[;1]=3)d [44] 23 [45] 5:it matiota a [46] (~0i)/6 out 'NOT DEFINED: ',,' ',(i=0)a [47] 6:dd[(i0)/i;] a(i0)a [48] 23 else, we are searching objects in the workspace, [49] 7:(~('*'a)0a)/8 iF ARGUMENT IS * OR EMPTY, GET NAMES TO SAVE [50] a1 ws+/1,('*'a)/ 2 4 also search vars and grps if /fn=* [51] t5 ws a [52] a(t[;(t)[2]]0)a OBJECTS THAT ARE DEFINED GLOBALLY [53] (~'*'fn)/8 if /fn=*, also search lx/elx/alx [54] tmatrify 'lx trap' [55] aa over(0=a matiota t)t [56] the matiota is because globalelx/alx may or may not be globals [57] 8:tshadowed a WARN ABOUT LOCALIZATION, BUT USE LOCAL VERSION [58] 23: [59] [60] ns'' objects not searched [61] i0 [62] 9:((1a), [63] f(f' ')/fa[i;] [64] (uf=0)/11 if reading from a file, [65] vread uf,d[i;2] get value from file [66] (2 3 =d[i;1])/15,10 21 [67] 10:vvrfromobj v get function vecrep [68] vCR,'[0] ',(v'')v CHANGE HEADER TO LINE [0] [69] 17 else, [70] 11:(2 1 4 =1,5 ws f)/14,13,12 21 get value from ws [71] note: 5ws used above instead of nc so lx is considered a var [72] 12:vmatrifyf 15 GET GROUP VALUE [73] 13:v1 fd f [74] vCR,'[0] ',(v'')v 17 CHANGE HEADER TO LINE [0] [75] 14:vf [76] 15:(~(2v)^'char'datatype v)/21 [77] (2=v)/16 vvtom CR,v [78] 16:vCR mtov('p[q]li7' fmt 1+1v),v [79] vv,' ' [80] 17:lv SS s search for string [81] (~1l)/9 if any occurences, [82] (~('*'fn)^uf=0)/18 [83] (0=('globalelx',[0.5]'globalalx')matiota f)/18f'',7f change globalelx to elx (sheesh!) [84] ('trap '6f)/18 [85] 18:(~c)/19 if the /n option was used, [86] jl/l eliminate matches that are part of a longer phrase [87] l[j]((v[1j-1]varc)v[j]varc)^(v[(v)j+s]varc)v[j+1+s]varc [88] 19:nv=CR [89] m(ln)/n m(m/1m)n/l mn Porred l [90] bn/n w(1b,1+n)-b base and width of each line [91] bm/b wm/w lines with matches [92] j0 [93] 20:((b) is already defined; erase it first' [14] 1:s'' appendr t comp 1 is file ID, written last [15] s(3) appendr t comp 2 is file head; written below [16] Fill in the system components (numbers 3-10) [17] cfopen ufiles[''ufiles;] [18] i2 [19] 2:(10 created' [43] untie(~numsp)/nums untie files we tied =jdoYY gtd zd outadatepkgs p;j;b;i;t;k;n;a;f;da;dn;df;u [1] Returns the names of commands whose packages that are out of date [2] Uses global variables: [3] UTN - tie number of user command file [4] UNA - names of objects in file [5] UNI - numeric info matrix for objects [6] The right argument is the prefix to use in the variable names for [7] the source file (default = U) [8] The left argument is the prefix to use in the target file (in [9] which the packages are saved (default = U) [10] [11] (0p)/'p''u'' ' [12] (0d)/'d''u'' ' [13] ap,'na' get globals using appropriate prefix [14] np,'ni' [15] fp,'tn' [16] dad,'na' [17] dnd,'ni' [18] dfd,'tn' [19] [20] da(0 3 da)da [21] j((dn[;1]=2)^da[;3]^.='pkg')/1da names of packages [22] b(j)1 [23] i0 [24] 1:((j)THAT.=j`` za append t;s;trap [1] Writes to the first free record in file , returns record number [2] ER(t1udr)/'WRONG FILE' [3] zfindcomp 4ws 'a' find component in which to store A [4] (z=(size t)[2])/1trap'21 e (1e5+12size t)resize tlc' [5] a replace t,z write data to the file [6] 0 [7] 1:za appendr t ns a=j8 be closeuf p;t [1] Closes user file tied to UTN, updating directories [2] The right argument is the prefix for the global variables. If the [3] argument is '', 'U' is used by default. [4] The directories are saved only if the prefix is '' or 'U' [5] [6] (0p)/'p''u'' ' [7] (~p'u')/1 skip save if closing another file [8] delete utn,uhd[2 3] [9] uhd[2 3](una append utn),uni append utn [10] commit utn [11] 1:untie'(~',p,'etc[2])/',p,'tn' untie the file if OPENUF tied it [12] tmatrify 'tn hd rum dr na ni etc' [13] tex(((1t),,p)p),t erase variables created by OPENUF =j-- E commit t;c;s;trap [1] installs changes made to file during the transaction [2] ER(t1udr)/'wRONG FILE' [3] we'd also like to check that the file is exclusively tied [4] but here we assume it was held in the first place [5] delete t,1uhd delete record used to store current RUM [6] cfindcomp 8+4ws 'urum' find new place for the Record Usage Map [7] urum[1udr]urum[1udr] mark deleted records as free [8] trap'21 e (1e5+12size t)resize tlc' [9] (c=(size t)[2])/1 If writing RUM to existing comp, [10] urum replace t,c2 replace it [11] 1:curum appendr t append RUM to new comp [12] 2:uhd[1]c remember where RUM is stored & replace file head [13] uhd replace t,2 instantly changing state of file [14] s6fd'uhd urum udr' end transaction [15] s,names[numst;] untie t [16] s stie t retie in shared mode m=j4 zdatatype v;r;trap [1] returns data type name of value [2] r'n' trap'c 1' [3] rdtype v [4] 1:trap'' [5] z(5 4 'boolcharint realnosh')['bcir'r;] ]=j Azdeb Ab;b [1] Deletes leading, trailing, and excess blank columns in [2] Az((-Ab)1)(b1b' '^.=Ab)/Ab' ',Ab =jB18] delete t [1] Marks records 1 in file [1] for deletion on commit [2] ER(t[1]1udr)/'WRONG FILE' [3] udrudr,(0<1t)/1t =jgg zdtype a [1] rETURNS THE DATATYPE OF , b, i, r, OR c [2] z'irc?'[163 645 82 DR a] . =j's' zfindcomp s;d [1] Finds component in which to store array of size without explosion [2] Also updates global URUM to claim the component Z [3] [4] ss16 size of object in paragraphs [5] durum-s excess space in each component [6] z/(d0)/d find comp with least wasted space [7] zdz the comp number [8] (z>d)/1 If a free record is big enough, [9] ((s>32)^urum[z]>2s)/1 and there will not be >50 wasted space [10] urum[z]-urum[z] mark record as being in use [11] 0 Else, no record is big enough, [12] 1:zurum0 look for an unused component [13] (z>d)/2 If there is one, [14] urum[z]-s use it; remember its size [15] 0 Else, no empty component, [16] 2:urumurum,-s add new comp to end of file ced =jk dF (P=Hp(( 7 ftimebase(@3xx  (=bV12;[1@84MPABIF8 `(V'  pc pcH ],' - ()* (-(tftimebase ts;shape(@copyright i.p.sharp associates limited 1985@X( accepts a numeric vector or array in ts format with <7=1argument>XX( returns time and date in rdci format with shape <1argument> f X (shape1ts n (H-( ts((1ӫ/shape),7),ts((<(ts((1ts),7)ts(0x(ts[;6+io]ts[;6+io]6100j0Pt 60 29 1 30 60 91 121 152 183 213 244 274[ts[;1+io]-~io]P0H(tt-(4ts[;io])<2ts[;1+io]08(t(t+365.2560+100ts[;io]), 0 2 ts80(tshape 1 1 24 60 60 60 t0:',c=jk dF (P'"b Hp((( ,*ftimerep(@P00(=b@`x0 h   0 ( )),*-.U08tsftimerep ts;md;shape;tmp;yr;z;io8@copyright i.p.sharp associates limited 1985@Hh}( *** convert rdci timestamp(s) to ts-format ***kHH( right argument: rdci-type timestamp(s) of any shape6HP result: ts-type timestamp(s) with shape <(argument),7>PH (io0  ( shapets dFn x( ts,ts8vmd365.25011+1461yrts51840008H`(tmp 31 61 92 122 153 184 214 245 275 306 337 366nt 1(H8z(,(ts(shape,7)ts YP=jj zftnum f;i;a;b;d [1] Returns tie number of file or 0 if file is not tied [2] (2=vi f,f)/1 If no library number was provided, [3] d66+av1chdir '' get default drive number [4] f(1ai),' ',f use the default drive [5] 1:anames a(+/^\a=' ')a left justify file names [6] f' ',f bf' ' f1(b1b,0)/f delete excess blanks from F [7] i(a^.=(1a)f)1 search for the file name [8] z(nums,0)[i] return tie number or 0 if none =jhh R Azljust Aa;At [1] LEFT JUSTIFIES CHARACTER VECTOR OR MATRIX [2] Az(+/^\' '=Aa)Aa =jX AzAd mtov Am [1] mATRIX to vECTOR: CONVERTS CHARACTER MATRIX TO -DELIMITED VECTOR [2] (0nc'Ad')/'AdCR' DEFAULT IS CR [3] Az,1,~^\Am' ' AzAz/,(''Ad),Am =jYY p openuf a;f;t;1;2;3 [1] Opens user command file , reads directories, sets global variables [2] The right argument is the name of the file to open [3] The optional left argument is an alternate prefix to use in front [4] of the result variable names. The default is 'U' [5] If the prefix is 'U', the file is held for a write transaction [6] Results: [7] UTN - tie number of the file [8] UHD - file head (component 2) [9] URUM - record usage mask [10] UDR - tie number, list of deleted records [11] UNA - character matrix of names of objects in the file [12] UNI - numeric matrix of info about objects [13] UETC[1] - flag set to 1 if a new object is saved in the file [14] UETC[2] - was the file tied before we opened it? [15] [16] (0=nc 'p')/'p''u'' ' default prefix [17] fnums [18] tp openufsub a open the file [19] p,'tnt' define [20] p,'hd1' [21] p,'rum2' [22] p,'dr3' [23] p,'naread t,1[2]' [24] p,'niread t,1[3]' [25] p,'etc0,tf' no new object yet, was file tied? =jB18] zp openufsub a;udr;uhd;urum [1] Subroutine used by OPENUF [2] z(p'u') tieuf a [3] 1uhd [4] 2urum [5] 3udr =j za patiota b;e;i;l;r;v;x [1] Like MATIOTA, but the left argument may contain patterns [2] Arguments: [3] A - a character matrix with a pattern (or name) on each row. [4] A ? character matches any single character, and * matches [5] zero or more chars. * may occur only once, at the start or [6] end of the pattern. [7] B - a character matrix of names [8] The arguments may be scalars or vectors, in which case [9] they are treated as a 1-row matrix. [10] Result: [11] Z - integer vector with an element for each name in B. [12] The value is the index of the first pattern in A that [13] matched the corresponding name in B, or 0 if none matched. [14] [15] a(2 1 1 ,a)a coerce arguments to matrices [16] b(2 1 1 ,b)b [17] v1b width of B [18] rrjust b [19] z(1b)0 [20] i0 e1a [21] 1:(e(size z)[2])/1 watch out for empty file [16] t'USER-DEFINED COMMANDS FILE' phrase that shows file as ours [17] (t(t),read z,1)/2 ensure right type file [18] 1:untie(~ztied)/z untie file if we tied it [19] ER 'not a user command file: ',f [20] 2:uhdread z,2 file head [21] urumread z,1uhd record usage mask [22] (~^/urum 0 1)/3 If RUM is boolean, [23] urum-urum convert to new integer format [24] 3:n(size z)[2]-1 [25] urumnurum,(0n-urum)Ң1 assume extra comps at end are in use [26] udr,z tie number and list of deleted records (none yet) =jh zvrfromobj c;f;g [1] returns 1fd of compiled function given its object code [2] zc (''1c)/0 return argument if it's not object code [3] f2c f(1+f' ')f name of function [4] fx('g;',f)over 'z1fd fx c' =jdvv Azvtom Av;At [1] vECTOR to mATRIX: CONVERTS 1 DELIMITED CHARACTER VECTOR TO MATRIX [2] Az>1B/ QB/h@@?B/hB/h@@@B/hB/h@@@B/hB/h@@AB/hB/h@@AB/hB/h@@BB/hB/h@@BB/hB/h@@CB/hB/h@@CB/hB/h@@DB/hB/h@@DB/hB/h@@EB/hB/h@@EB/hB/h@@FB/hB/h@@FB/hB/h@@GB/hB/h@@GB/hB/h@@H97M@@HB/hB/h@@IB/hB/h@@IB/hB/h@@JB/hB/h@@JB/hB/h@@KB/hB/h@@KB/hB/h@@LB/hB/h@@LB/hB/h@@MB/hB/h@@MB/hB/h@@NB/hB/h@@NB/hB/h@@OB/hB/h@@OB/hB/h@@PB/hB/h@@P@B/hB/h@@PB/hB/h@@PB/hB/h@@QB/hB/h@@Q@B/hB/h@@QC$ќS@@Q9@@R9<@@R@B/hB/h@@RB/hB/h@@RB/hB/h@@SB/hB/h@@S@B/hB/h@@SB/hB/h@@SB/hB/h@@TB/hB/h@@T@B/hB/h@@TB/hB/h@@TB/hB/h@@UB/hB/h@@U@B/hB/h@@UB/hB/h@@UB/hB/h@@VB/hB/h@@V@B/hB/h@@VB/hB/h@@VB/hB/h@@WB/hB/h@@W@B/hB/h@@WB/hB/h@@WB/hB/h@@XB/hB/h@@X@B/hB/h@@XB/hB/h@@XB/hB/h@@YB/hB/h@@Y@B/hB/h@@YB0*3@@YB/hB/h@@ZB/hB/h@@Z@B/hB/h@@ZB/hB/h@@ZB/hB/h@@[B/hB/h@@[@B/hB/h@@[B/hB/h@@[B/hB/h@@\9s=jhcCOMPACK COMPBOOL COMPFN COMPIND COMPV COMPVAR DISPLAY FIT FNCR JDMR1 MCOMP UNIQUE cmddebug cmdfcopy cmdferase cmdrename cmdties cmducomp cmducopy cmduerase cmdufile cmduhelp cmduload cmdumake cmdunames cmdunsaved cmdupack cmdusave cmduset cmdwsloc debugdoc ec fcopydoc ferasedoc grpcmddebug grpcmdfcopy grpcmdferase grpcmdrename grpcmdties grpcmducomp grpcmducopy grpcmduerase grpcmdufile grpcmduhelp grpcmduload grpcmdumake grpcmdunames grpcmdunsaved grpcmdupack grpcmdusave grpcmduset grpcmdwsloc makeufile outadatepkgs renamedoc rover svm tiesdoc trap ucompdoc ucopydoc uerasedoc ufiledoc uhelpdoc uloaddoc umakedoc unamesdoc unsaveddoc upackdoc usavedoc usetdoc wslocdoc append closeuf commit datatype deb delete dtype findcomp ftimebase ftimerep ftnum ljust mtov openuf openufsub patiota patmatch pchk putval renamevr rjust shadowed telprint tieuf vrfromobj vtom wsnl =jPssrYXCY5#[NOz8=j(c u(srq=jk dF (:Hp((@:ucmdps(@0 6720h=b69h6942(00002626 6 68 2X727276760 4p 00 00 920 92p 9 0 0 6767(67@67h2 20h867 0" ps4.62 08P2 oresultt ucmd p;b;d;f;rc;globals;ufiles;ec;trapplacP8 imitate STSC's UCMD file system dFnre8X(~(ppdef('io' pack 1) pins('ct' pack 2*46) pins 'pw' pack 79gB(X((globalsio,ct,pw ((( (0nc 't')/'tMT'((io1 (@( result 0 0 '' ((( p(\~p' ]')/p ( ( (0=p)/0dFn( ( ( case insensitive code(Pt ed(d[1 1 ;],dav[(av'aA').+0,25]), 2 12 '0123456789'P (b+/^\pd @nt4 p[b]d[1;d[2;]bp] those 2 lines Com@@ Cm cpt 4 in names fmt. Main file ALWAYS there.c@@plcufiles(d)d(read t,4)names[numst;]@H ( on PC cpt 6 contains the binary code for unpackagingtH8plcd'rcf',,';',pnames bread t,5e8@8 orcfx>d'bppdef brct ucmd2 p'mpone@ ((rc'f')1 Z( (0=rcf)1 (x(ioglobals[io] (FD(((c( ctglobals[1+io] ((( pwglobals[2+io] (h( 0(hc(1:signal(1=1rc)/1((p@(signal(4=1rc)/15E((Pt e'UNEXPECTED ERROR WITHIN USER COMMAND PROCESSOR' signal 11ed *P00 3=j al`(Px@h`(0H((00(( [2]=!X0!((`es[#x0#((He=0)/$0$((@ct [%p0%((Hea m&x0&(([24]'P0'p(( its(x0((()X)x)((`))x)(())x*((ver *0*@((x:sl).0.((1X01((h2]=06x06((=t)/KP0Kx((iferrin<((@x@ (=b] ET0 AG2 (cp@ Xtv ( (