NeoDskYWp -zO  @`/#@%359A C@E`GIKMOQ S@U`WY[]_a c@e`gikmoq s@u`wy{} @` @ ` @ ` ` @ ` ǀ ɠ @ ` ׀ ٠  @` @`!Aa   !Aa!!#A%a')+-/1!3A5a79;=?A!CAEaGIKMOQ!SAUaWY[]_/cAgikoq!sAuawy{}!Aa!Aa!A!AaO  @`/#@%359A C@E`GIKMOQ S@U`WY[]_a c@e`gikmoq s@u`wy{} @` @ ` @ ` ` @ ` ǀ ɠ @ ` ׀ ٠  @` @`!Aa   !Aa!!#A%a')+-/1!3A5a79;=?A!CAEaGIKMOQ!SAUaWY[]_/cAgikoq!sAuawy{}!Aa!Aa!A!AaBM_SEARCH xCOMMAND 'x=CO_CLI MxlTREESHEL102XxSHELLINFDAT 4ZLEES DITt HA313 [. x.. BM MAN 0 BM TTP 0UBM C 0 BM H 0BM LNK ב0 EXECUTE C 0!EXTERN H 0&GETPATFIC 0'GLOBAL C 0)MAKEDESCC 0*MAKEFILE ő0+MAKESKIPC M-MATCHFOUC 0/MKDESCVEC 01MOVERESIC M2PORT_ST M4bPRINTLINC 06PUTUSAGEC 07README Ƒ08SEARCH C 0;j BM(1) NAME bm - search a file for a string SYNOPSIS bm [ option ] ... [ strings ] [ file ] DESCRIPTION Bm searches the input files (standard input default) for lines matching a string. Normally, each line found is copied to the standard output. It is blindingly fast. Bm strings are fixed sequences of characters: there are no wildcards, repetitions, or other features of regular expres- sions. Bm is also case sensitive. The following options are recognized. -x (Exact) only lines matched in their entirety are printed -l The names of files with matching lines are listed (once) separated by newlines. -c Only a count of the number of matches is printed -e string The string is the next argument after the -e flag. This allows strings beginning with '-'. -h No filenames are printed, even if multiple files are searched. -n Each line is preceded by the number of characters from the beginning of the file to the match. -s Silent mode. Nothing is printed (except error mes- sages). This is useful for checking the error status. -f path The string list is taken from the path. This may be either a file or a tty (use -f - on the Atari ST). Unless the -h option is specified the file name is shown if there is more than one input file. Care should be taken when using the characters $ * [ ^ | ( ) and \ in the strings (listed on the command line) as they are also meaningful to the Shell. It is safest to enclose the entire expression argument in single quotes ' '. Bm searches for lines that contain one of the (newline- separated) strings, using the Boyer-Moore algorithm. It is far superior in terms of speed to the grep (egrep, fgrep) family of pattern matchers for fixed-pattern searching, and its speed increases with pattern length. SEE ALSO grep(1) DIAGNOSTICS Exit status is 0 if any matches are found, 1 if none, 2 for syntax errors or inaccessible files. AUTHOR Peter Bain (pdbain@bnr-vpa), with modifications suggested by John Gilmore and Amir Plivatsky. Leo de Wit did this Atari ST port. BUGS Only 100 patterns are allowed. Patterns may not contain newlines. If a line (delimited by newlines, and the beginning and end of the file) is longer than 8000 charcters (e.g. in a core dump), it will not be completely printed. If multiple patterns are specified, the order of the ouput lines is not necessarily the same as the order of the input lines. A line will be printed once for each different string on that line. The algorithm cannot count lines. The -n and -c work differently from fgrep. The -v, -i, and -b are not available. `R&o#G8AB(HSB$H  g  g  f RSBj` g =g %gJ`Rpr A9nA0m/ПЁRSBk`Jg n <#Nr`zRpr A9nA0m/ПЁRSBkT`JgN n <#G<`8CG`CFrRSBk$  g  g  gQp`JBkQB"+ҫ Nr$9Gp#H`4 nHH/HyG@HyO>NO Np/N\XR nJfXS`JHpfTJHlfLJf(HyGZHyO>NPNp/N\X` n/HnRN P-@XS .-@Jf HnB/.HnRNO` .SJg nJHtg n#H/< n/N&FP-@Jj" n/HyGtHyO>NO R`FHn/./.HnRNO".-@JH|gJf BN\X/.N,XX`LJHhg/9HHyGNPJgp` ./N\XN^NuNVH *n.. ,.(nap-@-@-@-@ .԰l M"PB#LR` < B-@ L/.//a"O -@Rf HyGHyO>NPp/N\X .ѮJgJfB .Ю LS-@-H n g eS` nرd LS-HJfp-@B .԰l M"P/IJf&/ /)//./) /)NO o!@ . M"PJgBB/./ /./ N O-@JH|fJHtgJg pL0N^NuR`fJg( LS// // NO".Ӯ-@JfnJWDHHL0N^NuNVJNvfxp/pH/NDP#N 9NS"9N€-AJg#N`/9NpH/NDP |#Nvf HyGHyO>NPp/N\X#NvNzp#N#N~N^NuNVH p-@JNgL0N^Nu 9N~ yNv"yNzfbJoNlp#N .L0N^Nu/9N/9Nv/.N(O #N~Jfp#N .L0N^Nu#NvNz yNvN~ Nz.n ` ..Jf .L0N^Nu߮*yNz(n SJgRR`-L #Nz`"NV/.NFXJf HyGHyO>NPp/N\XHyG/.NF\PJf-|-|O`HyG/.NP-@Jf&/.HyGHyO>NO p/N\Xp/B/.N|O Rf&/.HyH HyO>NO p/N\X/.NXr///.-@N|O Jf HyH!HyO>NPp/N\X .R/NX-@Jf HyHNPp/N\X-n n -@Jo*/.//.NO Jg/.NFXѮ` n( fB(` nBAO .g /N"X` /.NFX/./. N PN^NuNVp/NX/<-@NX n Jf HyHHyO>NPp/N\X/.NFX/NX n!@Jf HyHHyO>NPp/N\X n"n#H/NFX n!@ //(//(N O .N^NuNV ./NX-@Jf HyHHyO>NPp/N\XB . n n .0R`B .".l6 nHH n S0 n .【S0R` .S-n-@Jk . n .찮l\ n"ngF . n .Sr2/Hc .S" o0 . n-P`SS`xB .".n6 n".Ҁp0/Hc .Ю쐮 o0R` . n-P .谮lT .".첀l6 n".蒮Ҁp0/Hc .萮Ю o0R` . n-P`/.NXN^NuNV nB hS-H-H ne gS`R nb gR` ncS nR"n#HJHg2 n g R` .S n"( gpN^NuJH|gpN^NuJHhg RHpN^Nu n (". Ҁ/././NhO pN^NuNVB n JgVp //NFP-@Jg@ dl6 @B . n/. /HN HX o nRR-H ` n Jg. dl$ ."n//IN HX o R .N^NuNVH -nB .谮 l0 n"P ne . n"P i-HR`-n n g eS` nd-n`R .R(n*n-@-@Jg RRS`B .谮 l n"P .R` .L0N^NuNVH<*n(n-n . nS"n&iS. . U"L:-H bjfP$nf K"n #HpLp M0@d.`p M>Ed.` . S K"n#HpLNPp/N\X/9HNFXJg$/9Hp /NDPHyHp /NDPpN^NuJHgbJHfZ/9HNFX Lo HyHHyO>NPp/N\X/9Hp /NDPHyIp /NDPJHxg(/.HyIHnN5O Hnp /NDP nhB(/. p /NDP nn gHyIp /NDPN^NuHyIHyO>NPHyIWHyO>NPHyIHyO>NPHyIHyO>NPHyIHyO>NPHyIHyO>NPHyJHyO>NPHyJ#HyO>NPHyJXHyO>NPHyJHyO>NPHyJHyO>NPNuNVBNp#N Nl nHHR"@MfgR` nJgZ 9NRN @N  nHHJgR"@MffR` nrR@JfpNqHyOHyJHyFNO 9G-@ >g"HyO&HyJHyGNO -@` HyO&HyJHyGNO -@HyO>HyJHyJNO -@Jf p/N-XJf/.HyJN"Pp/N\X/9MNN#xX//.N P n(@Jf/.HyKN"Pp/N\XHyN/9NNPBN\XN^NuNVB 9OS#OJkp yORO`HyONX-@ g, f nRB` nR .`JfpN^Nu nB .N^NuNVB . S".lL n (S!@Jk "PRp` /.NX-@Rg nR . fNq . nBJfpN^Nu .N^NuNV nHHR-@Jg:"9O.S#O.Jk yO&RO&HH`HyO&/.NP` 9O.S#O.Jk yO&RO&p HH`HyO&p /NPN^NuNVB nHHR-@Jg4 n "(S!AJk "PRHH`/. /.NP-@` .N^NuNV n(g/p/NP` f n ( n p!@!@(g@ n(HH/./. /N+O RfpN^Nu n(@pN^NuNV n(HHr/B/N+O -@Rg nJf .N^Nu n(g  ".Ҁ N^Nu . nN^NuNVH A-H n JgHHR-@-H %f %f gJfV n@`\.gp`p nHH`8.gp`p` nHH` nBp#MJpN^Nup n@ nJf n|B .N^NuB . lFr NEd @K&R//.NF\PJf .r NEd @K&"nPR`.g /.N0X.gp` . //.N-P n!@JG4g@ . JgB/.N/P n!@JG4gJp#MJ nBpN^Nu .  f$ n/(N0Xp#MJ nBpN^Nu .N^NuNV . ". ///.azO N^NuNVJjp#MJpN^Nu/.aX-@JfpN^Nu n(HH dN``` ``/./. n/(N0O -@JG4g JfpN^Nu ng .N^Nup-@-@ .lZ n R@HH g f$ .Sr///.aO .N^Nu n R`JfJfB .N^NupN^NuNVJjp#MJpN^Nu/.aX-@JfpN^Nu n(HH drN``` ``P ngp/B/.aLO ng0/./. /(N1O -@JG4gpN^Nu .N^NuB.p-@-@-@ .l n R@ f . g | S nP .R.-@A m/HyP n/(N1O -@갮gpN^NuJG4gpN^NuB`hJg:/.HyP n/(N1O -@갮gpN^NuJG4gpN^Nu .N^Nu .N^Nup#MJpN^NuNV/.aX-@JfpN^Nu n(JgpN^Nu/./. n/(N1dO -@JG4gp#MJpN^Nu f`JgZ nfN .S-@Jk4B/./.afO Jgp/Hn/.a\O JfS` .RN^Nu .N^NuNV/.aJX-@JfpN^NuB n/(N0XJG4gp-@ nB .N^NuNV/.N0XJG4gpN^NupN^NuNV/.aXN^NuNV/. /.NPN^NuNV .G,opN^Nu yG( .ѹG(G, N^NuNV/.aX-@JgN^Nu | N^NuNV 9G(G$ѹG,#G$G(#MZ#MR#M^#MV N^NuNVaL /./9L-@aP n-@Jfp-@ . dN```8`R``J f`A"n#H`4  fDA"n#H`  f(A,"n#H`A"n#H`  fA"n#H`A2"n#H`  f. .r/@B///r/r/NCO #G4JG4WDHHLN^NuNV .r/@///r/rA/NCO#G4JWDHH N^NuNVJfB/./. /.aON^Nu"n iB/./. / NON^NuNVJfp//./. /.adON^Nu"n ip//./. / NON^NuNVH Jf pLN^NuAL$n"jg pLN^Nup". /. n/(/. /p/pB/NCOLN^NuNVJgp@`p?r$.". v/A////./ n/(v//-@NCO-@Jj #G4pN^Nu .N^NuNVBp/NCP n pN^NuNVB .l& n HH/r/r/NCO R` .N^NuNVB .l& n HH/r/r/NCO R` .N^NuNVv . lS`p}@A r//r/r /NCOp /p/p/NCO .HHr-Ax-@| .|T".xl>6@w f| w .wf .xUDN^Nu .xU n wRx` .| }l n  .|RN^NuNVB .lP n @HH fp /p/p/NCO .HH/r/r/NCO R` .N^NuNVJg .`pN^NuNVB . n*r NEd @QrJf @Qr N^NuR`pN^NuNV nBN^NuJRbg/9RbaX`NuNV. am zn aAN^Nu. N^NuNV. HH/aX.HH/@aX/fp`pN^NuNVp-@p-@p-@-@ n JgR`B . nJg n@JgR =g ,f .S".f .N^Nu .R.HH n HH//-@a2PJfB. ,g =f p-@p-@ .,fRR`^Jg .S".f .N^NupN^NuNVA-H-n n JgHHR-@-H %fb %f"nR R`HnHnHn/. N6O-@JgB-@ .lA"nRR` . nR`l nB -@N^NuNVH p-@r-Ar -A n-@-@-@ -f pR-@ nHH/@R @Mfgh 0fp0-@ nHHR-@ nHHR"@Mfg$ .r NEdHHRЁ-@` n .fHRB nHHR"@Mfg$ .r NEdHHRЁ-@` n lf pR-@B nHHrHkfNf`ne``g`Pc`*s`o`Xx`u`8d`Jg"n QX-P` "n QX-PJj(p-@` Jg"n QX-P` "n QX-Pp -@ .r NE-AJjDS .0". .r NE-@Jf fS .-A .r -A-H`vJg"n QX-P` "n QX-Pp-@S . @L . .-@JfA .r-A-H`Jg"n QX-P` "n QX-Pp -@S .0". .-@JfA .r -A-H` f-|"n QX"P-Iгf-|L.B .lP nJgDR`Ap-@$n"RX @-H` p-@`B`p-@` pLN^NuJgJg .ܰl-n .BJgH .S-@Jk n R"nR` .S-@Jk\ n R .` .S-@Jk n R .` .S-@Jk n R"nR` n nR LN^Nu fp-@ mp` .-@R WDHHHnHnHn// n/N?,O nPA".-@-A-HJjD fJg mp`p-@JgSp-@JgRJg* .R".Ё-@Jk .ѮJg@R`: .\ѮJj .D` .-@ coR oRJf4 .ܰo* . .S-@Jk . n R R`Jg n -R JgJjp n 0R.R-H .S-@Jk .R-@Jj n 0R ` .S-@Jk n"n RR ` n 0R ` .SJk0 .S-@Jk n"n RR ` n 0R `Jg n .R .S-@Jk: .S-@Jk n"n RR ` n 0R ` .S-@Jk n"n RR ` n 0R n .R .S-@Jk0 .S-@Jk n"n RR ` n 0R ` n ER-H Jj-R D` n +R p -@S .r NE0 . .r NE-@ nJf . lR n R ` f4 .ܰo* . .S-@Jk . n R R` n nR LN^NuNPNQH0$h "NBBiBi/f$h&( S`RB3BHB3BBF4)g\jVBk Bia`Ha2Ri`tiaaSiJkSi`BBBF/gaJFf BfSi`0 RB Bkv$( Jg(<iSBk:x Bl281  9o"0 R1 1 SBjRiSCzgR$hG0 gSD6CkxQJCk0Q$hBJigS$hB2)H$L NYNXNuBfNu|H0$&҃тdRL Nu/t?<@ B m RSWfO$NuNPNQH~0pr3@3@3@3@at 0fi ` -f iaV 0m> 9n8i 3F <)i/gRi`a:<) ҆Bц` .f Jif`Ri` eg efNa +g -f ia 0m. 9n(:)iFi im?)_ f $hB`4)?)_gDBi/gT3|?Jk Si`Jig ktia\adSi`aRi`t4)?)_gNB$h$$$h$p0)L~NYNXNu,(g !|NuH$hN<L?3FS fiNu?)_g|Nu9$fprt`"HBHBB/t Q$Nu//gdB Jf BB /g$RB/fJjRd R`SBgBo Bl(J?BBHB_HB&Nu/<NCp`/<NC0<HBBH@B@Or`NV#RjN^NuNVH*OBG4pn@N?.*?.&?."?.?.?.?.?. NA.ML?N^NuCL2#Rf O0/@11g"HS@4TBB$0 g/`?S@j?(NA.yRfNuCL#Rf O0/@11g"HS@4TBB$0 g/`?S@j?(NM.yRfNuCL#Rf O0/@11g"HS@4TBB$0 g/`?S@j?(NN.yRfNu o /o "/ SfNuH<*g2jD(g(jDBv㒴eRQ"jDjD`BBL@@@D#include #include #include "bm.h" #include "Extern.h" int _mneed = 30000; main(argc,argv) int argc; char *argv[]; { /* grep based on Boyer-Moore algorithm */ char BigBuff[MAXBUFF+2]; /* * We leave one extra character at the beginning and end of the buffer, * but don't tell Execute about it. This is so when someone is * scanning the buffer and scans past the end (or beginning) * we are still technically in the buffer (picky, but there ARE * machines which would complain) */ int ret = 1, /* return code from Execute */ NotFound = 0, /* non-zero if file not readable */ NFiles, NPats; /* number of patterns to search for */ char *FlagPtr, **OptPtr; /* used to scan command line */ int TextFile /* file to search */; struct PattDesc *DescVec[MAXPATS]; --argc; OptPtr = argv + 1; while ( argc && **OptPtr == '-') { FlagPtr = *OptPtr + 1; do { switch (*FlagPtr) { case 'c': cFlag = 1; break; case 'e': eFlag = 1; /* get the patterns from next arg */ NPats = MkDescVec(DescVec,*++OptPtr); --argc; break; case 'f': fFlag = 1; /* read the patterns from a file */ NPats = GetPatFile(*++OptPtr,DescVec); --argc; break; case 'l': lFlag = 1; break; case 'n': nFlag = 1; break; case 's': sFlag = 1; break; case 'x': xFlag = 1; break; case 'h': hFlag = 1; break; default: fprintf(stderr, "bm: invalid option: -%c \n", *FlagPtr); PutUsage(); exit(2); } /* switch */ ++FlagPtr; } while (*FlagPtr); ++OptPtr; --argc; } /* while */ /* OptPtr now points to patterns */ if (!fFlag && !eFlag) { if (!argc) { fprintf(stderr,"bm: no pattern specified\n"); PutUsage(); exit(2); } else NPats = MkDescVec(DescVec,*OptPtr); ++OptPtr; --argc; } /* OptPtr now points to first file */ NFiles = argc; if (!NFiles) ret &= Execute(DescVec,NPats,0,BigBuff+1); else while (argc--) { if ((NFiles > 1) || lFlag) FileName = *OptPtr; if ((TextFile = open(*OptPtr,O_RDONLY|O_RAW)) < 0) { fprintf(stderr,"bm: can't open %s\n",*OptPtr); NotFound++; } else { ret &= Execute(DescVec,NPats,TextFile,BigBuff+1); if (sFlag && !ret) exit(0); close(TextFile); } /* if */ ++OptPtr; } /* while */ if (cFlag) printf("%d\n",MatchCount); exit(NotFound ? 2 : ret); } /* main */ #define FIRSTCHAR ' ' #define MAXCHAR 0377 #define MAXBUFF 8192 #define MAXSIZE 100 #define MAXPATS 100 /* max number of patterns */ #define PSIZEDEF 1024 /* space for patterns if they come from a tty */ #ifndef min #define min(x,y) ((x) < (y) ? (x) : (y)) #endif #ifndef max #define max(x,y) ((x) > (y) ? (x) : (y)) #endif struct PattDesc { unsigned short *Skip1, *Skip2; /* pointers to skip tables */ char *Pattern; int PatLen; /* pattern length */ char *Start; /* starting position of search (at beginning of pattern) */ int Success; /* true when pattern found */ }; #define index(a,b) strchr(a,b) #define cfree(a) free(a) extern char *strchr(); input \lib\startup.bin input bm.bin input Execute.bin input GetPatFi.bin input Global.bin input MakeDesc.bin input MakeSkip.bin input MatchFou.bin input MkDescVe.bin input MoveResi.bin input Search.bin input PrintLin.bin input PutUsage.bin library \lib\clib #include #include #include "bm.h" #include "Extern.h" static void loinit(); static int loread(); Execute(DescVec, NPats, TextFile, Buffer, inbufsiz) register struct PattDesc *DescVec[]; /* pointers to status vectors for the different * patterns, including skip tables, position in buffer, etc. */ register int NPats; /* number of patterns */ register char Buffer[]; /* holds text from file */ register int TextFile; /* file to search */ { int NRead, /* number of chars read from file */ NWanted, /* number of chars wanted */ NAvail, /* number of chars actually read */ BuffSize, /* number of chars in buffer */ BuffPos, /* offset of first char in Buffer in TextFile */ BuffEx, /* flag to indicate that buffer has been searched */ ResSize, /* number of characters in the last, incomplete line */ Found, /* flag indicates whether pattern found * completely and all matches printed */ Valid; /* was the match "valid", i.e. if -x used, * did the whole line match? */ char *BuffEnd; /* pointer to last char of last complete line */ /* misc working variables */ int i; /* initialize */ loinit(); ResSize = 0; Found = 0; BuffPos = 0; for (i=0; i < NPats; i++) { DescVec[i] -> Success = 0; DescVec[i] -> Start = Buffer; } /* for */ /* now do the searching */ do { /* first, read a bufferfull and set up the variables */ NWanted = MAXBUFF - ResSize; NRead = 0; do { NAvail = loread(TextFile,Buffer + ResSize + NRead, NWanted); if (NAvail == -1) { fprintf(stderr, "bm: error reading from input file\n"); exit(2); } /* if */ NRead += NAvail; NWanted -= NAvail; } while (NAvail && NWanted); BuffEx = 0; BuffSize = ResSize + NRead; BuffEnd = Buffer + BuffSize - 1; /* locate the end of the last complete line */ while (*BuffEnd != '\n' && BuffEnd >= Buffer) --BuffEnd; if (BuffEnd < Buffer) BuffEnd = Buffer + BuffSize - 1; while (!BuffEx) { /* work through one buffer full */ BuffEx = 1; /* set it provisionally, then clear * it if we find the buffer non-empty */ for (i=0; i< NPats; i++) { if (!DescVec[i]->Success) /* if the pattern has not been found */ DescVec[i]-> Success = Search(DescVec[i]->Pattern, DescVec[i]->PatLen, BuffEnd, DescVec[i]->Skip1, DescVec[i]->Skip2, DescVec[i]); if (DescVec[i]->Success){ /* if a match occurred */ BuffEx = 0; Valid = MatchFound(DescVec[i],BuffPos, Buffer, BuffEnd); Found |= Valid; if ((sFlag || lFlag) && Found) return(0); } /* if */ } /* for */ } /* while */ if(NRead) { ResSize = MoveResidue(DescVec,NPats,Buffer, Buffer+BuffSize-1); BuffPos += BuffSize - ResSize; } /* if */ } while (NRead); return(!Found); } /* Execute */ static char *lobuf, *lopos; static int lobread, loeof, lbsiz; static void loinit() { int newsiz; if (lobuf == (char *)0) { lbsiz = Malloc(-1); while (newsiz = lbsiz & (lbsiz-1)) { lbsiz = newsiz; } lobuf = (char *)Malloc(lbsiz); if (lobuf == (char *)-1) { fprintf(stderr,"bm: memory allocation failed\n"); exit(1); } } lopos = lobuf; lobread = 0; loeof = 0; } static int loread(fd,pos,len) int fd,len; char *pos; { int totalread = 0; register char *from, *to; register int toread; if (loeof) { return totalread; } for (;;) { if (lopos == lobuf + lobread) { if (lobread > 0 && lobread < lbsiz) { loeof = 1; return totalread; } lobread = read(fd,lobuf,lbsiz); if (lobread == 0) { loeof = 1; return totalread; } lopos = lobuf; } toread = (lobuf+lobread)-lopos; toread = min(toread,len); if (toread == 0) { return totalread; } len -= toread; totalread += toread; for (from = lopos, to = pos; toread-- != 0; ) { *to++ = *from++; } pos = to; lopos = from; } } /* global flags for bm */ extern int cFlag, /* true if we want only a count of matching lines */ eFlag, /* indicates that next argument is the pattern */ fFlag, /* true if the patterns arew to come from a file */ lFlag, /* true if we want a list of files containing the pattern */ nFlag, /* true if we want the character offset of the pattern */ sFlag, /* true if we want silent mode */ xFlag, /* true if we want only lines which match entirely */ hFlag, /* true if we want no filenames in output */ MatchCount; /* count of number of times a search string was found * in the text */ extern char *FileName; #include #include "bm.h" int GetPatFile(PatFile, DescVec) char *PatFile; struct PattDesc *DescVec[]; /* read patterns from a file and set up a pattern descriptor vector */ { extern char *malloc(); FILE *PFile; int PatSize; /* the number of chars in all the patterns */ char *PatBuff; /* hold the patterns */ char *s; int readlen; if (!(strlen(PatFile))) { fprintf(stderr,"bm: no pattern file given\n"); exit(2); } /* if */ if (!strcmp(PatFile,"-")) { PatSize = PSIZEDEF; PFile = stdin; } else { if (!(PFile = fopen(PatFile,"r"))) { fprintf(stderr, "bm: can't open pattern file %s\n",PatFile); exit(2); } if (fseek(PFile,0L,2) == -1) { fprintf(stderr,"bm: can't fseek %s\n",PatFile); exit(2); } /* if */ PatSize = ftell(PFile); rewind(PFile); if (!PatSize) { fprintf(stderr,"bm: pattern file is empty\n"); exit(2); } /* if */ } /* if */ if (!(PatBuff = malloc(PatSize+1))) { fprintf(stderr,"bm: insufficient memory to store patterns\n"); exit(2); } /* if */ for (s = PatBuff; (readlen = (PatBuff + PatSize) - s) > 0 && fgets(s,readlen,PFile) != (char *)0; s += strlen(s)) { } /* make sure the patterns are null-terminated. We can't have * nulls in the patterns */ if (s[-1] == '\n') s[-1] = '\0'; else s[0] = '\0'; if (PFile != stdin) { fclose(PFile); } else { clearerr(PFile); } return(MkDescVec(DescVec,PatBuff)); } /* GetPatFile */ /* global flags for bm */ int cFlag=0, /* true if we want only a count of matching lines */ eFlag=0, /* indicates that next argument is the pattern */ fFlag=0, /* true if the patterns are to come from a file */ lFlag=0, /* true if we want a list of files containing the pattern */ nFlag=0, /* true if we want the character offset of the pattern */ sFlag=0, /* true if we want silent mode */ xFlag=0, /* true if we want only lines which match entirely */ hFlag=0, /* true if we want no filenames in output */ MatchCount=0; /* count of number of times a search string was found * in the text */ char *FileName = 0; #include #include "bm.h" #include "Extern.h" extern char * malloc(); /* makes a pattern descriptor */ struct PattDesc *MakeDesc(Pattern) char *Pattern; { struct PattDesc *Desc; Desc = (struct PattDesc *) malloc(sizeof(struct PattDesc)); if (!(Desc->Skip1 = (unsigned short int *) malloc( sizeof(int) * (MAXCHAR + 1)))){ fprintf(stderr,"bm: can't allocate space\n"); exit(2); } /* if */ if (!(Desc->Skip2 = (unsigned short int *) malloc(sizeof(int) * strlen(Pattern)))){ fprintf(stderr,"bm: can't allocate space\n"); exit(2); } /* if */ Desc->Pattern=Pattern; Desc->PatLen = strlen(Desc->Pattern); MakeSkip(Desc->Pattern,Desc->Skip1, Desc->Skip2,Desc->PatLen); return(Desc); } /* main */ # @(#)Makefile 1.2 DEF = CFLAGS = $(DEF) -O STRIP = -s LDFLAGS = $(STRIP) O = bin SOURCES = bm.h bm.c Execute.c Extern.h\ GetPatFi.c Global.c MakeDesc.c MakeSkip.c \ MatchFou.c \ MkDescVe.c MoveResi.c PrintLin.c PutUsage.c Search.c OBJECTS = bm.$(O) Execute.$(O) \ GetPatFi.$(O) Global.$(O) MakeDesc.$(O) MakeSkip.$(O) \ MatchFou.$(O) \ MkDescVe.$(O) MoveResi.$(O) Search.$(O) PrintLin.$(O) PutUsage.$(O) BASEFILES = $(SOURCES) Makefile README bm.1 ALL = bm all:: $(ALL) cp cmp:: $(ALL) for i in $(ALL); do $@ $$i $$ROOT/usr/local/$$i; done clean:: ; rm -f a.out core *.s *.$(O) errs $(ALL) get:: ; getall unget:: ; ungetall bm: $(OBJECTS) link.ttp -with bm -prog bm # $(CC) -s -o bm $(CCFLAGS) $(OBJECTS) bm.$(O): bm.c bm.h Extern.h cc -c $(CCFLAGS) bm.c PutUsage.$(O): PutUsage.c bm.h cc -c $(CCFLAGS) PutUsage.c MakeSkip.$(O): MakeSkip.c bm.h cc -c $(CCFLAGS) MakeSkip.c Search.$(O): Search.c bm.h Extern.h cc -c $(CCFLAGS) Search.c Execute.$(O): Execute.c bm.h cc -c $(CCFLAGS) Execute.c MoveResidue.$(O): MoveResidue.c bm.h Extern.h cc -c $(CCFLAGS) MoveResidue.c MatchFound.$(O): MatchFound.c bm.h Extern.h cc -c $(CCFLAGS) MatchFound.c PrintLine.$(O): PrintLine.c Extern.h cc -c $(CCFLAGS) PrintLine.c MkDescVec.$(O): MkDescVec.c bm.h cc -c $(CCFLAGS) MkDescVec.c GetPatFile.$(O): GetPatFile.c bm.h cc -c $(CCFLAGS) GetPatFile.c MakeDesc.$(O): MakeDesc.c bm.h cc -c $(CCFLAGS) MakeDesc.c Global.$(O): Global.c cc -c $(CCFLAGS) Global.c #include #include "bm.h" extern char *malloc(); MakeSkip(Pattern,Skip1,Skip2,PatLen) char Pattern[]; unsigned short int Skip1[], Skip2[]; int PatLen; /* generate the skip tables for Boyer-Moore string search algorithm. * Skip1 is the skip depending on the character which failed to match * the pattern, and Skip2 is the skip depending on how far we got into * the pattern. Pattern is the search pattern and PatLen is strlen(Pattern) */ { int *BackTrack; /* backtracking table for t when building skip2 */ int c; /* general purpose constant */ int j,k,t,tp; /* indices into Skip's and BackTrack */ if (!(BackTrack = (int *) malloc(PatLen * (sizeof (int))))){ fprintf(stderr,"bm: can't allocate space\n"); exit(2); } /* if */ for (c=0; c<=MAXCHAR; ++c) Skip1[c] = PatLen; for (k=0;k= 0; --j,--t) { BackTrack[j] = t; while (t #include "bm.h" #include "Extern.h" MatchFound(Desc, BuffPos, Buffer, BuffEnd) struct PattDesc *Desc; /* state info about search for one string */ int BuffPos; /* offset of first char of buffer into the file being searched */ char *Buffer, /* pointer to the first character in the buffer */ *BuffEnd; /* pointer to the last character in the buffer */ { char *MLineBegin, *MLineEnd; Desc->Success = 0; /* Start points to first character after a successful match */ MLineBegin = MLineEnd = Desc->Start - 1; while(MLineBegin >=Buffer && *MLineBegin != '\n') --MLineBegin; ++MLineBegin; while( MLineEnd <= BuffEnd && *MLineEnd != '\n') ++MLineEnd; if (MLineEnd > BuffEnd) --MLineEnd; /* fixed 25jun85 pdbain. suppress multiple matches of the same * pattern on one line */ Desc->Start = MLineEnd + 1; /* check if exact match; TOS has \r in text line, hence -1 */ if (xFlag && !( Desc->PatLen == (*MLineEnd != '\n' ? ((MLineEnd - MLineBegin) + 1) : (MLineEnd - MLineBegin)-1))) return(0); /* failure */ if (sFlag) return(1); if (cFlag) { ++MatchCount; return(1); } /* if */ PrintLine(BuffPos+(Desc->Start-Buffer),MLineBegin,MLineEnd); return(1); } /* MatchFound */ #include "bm.h" /* scan a newline-separated string of patterns and set up the * vector of descriptors, one pattern descriptor per pattern. * Return the number of patterns */ int MkDescVec(DescVec, Pats) struct PattDesc *DescVec[]; char *Pats; { int NPats = 0; char *EndPat; extern struct PattDesc *MakeDesc(); /* some systems use "strchr" instead of "index" */ while (*Pats && (EndPat = index(Pats,'\n')) && NPats < MAXPATS) { *EndPat = '\0'; DescVec[NPats] = MakeDesc(Pats); Pats = EndPat + 1; ++NPats; } /* while */ if (*Pats && NPats < MAXPATS) { DescVec[NPats] = MakeDesc(Pats); ++NPats; } /* if */ return(NPats); } /* MkDescVec */ #include "bm.h" /* Moves the text which has not been completely searched at the end of * the buffer to the beginning of the buffer * and returns number of bytes moved */ int MoveResidue(DescVec, NPats,Buffer, BuffEnd) struct PattDesc *DescVec[]; int NPats; char *Buffer, *BuffEnd; { char *FirstStart, *Residue; /* use this declaration if you don't use "bcopy" */ register char *f, *t; int ResSize, i; FirstStart = BuffEnd; /* find the earliest point which has not been * completely searched */ for (i=0; i < NPats; i++) { FirstStart = min(FirstStart, DescVec[i]-> Start ); } /* for */ /* now scan to the beginning of the line containing the * unsearched text */ for (Residue = FirstStart; *Residue != '\n' && Residue >= Buffer; Residue--); if (Residue < Buffer) Residue = FirstStart; else ++Residue; ResSize = (BuffEnd - Residue + 1); /* now move the residue to the beginning of * the file */ /* use this if you don't have "bcopy" */ t = Buffer; f = Residue; for(i=ResSize;i;--i) *t++ = *f++; /* use this if you do have "bcopy" bcopy(Residue, Buffer, ResSize); */ /* now fix the status vectors */ for (i=0; i < NPats; i++) { DescVec[i]->Start -= (Residue - Buffer ); } /* for */ return(ResSize); } /* MoveResidue */ Modifications to the original bm for the ST port (those I can remember). 1) added _mneed to allow for additional big Malloc. Setting _mneed instructs the Lattice startup code to do an Mshrink to that size; this allows an additional big Malloc later on. 2) added O_RAW flag to open mode (performance improvement). The Lattice read() and write() functions do implicit text translations if O_RAW is not specified (CR/LF to LF on input, and LF to CR/LF on output). Setting O_RAW allows for better I/O performance. 3) Two functions loinit() and loread() were created so that large blocks can be read. 4) modifications to GetPatFile() to read stdin (read() from stdin in Lattice C returns after first newline read). 5) modification to MatchFound() for exact match case. Since the text line still contains a '\r' in raw mode, in case of an exact match a check must be done for that character. 6) "#define index(a,b) strchr(a,b)" and "#define cfree(a) free(a)" were added. 7) modifications to PrintLine to explicitly use Cconws() instead of printf() (allowing for redirection). 8) modifications in makefile to support ST file names, and circumvent TOS argument string limitations Leo. #include #include #include "Extern.h" PrintLine(OffSet,LineStart,LineEnd) int OffSet; /* offset of LineStart from beginning of file */ char *LineStart, *LineEnd; { char OffStr[80]; char save; if (lFlag) { if (strlen(FileName) > 76) { fprintf(stderr,"bm: filename too long\n"); exit(2); } /* if */ if (strlen(FileName)) { Cconws(FileName); Cconws("\r\n"); } /* if */ return 0; /* value ignored */ } /* if */ if (FileName && !hFlag) { if (strlen(FileName) > 76) { fprintf(stderr,"bm: filename too long\n"); exit(2); } /* if */ Cconws(FileName); Cconws(":"); } /* if */ if (nFlag) { sprintf(OffStr,"%d: ",OffSet); Cconws(OffStr); } /* if */ save = LineEnd[1]; LineEnd[1] = '\0'; Cconws(LineStart); LineEnd[1] = save; if (*LineEnd != '\n') Cconws("\r\n"); } /* PrintLine */ #include PutUsage() { fprintf(stderr, "bm: search for a given string or strings in a file or files\n"); fprintf(stderr, "synopsis: bm [option]* [string(s)] [file]*\n"); fprintf(stderr, "options:\n"); fprintf(stderr, "-c print only a count of matching lines \n"); fprintf(stderr, "-e Take next argument as the pattern\n"); fprintf(stderr, "-f PFile read patterns from a file PFile\n"); fprintf(stderr, "-h Do not print file names\n"); fprintf(stderr, "-l print a list of files containing the pattern(s) \n"); fprintf(stderr, "-n print the character offset of the pattern(s) \n"); fprintf(stderr, "-s silent mode. Return only success (0) or failure (1)\n"); fprintf(stderr, "-x print only lines which match entirely \n"); } /*PutUsage */ Bm is a fast pattern matching utility, intended to be almost identical in functionality to fgrep (ugh!) but much faster. It uses the Boyer-Moore algorithm, as described in the papers listed below: D.E. Knuth, J.H. Morris, V.R. Pratt,"Fast Pattern Matching in Strings", SIAM J. Comput., 6(2), June 1977, 323-350, Z. Galil, "On Improving the Worst Case Running Time of the Boyer-Moore String Matching Algorithm", CACM, 22(9), Sept. 1979, ACM, R.S. Boyer, J.S. Moore,"A Fast String Searching Algorithm", CACM, 20(10), Oct. 1977, 762-772, G. de V. Smit,"A Comparison of Three String Matching Algorithms", Software - Practice and Experience, vol. 12, 1982, 57-66, *** NOTE *** There are certain system dependencies in the code. Please check whether your system uses "index" or "strchr" to find a character in a string: this affects MkDescVec.c. Also check whether your system uses or . This affects match.c/bm.c, MkDescVec.c, and PrintLine.c. Also check whether your system has "bcopy". If so, see MoveResidue.c The files are MkDescVec.c, PrintLine.c, bm.c, and Execute.c: search a file for the patterns Extern.h: declarations of externs GetPatFile.c: read in patterns from a file and set up a vector of pattern descriptors Global.c: global variables (complement to Extern.h) MakeDesc.c: create a pattern descriptor for one pattern, including skip tables, etc. MakeSkip.c: make the skip tables for one pattern Makefile: you can figure this one out for yourself MatchFound.c: what to do when you actually FIND a pattern - print it, update flags, etc. MkDescVec.c: make a vector of pattern descriptors, given a string of newline-separated patterns MoveResidue.c: when you come to the end of the buffer, move the unsearched "residue" to the beginning and start again PrintLine.c: print the appropriate stuff after finding a match PutUsage.c: mini-man page. README: this file Search.c: the guts. Implements B-M algorithm given a pattern, skip tables for the pattern, and a buffer to search bm.c: mainline. mostly interpreting the command line and tidying up at the end. Calls Execute for each file. bm.h: constants bm.p: man page #include "bm.h" #include "Extern.h" int Search(Pattern,PatLen,EndBuff, Skip1, Skip2, Desc) char Pattern[]; int PatLen; char *EndBuff; register unsigned short int Skip1[], Skip2[]; struct PattDesc *Desc; { register char *k, /* indexes text */ *j; /* indexes Pattern */ register unsigned short Skip; /* skip distance */ char *PatEnd, *BuffEnd; /* pointers to last char in Pattern and Buffer */ register char c; register unsigned short DefSkip; BuffEnd = EndBuff; PatEnd = Pattern + PatLen - 1; k = Desc->Start; Skip = PatLen-1; c = *PatEnd; DefSkip = Skip2[PatLen-1]; while ((k += Skip) <= BuffEnd) { if (*k == c) { j = PatEnd; do { if (j == Pattern) { /* found it. Start next search * just after the pattern */ Desc -> Start = k + Desc->PatLen; return(1); } /* if */ } while (*--j == *--k); Skip = Skip2[j-Pattern]; if (Skip < Skip1[*(unsigned char *)k]) { Skip = Skip1[*(unsigned char *)k]; } } else { Skip = Skip1[*(unsigned char *)k]; if (Skip < DefSkip) { Skip = DefSkip; } } } /* while */ Desc->Start = k-(PatLen-1); return(0); } /* Search */ . 'x=.. AS >nCC ?UCOMMAND DOC @kCOMMAND HLP NV kCOMMAND PRG QV COMMAND TXT GETARG PRG aJREADME TXT etTEST flnotext cls size0 $0.s fehler echo 1. ASSEMBLIERUNG as68.ttp -l -u $0.s size0 $0.o fehler echo 2. LINKER echo $0.s -> $0.$1 link68.ttp [u] $0.68k = $0.o size0 $0.68k fehler echo 3. RELATIVLADER relmod.ttp $0.68k $0.$1 rm $0.68k *.o echo stop lbl fehler echo !!! Abbruch wegen Fehler !!! echo ; ; Batchfile zur Erzeugung lauffhiger Progamme ; mit dem MEGAMAX-C-Compiler ; notext ; kein unntiges Geschwtz cls ; oben anfangen echo echo Compilierung luft echo mmcc.ttp $0.c ; C-Source compilieren ?status# 0 fehler ; im Fehlerfall echo echo File wird gelinkt echo mmlink.ttp $0.o -O $0.$1 ; linken des O-Files ?status# 0 fehler rm $0.o ; entfernen des Objektfiles echo echo echo Abarbeitung erfolgreich echo echo stop ; und Ende des Arbeit lbl fehler wait ; warten zur Fehlerbeschau lbl edit ed $0.c ; irgendein Editor restart ; wieder von vorn 06101020705800 1Seite # 2 F0000000 9[........................................................]011 Inhalt  1 Einleitung zu command.prg ........................................ 3 2 Allgemeine Hinweise zur Befehlseingabe ........................... 4 3 Allgemeine Befehle ............................................... 7 3.1 Besondere Befehle ............................................ 27 3.2 Zahlkonvertierungen .......................................... 28 4 Die ALIAS-Einrichtung ............................................ 29 4.1 Einfhrung ................................................... 29 4.2 ALIAS-Befehlssatz ............................................ 29 5 Die History-Einrichtung .......................................... 31 5.1 Einfhrung ................................................... 31 5.2 Die !-Befehle ................................................ 33 6 Das Batch-Processing ............................................. 34 6.1 Einfhrung ................................................... 34 6.2 Befehlssatz .................................................. 34 6.3 Beispiele .................................................... 41 6.3.1 Bsp.1 .................................................... 41 6.3.2 Bsp.2 .................................................... 42 6.3.3 Bsp.3 .................................................... 43 7 Variablen ........................................................ 44 7.1 Allgemeines zu den Variablen ................................. 46 7.2 Beispiel ..................................................... 47 7.2.1 Der File cc .............................................. 48 8 EDI .............................................................. 49 8.1 Die Kommandos von EDI ........................................ 49 9 Fehlermeldungen .................................................. 51 10 Die Ausgabeumleitung ............................................ 54 11 Allgemeines Blabla zum Schlu ................................... 55 11.1 Lieferumfang ................................................ 55 11.2 Zur Programmierung .......................................... 55 12 ANHANG A (Befehlszusammenfassung) ............................... 58 13 ANHANG B (oldy-Beispiele) ....................................... 61 13.1 Beispiel 1 fr die Verwendung des oldy-Befehls .............. 61  13.2 oldy, die Zweite ............................................ 62 14 Index ........................................................... 63  1 Einleitungzucommand.prg 9[........................................................]011  command.prgisteinKommandointerpreter,deraufherkmmlicheArt(la MS-DOSo..),alsoohneGEModerhnlicheBedienoberflchen,dieArbeit mitdemATARIuntersttzensoll.ErumfatdiedafrblichenBefehle wiez.B.frdasFilekopieren,dasFilelschenoderdieFileumbenen nung. EinigeBefehlewurdenbeiUNIXabgeschaut.EinTeilderHistoryeinrich tungfindetinhnlicherFormunterVMSVerwendung.DieBefehlemssen viaTastatureingegebenwerden.EswirdzurBenutzungalsokein GebrauchvonderMausgemacht! berdiebereitserwhnteHistoryeinrichtungistesmglich,alte Befehlerelativeinfacherneutaufzurufen,ohneeinekompletteNeuein gabederZeilevornehmenzumssen. ImFolgendenfindetsicheineZusammenstellungderBefehlemitBe schreibung,sowieeineErklrungzudenzustzlichenFeatureswiez.B. dasBatchprocessing. Esverstehtsichwohlvonselbst,daichfrdaskorrekteFunktionie rendesProgrammskeineGarantiebernehme.Datenverluste,diedurch auftretendeProgrammfehlerodereinefehlerhafteBedienungverursacht wordensind,hatjederselbstzuverdauen! GefundeneFehleroderProblemebitteichanmichweiterzuleiten(meine Adressestehtim'AllgemeinenBlabla'-Abschnitt).  2 AllgemeineHinweisezurBefehlseingabe  DieEingabeeinesBefehlskannmitHilfederCursortasten,derDELETE- Taste,derESC-TasteundderBACKSPACE-Tastekorrigiertwerden! CONTROL-'<-'bzw.CONTROL-'->'bringendenCursorandenZeilenanfang/ dasZeilenende. SHIFT-'->'bzw.SHIFT-'<-'bringendenCursoreinWortnachrechts/ links. CONTROL-XvertauschtdasaktuellemitdemfolgendenZeichen. CONTROL-DlschtalleZeichenvomPromptbiszurCursorposition. INSERTexpandierteinenEingabestring,wenneseinenFileimaktuellen Ordnergibt,dermitdiesemStringbeginnt. ManbefindetsichbrigensdieganzeZeitineinemEinfgemodus,d.h. beimKorrigiereneinerZeilewerdenkeineZeichenberschrieben. berflssigeZeichenmssenalsoexplizitgelschtwerden! DieESC-TastelschtdiekompletteZeile.DieanderenTastenhabenihre blicheFunktion. VieleBefehleerwartenmehrereArgumentangabenoderlassenmehrere Argumentezu.DiesemssenjeweilsdurcheinenBlankabgegrenztsein, z.B.wrde"dir*.prg*.tos"zuerstallePRG-FilesunddannalleTOS- DateiendesaktuellenVerzeichnissesaufzeigen. DemBenutzerltererVersionendesInterpretersflltvielleichtauf, dadieAnmerkungnurBefehlseingabeninKleinbuchstabenvorzunehmen, nichtmehrvorhandenist.DieseRestriktionhabeichentfernt.Es knnenjetztEingabeninGro-undKleinschreibungerfolgen. Manmuallerdingbeachten,dabeieinerEingabederersteStringin Kleinbuchstabenumgewandeltwird,dieArgumentangabenbleibenunvern dert. ACHTUNG! Ichbininzwischendazubergegangen,BefehleausdemInterpreterzu entfernen.EshandeltsichdabeiausnahmslosumKommandos,diedurch andereeinfachnachgebildetwerdenknnen(z.B.hide).DerGrundliegt einmalinderErsparnisvonSpeicher.DasProgrammbelegtinder jetzigenFormmitVariablenundPufferbereichenfast100kBRAM.Essind bereitsLeutegekommen,diewegendiesesUmfangsSpeicherprobleme bekommenhaben.ZweitenshatdieVielfaltderKommandosnichtbesonders zurbersichtlichkeitbeigetragen.Eswurdenaberwirklichnurdoppelt gemoppelteKommandosentfernt.DieBeschreibungenthltandenrelevan tenStellenHinweise,wiemandieseBefehlenachbildenkann! BeiderfolgendenBefehlsbeschreibungsind'[]'-Argumentangabenals optionalzuverstehenund'<>'alszwingend.SindArgumentez.B.durch '(s)'alsPluralgekennzeichnet,bedeutetdies,damehrereArgumente angegebenwerdenknnen(nichtmssen). EsgibteineganzeReihevonFehlermeldungen,dieesdemBenutzer erleichternsollen,einenFehlerbzw.einaufgetretenesProblemzu erkennen.DurchdieVerbindungeinerFehlermeldungmiteinerFehlernum mer,istderBenutzervonBatchdateieninderLage,aufbestimmte Situationenindividuellzureagieren. EineweitereFhigkeitdesInterpreterssollauchschonandieser StelleErwhnungfinden.MankannvonihmausexterneProgramme aufrufen.KanneineingegebenesKommandonichtalsinternerBefehl erkanntwerden,wirdversucht,obeseinProgrammgibt,dadiesem Befehlsnamenentspricht.IstdiesderFall,wirdesaufgerufen(das beziehtsichaufTOS,TTPundPRG-Dateien).Programme,diesichim aktuellenVerzeichnisbefindenunddieaufgerufenwerdensollen,mssen nichtmitihremvollenNamenbezeichnetwerden!Eswirddaserste Programmgestartet,damitdemeingegebenenTeilstringbereinstimmt undeinederobigenExtensionshat. DieEinschrnkungmitdemaktuellenVerzeichnisbestehtabdieser Versionnichtmehr,d.h.auchProgrammeausanderenOrdnernund LaufwerkenknnenviaTeilstringaufgerufenwerden!Frdienotwendige EindeutigkeitmuderBenutzerallerdingsselbersorgen. Sollz.B.einProgramm'programm.tos'aufgerufenwerden,gengtes 'programm'odersogarnochwenigerZeicheneinzugeben,umeszu starten. Esverstehtsichwohlvonselbst,daeingegebeneArgumenteandiese Programmeweitergegebenwerden. DerBenutzerkannmithilfedespath-BefehlsbestimmteSuchpfadeange ben,diederInterpreteraufderSuchenacheinembestimmtenProgramm abklappert. IndenVorgngerversionendesInterpreterswurdenachdemLaufeines '.PRG'-ProgrammsderBildschirmgelscht.DiesesVerhaltenfanden allerdingseinigeLeutenichtsobesonderstoll.AusdiesemGrundwird nunkeineLschungmehrvorgenommen.DerCursorbefindetsichnachdem ProgrammlaufinderletztenZeile(dieallerdingsgelschtwird).Obes nununterUmstndenzukleinerenUnschnheitenmitdemMauszeiger kommt,bleibtabzuwarten. DieBefehleinderfolgendenBeschreibungsinddurcheinvorangestell tes'->'undeineeinfacheUnterstreichungkenntlichgemacht. DaeszahlreicheKommandosgibt,dienurdurcheineAbkrzungreprsen tiertsind(z.B.cpfrcopy),werdendortdievollstndigeAusschrei bungderKommandosangegeben.Diesscheintmirfreineinfacheres EinprgenderBefehlefrderlichzusein. DurchhufigenGebrauchvonBeispielenhabeichversucht,dieBefehle undihreFunktiontransparenterzumachen.EinigedieserBeispiele enthaltenHinweise,diezueinerbequemerenHandhabungdesInterpreters fhrensollen.Esistdahernichtganzsinnlos,sichmitdiesem zustzlichenGeschwafelauseinanderzusetzen. 3 AllgemeineBefehle  ->?ok DiesenBefehlunddenzugehrigenFilechecksum.datgibtesnichtmehr. EskonntepraktischjederdieZahlinderangesprochenenDateindern undsoeineWarnungprovozieren,alsohatdasKommandoseinenSinn leiderverfehlt.IchmchteandieserStellenochaufdieinzwischen dochrechtzahlreichvorhandenenPD-Programmehinweisen,dieein ErkennenvonVirenzulassen.DieVerwendungeinessolchenProgrammssei jedemnurwrmstensempfohlen! ->bell DieserBefehlltdenATARIeinmal'klingeln'.Mankannmitdiesem Kommandoz.B.dasEndeeinerBatchfilebearbeitungakustischhervorhe ben. ->cat (kompletterName:concatenate) GibtdenInhalteinesASCII-Text-FilesaufdenBildschirmaus.Die Ausgabekannjederzeitmit^Zabgebrochenwerden.DerBefehlerlaubt es,mehrereDateienanzugeben. BeimVersuchz.B.eineProgrammdateiauszugeben,brichtnatrlichdas Chaosaus! DurchF1(damitistdieFunktionstastegemeint)kanndieAusgabe angehaltenwerden,durcherneutenDruckaufF1wirdsiewieder fortgesetzt. MankanndiesesKommandobrigensauchaufandereVerzeichnisseund Laufwerkeanwenden! BEISPIEL: cat*.c Hierwerdenalle'C'-Dateienausgegeben. catcommand.txttest.txt*.dat EswirderstderFile'command.txt'ausgegeben,danndieDatei 'test.txt'undzumSchlualle'dat'-Files. cat/test/*.dat Ausgabealler'dat'-Files,diesichimOrdner'test'befinden. ->cd (kompletterName:changedirectory) DiesesKommandowirdzumWechselnvonVerzeichnissenbenutzt. SollzueinemOrdnergewechseltwerden,dersichimaktuellenDirectory befindet,gengtes,dieerstenBuchstaben(bisEindeutigkeitherge stelltist),einzugeben. EswirdimmerdasersteVerzeichnisangesprungen,damitdiesem Teilstringbereinstimmt. Esistabundzuschonvorgekommen,dabeimWechselnvonLaufwerken, zwarsogetanwird,alshtteeinsolcherstattgefunden,mansichaber inWirklichkeitimmernochandergleichenStellebefindet.Hier scheinteseinProblemimTOSzugeben(GEMDOS-RoutineDsetdrv).Dieses VerhaltenhabeichallerdingsbishernurbeiFloppylaufwerkenbeobach tenknnen.RamdisksoderverschiedenePartitionseinerHarddisk bereitenkeineProbleme.IchmchtemitdiesemHinweisallerdingsnicht sagen,dajetztdauerndmitdieserNichtwechseleizurechnenist,also keinePanik! BEISPIEL: cdsubdir WechseltvomaktuellenVerzeichnisindasUnterverzeichnis'subdir'. cda:bingo WechseltdasLaufwerk,vomaktuellenLaufwerkaufLaufwerkA,undgeht dortindenOrdner'bingo'. cd.. VomaktuellenUnterverzeichniswirdindasVerzeichnisgegangen,da sicheineEbeneberdemUnterverzeichnisbefindet.Verhltsichalso analogzueinemAnklickenderoberenlinkenFenstereckeunterGEM. cd/(odercd\) WechseltindasWurzelverzeichnisdesaktuellenLaufwerks. cdd: WechseltnurdasLaufwerk.DieEingabevon'd:'bewirktbrigensdas gleiche(s.u.).  ->chmod... (kompletterName:changemode) DieserBefehlkannzurnderungvonFileattributenbenutztwerden.Bei denFileangabenkannmit'*'gearbeitetwerden.'mode'reprsentiert eineIntegerzahl,diedasneueAttributdarstellt. MansolltebeiVerwendungdiesesBefehlsetwasVorsichtwaltenlassen. Ichhabez.B.malauseinemnormalenauto.com-FileeinVolumelabel gemacht.LeiderhatdieRckfhrungineinenormaleDateinichtmehr funktioniert.DasBetriebssystemisthierleiderziemlichrestriktiv ausgelegt! Esistmirbisjetztauchnochnichtgelungen,Verzeichnissenz.B.das readonly-Attributzuvergeben(wasjaalsSchutzfunktionrecht ntzlichwre).IrgendwiehatmanaufsolcheEintrgekeinenZugriff viaFattrib(). AndieserStelleisteineZusammenstellungderBitsundihrerBedeutung wohlganzhilfreich: Bit0:Dateiistschreibgeschtzt Bit1:Dateiistversteckt(wenigstenseinbichen) Bit2:eshandeltsichumeineSystemdatei(habebisjetztnoch keinegefunden) Bit3:Volumelabel(kannmanz.B.beimFormatierenangeben) Bit4:Verzeichnis Bit5:istdasArchivbit(Kennungwc) UmdieentsprechendeEigenschaftzubesitzenmudasjeweiligeBit gesetztsein! BEISPIEL: chmod*.prg1 AllenPRG-DateienimaktuellenOrdnerwirddasnurlesen-Attribut verliehen. chmod*.prg1*.txt0 PRG-Fileswerdenmitdemnurlesen-Attribut,TXT-Dateienerhaltendas normaleSchreiben/Lesen-Attribut. ->cls (kompletterName:clearscreen) EswirdmitdiesemBefehlnurderBildschirmgelscht. ->cmp (kompetterName:compare) VergleichtdenInhaltzweierFilesmiteinander.Istdiesergleich,wird nichtszurckgemeldet,ansonsteneinfilesdiffer. EsistbeidiesemBefehlmglich,sichaufandereLaufwerkeundandere Ordnerzubeziehen. Wemesabundzuschonpassiertist,daeinscheinbarkorrekt abgelaufenerKopiervorgangdochnichtsorechtfunktionierte,wird diesenBefehlzuschtzenwissen. BEISPIEL: cmpc:command.txta:command.txt VergleichderbeidenDateien,diesichaufunterschiedlichenLaufwerken befinden. cmpcommand.txtcommand.txt DieserBefehlwirdnichtausgefhrt,dadavonauszugehenist,daes sichumeinunddenselbenFilehandelt. ->compress DiesesKommandokomprimiertDateien.DieAusgabefilesbesitzendie Extension'CPR'. DieursprnglichenFileswerdenmitexpandwiedererzeugt. DasErgebnisderKompaktierungistallesinallemnichtbesonders berauschend,abereinbichenschautschondabeiheraus. SolltejemandaufeinewirklicheffektivarbeitendeKompaktierung angewiesensein,somchteichdiesenaufProgrammewieARCoderZOO verweisen. ltereVersionendesKommandointerpreterskonntennurreineASCII- Textdateienpacken.DieseEinschrnkunggiltnichtmehr.DieserVorteil hatallerdingseinenkleinenHaken,redundanteTextewiez.B.Leerzei len,dienurBlanksenthaltenoderZeilen,diemitBlanksaufhren, werdennichtmehrentfernt!NachderErweiterungmitexpandhatman alsowiederdenursprnglichenFilevorsich. DasVerfahren,dashinterdiesemKommandostehtistbrigensganz einfach:eswerdenalleStrings,dieausmehralszweigleichenZeichen bestehen,zudreiByte-Stringszusammengefat. BesondersguteOpferfrdiesenBefehlsindmitdemEditorTEMPUS erstellteDateien.DadieserleidernichtinderLageist,vernnftig mitTAB-Zeichenumzugehen(undstattdessendasidiotischeATARI- spezifischeZeichenbzw.dieeingestellteAnzahlvonBLANKsmacht), bringthierdieKomprimierungschoneinigeBytesanErsparniss.Sollte irgendwanneinmaleineVersiondieses,ansonstenwirklichguten, Editorsherauskommen,dieeinebrauchbareEinbindungundVerarbeitung vonTABbeinhaltet,bringtdieKomprimierungnatrlichauchnichtmehr dieseErgebnisse. BEISPIEL: compressbeispiel.txt KompaktiertdieDatei'beispiel.txt'.DererzeugteFileheit 'beispiel.cpr'.'beispiel.txt'selbstwirdnichtverndert! ->cp (kompletterName:copy) DieserBefehlwirdzumKopierenvonDateienbenutzt.'fileA'wirddabei in'fileB'kopiert. DerBefehlistsoausgelegt,dainweitemUmfangaufandereLaufwerke undVerzeichnissezugegriffenwerdenkann.DieVerwendungvon'*' bieteteinzustzlichesMaanFlexibilitt. WhrenddemKopiervorgangwirdangezeigt,welcheFilesgeradedupli ziertwerden. SicherheitshalbersolltebeimKopiereninoderausVerzeichnissender vollstndigePfadangegebenwerden! WirdnureinArgumentangegeben,soersetztdasProgrammdaszweite durch'*.*'. BEISPIEL: cpc:command.txtd:\subdir\*.* IndiesemBeispielwirdderFile'command.txt'vomHauptdirectoryauf LaufwerkCindasSubdirectory'subdir'aufLaufwerkDkopiert. Eskannbrigensstatt'\'auch'/'verwendetwerden. cp*.prga: KopiertallePRG-DateiendesaktuellenVerzeichnissesaufLaufwerkA. cp*.*d:/allefiles/*.* HierwerdenalleFilesdesaktuellenOrdnersindasDirectory 'allefiles'aufLaufwerkDkopiert. cpc:xyz.dat DerFile'xyz.dat'wirdvomLaufwerkCindasVerzeichniskopiert,in demmansichgeradebefindet.DerNamederneuenDateiistdabeiauch wieder'xyz.dat'. ->crsoff (kompletterName:cursoroff) SchaltetdenCursoraus. ->crson (kompletterName:cursoron) SchaltetdenCursorein. ->crypt MchtemaneinenFilever-bzw.entschlsseln,sokanndazudieser Befehlbenutztwerden.UmdiesenKodierungsvorgangzustarten,istes notwendig,zweiZahlen('keyA'und'keyB')einzugeben.Nurmitdiesen beidenZahlenkanneinverschlsselterFilewiederdekodiertwerden! 'fileA'stelltdenzuver-/entschlsselndenFiledar,'fileB'repr sentiertdieErgebnisdatei. ACHTUNG,imLaufederZeit(oderbesser:derInterpreterversionen)sind andiesemProgrammteilimmerwiedernderungenvorgenommenworden!Es istdaherfrBenutzerdiesesBefehlsnotwendig,festzustellenobein EntschlsselnvonDateien,diemiteinerlterenVersionverschlsselt wordensind,nochmglichist.Kanndiesnichtmehrdurchgefhrt werden,mumandenfraglichenFileerstmitderlterenVersionwieder inseinenUrzustandbringen! WiesicherdieKodierungist,magjederselbstentscheiden.Diebeiden SchlsselsindvomTyp'long',damitergebensichschoneinigeKodie rungsmglichkeiten.EsknnenbrigensauchgnegativeSchlsselbenutzt werden. BEISPIEL: crypt1234711command.txtcommand.crp DieDatei'command.txt'wirdinverschlsselterFormimFile 'command.crp'abgelegt.Sollaus'command.crp'wiederderentschls selteFileentstehen,mueinfach crypt1234711command.crpcommand.ent eingegebenwerden.'command.ent'reprsentiertnundenentschlsselten File.EshttenatrlichauchirgendeinandererDateinamegewhlt werdenknnen. DerUrfile(indiesemFall'command.txt')wirdbrigenswedergelscht nochsonstirgendwieverndert! ->date[dd.mm.yy] Ausgabe/SetzendesDatums. WirdkeinArgumentangegeben,wirdeinfachdasSystemdatumausgegeben, sonsterfolgteinebernahmedesArguments. BEISPIEL: date1.5.88 SetztdasSystemdatumaufden1.Mai1988. date HierwirdnurdasSystemdatumausgegeben. ->defkey (kompletterName:definekey) BelegungderFunktionstastenmiteinemBefehl,derbeiDrckendieser Tastenausgefhrtwird. 'f-key'umfatdenBereichvon1bis20(naja,esgibthaltnur zwanzigFunktionstasten),wobeiabNummer11diegeshiftetenTasten gemeintsind,alsowirdz.B.Taste14duchSHIFT-F4reprsentiert. BEISPIEL: defkey1dir*.prg JederDruckaufF1fhrtjetztzumAufzeigenallerPRG-Dateienim aktuellenVerzeichnis. DieHauptanwendungfrdieseFunktiondrfteallerdingsimAufrufenvon externenProgrammenmitbestimmtenParameternliegen: defkey12x.prg F12(SHIFT-F2)fhrtnunzumStartendesProgramms'x.prg'.  ->device AusgabederangemeldetenLaufwerke. ->df (kompletterName:diskfree) DiesesKommandozeigtdenfreienSpeicherplatzdesaktuellenLaufwerks an. ->dir[filedeskriptor(en)] (kompletterName:directory) Aufzeigenaller(bestimmter)DateieneinesOrdners.Esknnenauch Laufwerksbezeichnungenbzw.Ordnerangegebenwerden. WirdkeinDeskriptorangegeben,werdenalleFilesausgegeben.Bei AngabemehrererDeskriptoren,werdensukzessivealleentsprechenden Dateienaufgezeigt. ZustzlichzudenFilenameerfolgteineAusgabevonErstellungsdatum, GreundFileattribut. DieAttributewerdensowohlinabgekrzterForm,alsauchalsInteger wert(inKlammern)ausgegeben.DieAttributabkrzungenundihreBedeu tung: -rw=ReadandWrite -ro=ReadOnly -hi=HIdden -sf=SystemFile -vl=VolumeLabel  -di=DIrectory -wc=WrittenandClosed NatrlichkanneinFilemehrereAttributehaben(z.B.wcundhi).Es werdendannalleaufgefhrt. BEISPIEL: dir AusgabeallerDateiendesaktuellenVerzeichnisses. dira: AusgabeallerFilesvomaktuellenOrdneraufLaufwerkA. dir*.prga*.* AusgabeallerPRG-FilesunddanachallerDateien,diemit'a'beginnen. dir/megamax/ AusgabeallerDateienimVerzeichnis'megamax'. ->echo[string] Ausgabevon'string'aufdenBildschirm.WirdkeinStringangegeben, erfolgtnurdieAusgabeeinerLeerzeile. SinnvollistdiesesKommandoinBatchfiles. BEISPIEL: echoNaprima! Eswird'Naprima!'ausgegeben. ->exit VerlassendesInterpretersundzurckzumDesktop.Dasgleichekannman auchdurchDrckenvon^Cerreichen. ->expand DieserBefehlstelltdieUmkehrungzucompressdar.Erdientder WiederherstellungvonmitcompressbehandelterDateien.DerErgebnis filehatdieExtension'EXP'. ->find EswirdimkomplettenFilesystem(alsoauchindenUnterverzeichnissen) nach'file'gesucht.WirdeinepassendeDateigefunden,wirddiesemit vorangestelltemPfadnamenausgegeben. BEISPIEL: find*.* DiesesKommandowrdealleFileseinesLaufwerksmitdenzugehrigen Verzeichnisnamenausgeben. find*.prg DieserBefehlgibtallePRG-Filesaus,diesichaufdemaktuellen Laufwerkbefinden. ->flags AusgabediverserProgrammflags.DieseFlagswerdenspter,bzw.immer beidenBefehlenfrdiesierelevantsind,nocheingehenderbespro chen. ZuordnungderKommandos: "Errorbreak" Befehl:errorbreak  "History" Befehl:srhist  "=Beta" Befehl:sz  "Patchchange" Befehl:pchange  "Showbatchcommands" Befehl:text/notext  "Savehistory" Befehl:savehist  "Printtitle" Befehl:srtitle  "ExpandTAB" Befehl:srtab  "Convertslash" Befehl:slash  "Linenumbers" Befehl:numbers  BeidiesenFlagswirddurchon/offangezeigt,obdieFunktiondes entsprechendenBefehlsaktiviertistodernicht. DiefolgendeAuflistungzeigtdieVerbindungvonKommandos,dieSetUp FunktionhabenundihreRepresentationinderFlag-Liste: "TAB" Befehl:settab  "Linesperpage" Befehl:lppage  "Margin" Befehl:lpmargin  "Startpage" Befehl:page  "start:" Befehl:setlp  "stop:" Befehl:resetlp  ->free GibtdennochverfgbarenRAM-Speicherplatzaus. ->headhelp[command(s)] WirddieserBefehlohneArgument(e)eingegebeodereinfachdieHELP- Tastegedrckt,erfolgteineAuflistungallerverfgbarenKommandos. DieseAuflistungist(leider)nichtalphabetischgeordnet,sondern entsprichtderReihenfolgeinderneueBefehledemProgrammhinzugefgt wordensind.DasistzwarnichtbesondersschnaberzumVerschaffen eineskurzenberblicksdrfteeswohlgengenunddieprogrammtech nischennderungenzumAusgebeneinergeordnetenListe,stehtwohlin keinemsinnvollenVerhltniszumNutzen. WirdallerdingseinArgument(odermehrere)angegeben,soerfolgtdie AusgabeeinerKurzbeschreibung. DieseBeschreibungenbefindensichinderDateicommand.hlp,diesich immerindemVerzeichnisbefindenmu,vondemausderKommandoin terpreteraufgerufenwurde. BEISPIEL: helpdirrm EswerdendieKurzbeschreibungenzudenKommandosdirundrmausgege ben. ->hide WollttemaneinenFilesokennzeichnen,daeraufdemDesktopnicht mehrerschien,konntediesinlterenInterpreterversionenmitdiesem Befehlbewerkstelligtwerden.DiesesKommandogibtesnichtmehr! MchtejemandtrotzdemDateienverstecken,kannerdiesunterVerwen dungvonchmodtun.EsmubeidenDateienBit1(dezimal=2)gesetzt sein,umeinehide-Kennzeichnungzuerreichen,bzw.mudiesesBitbei normalsichtbarenDateiengelschtsein.DasganzemitdemVerstecken funktioniertallerdingsnur,wennwirklichnurdieseseineBitgesetzt ist! UmeineDateientsprechendzukennzeichnen,mumanalsoinZukunft "chmod2"verwenden. IchhabediesesKommandoentfernt,daeseinigeLeutegab,dielieber einkrzeresProgrammhabenwolltenunddafrauf,zugegebenermaen, berflssigeBefehlezuverzichtenbereitwaren. ->inverse DieBildschirmdarstellungwirdinvertiert,d.h.warvorEingabedes BefehlsdienormaleDarstellung,alsoschwarzaufwei,aktiv,soist dieDarstellungnunweieSchriftaufschwarzemGrund.Wardie Darstellungweiaufschwarz,wirdwiederaufdienormaleEinstellung umgeschaltet. EsgibteinigeProgramme,diefreineInvertierungderBildschirmdar stellungsorgenohnedenOriginalzustandwiederherzustellen.Dieses Mankowirddurchinverseaufgehoben. ->keyboard AusgabederKommandos,diezumEditierenderEingabezurVerfgung stehen. ->keys DieserBefehlsorgtfreineAuflistungderFunktionstastenbelegungen (vgl.defkey). ->lock MchtemandenRechnereineWeileangeschaltetstehenlassen,aber gleichzeitigSorgedafrtragen,daihnkeinandererbenutzt,sokann diesmitlockgemachtwerden. NachEingabedesKommandoswirdderBenutzeraufgefordert,einPasswort einzugeben.ZurBesttigungmudieseEingabewiederholtwerden.Wares jedesmaldasgleicheWort,meldetderRechner,daerabgeschlossen (locked)ist.Willmannunweiterarbeiten,mueinfacherneutdas Passworteingegebenwerden.Istesfalsch,erfolgtkeineReaktion, sonsterscheintwiederdernormalePrompt. EinKnackendesSchutzeskannbrigensdurchdieRESET-Tasteoderdurch einfachesAus-/Einschaltenerfolgen(klar,oder?). ->lp (kompletterName:lineprinter) SolleineASCII-Datei(odermehrere)aufeinemDruckerausgegeben werden,geschiehtdiesdurchdiesesKommando.HatmaneinenDrucker spoolerinBetrieb,istdaseinerechtnetteAngelegenheit. AuerdemgibtesbeiVerwendungvonlpkeineProblememitTAB-Zeichen, dasiekorrektexpandiertwerden(wenngewnscht).Esistauerdem mglich,eineTitelseiteauszugebenundvordemeigentlichenAusdruck undnachdessenAbschlu,eineSteuersequenzandenDruckerzuschicken (vgl.auchsettab,srtitle,setlpundresetlp). EinStoppendesDruckvorgangskannjederzeitmit^Zausgelstwerden! BEISPIEL: lpcommand.txt AusdruckderDatei'command.txt'. ->lpmargin[intvalue] (kompletterName:lineprintermargin) AnzahlderBlanks,diebeieinemAusdruckvordereigentlichenZeile kommen.FehltdasArgument,istdieseFunktionausgeschaltet. ->lppage[intvalue] (kompletterName:lineprinterpage) AnzahlderZeilenproSeitebeieinemAusdruck.WirdkeinArgument angegeben,istdieseFunktionausgeschaltet. BeieingeschalteterFunktion,wirdjeweilsnachErreichenderZeilen zahleinSeitenvorschubdurchgefhrt. ->ls[filedeskriptor(en)] (kompletterName:listshort) DieserBefehlisteineAbartvondir.Dortwirdeineausfhrliche InformationsfolgezujedemFilemitausgegeben.Diesunterbleibtbei ls.HierwerdennurdieDatei-bzw.Ordnernamenaufgelistet. ->merge DiesesKommandowirdzurVerbindungvonzweiASCII-Filesbenutzt.Dabei wird'fileB'an'fileA'angehngt.'fileB'wirdnichtmodifiziert! 'fileA'und'fileB'drfennichtdiegleicheDateidarstellen,d.h.der Befehl"mergecommand.txtcommand.txt"wrdenichtfunktionieren! ->mkdir (kompletterName:makedirectory) DieserBefehlerzeugteinenneuenOrdner.Mansollteallerdingsnicht vergessen,danureinebestimmteVerzeichnistiefezulssigist.Auch das'40-Ordner-Problem'solltemanimAugebehalten. NachderGenerierungdesneuenVerzeichnisses,findetmandortbereits zweiEintrge,nmlich'..'und'.'.'.'stellteeinenVerweisaufden Ordnerdar,'..'isteinVerweisaufdasdarberliegendeVerzeichnis (vglauch"cd.."). BEISPIEL: mkdirschrott EswirdimaktuellenDirectorydasneueUnterverzeichnis'schrott' eingerichtet.Mit"cdschrott"unddirkannmananschauen,welche Dateiendabeierzeugtwordensind('.'und'..',welchesonst?). ->moremouseoff DerSinndiesesunddesnchstenBefehlsmagaufdenerstenBlicknicht einleuchten,aberessteckttrotzdemeinerdahinter. DasKommandoschaltetdenMauszeigeraus.NormalerweiseistimInter preterdieserZeigersowiesonichtsichtbar.EsgibtaberProgramme, diediesenZeigersehrwohlbenutzen,undhngtsichnunsolchein Programmauf,kannesunterUmstndenzueinemherrlichenDurcheinander mitderMauskommen. Wirdz.B.einProgrammmitderExtensionPRGaufgerufen,schaltetder InterpreterautomatischdenMauszeigervordemProgrammaufrufein. SchaltetdiesesProgrammnundiesenZeigerwiederausundihnauchbei erreichendesProgrammendesnichtwiederein(wieesgentlemanlike wre),sogibtesProbleme,daderInterpreternachdemLaufdes ProgrammsdenZeigerabschaltet,undzwarunabhngigdavon,oberein- oderausgeschaltetwar. Ichnehmemalan,dadieProblematikbisjetztnochnichtsoganz einleuchtet,schlielichwillmanja,daderMauszeigerverschwindet. LeideristdasGEMabersoorganisiert,daessichmerkt,wieoftder Zeigerausgeschaltetwordenist,d.h.wirderzweimalausgeschaltet, muer,umwiedersichtbarzuwerden,auchwiederzweimaleingeschaltet werden.DerInterpreterhatnunaberkeineAhnung,wieoftderZeiger ausgeschaltetwurde.DerBenutzersolltenunselbstfreineKorrektur desProblemssorgen.Diesistnotwendig,wennmitAnwendungengearbei tetwird,diedenMauszeigerverwenden.Eskannsonstpassieren,dain einemsolchenProgramm,indemdieMausgebrauchtwird(z.B.einGEM- Editor),keineauftaucht.EsmachtnichtvielSpa,jetztwieein blindesHuhnherumzuirren,bismanwiederausdemProgrammrauskommt (wennmannichtliebergleichRESETdrckt). Mansolltealso,fallsdasangesprocheneProblemaufgetauchtist, solangedenMauszeigeranschalten(mouseon),biserwiedersichtbar ist.DanngibtmaneinmalmouseoffeinunddieWeltistwiederin Ordnung.Normalerweisereichtesbrigenszweimalmouseoneinzugeben. DerAufwandbleibtalsoineinemvertretbarenRahmen. ->mouseon DieserBefehlschaltetdenMauszeigerein.  ->mv (kompletterName:move) ZumUmbenenneneinesFileswirddiesesKommandozurVerfgunggestellt. Aus'fileA'wird'fileB'. mvkannmit'*'benutztwerden.Mansollteallerdingseinbichen aufpassen,dadieMglichkeitenzumUnsinnanstellennichtzuverachten sind. BEISPIEL: mvoldie.daturoldie.dat DerFile'oldie.dat'wirdindenFile'uroldie.dat'umbenannt. ->numbers SchalteteinFlagein/aus,dasbestimmt,obbeieinemAusdruck Zeilennummernausgegebenwerden. flagskannzurberprfungderaktuellenEinstellungbenutztwerden. ->od (kompletterName:outdump) MchtesichderBenutzerbestimmteDateieninhexadezimalerSchreib weiseanschauen,sokannerdiesmitHilfediesesKommandostun. Der/dieFile(s)werdenseitenweiseaufdemBildschirmausgegeben.Ein AbbruchkanndurchDrckenvon^Zerfolgen. DerBefehlistsoausgelegt,daauchaufandereLaufwerkebzw. Unterverzeichnissezugegriffenwerdenkann. BEISPIEL: odcommand.txt GibtdieDatei'command.txt'hexadezimalaus. od/megamax/headers/*.h HexadezimaleAusgabealler'.h'-DateiendiesichimVerzeichnis '/megamax/headers/'befinden. ->page[intvalue] IstdieseFunktioneingeschaltet,wirdamSeitenanfangbeieinem AusdruckderFilenameunddieaktuelleSeitennummerausgegeben.Das ArgumentgibtdieStartseitennummeran.BeifehlendemArgumentistdie Funktionausgeschaltet. ->path AngabeeinesPfades,derzumAuffindeneinesProgrammesdurchsucht werdensoll.EsknnenmaximalzwanzigPfadeangegebenwerden. Programmnamenmssen,fallssienichtimaktuellenVerzeichniszu findensind,komplettangegebenwerden!Pfadnamenmssendurch'/' (bzw.'\')abgegrenztsein.Diesgiltallerdingsauch,wennessichnur umLaufwerksnamenhandelt(z.B."patha:/c:/"),dannwirddort allerdingsnurimHauptverzeichnisgesucht. InvorhergehendenProgrammversionenerfolgtekeinSprungindiezu durchsuchendenOrdner.DiesesMankohabeichnunbeseitigt.Diesgilt allerdingsnurfrProgrammemitderExtension'.PRG'!Ichsollte vielleichtdenGrundfrdieseEinschrnkungnennen: IchbenutzeeinenbestimmtenOrdnerzurAufbewahrungvonTool-Program men,diemehroderwenigerdieEndungen'.TTP'haben.Nehmeichnun diesenOrdnerindiezudurchsuchendenPfadeauf,wirdzwarbei AuffindendesProgrammsindenOrdnergesprungen,aberdieArgumente (inderHauptsacheFiles)befindensichhaltnichtdort,alsofunktio niertdasganzenicht.DadiemeistenBenutzerGEM-Anwendungenam laufenhaben,diez.B.'RSC'-DateiennachladenunddiedieEndung '.PRG'besitzen,drftemanmitderEinschrnkunglebenknnen. SelbstverstndlichkanndieserautomatischeSprungindenzudurchsu chendenOrdnerauchabgeschaltetwerden(vgl.pchange).DasKommando verhltsichdannwieindenlterenInterpreterversionen. Auerdemistesjetztauchmglich,wieimHauptverzeichnis,nurnoch TeilstringszumStarteneinesProgrammeseinzugeben.FrdieEindeutig keitdesAufrufsmuallerdingsderBenutzerselbersorgen! Mansolltvielleichtauchnochbeachten,damitderAnzahlderzu durchsuchendenVerzeichnisseauchdieZeitbiszurAuffindungbzw.bis zurMeldung,daeinProgrammnichtgefundenwerdenkann,steigt! DieSuchenacheinemProgrammgeschiehtinfolgenderReihenfolge: 1.wennALIAS-Eintrag,dannUmwandlung 2.wennmitPfadangabe,dannAusfhrung 3.wenninaktuellemVerzeichnis,dannAusfhrung 4.diemitpathfestgelegtenWegeabsuchenundggf.Ausfhrung eswirddabeidieArgumentfolgeinReiheabgesucht! DieBedeutungvonALIASwirdineinemextraAbschnitterlutert! DaichkeinrechtesVertrauenindieFhigkeitendesTOShabe, existiertbeimWechselnderPfadeeinKontrollmechanismus,derbei einemfehlerhaftenOrdneransprungeineWarnungausgibt.Diessollte eigentlichniederFallsein,abermansollnieniesagenwasdasTOS betrifft. BEISPIEL: path/erste/a:/c:/oben/unten/ EinexternesProgrammwrdeindiesemFallerstimaktuellenVerzeich nisgesuchtwerden.Kannesdortnichtgefundenwerden,wirdversucht, esimOrdner'/erste/'zufinden.Istesauchdortnichtvorhanden, wirdzumHauptverzeichnisaufLaufwerkAgegangen.Beieinemweiteren FehlschlagwirdnunnochaufLaufwerkCimDirectory'/oben/unten/' gesucht. path OhneArgumentewirdnurdereingestellteSuchpfadausgegeben. ->pchange (kompletterName:pathchange) SchaltetdenPfadwechseldespath-Kommandosein/aus.Mitflagskanndie aktuelleStellungberprftwerden.VoreingestelltistdasWechselnder Directories. ->pwd (kompletterName:printworkingdirectory) DieserBefehlzeigtdenaktuellenPfadan,indemmansichgerade befindet. ->reset DerRechnerfhrteinenResetaus. ->resetlp[intvalue(s)] (kompletterName:resetlineprinter) DieserBefehlwurdebereitsbeimlp-Kommandoerwhnt.Wirdlpzum AusdruckvonDateienbenutzt,wirdvorodernachdemeigentlichen DruckvorgangeineSteuersequenzandenDruckergeschickt(z.B.Schrift greodereinInitialisierungskommando). resetlpistnunfrdieSequenzzustndig,dienachdemAusdruckanden Druckergeschicktwird.MchtederBenutzer,dakeinesolcheFolge geschicktwird(Defaulteinstellung),muereinfachresetlpeingeben. MitflagskannmansichdieaktuellgltigeSteuersequenzanschauen. BEISPIEL: resetlp122864 DieseSequenzsorgtnachAbschlueinesAusdrucksfreinenSeiten vorschubundderUmschaltungaufdieGrundeinstellungeinesNEC-P6- Druckers. ->rm (kompletterName:remove) ZumLschenvonDateienfindetdieserBefehlVerwendung.Esknnen damitsowohlganzeFilegruppenalsauchnurbestimmteEinzeldateien entferntwerden(VerwendungvonWildcartsistmglich). MansolltebeiBenutzungdesKommandoseinbichenaufpassen,sonst lschtmanDateien,diemaneigentlichnochbraucht. DieserBefehlerlaubtdenZugriffaufandereVerzeichnisseundLauf werke. Eskannvorkommen,daFilesvordemLschengeschtztsind(Attribut: nurlesbar).DerBefehlistnichtinderLage,solcheDateienzu entfernen(vgl.auchsaveundunsave)! BEISPIEL: rm*.* HierwerdenalleFilesgelscht. rm*.prgcommand.txt HierwerdenerstallePRG-Dateienentfernt,imAnschludaranderFile 'command.txt'. rmc:/copy/c_files/ AufLaufwerkCwerdenalleDateienimUnterverzeichnis'/copy/c_files/' gelscht. ->rmdir (kompletterName:removedirectory) Eskannvorkommen,daOrdnerentferntwerdensollen.Dergeeignete Befehlfindetsichinrmdir.DerzulschendeOrdnermuallerdings leersein! BEISPIEL: rmdirschrott DieseEingabebewirkteinEntfernenvonDirectory'schrott'. ->save Files,aufdiedieserBefehlangewandtwird,sindnurnochlesbar. RckgngiggemachtwerdenkanndiesesKommandomitunsave. Mansolltebeachten,daesProgrammegibt,dieaufsolchermaen geschtzteDateienmitdemfrohenWerfenvonBombenreagieren.Esmu alsovorVerwendungsolcherProgrammeunsavebenutztwerden! ->savehist (kompletterName:savehistory) PerDefaulteinstellungwirdbeimVerlassendesInterpreterseinFile history.datangelegt,indemsichdiezuletztgemachtenEingaben befinden. DieserBefehlbewirktnuneinEin-/AusschaltendieserAbspeicherfunk tion. Mitflagskannbestimmtwerden,obsiegeradeeingeschaltetistund kanndann,jenachBenutzerwunsch,umgeschaltetwerden(toggle-Funk tion). ->setlp[intvalue(s)] (kompletterName:setlineprinter) DieanalogeFunktionzuresetlpfindetsichindiesemBefehl.Diehier angebbareSteuersequenzwirdvordemeigentlichenAusdruckanden Druckergeschickt.Sollnichtsgeschicktwerden(default),isteinfach wiedersetlpeinzugeben. MitflagskanndiegltigeSteuersequenzangeschautwerden. ->settab (kompletterName:settabulator) EineweitereFunktion,diedenAusdrucksteuert,wirddurchdieses Kommandoabgedeckt.DerBenutzeristhiermitinderLage,dieTabula torweitezubestimmen(defaultmigauf8Zeichen).DieminimaleWeite liegtbeizweiZeichen! settabbeeinflutbrigensnichtnurDruckerausgaben.AuchAusgabenvia catodermorebenutzendieeingestellteTabulatorweite! DieserBefehlhatbeiListingsnatrlichnureineBedeutung,wenndas Tabulatorflag,daangibtobTABoderdieentsprechendeAnzahlBlamks gesendetwird,gesetztist. flagszeigtdieaktuelleTabulatorweitean. ->slash Normalerweisekannmanstatt'\'auch'/'benutzen(z.B.beicd).Es gibtaberexterneProgramme,diemitArgumentengefttertwerden knnen,dieein'/'enthalten.DaderInterpreter'/'inein'\' umwandelt,kanneshierzuProblemenkommen.Mitslashkanndiese Konvertierungein-bzw.ausgeschaltetwerden. MitflagskannderaktuelleZustandangeschautwerden.  ->srhist (kompletterName:set/resethistory) NormalerweisewerdendieletztenfnfzigEingabenineinerHistoryta bellegehalten.DamitistderBenutzerinderLage,aufeinfacheWeise, aufdieseKommandosBezugzunehmen(s.u.). UmdieseEintragungenein-/auszuschalten,kanndieserBefehlbenutzt werden. MitflagskannderaktuelleStanddesentsprechendenFlagsangeschaut werden.srhisterzeugtdanndieentgegengesetzteStellung. FindenkeineEintragungenindieHistorytabellestatt,erscheintder Eingabezhlerinvers.  ->srtab (kompletterName:resettabulator) Normalerweise(default)sendetderBefehllpkeineTAB-Zeichenanden Drucker,sondernexpandiertdieseZeichenkorrektundschicktdie entsprechendeAnzahlBlanks.DieserBefehlkannnunzumSet zen/RcksetzendieserFhigkeitbenutztwerden. MitflagskanndieaktuelleEinstellungberprftwerden. ->srtitle (kompletterName:set/resettitle) NunzumvorletztenBefehl,mitdemeinDruckerlistingbeeinflutwerden kann.DefaultmigwirdvorjedemAusdruckeinTitelblatterzeugt,auf demderFilenamensteht.Istdiesjedochnichtgewnscht,kannmit srtitledieseMglichkeitabgeschaltet(oderauchwiedereingeschaltet) werden. MitflagskannmalwiederderaktuelleZustanddesentsprechendenFlags angeschautwerden. ->string DieserBefehldientdemAbsuchenvonDateiennacheinerbestimmten Zeichenfolge.EskanndabeisowohlnureineDateialsauchmehrere angesprochenwerden(ber'*').DerSuchstringmuzwischenzwei gleicheZeicheneingeschlossensein!DerBefehlbeziehtsichimmerauf dasaktuelleVerzeichnis. DiemaximaleLngeeinessolchenStringsbetrgtzwanzigZeichen. berschreiteterdiese,erfolgteineKrzungaufdieseZeichenlnge! BEISPIEL: string*.*/Ohsolemio/ EswerdenalleDateiendesaktuellenOrdnersnachdemString'Ohsole mio'abgesucht.WirdderStringineinemFilegefunden,wirdeine entsprechendeMeldungausgegeben. stringcommand.txt*Bingo* IndiesemFallwirdderFile'command.txt'nachdemString'Bingo' abgeklappert. Mansieht,dadieArgumentbegrenzungenvlligverschiedenseinknnen, imoberenBeispiel'/',imunteren'*'.Siemssennurbeider jeweiligenEingabebereinstimmen.Esverstehtsichwohlvonselbst, dadieseBegrenzungennichtimeigentlichenSuchstringenthaltensein drfen! ->sz DerletzteBefehlzurDruckersteuerung.ErentstandausdemMangel meinesDruckers,einvernnftiges''machenzuknnen. IstdasentsprechendeFlaggesetzt,wirdeinfachderCodefreinBeta (225)geschickt,wennimTextein''vorkommt.IstdasFlagnicht gesetzt,wirddereigentliche''-Codegeschickt(158). MitflagskanndieFlagstellungberprftwerden.Defaultmigist diesesFlagbrigensgesetzt,alsowirdBetageschickt! ->time[hh:mm] DasSetzenbzw.AbfragenderUhrzeitgeschiehtmitdiesemKommando. WirdkeinArgumentangegeben,soerfolgteineAusgabederaktuellen Systemzeit,sonstwirddasArgumentalsneueSystemzeitbernommen.Bei derAusgabewerdenauchdieSekundenangegeben.BeimSetzendrfen diesenichtangegebenwerden! BEISPIEL: time12:4 SetzenderUhrzeitauf12Uhr4Minuten.DieSekundenwerdenautoma tischaufNullgesetzt. ->tree AusgabeallerOrdnerundUnterordnereinesLaufwerks.  ->unsave Files,dienurlesbarsind,alsonichtgelschtwerdenknnen,werden durchdiesesKommandoentschtzt.DerumgekehrteBefehlistsave. ->version DiesesKommandogibtdasErstellungsdatumaus.Esexistiertkeine Versionsnummermehr! ->wc (kompletterName:wordcount) InteressiertmansichfrdieAnzahlvonZiffern,ZeilenundZeichen einesFiles,sofindetdieserBefehlVerwendung.Allesinallemkein besonderswichtigesKommando. 3.1 BesondereBefehle  DiefolgendenvierBefehlediezumErzeugeneinesASCII-Filesbenutzt werdenkonnten,gibtesnichtmehr:   open    write    append    close  DiesstelltallerdingskeineEinschrnkungbeidereinfachenKreierung vonTextdateiendar.IchmchtedenBenutzeraufdenAbschnitt,der sichmitderAusgabeumleitungbefat,verweisen.DieVerbindungdieser Mglichkeitmitdemecho-BefehlerlaubtsmtlicheAktionendervier weggefallenenBefehle. DerGrundfrdasStreichenderKommandoswarwiederderVersuch,den InterpreteretwaskompakterzumachenundredundanteBefehle,dienur einenunntigenBallastdarstellen,zuentfernen.Ichglaube,da zumindestindiesemFallkeineEinschrnkungfrdenBenutzergegeben ist. MchtederBenutzerdasLaufwerkwechseln,kannerdazudencd-Befehl benutzen,diesistabernichtunbedingtnotwendig.Esistauchmglich, diesenWechseleinfachdurchLaufwerkskennungundanschlieendenDop pelpunktvorzunehmen. BEISPIEL: a: WechselzuLaufwerkA.  3.2 Zahlkonvertierungen  Eskommtabundzuvor,daZahlumrechnungenvorgenommenwerdenmssen. DerInterpreterstellthierdreiFunktionenzurVerfgung: -># EingabeeinerDezimalzahlundderenUmrechnungindashexadezimaleund oktalequivalent. ->$ EingabeeinerhexadezimalenZahl.AlsResultatwerdendiedezimalenund oktalenquivalenteausgegeben. ->\ UndalsletztesdieUmrechnungfroktaleZahlen.Mankannhier brigenseinProblemerkennen,daeventuellauftritt,wennmit'\'ein Programmaufgerufenwerdensoll.ImZweifelsfallmumaneinfachnur dieLaufwerksbezeichnungmitangegebenodermit'/'arbeiten. 4 DieALIAS-Einrichtung  4.1 Einfhrung  DerKommandointerpreterbietetdemBenutzerdieMglichkeit,bestimmte Befehleumzubenennen.WirdzumBeispielfterseinspeziellesProgramm aufgerufen,kanndieserAufrufumbenanntwerden. SeidasProgramm'xcompiler.prg'immerwiederaufzurufen,kanndieses Kommandoz.B.in'cc'umbenanntwerden(sinnigerweisegeheichin diesemBeispieldavonaus,dadieserominse'xcompiler'einC- Compilerist.'cc'wresonsteinrechtverwirrenderName).Wirdein EditorfterszumEditiereneinesbestimmtenFilesaufgerufen(bei einerProgrammerstellungpassiertdieseigentlichdauernd),kannder normaleAufruf'editor.prgfile'einfachineinenkrzeren,z.B. 'edit',umbenanntwerden. SchreibfauleNaturenundLeute,diemitderNamensgebungderinternen Kommandosnichtbesondersglcklichsind,knnendurchdiesenMechanis musihreeigeneNomenklaturaufbauen. SmtlicheUmbenennungenknnenimFilealias.databgelegtwerden.Diese DateiwirdzumProgrammbeginnvoncommand.prgeingelesen(soweit vorhandennatrlich).Diesfunktioniertallerdingsnur,wennsichdiese DateiimgleichenVerzeichniswiederInterpreterbefindet! alias.datwirdbrigensbeimVerlassenvoncommand.prgnichtautoma tischabgespeichert(vgl.savealias). DiealternativenKommandonamenknnenalsosofortgenutztwerdenund mssennichtzujederSitzungneueingegebenwerden! Esistnatrlichmglichganzohnealias.datauszukommenunddie ErzeugungderUmbenennungendurcheinenBatchfilevorzunehmen.Der bequemereWegerscheintmitjedochdieVerwendungdieserDateizusein. 4.2 ALIAS-Befehlssatz  ->alias[string(s)] AufzeigenalleraktuellgltigenUmbenennungenundihrerquivalente. EsistauchdieselektiveAuswahleinesEintrags(bzw.mehrerer) mglich.  ->delalias (kompletterName:deletealias) LscheneinesAlias-EintragsausderAlias-Liste. ->getalias DerFilealias.datwirdmitdiesemKommandoeingelesen. ->newalias Umbenennungvon'old'in'new'.DieserBefehldientalsozurAlias- Erzeugung. NeueEintrgewerdenbrigensnichtandieAlias-Listeangehngt, sondernstehenimmeranersterStelle(Zeit-undCodeersparnis). BEISPIEL: newaliasccxcompiler.prg DieBeschreibungstehteigentlichschonindemobigenBlabla.Jede Eingabevon'cc'wirdduch'xcompiler.prg'ersetzt. newaliasalalias StattaliasfhrtnunauchalzumAufzeigenderAlias-Eintrge. ->savealias AbspeicherndergltigenUmbenennungenimFilealias.dat.Esmu beachtetwerden,dadiesesAblegenderDateinichtautomatisch erfolgt! MankannsichbrigensmithilfeeinesBatchfileseineEnderoutine schreiben,diemanzumVerlassendesInterpretersaufruftunddie savealiasenthlt. 5 DieHistory-Einrichtung 5.1 Einfhrung  EinweiteresBonbondesInterpretersistdieMglichkeit,bereits eingegebeneBefehleaufeinfacheWeiseerneutaufzurufen.Diesist allerdingsaufdieletztenfnfzigEingabenbeschrnkt. UNIX-KennerndrftedieseEinrichtungundihreVorzgewohlhinlnglich bekanntsein. EineinfachesBeispielsolldiepraktischeAnwendungdieserFhigkeit aufzeigen.ZumErstelleneinesProgrammsinC,PASCALu.s.w.sindimmer diegleichenSchrittenotwendig: Editieren->Compilieren->Linken->Probelauf MeisterfolgtzwischenCompilierenundLinkennocheineKurzvisitebeim Editor,weilhaltdochnocheinkleinesFehlerchenimSourcecode aufgetauchtist. DieKommandosfrdasBeispielseiennunfolgende: 77>edbsp.pas Bedeutung:AufrufdesEditorszurBearbeitungdesFiles'bsp.pas'. 78>pasbsp.pas Bedeutung:AufrufdesCompilerszurObjektfileerzeugung. SolltenjetztFehlermeldungenaufgetauchtsein,geht'swiederzurck zumEditor.Alsowieder 79>edbsp.pas reinklopfenu.s.w. Bevoresjetztweitergeht,sollteichvielleichtverraten,dadie ZahlenvordenBeispieleingabenvomInterpretergeliefertwerden. DieserkleineHinweisistfrdasweitereVerstndnisziemlichhilf reich! DurchdieHistoryeinrichtunggengtes,wennderBenutzerbeiBefehl79 ("edbsp.pas")einfachnur"!77"eingibt.EswirddannKommando77 erneutausgefhrt. EskannabernichtnurberdieKommandonummernaufzurckliegende EingabenBezuggenommenwerden;dieEingabe"!e"htteauchzum WiederaufrufdesEditorsgefhrt,d.h.eswirdbeidieserEingabenach demletztenKommandogesucht,damitdemBuchstaben'e'begonnenhat, und,fallsesgefundenwerdenkann,erfolgteinerneuterAufrufdesnun expandiertenBefehls(hierwredies"edbsp.pas"). DieMglichkeit,alteKommandosberdenAnfangsbuchstabenzurckzuho len,istnichtaufeinenBuchstabenbegrenzt.Eswirdnachdemletzten Kommandogesucht,damitdemeingegebenenTeilstringbereinstimmt. EinweiteresBeispielsolldasverdeutlichen:HatderBenutzerkrzlich denBefehl"cpafilebfile"eingegebenundaufdiesenBefehlfolgend dasKommando"cmpafilebfile",sowrdedurch"!c"dercmp-Befehl erneutaufgerufenwerden.DurchEingabevon"!cp"wrdeaberein eindeutigerBezugaufdenKopierbefehlgeschaffenunddieserausgefhrt werden. Esistalsomglich,durchbeliebiglangeTeileingabeneindeutige ZuordnungenzuvorhergehendenBefehlenzubilden.Esseinocheinmal daraufhingewiesen,dasichinderHistory-Listenurdieletzten fnfzigBefehlebefindenunddamannurdieseerneutdurchdie History-Kommandosaufrufenkann. JedeNeueingabewirdindieseListeeingetragen,dafrwirdderlteste Eintragentfernt.NormalerweisemteaberderUmfangdergemerkten Kommandosmehralsausreichendsein. DasbishergesagtemchteichmiteinemBeispielnochetwasanschauli chermachen: 120>cpafilebfile 121>cmpafilebfile 122>!c 123>!cp 124>!121  Eswerdenwiedercpundcmpverwendet.DieKommandos120und121mten eigentlichklarsein.Kommando122ruftdasletzteKommandoauf,da mitdemBuchstaben'c'begannauf,indiesemFallcmp.Kommando123 ruftdenletztenBefehlauf,dermitdenBuchstaben'cp'beginnt,und dasistKommando120.Befehl124beziehtsichnunexplizitaufein Kommando,dencmp-Befehl. Zustzlichzuden!-KommandosgibtesnocheineweitereMglichkeit, aufalteEingabenzugreifenzuknnen: WerschonaufeinerVAXunterVMSgearbeitethat,drftemitder VerwendungderCURSOR-UPbzw.CURSOR-DOWN-TastenindiesemZusammenhang vertrautsein.AuchdieserInterpretererlaubtesmitHilfedieser Tasten,alteBefehlewiedersichtbarzumachen.Esistauerdem mglich,durchVerwendungderCursortastenundderbereitsamAnfang erwhntenTasten,diesealtenKommandosfreizueditieren. VorhergehendeBefehlewerdenmitderCURSOR-UP-Tasteaufgerufen,ein ZurckbltternwirddurchdieCURSOR-DOWN-Tastebewerkstelligt. 5.2 Die!-Befehle  ->h (kompletterName:history) DieserBefehlgibtalleinderHistory-ListestehendenEintrgeaufden Bildschirmaus(dieEingabevonhistorybewirktdasgleiche). ->! HierwirddasKommandomitderNummer'nr'nocheinmalaufgerufen. InVerbindungmitderfolgendenHistoryfunktion'!'muan dieserStelleleideraufeinenSchwachpunkthingewiesenwerden!Pro gramme,diemiteinemZiffernstringbeginnenunddienundurch '!'erneutaufgerufenwerdensollen,kommennichtzur Ausfhrung(bzw.nurdann,wennzuflligerweisederZiffernstringmit derKommandonummerbereinstimmt),d.h.ZahlendiesichaufKommando zeilenbeziehen,habenimmerVorrangvoranderenStrings!Dassollaber nichtheien,daesunmglichist,solchespeziellen'Ziffern'- Eingabenzuwiederholen.NurmumandannstatteinemAusrufezeichen zweiverwenden!EinBeispielsolldieseProblematiketwasbeleuchten:  101>1.prg  102>!!1 103>!1 Kommando101rufteinProgramm'1.prg'auf,102wiederholtdiesen Aufruf.Nummer103fhrtzueinerFehlermeldung,daderBefehlmitder Nummer1nichtmehrinderHistorytabellevorhandenist. ->! EssolldasletzteKommandogestartetwerden,damit'string'beginnt. ManbeachtediebeimvorhergendenKommandoangesprocheneRestriktion diesesBefehls! ->!! DieletzteEingabewirdwiederholt. ltereVersionendesKommandointerpreterserlaubtenstattzweiAusrufe zeichenauchdieVerwendungvonnureinem.Diesfhrtnunzueiner Fehlermeldung! 6 DasBatch-Processing  6.1 Einfhrung  IchwillnunaufdienchsteFhigkeitdesInterpreterseingehen,die AbarbeitungvonBatchdateien. LeiderwirddieseMglichkeitauchaufSystemen,diedafrbereits 'serienmig'eingerichtetsind,zuseltengenutzt.Liebergibtein BenutzerimmerwiederdiegleicheBefehlsfolgeein,alssicheineDatei zuerstellen,diedieseFolgeenthltunddieeinfachnuraufgerufen werdenmu. IneinerBatchdateikannprinzipielljedesderbisherbesprochenen Kommandosstehen.EsgibtnocheineganzeReiheweitererBefehle,die denAblaufinnerhalbeinessolchenFilessteuern(z.B.Sprungmarken). WirdineinemBatchfilevielgesprungen,bzw.findenSchleifendurch lufestatt,solltederFileineinerRAM-Diskabgelegtundgestartet werden.DasbringtzumeineneinengewissenZeitgewinnundnutztauf deranderenSeitedieDiskettenichtsoab.Ichmchteesnicht unerwhntlassen,daderInterpreterdenBatchfilenichtaufeinmal einliestunddannabarbeitet,sondernKommandofrKommandoholt. DadurchwirdetwasSpeichergespartunddieVerwaltungistumeiniges einfacher. DieAbarbeitungeinerBatchdateikannjederzeitdurch^Zabgebrochen werden! BefehleeinesBatchfileswerdennichtindieHistory-Listeaufgenommen! DieimFolgendenbeschriebenenBefehleknnenzumTeilauchim Direktmoduseingegebenwerden,diesistallerdingsbeieinigenKomman dosnichtsehrsinnvoll. Wichtigenderung: IndenlterenVersionendesInterpretersgabesdiefesteingebaute Variablecounter.SeitEinfhrungderVariablen,istdieseundalle ihreFunktionennichtmehrnotwendig.UmdenProgrammcodezukrzen, habeichdeshalbdieseVariableentfernt.Benutzervoncounter- Befehlen,mssendiesedurchentsprechendeVariablenkommandosersetzen!  6.2 Befehlssatz  ->batch[arg0...arg9] AufrufeinerBatchdatei'file'.'arg0'bis'arg9'entsprechenStrings. InnerhalbeinesBatchfilesknnenPlatzhaltergesetztwerden('$0'bis '$9').DiesewerdendurchdieStrings('arg0'bis'arg9')beieinem AbarbeitendesBatchfilesersetzt.Dadurchwirderreicht,daz.B.eine Batchdatei,diedieCompilierungunddasLinkeneinesSourcefiles zusammenfat,frunterschiedlicheSourcefilesVerwendungfindenkann. DieArgumentemssenaufsteigendbei0beginnendeingesetztwerden, d.h.jedes'$0'wirddurchdasersteStringargumentersetzt,jedes'$9' wrdedurchjedesneunteStringargumentersetztwerden.Esstehenalso maximalzehnsolchePlatzhalterzurVerfgung. WeiteruntenfolgeneinigeBeispiele,dieunteranderemdieVerwendung dieserArgumentersetzungbeleuchtensollen. FrfauleBenutzergibtesdieMglichkeit,aufdieExtension'.COM'zu verzichten,auchwenndieBatchdateidiesebesitzensollte.Kannder InterpretereinenangegebenenBatchfilenichtfinden,versuchternoch durchAnhngenvon'.COM'zumErfolgzukommen.Beispielsweisewrde dieDatei'BSP.COM'durch"batchbsp"unddurch"batchbsp.com" aufgerufenwerden.IchmchteandieserStellebetonen,daein BatchfiledurchauskeineExtensionhabenmu.JedergltigeFilename kannfreineBatchdateiverwendetwerden! Esknnenmaximal3BatchfileszurgleichenZeitlaufen(sichgegensei tigaufrufen)!DieArgumentesindinjedemdieserdreimglichen Dateienunterschiedlich,d.h.besitztFileAdieBelegung'BEISPIEL' fr'$0'undruftdannFileBauf,soistdort'$0'unbesetzt,wenn beimAufrufkeinArgumentexplizitangegebenwordenist. DasmitdenArgumentenmchteichandieserStellenochaneinem kleinenBeispielzuverdeutlichenversuchen. Ichgehemaldavonaus,damansichincommand.prgbefindet.Die folgendeEingabesequenzerzeugtnuneineBatchdatei'BSP.COM',die nichtsanderesmacht,alszweiArgumentemitechoauszugeben.Der BenutzerkanndarandieWirkungder$-ErsetzungdurchEingabeparameter erkennen(hoffentlich).  80>echo|bsp.com 81>echo||bsp.comecho$0$1 82>batchbsp.comarg1arg2 arg1arg2 83>  JenachdemmitwelchenArgumentendieseDateinunaufgerufenwird, ndertsichdieAusgabe.Mansolltesichruhigauchmalanschauen, welcheAusgabebeifehlenderArgumentangabekommtbzw.beiAngabevon dreiodernochmehrParametern. ->@[arg0...arg9] Analogzubatch,nurdiesmalmit@.DiesesKommandoisteinfachnurfr dieLiebhabervonVMSgedacht.  ->?arg