home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / ENTERPRS / CPM / UTILS / S / ZF10Q.LBR / ZFILER.TZJ / ZFILER.TCJ
Text File  |  1991-06-04  |  48KB  |  866 lines

  1. Thi≤ documen⌠ contain≤ thσ tex⌠ oµ tw∩ article≤ oε ZFILE╥ b∙ Ja∙ ì
  2. Sagσ whicΦ originall∙ appeareΣ iε Thσ Compute≥ Journa∞ issue≤ #3╢ ì
  3. anΣ #37«  ReprinteΣ witΦ permissioε oµ thσ publisher:
  4.  
  5.      Thσ Compute≥ Journal
  6.      P.O« Bo° 12
  7.      S« Plainfield¼ N╩  07080-0012
  8.  
  9.  
  10.                      ZFILER, The Point-and-Shoot Shell
  11.  
  12.      Now let's turn to the technical subject for this issue, the ZFILERì
  13. shell.  Having written about shells so much in the past few columns, I amì
  14. tempted to jump right into the thick of the subject.  However, judging fromì
  15. the number of new subscriptions that SME alone takes each month, TCJ mustì
  16. have lots of new readers with each issue.  Therefore, I will begin at theì
  17. beginning.  Since time and energy are in short supply, however, I will notì
  18. attempt to provide the same comprehensive documentation that I did forì
  19. ARUNZ.  Instead, I will concentrate on the basics, on the one hand, and onì
  20. some of the special features that many users may overlook, on the other.
  21.  
  22. Z-System Shells
  23.  
  24.      A Z-System shell is a program that takes over the user-input functionì
  25. of the command processor.  The way this works is that the Z-Systemì
  26. environment includes a special area in memory called the shell stack whereì
  27. shell command lines can be kept.  Whenever the ZCPR3 command processor isì
  28. finished processing all the commands that have been passed to it in theì
  29. command line buffer (another special area in memory), it checks the shellì
  30. stack.  Only if no command line is present there does the command processorì
  31. itself prompt the user for the next command line.  If there is an entry inì
  32. the shell stack, then that command line is run instead, and the user noì
  33. longer sees the command processor directly.
  34.  
  35.      Some shells, like the EASE history shell, while making a big change inì
  36. how the system is actually running, make relatively little change in how itì
  37. appears to run.  A command prompt is still presented, and one entersì
  38. commands more or less as usual.  The difference is that one has a moreì
  39. capablσ edito≥ a⌠ one'≤ disposal¼ anΣ thσ command≤ arσ saveΣ t∩ ß histor∙ filσ ì
  40. froφ whicΦ the∙ caε bσ recalled¼ edited¼ anΣ ruε again«  A≤ wσ shal∞ see¼ thσ ì
  41. ZFILE╥ shel∞ present≤ thσ use≥ witΦ ß dramaticall∙ differen⌠ use≥ interface.
  42.  
  43. What is ZFILER For?
  44.  
  45.      Historically, ZFILER is a descendant in the line of file maintenanceì
  46. utilities like SWEEP and NSWP (hence the "filer" part of the name).  Fileì
  47. maintenance is generally concerned with copying files, looking at theirì
  48. contents, renaming them, erasing them, and so on.  ZFILER provides all theseì
  49. functions and more.
  50.  
  51.      ZFILER's immediate parent was VFILER, where the "V" stood for video. ì
  52. The TCAP facility in Z-System makes it easy for programs to take advantageì
  53. of the full-screen capabilities of whatever video display terminal happensì
  54. to be in use at any time.  In contrast to applications under CP/M, Z-Systemì
  55. programs need not be configured to match the terminal.  It was, therefore,ì
  56. natural to build a file maintenance program in which the files are displayedìègraphically on the screen.  When I decided to explore some new directionsì
  57. with VFILER, to avoid confusion I gave the program the new name ZFILER, forì
  58. Z-System Filer.
  59.  
  60.      The file maintenance tasks described above would not require a shell. ì
  61. Making the program a shell, however, allows it to go beyond the functionsì
  62. included in the program's own code.  Because a shell can pass command linesì
  63. to the operating system, ZFILER can perform any operation that the computerì
  64. is capable of.  Like a menu system, however, it helps the user by generatingì
  65. the commands automatically at the touch of a key.
  66.  
  67.      When ZFILER is running, the screen is filled with an alphabetizedì
  68. display of the files in a specified directory, and there is a pointer thatì
  69. the user can manipulate using cursor control keys.  If we had a mouse toì
  70. move the pointer, it would be a little like having a Macintosh.  Actually,ì
  71. it would be a lot more.  It would be like having a mouse with fifty buttons! ì
  72. Once the pointer has been positioned on a file, pressing a key (or two orì
  73. three⌐ cause≤ an∙ oµ ß grea⌠ numbe≥ oµ function≤ t∩ bσ invokeΣ t∩ ac⌠ oε átha⌠ ì
  74. file«  Wσ wil∞ describσ ho≈ thi≤ work≤ iε morσ detai∞ shortly.
  75.  
  76. Invoking ZFILER
  77.  
  78.      Since ZFILER performs full-screen operations, a proper Z-Systemì
  79. terminal descriptor (TCAP) must have been loaded.  If you have not doneì
  80. that, or if you have selected a terminal that does not support all theì
  81. functions ZFILER needs, then ZFILER will give you an error message.  Theì
  82. TCAP, unfortunately, does not include information about whether dim orì
  83. reverse video is used by the terminal, and since these two modes forì
  84. highlighting regions on the screen are so different, ZFILER is madeì
  85. available in separate versions for each.
  86.  
  87.      There is also an option to have either four or five columns of fileì
  88. names in the display.  Personally, I prefer the four-column version, whichì
  89. gives an uncluttered screen with plenty of restful white space and a veryì
  90. distinct¼ eas∙-t∩-spo⌠ pointer«  Other≤ thinδ i⌠ i≤ morσ importan⌠ t∩ bσ ablσ ì
  91. t∩ seσ thσ maximuφ numbe≥ oµ file≤ oε eacΦ screeε anΣ prefe≥ thσ fivσ-columε ì
  92. display.
  93.  
  94.      Then there is the issue of support for time and date stamping of files. ì
  95. ZFILER contains the code for preserving the time stamps when files areì
  96. copied.  So as not to inflict the overhead of this code on those who haveì
  97. not implemented DateStamper (though they should do that!), ZFILER is alsoì
  98. provided in versions with and without the DateStamper code.
  99.  
  100.      If we supported all combinations of the above choices, there would beì
  101. eight different versions of ZFILER.  Typically, the distribution libraryì
  102. contains four or five of the combinations.  For example, a five-column fileì
  103. display is not particularly compatible with reverse video highlighting,ì
  104. because the reverse video of tagged files runs into the reverse-videoì
  105. pointer.
  106.  
  107.      When you get ZFILER, you have to choose which version you prefer,ì
  108. extract it for the distribution library, and give it a working name (some ofì
  109. the early Z-System shells had to have a specific name, but you can giveì
  110. ZFILER any name you like).  I prefer the name ZF, since it is very quick andìèeasy to type, and I will use that name in all the examples that follow.
  111.  
  112.      The general syntax for invoking ZFILER is
  113.  
  114.         ZF filespec
  115.  
  116. where "filespec" is a standard Z-System ambiguous file specification (thatì
  117. is, it may contain the wildcard characters "?" and "*").  The filespecì
  118. selects the directory area and the files from that area to be included inì
  119. the screen display.
  120.  
  121.      Various parts of the filespec can be omitted.  If no filespec is givenì
  122. at all, then "*.*" for the currently logged directory is assumed. ì
  123. Similarly, if only a directory is specified (e.g., B: or 3: or B3: orì
  124. WORK:), then all the files ("*.*") in that directory are displayed.  If aì
  125. file name/type is included, then it will serve as a mask on the files to beì
  126. displayed.  Thus "ZF WORK:*.DOC" will show only files of type DOC in theì
  127. directory WORK:.
  128.  
  129.      The directory and file mask can both be changed from inside ZFILER asì
  130. well using the "L" or LOG command.  I bring this up now because there is aì
  131. confusing difference in the way the "L" command works.  VFILER originallyì
  132. allowed one to change only the directory and not the file mask from insideì
  133. the program.  To save the user the trouble of typing the colon after aì
  134. directory, its inclusion was made optional.  Since users became soì
  135. accustomed to this shorthand, it was carried over into ZFILER.  Because ofì
  136. this, if you want to change only the file mask, you must remember to precedeì
  137. it with a colon.  Otherwise your mask will be taken as the name of aì
  138. directory (which generally results in an error message).
  139.  
  140.      One brief aside for programmer types.  ZFILER can be loaded from anyì
  141. directory.  One of the special features of Z-System since version 3.3 of theì
  142. command processor allows a program to find out both its own name and theì
  143. directory from which it was actually loaded, perhaps as the result of a pathì
  144. search.  ZFILER builds the shell stack entry to invoke ZFILER under itsì
  145. current name from the directory in which it is actually located.  Thisì
  146. sometimes makes it run faster, and it allows ZFILER to be invoked from aì
  147. directory that is not on the search path.
  148.  
  149. The ZFILER Display
  150.  
  151.      The main ZFILER display contains three parts.  At the top of the screenì
  152. there is a message line.  In the version of ZFILER that is current at theì
  153. time I am writing this column (version 1.0L), this line contains, from leftì
  154. to right, the following information: (1) the directory that has beenì
  155. selected, in both DU and DIR (named directory) format; (2) the indicatorì
  156. "[PUBLIC]" if that directory is a ZRDOS public directory (if you don't knowì
  157. what this is, just ignore it); (3) the current time of day if DateStamper orì
  158. one of the new DOSs (ZSDOS or ZDDOS) is running; (4) the program's officialì
  159. name and version; (5) the text string "Current File:"; and (6) the name ofì
  160. the file currently being pointed to (this changes as the pointer is moved).
  161.  
  162.      At the bottom of the screen is a command prompt of the form
  163.  
  164.         Command? (/=Help, X=Quit):è
  165. The cursor (don't confuse this with the file pointer) is positioned afterì
  166. this command prompt to indicate that ZFILER is waiting for you to press aì
  167. key.
  168.  
  169.      The center 20 lines of the screen show the selected files.  Theì
  170. character string "-->" (only "->" in the five-column display) floats betweenì
  171. the rows of file names and designates the so-called "pointed-to" file.  Manyì
  172. of the ZFILER commands automatically operate on this file.
  173.  
  174.      What we have described so far is the main ZFILER screen, but it is notì
  175. the only one.  As the command prompt suggests, pressing the slash characterì
  176. (or "?" if you prefer) brings up a help screen that summarizes the built-inì
  177. commands of ZFILER.  This help screen replaces the file display but leavesì
  178. the status line at the top and the command line at the bottom, except thatì
  179. "/=Help" changes to "/=Files".  As you might, therefore, guess, pressingì
  180. slash again will take you back to the file display screen.
  181.  
  182.      I do not know if anyone makes use of this feature, but all ZFILERì
  183. command operations can be invoked from the help screen.  Although you cannotì
  184. see the file pointer, you can manipulate it in the usual way, and you canì
  185. tell what file you are pointing to from the name displayed at the upperì
  186. right on the status line.
  187.  
  188. ZFILER Commands
  189.  
  190.      I am not going to attempt to describe all of ZFILER's commands, but Iì
  191. will try to list most of them.  Basically, the commands fall into severalì
  192. classes.
  193.  
  194.      One classification reflects where the code for the command resides. ì
  195. There are two categories:
  196.  
  197.     A. Built-In Commands
  198.     B. Macro Commands
  199.  
  200. Class A includes the functions for which the code is part of ZFILER.  Macroì
  201. commands are like aliases in that they generate command lines that areì
  202. passed to the command processor for execution.  These commands make ZFILER aì
  203. shell.  In this column I will discuss only the built-in commands, and I willì
  204. take up the more complex subject of macro commands next time.
  205.  
  206.      A second classification depends on what the command acts on.  Threeì
  207. categories describe the object of the commands:
  208.  
  209.     1. the pointed-to file
  210.     2. a group of tagged files
  211.     3. neither of the above
  212.  
  213. We will begin the discussion with commands of class A3, resident commandsì
  214. that do not perform any action on the files.
  215.  
  216. Pointer Commands
  217.  
  218.      Class A3 includes the commands that move the file pointer.  These areìèshown on the help screen, and I will not list them here.  One can move theì
  219. pointer to the next file on the screen or to the previous one (withì
  220. wraparound); up, down, left, or right (with wraparound); to the first orì
  221. last file on the current screen; or to the very first or very last file ofì
  222. those selected by the file mask.  One can advance to the next screen ofì
  223. files or to the previous screen.  Obviously, some of these functions will beì
  224. redundant in some cases, such as when all the selected files can fit on oneì
  225. screen (think what happens when there is exactly one file selected).
  226.  
  227.      ZFILER learns from the TCAP the control characters sent by any specialì
  228. cursor keys on the keyboard (provided they send a single control characterì
  229. and provided the TCAP has been set up correctly), and it makes them generateì
  230. the up, down, left, and right functions.  If the cursor keys generateì
  231. control codes normally used for another function, then that function will beì
  232. lost (the cursor keys take precedence).  That can cause problems.  Oneì
  233. solution is to eliminate the definition of the cursor keys in the TCAP andì
  234. simply use the default WordStar diamond keys for those functions. ì
  235. Alternatively, one can patch ZFILER to use different keys for its ownì
  236. functions, but this is not straightforward to do, and I will not describe itì
  237. here.
  238.  
  239.      The "J" (Jump) command allows you to jump to a file that you name. ì
  240. This is very handy when there are many files in the display or when the fileì
  241. you want is not on the current screen.  Press the "J" key, and you will beì
  242. prompted for a file name.  You do not have to enter the exact name.  ZFILERì
  243. automatically converts what you type into a wildcard filespec, and it findsì
  244. the first file that matches.  For example, if you enter only "Z" followed byì
  245. a return, this is equivalent to "Z*.*", and ZFILER will move the pointer toì
  246. the first file that starts with a "Z".  Similarly, if you enter ".D", ZFILERì
  247. will move to the first file with a file type that starts with "D".
  248.  
  249.      The "J" function is very handy; however, there is more.  Many peopleì
  250. are not aware that you may press control-J to repeat the same search andì
  251. find the next matching file.  The search will wrap around from the end ofì
  252. the files back to the beginning.  This function is not listed on the helpì
  253. screen because I could not find room for it.
  254.  
  255. Other Non-File Commands
  256.  
  257.      Some other commands that do not act on files are: X, L, A, S, E, H, Z,ì
  258. and O.  "X", as the command prompt reminds you, is used to exit from ZFILER. ì
  259. Besides terminating the current execution of the program, it also removesì
  260. ZFILER's entry in the shell stack (if it did not, you would just reenter itì
  261. right away).
  262.  
  263.      We already spoke about the "L" (Log) command earlier.  The "A"ì
  264. (Alphabetize or Arrange or Alpha sort) toggles the way in which the filesì
  265. are sorted, namely alphabetically by the file name or by the file type.      ì
  266. The "S" (Status) command prompts you for a disk drive letter and then tellsì
  267. you the amount of space remaining on that disk.
  268.  
  269.      The "E" command (refresh scrEEn -- I know that's stretching things, butì
  270. "R" was already used) redraws the screen.  You might think that this wouldì
  271. never be needed, but there are two circumstances in which it comes in veryì
  272. handy.  One is when ZFILER is being used on a remote system.  It is trueìèthat very few RASs make ZFILER available, but I do on Z-Node #3.  If you getì
  273. some line noise, the screen can become garbled.  Then the "E" key can beì
  274. used to draw a fresh screen.
  275.  
  276.      The other circumstance in which the "E" command saves the day is withì
  277. Backgrounder-ii if you do not have a screen driver (I don't for my Conceptì
  278. 108 terminal -- never got around to writing one, partly because all theì
  279. programs I use frequently have a redraw key like this one).  I simply defineì
  280. a BGii key macro specifying "E" as the "redraw" key, save the keyì
  281. definitions to ZFILER.BG, and attach that definition to ZF.COM.  Thenì
  282. whenever I swap tasks back into ZFILER, BGii simulates my pressing the "E"ì
  283. key, and the screen is redrawn.  This often gives a faster screen refreshì
  284. than one gets with a full-fledged screen driver.
  285.  
  286.      The "H" (Help) command generates a macro command to invoke the Z-Systemì
  287. HELP facility.  To tell the truth, I have not used this and don't evenì
  288. remember precisely what it does.  I would have to look at the source code.
  289.  
  290.      The "Z" (Z-system) command prompts you for a command, and whatever youì
  291. enter is passed on to the Z-System multiple command line buffer forì
  292. execution.  When that command line is complete, ZFILER is reinvokedì
  293. automatically.
  294.  
  295.      When you use the "Z" command, you will normally be logged into theì
  296. directory that is currently displayed.  However, this will not always beì
  297. possible.  ZFILER allows you to select directories with user numbers from 0ì
  298. to 31.  Unless you are using a version of ZCPR33 or ZCPR34 with the HIGHUSERì
  299. option enabled, you cannot log into user areas above 15.  In that caseì
  300. ZFILER will put you in the directory your were in when you invoked ZFILER. ì
  301. In any case, the command prompt will indicate the directory from which yourì
  302. command line will be executed.
  303.  
  304.      Since commands you run using the "Z" function may put some informationì
  305. on the screen that you would not want ZFILER to obliterate immediately,ì
  306. there is a flag set that signals ZFILER to prompt you and to wait for you toì
  307. press a key before putting up its display.  Here is a tip for advancedì
  308. users.  If you enter your command line with one or more leading spaces, thisì
  309. shell-wait flag will not be set, and ZFILER will return without your havingì
  310. to press a key.  The leading spaces are stripped from the command lineì
  311. before it is passed to the command processor.  This means that you cannotì
  312. use a leading space to force invocation of the extended command processorì
  313. (ECP); you have to use the slash prefix instead.  A space and a slash willì
  314. force invocation of the ECP and will disable the shell-wait flag.
  315.  
  316.      The final command in class A3 is the "O" (Options) command.  It is aì
  317. complex topic, and I will leave it for next time.  If you can't wait untilì
  318. then, experiment with it.  It should not be able to do any harm to yourì
  319. system.
  320.  
  321. Single-File Built-In Functions
  322.  
  323.      Now let's discuss the commands in class A1, the built-in commands thatì
  324. act on the pointed-to file.  These are invoked by pressing one of theì
  325. following keys, whose meaning is indicated in parentheses: C (Copy), Mì
  326. (Move), D (Delete), R (Rename), V (View), P (Print), F (File size), T (Tag),ìèand U (Untag).  Some of these are self-explanatory, and I will not discussì
  327. them.
  328.  
  329.      The "C" command copies a file to another directory under the same name;ì
  330. it does not allow one to give a new name for the destination file (however,ì
  331. you can do that with a macro command).  The "M" command does not really moveì
  332. a file; it copies the file and then, if the copy was successful, deletes theì
  333. original file.  It is really a combination of "C" and "D".  Moving a fileì
  334. this way is inefficient if the destination directory is on the same drive asì
  335. the source file.  A macro command that invokes an ARUNZ alias can get aroundì
  336. this limitation (and almost all other ZFILER limitations).
  337.  
  338.      The tag and untag commands are used to select a group of files on whichì
  339. operations can be performed.  Tagged files are indicated in two ways.  Aì
  340. special character ("#") is placed after the file name in the display, and,ì
  341. if the terminal supports video highlighting, the file is highlighted.
  342.  
  343.      Two related commands are W (Wild tag) and Y (Yank back?).  "W" allowsì
  344. you to tag or untag groups of files designated by an ambiguous file spec. ì
  345. After tagged files are operated on by the built-in group commands describedì
  346. below, the tag marker "#" is changed to "'" (a soft tag).  The "Y" commandì
  347. changes the soft tags back into hard tags so that further group operationsì
  348. can be performed on those files.
  349.  
  350. Built-In Group Commands
  351.  
  352.      Group commands are initiated by pressing the "G" (Group) key.  Theì
  353. command prompt at the bottom of the screen changes to
  354.  
  355.     Command? (/=Help, X=Quit)  Group: (A,C,D,F,M,P,R,T,U,V)
  356.  
  357. For now we will consider only the built-in group functions (class A2) andì
  358. will take up group macro commands (class B2) next time.
  359.  
  360.      Except for the four functions described below, the letters invoke theì
  361. same action as the individual command corresponding to that letter, but theì
  362. function is performed on all the tagged files.  We will not discuss thoseì
  363. further.  Note in particular that the keys "A" and "R", however, have aì
  364. group function that is completely different from the individual function.
  365.  
  366.      The "U" and "T" group functions do not act on the tagged files; theyì
  367. change the tagging.  The former untags all files; the latter tags them all.
  368.  
  369.      The "R" group function is another one that does not, strictly speaking,ì
  370. act on the tagged files.  It reverses the tags, tagging the files that hadì
  371. been untagged and untagging the ones that had been tagged.  This can be veryì
  372. handy in several circumstances.  For example, you might want to copy all theì
  373. files except two.  It is easier to tag those two and then to reverse theì
  374. tags.  As another example, you might want to copy some of the displayedì
  375. files to one diskette and the others to a second diskette.  I do thisì
  376. frequently.  I begin by tagging the ones to go to the first diskette.  Thenì
  377. I group copy ("GC") them to the destination diskette.  Next, I yank back theì
  378. tags using the "Y" command and then reverse the tags with "GR".  Now I canì
  379. group copy the rest to the second diskette.
  380. è     The "A" (Archive) group command is very handy for automating backups. ì
  381. When it is entered, the tags are removed from any tagged file whose archiveì
  382. flag is set.  As a result, only files that have been modified since the flagì
  383. was last set will remain tagged.  In addition, the "A" group commandì
  384. automatically initiates a group copy operation but with one special feature. ì
  385. After the file has been copied successfully, the archive flag on the sourceì
  386. file is set to indicate that the file has been backed up.
  387.  
  388.      Under later versions of VFILER, the group "A" command automaticallyì
  389. tagged all unarchived files; under ZFILER it untags the archived ones.  Thisì
  390. difference is very important.  With VFILER, you were forced to back up allì
  391. the files selected by the VFILER file mask.  Under ZFILER you can select theì
  392. files that will be candidates for backing up.  If you want the achieve theì
  393. same function as under VFILER, just tag all the files first with "GT" andì
  394. then archive them with "GA".  On the other hand, if you want to exlude BAKì
  395. files from the backup, you can "GT" all files, untag the "*.BAK" files usingì
  396. the "W" command, and then use the "GA" command.
  397.  
  398.      After you enter the command "GA", you will be prompted for aì
  399. destination directory.  You do not have to supply one!  If you simply enterì
  400. a carriage return, the copy operation will be skipped, and you will be leftì
  401. with tags on the files that need to be backed up.  You can then use a macroì
  402. function to back them up in a specialized way, such as crunchingì
  403. (compressing) them to the backup disk (instead of copying them as they are)ì
  404. or putting them into a library on the backup diskette.  Next time we willì
  405. discuss the macro techniques required to do this.
  406.  
  407.  
  408.                            ZFILER, Installment 2
  409.                            =====================
  410.  
  411.    Last time we covered most of the built-in functions and had left theì
  412. macro commands for this time.  One built-in function was also deferred, theì
  413. option command "O", and we will take up that subject first.
  414.  
  415.  
  416.                              The Option Command
  417.  
  418.    When the option command letter "O" is pressed, a special options screenì
  419. is displayed.  Eleven operating characteristics can be changed from a menuì
  420. with the following appearance (approximately):
  421.  
  422.     A. single replace query        Y
  423.     B. group replace query        Y
  424.     C. archive replace query    N
  425.     D. verify query            Y
  426.     E. verify default        Y
  427.     F. suppress SYS files        Y
  428.     G. sort by file name        N
  429.     H. set copied file attributes    Y
  430.     I. use dest file attributes    Y
  431.     J. archive destination        Y
  432.     K. search path for CMD file    N
  433.  
  434. We will explain the meaning of each of these options in a moment.  First aìèfew words about the mechanics.  While the options menu is displayed,ì
  435. pressing the index letter at the left will cause the setting of theì
  436. corresponding option to be toggled, and the new state will be shown in theì
  437. column at the right.  The listing above shows the initial state of theì
  438. options in my personal version of ZFILER.  When you are finished togglingì
  439. options, just press carriage return to return to the main ZFILER menu. ì
  440. These option settings are stored in the ZFILER shell stack entry and willì
  441. thus continue in effect through all ZFILER operations until the command "X"ì
  442. is used to terminate the shell.
  443.  
  444.    The first three options concern how ZFILER responds when copying (orì
  445. moving) files and a file of the same name already exists in the destinationì
  446. directory.  Item A applies when individual files are copied (commands "C"ì
  447. and "M"); item B applies when a group copy is performed (commands "GC" andì
  448. "GM"); and item C applies when performing an archiving operation (commandì
  449. "GA").  If the option is "YES", then ZFILER will prompt one before existingì
  450. files are erased and give one the chance to cancel the operation for thatì
  451. file, leaving the existing file intact.  If the option is toggled to "NO",ì
  452. then existing files will be overwritten without even a message.
  453.  
  454.    The next two options affect the verification of the copied file in theì
  455. destination directory.  Item D determines whether or not the user will beì
  456. asked about verification.  If this option is set to "N", then the state ofì
  457. option E will determine whether or not verification is performed on fileì
  458. copies.  If this option is set to "Y", then before each copy, move, groupì
  459. copy, or group move, ZFILER will put up the prompt "Verify (Y/N)?".
  460.  
  461.    The next two options affect the way files are displayed on the screen. ì
  462. If item F is set to "Y", then files with the "system" or SYS attribute willì
  463. be suppressed, that is, not included among the selected files on whichì
  464. ZFILER acts.  This is a reasonable choice for this option, since the mostì
  465. common use of the SYS attribute is to make the files disappear fromì
  466. consideration during file maintenance and display operations.  Item G on theì
  467. options menu determines whether files are sorted first by name and then byì
  468. type or vice versa.  Changing this option is presently equivalent to the "A"ì
  469. command from the main ZFILER command menu.
  470.  
  471.    The next three options concern how file attributes are treated when filesì
  472. are copied.  One possibility is to create new files with a clean slate ofì
  473. attributes (that is, all attributes reset: not read-only, not SYS, notì
  474. archived).  This is what will happen when option H is set to "N" (but noteì
  475. option J, which may override this).  When the attributes of the destinationì
  476. file are to be set, they can be set in two possible ways.  If a file of theì
  477. same name existed in the destination directory, then its file attributesì
  478. could be used for the copy that replaces it.  This is what will be done ifì
  479. option I is set to "Y".  If option I is set to "N" or if there was noì
  480. matching file in the destination directory, then the attributes will be setì
  481. to match those of the source file.
  482.  
  483.    Option J can set a special override for the archive or ARC attribute.  Ifì
  484. the option is set to "N", then the ARC attribute is treated just like theì
  485. other attributes according to options H and I.  If option J is set to YES,ì
  486. then the destination file always has its ARC attribute set.
  487.  
  488.    There was at one time a great deal of controversy over the way the ARCìèattribute is handled under ZFILER.  At one time it was always reset, so thatì
  489. the destination file would be marked as not backed up.  Another school ofì
  490. thought asserted that, on the contrary, the file was backed up, since thereì
  491. was a copy of it on the source disk from which the file was copied.  Thatì
  492. latter argument made considerable sense in the case of copying files from aì
  493. master disk to a RAM disk before a work session.  Here it was certainlyì
  494. important to start with all files marked with the ARC attribute so that oneì
  495. could easily tell at the end of the session which files had been modified soì
  496. that they could be copied back to the permanent storage medium.
  497.  
  498.    All in all, I never understood this controversy.  Both approaches clearlyì
  499. have merit, and since ZFILER supports both, I saw no reason for all theì
  500. argument.  In a future version of ZFILER, I think I would like to add a flagì
  501. word that would indicate which drives should automatically set the ARC flagì
  502. when the J option is set to YES.  That way, the option could be made toì
  503. apply to RAM drives only.
  504.  
  505.    The final item on the option menu, option K, determines how the macroì
  506. command file ZFILER.CMD (see discussion below) will be located.  There areì
  507. two choices.  If option K is set to YES, then ZFILER will look for it firstì
  508. in the currently displayed directory and then along the entire ZCPR3 searchì
  509. path.  This option is useful if one wants to have different macro commandì
  510. files that apply to specific directory areas.  Alternatively, if option K isì
  511. set to NO, then ZFILER locates the CMD file without using the path. ì
  512. Depending on how ZFILER is configured (this will be discussed another time),ì
  513. the file will be sought either in the root directory of the path (the lastì
  514. directory specified on the search path) or in a specific drive/user areaì
  515. codeΣ int∩ ZF.COM«  Thi≤ alternativσ result≤ iε faste≥ operation¼ especiall∙ ì
  516. iµ thσ specifieΣ director∙ reside≤ oε ß RA═ disk.
  517.  
  518.    The options controlled by the option menu can also be permanently changedì
  519. in the ZFILER program file using a patching utility like ZPATCH.  In theì
  520. first page of the file, you will see the ascii string "OPT:".  The elevenì
  521. bytes following this string contain the startup values for the elevenì
  522. options.  Patch a byte to 00 for NO or FF for YES.
  523.  
  524.  
  525.                                ZFILER Macros
  526.  
  527.    Although ZFILER can accomplish many tasks using its built-in functions,ì
  528. its real power comes from the macro facility, which allows it to be extendedì
  529. to include any functions that can be performed using combinations of otherì
  530. programs.  This is where ZFILER really makes use of its power as a shell. ì
  531. First I will describe how the macro facility is used, and then I willì
  532. describe how the user defines the macro functions.  As with the built-inì
  533. functions, macro functions can operate either on single files or on groupsì
  534. of files.  The single-file macro facility is well developed and was alreadyì
  535. present in nearly the same form in VFILER; the group macro facility is newì
  536. with ZFILER and has not been fully developed yet.
  537.  
  538.  
  539. Invoking Macros
  540.  
  541.    One way to initiate a macro operation on the pointed-to file is to pressì
  542. the macro invocation key, which is normally the escape key.  A prompt ofìè"Macro:" will appear after the normal ZFILER command prompt.  At this pointì
  543. you have several choices.  If you know the key corresponding to the macroì
  544. you want to run, then you can simply press that key.  ZFILER will thenì
  545. construct a command line and pass it on to the command processor forì
  546. execution.  If ZFILER is configured for instant macro operation (itì
  547. generally is), then macros associated with the number keys "0" through "9"ì
  548. can be initiated without the macro invocation key; the number key enteredì
  549. alone at the main ZFILER command prompt will generate the macro function.
  550.  
  551.    If you press the macro invocation key a second time, a user-created helpì
  552. screen will be displayed.  This screen generally lists the available macroì
  553. functions.  You can now press the key for the desired function, or you canì
  554. press carriage return to cancel the macro operation and return to the mainì
  555. ZFILER menu.  The help menu screen will also be displayed if you press theì
  556. "#" key.  This is a holdover from VFILER and arises in part because of theì
  557. structure of the file in which the macros are defined (more on thisì
  558. shortly).
  559.  
  560.    Group macros are invoked in a similar way from the group function commandì
  561. line.  After you have tagged a group of files, press the "G" key to enterì
  562. group mode.  The prompt will list only the built-in group functions, but ifì
  563. you press the macro invocation key, you can proceed as described above forì
  564. single-file macro operations, except that the macro function will beì
  565. performed on each of the tagged files.
  566.  
  567.    The group macro facility works a little differently than the single-fileì
  568. macro facility.  Since the command line would generally not be long enoughì
  569. to contain the commands for all the tagged files, the group macro facilityì
  570. works by writing out a batch file for processing by ZEX or SUBMIT.  In thisì
  571. way there is virtually no limit to the number of files on which group macrosì
  572. can operate.
  573.  
  574.    There are many configurable options (described below) that are associatedì
  575. with the group macro operation.  These include the name of the ZEX or SUBì
  576. batch file, the directory to which it is written, and the command line thatì
  577. ZFILER generates to initiate the batch operation.  The NZ-COM version ofì
  578. ZFILER uses a file called ZFILER.ZEX and the command line "ZEX ZFILER".  Theì
  579. Z3PLUS version, under which ZEX will not run, uses a file called ZFILER.SUBì
  580. and a command line of "SUBMIT ZFILER".
  581.  
  582.    Since macros (and the main menu "Z" function) work by passing commands toì
  583. the command processor, file tags will be lost in the process, and whenì
  584. ZFILER resumes operation, it starts afresh.  In a future version of ZFILER,ì
  585. I hope to preserve the tag information by having it optionally written to aì
  586. temporary file (the shell stack entry is far too small) and read back inì
  587. when ZFILER resumes.
  588.  
  589.  
  590. Defining Macros -- The CMD File
  591.  
  592.    Now let's learn how to define the macro functions we want.  As Iì
  593. indicated earlier, the macros are defined in a file called ZFILER.CMD (theì
  594. ZFILER ComManD file).  In the version of ZFILER distributed with NZ-COM andì
  595. Z3PLUS, the CMD file is searched for in the root directory of the ZCPR3ì
  596. command search path.  As described earlier, the option menu allows theìèentire path to be used.  There are also some additional configurable optionsì
  597. that will be discussed another time.  You must be sure to put yourì
  598. ZFILER.CMD file in the appropriate directory.  If the file cannot beì
  599. located, you will still get the macro prompt, but, after you have specifiedì
  600. a macro key, the error message "ZFILER.CMD NOT Found" will be displayed.
  601.  
  602.    The ZFILER.CMD file is an ordinary text file that you can create with anyì
  603. editor or wordprocessor that can make plain ascii files (WordStar inì
  604. nondocument mode, for example).  The CMD file has two parts.  The first partì
  605. contains the macro command definitions; the second contains the help screenì
  606. (described earlier).
  607.  
  608.    In the first part of the CMD file, each line defines a macro.  Theì
  609. character in the first column is the key associated with that definitionì
  610. (case does not matter).  Macros can be associated with the 10 number keys,ì
  611. 26 letter keys, and all printable special characters except for "#"ì
  612. (explained below).  The space character and all control characters are notì
  613. allowed.  Owing to an oversight, the rubout character can be associated withì
  614. a macro!
  615.  
  616.    After the character that names the macro there can be any number ofì
  617. blanks (including zero).  If the first non-blank character is "!", then theì
  618. "strike any key" (shell-wait) prompt will appear before ZFILER puts up theì
  619. file display after a macro command is run.  This should be used whenever theì
  620. macro will leave information on the screen that you will want to read. ì
  621. After the "!" there can again be any number of spaces.  Any remaining textì
  622. on the line is taken as the script for the macro command.
  623.  
  624.    The second part of the CMD file starts when a "#" character is found inì
  625. the first column (hence the exclusion of that character as a macro name). ì
  626. Once that character appears, all remaining text, including text on the line,ì
  627. will be used as the help screen.  Since ZFILER will add some information toì
  628. the display (the name of the pointed-to file and a prompt), you willì
  629. generally want to keep the help screen to no more than 20 lines, includingì
  630. an extra blank line at the end for spacing.  With some experimentation youì
  631. will get the hang of designing this screen.
  632.  
  633.  
  634. Macro Scripts
  635.  
  636.    ZFILER macro scripts are similar to those in ARUNZ and in the other menuì
  637. shells (MENU, VMENU, FMANAGER) in that parameter expressions can appear. ì
  638. The critical parameters -- the ones that implement functions that cannot beì
  639. achieved any other way -- are those that convey information about theì
  640. directory currently displayed by ZFILER and about the pointed-to file. ì
  641. Parameters consist of a "$" character followed by one of the charactersì
  642. listed below.
  643.  
  644.     User prompt parameters
  645.  
  646.         '    User input prompt
  647.         "    User input prompt
  648.  
  649.     Parameters for directories
  650.       - currently displayed directoryè        C    DIR form
  651.         D    Drive letter
  652.         U    User number
  653.       - home directory (from which ZFILER was invoked)
  654.         H    DU form
  655.         R    Home DIR
  656.  
  657.     Parameters for pointed-to file
  658.  
  659.         P    Full information (DU:FN.FT)
  660.         F    File name (FN.FT)
  661.         N    File name only
  662.         T    File type only
  663.  
  664.     Special parameters
  665.  
  666.         !    GO substitution indicator
  667.         $    The dollar character
  668.  
  669.  
  670.    The parameters are listed in a special order above, and we will explainì
  671. that later.  First we will just present the meaning for each parameter.
  672.  
  673.    The parameter expressions $" and $' are used to display a prompt messageì
  674. to the user and to read in a response string.  Single and double quotes areì
  675. equivalent.  Once the prompt parameter has been detected, all subsequentì
  676. characters up to one of the quote characters are displayed as the userì
  677. prompt.  Thus, if I am not mistaken, there is presently no way to put eitherì
  678. quote character into the prompt.  The end of the line or the end of the fileì
  679. will also terminate the prompt.
  680.  
  681.    No special character interpretation is performed while expanding theì
  682. prompt.  If you want to make fancy screens, you can include escape sequencesì
  683. and some control characters (obviously carriage return won't work).  In theì
  684. future, ZFILER should be enhanced to provide a means to generate all controlì
  685. characters, to allow special characters to invoke screen functions based onì
  686. the current terminal definition, and to expand directory and file parametersì
  687. in the prompt.
  688.  
  689.    Now for the directory parameters.  Parameters C, D, and U returnì
  690. information about the currently displayed directory, while H and R returnì
  691. information about the home directory, the one from which ZFILER wasì
  692. originally invoked.  PLEASE NOTE: macros always operate from the homeì
  693. directory.  The reason for this is that ZFILER can display directories withì
  694. user numbers higher than 15 even when it is not possible to log into theseì
  695. areas.  If you want to operate in the displayed directory, then your scriptì
  696. must include an explicit directory-change command of the form "$D$U:" at theì
  697. beginning (or "$C:" if your system requires the use of named directories)ì
  698. and a command of the form "$H:" (or "$R:") at the end.
  699.  
  700.    One special note about the parameters that return directory names.  Ifì
  701. the directory has no name, then the string "NONAME" is returned.  This willì
  702. presumably not match any actual name and will lead, one hopes, to a benignì
  703. error condition.  These parameters are included only for systems that do notì
  704. allow directories to be indicated using the DU form (I hope that few if anyìèsystems are set up this way).
  705.  
  706.    Now we come to the four file name parameters.  They allow us to generateì
  707. easily the complete file specification or any part of it.  Note that "$F" isì
  708. not quite the same as "$N.$T".  The latter always contains a dot; the formerì
  709. does not if the file has no file type.
  710.  
  711.    Finally, we have two special parameters.  "$$" is included to allow aì
  712. dollar sign character to be entered into the script.  "$!" is a controlì
  713. parameter that is used only when a group macro is executed.  If it is placedì
  714. immediately before a token (string of contiguous characters), then thatì
  715. token will be replaced by the string "GO" on all but the first expansion ofì
  716. the script.  This allows group macro scripts to operate faster by avoidingì
  717. repetitive loading of a COM file.  It must be used with great care andì
  718. consideration, however, for reasons that I will not go into here.
  719.  
  720.  
  721. Rules for Script Expansion
  722.  
  723.    ZFILER follows a specific sequence of steps when expanding a script, oneì
  724. that gives it a special feature that, I would guess, few users are aware of. ì
  725. The first step in the expansion is to process only the user-input promptì
  726. parameters, substituting for the prompt whatever the user entered inì
  727. response.  This results in a modified script that is then processed by theì
  728. second step in the expansion.  Because the expansion is handled this way,ì
  729. the user input can include ZFILER script parameters!  Thus the script canì
  730. be used to write a script.  You will see an example of this later.
  731.  
  732.    The second step in the expansion is to substitute values for theì
  733. directory parameters, which are a kind of constant.  They do not change as aì
  734. function of the pointed-to file.  Finally, in a third step, the remainingì
  735. parameters are expanded.  For group macros, this final step in the expansionì
  736. is repeated for each of the tagged files.  The file parameters are expandedì
  737. differently for each file, and, starting with the second tagged file, theì
  738. "$!" parameter causes "GO" substitution.
  739.  
  740.  
  741. Macro Examples
  742.  
  743.    Listing 3 shows an example of a ZFILER.CMD file, one designed toì
  744. illustrate some techniques of macro writing.  While writing this article, Iì
  745. discovered that one can include blank lines as shown to make the CMD fileì
  746. easier to read.  The help screen part of the listing is taken from myì
  747. personal script file (which, I have to confess, I have not really workedì
  748. very hard at).  The macro definition part of the listing includes only a fewì
  749. of the definitions.
  750.  
  751.    The macro "Q" is included to illustrate a very simple, but useful, typeì
  752. of macro.  It invokes the very powerful file typing program QL (quick look)ì
  753. on the pointed-to file.  This is handy when you want more powerful viewingì
  754. capability than that offered by the built-in "V" command.  QL can handleì
  755. crunched files and libraries, and it can display text or hex forward orì
  756. backward.
  757.  
  758.    Macro "U" uncompresses a file.  It illustrates a more complex script thatìèinvolves flow control and parameters that extract individual components ofì
  759. the pointed-to file name.  It tests the file type to see if the middleì
  760. letter is "Q" or "Z".  In the former case, it unsqueezes the file; in theì
  761. latter, it uncrunches it.  The uncompressed file it put into the sourceì
  762. file's directory.
  763.  
  764.    Macros S, K, and B illustrate the use of input prompting.  The first oneì
  765. allows the user to specify the file attributes to be set.  Note that theì
  766. prompt includes a helpful reminder of the syntax required by SFA.
  767.  
  768.    Macro K crunches files to a user-specified destination.  It alsoì
  769. illustrates how one logs into the currently displayed directory.  I do thisì
  770. here so that a null answer to the prompt (i.e., just a carriage return) willì
  771. result in the crunched files being placed in the currently displayedì
  772. directory rather than in the home directory, as would otherwise be the caseì
  773. (since that is where the macro runs from, remember).  As a result, however,ì
  774. this macro will not operate properly in user areas above 15 under BGii orì
  775. versions of the command processor that do not allow logging into high userì
  776. areas.
  777.  
  778.    Macro B performs a slightly more complex function.  It not onlyì
  779. compresses the pointed-to file to a specified destination directory, but itì
  780. then marks the source file as having been backed up.  A combination of theì
  781. group archive built-in command (to tag files that need backing up) and aì
  782. group macro B (to perform the backup) gives the ZFILER user a way to back upì
  783. files in crunched form on the backup disk.
  784.  
  785.    Macro M is included to show that a ZFILER macro, when it needs to doì
  786. something more complex than it is capable of doing all by itself, can passì
  787. the task to an ARUNZ alias.  The MOVE alias first determines whether theì
  788. source and destination are on the same drive.  In that case, MOVE.COM isì
  789. used to perform the move.  Otherwise, the source file is copied to theì
  790. destination and then deleted.  What we have, therefore, is a MOVE commandì
  791. that frees the user of the responsibility of worrying about which drives areì
  792. involved -- another example of how Z-System can free you from considerationsì
  793. that need not concern you, that do not require human intelligence to decide.
  794.  
  795.    The final three macro examples are execution macros.  Macro X causes theì
  796. pointed-to file to be executed.  A more sophisticated version might check toì
  797. make sure that the file type is COM.  I opted for the flexibility ofì
  798. pointing, for example, to PROGRAM.Z80 and having PROGRAM.COM run.  If thereì
  799. is no COM file with a matching name, the error handler will take care ofì
  800. things.  You will note the leading colon before the "$n" parameter.  Itì
  801. makes sure that the current directory is searched even if it is not on theì
  802. path.  Prompted input is used to allow a command tail to be included.
  803.  
  804.    The Z macro performs a user-specified function on the pointed-to file. ì
  805. Two separate user prompts allow both the command and a command tail to beì
  806. given.  For example, if you wanted to squeeze the file to A0:, you wouldì
  807. enter "SQ" in response to the first prompt and "A0:" in response to theì
  808. second.
  809.  
  810.    The 0 macro illustrates how the response to a prompt can be used as aì
  811. ZFILER script.  This macro takes care of all those functions we forgot toì
  812. include in ZFILER.CMD.  The whole macro is just prompted input, and whateverìèwe answer will be run as a script.  I use this function so often that I putì
  813. it on a number key so that it can be invoked with a single key rather thanì
  814. the usual pair.  Also, as you may have noticed, I include in the macro helpì
  815. screen a list of the parameters that can be used.
  816.  
  817.    The only real limitation of this macro-to-write-a-macro approach is thatì
  818. prompted input cannot be included in the response.  As I write this,ì
  819. however, it occurs to me that this limitation could be overcome byì
  820. recursively parsing the prompt parameters until none remain, and only thenì
  821. going on to the subsequent macro expansion steps.
  822.  
  823.    Well, I was going to discuss patching and configuring ZFILER, but thisì
  824. article is already too long, so that will just have to wait for anotherì
  825. time.  I hope that this article will help you get more out of ZFILER.  Seeì
  826. you in the next issue!
  827.  
  828.  
  829.  
  830.                                   LISTIN╟ 3
  831.                                   ---------
  832.  
  833. Q   ql $p
  834.  
  835. U ! if $t=?q?;$!sys:uf $p $d$u:;else;$!sys:uncr $p $d$u:;fi
  836.  
  837. S ! $!sfa $p $" SFA Options (/o,o.. o=ARC,-ARC,R/O,R/W,SYS,DIR): "
  838. K ! $d$u:;$!crunch $f $"Destination directory (DU:) -- ";$h:
  839. B   $d$u:;crunch $f $"Destination directory (DU:) -- ";sfa $f /arc;$h:
  840.  
  841. M ! /move $p $"Destination directory for move: "
  842.  
  843. X ! $d$u:;:$n $" Command Tail: ";$h:
  844. Z ! $d$u:;$" Command to perform on file: " $f $" Tail: ";$h:
  845. 0 ! $"Enter ZFILER macro script: "
  846. #           SAMPLE ZFILER MACROS FOR TCJ
  847.  
  848. 0. on-line macro    A. set Archive bit        N. NULU
  849. 1. LPUT            B. Backup (cr/sfa)        O.
  850. 2. Z80ASM to COM    C. CRC                P. Protect
  851. 3. Z80ASM to REL    D. Date display            Q. QL
  852. 4. Compare Files    E. Edit                R.
  853. 5.            F.                S. SFA
  854. 6.            G.                T. Type
  855. 7.            H.                U. Uncompress
  856. 8.            I.                V. VLU
  857. 9.            J.                W.
  858.             K. Krunch            X. eXecute
  859.             L. LDIR                Y.
  860.             M. Move                Z. run command
  861.  
  862. $!  ZEX 'GO'        $D  DRIVE        $P  DU:FN.FT    $F  FN.FT
  863. $".."  PROMPT        $U  USER        $N  FN        $T  FT
  864. $'..'  PROMPT        $H  HOME
  865.  
  866.