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 / CPM / ZCPR33 / A-R / FOR-NXT2.LBR / FOR-NEXT.HZP / FOR-NEXT.HLP
Text File  |  2000-06-30  |  13KB  |  319 lines

  1. ;
  2.                    ZCPR3 LOOP CONTROL PROGRAMS
  3.  
  4.  
  5.  
  6.                         I  Introduction
  7.  
  8.  
  9.           F  FOR           N  NEXT           P  PERFORM
  10.  
  11.  
  12.                         A  Applications
  13.  
  14.                         E  Error Codes
  15. :I
  16.                                Introduction
  17.                                ------------
  18.  
  19.      The three programs FOR.COM, NEXT.COM, and PERFORM.COM allow you to
  20. easily carry out certain kinds of repetitive tasks.  They are especially
  21. well-suited to conditions in which the same operation must be carried out
  22. repeatedly, each time using a different file name or other parameter.  The
  23. actions of the three programs are:
  24.  
  25.      FOR <args>  -  Establishes the list of arguments to be used
  26.  
  27.      NEXT <var>  -  Puts the next argument from the list into the specified
  28.           system (shell) variable
  29.  
  30.      PERFORM <cmd_line>  -  Executes the specified command line once for
  31.           every argument in the list, substituting the current argument as
  32.           directed. 
  33.  
  34.                                                                Introduction
  35.  
  36.  
  37.      Ordinarily only NEXT or PERFORM will be used in conjuction with a
  38. single invokation of FOR, although there may be times when you want to use
  39. both.  Nested FOR/NEXT/PERFORM invokations--within a single directory--are
  40. not currently supported. 
  41.  
  42.      All three of these programs are command-line driven; all their
  43. arguments must be supplied when they are invoked.  Details of the syntax
  44. are presented in other sections, as appropriate.  In these syntax diagrams
  45. angle brackets (<>) indicate required arguments and square brackets ([])
  46. indicate optional arguments. 
  47.  
  48. :F
  49.                                   FOR.COM
  50.                                   -------
  51.  
  52.  
  53.      FOR.COM is used to specify a list of arguments that will subsequently
  54. be used to control the number of loops to be performed.  Each argument may
  55. also be used as a parameter within each loop.  The types of argument lists
  56. that can be constructed using FOR.COM are:
  57.  
  58.      o    Filenames -- wildcards can be expanded or not, as you choose.
  59.           Filenames matching several different ambiguous specifications can
  60.           be collected in one list.  If an explicit directory reference
  61.           precedes an ambiguous name, all expansions will also include the
  62.           directory specification. 
  63.  
  64.      o    Arbitrary strings -- these may include spaces
  65.  
  66.      o    All named directories
  67.  
  68.      o    Numbers -- all integers up to a specified number will be written
  69.           into the list.  The limit may be specified directly or one of
  70.           ZCPR3's numeric registers may be used. 
  71.  
  72.                                                                         FOR
  73.  
  74.  
  75.      All arguments to FOR.COM are specified on the command line.  The
  76. syntax of this command takes three basic forms, as shown on this and
  77. following screens. 
  78.  
  79. 1)   FOR <[du:|dir:]fn.ft> [<[du:|dir:]fn.ft>] [/X]
  80.  
  81. where the 'X' option indicates that all ambiguous filenames are to be
  82.      expanded.  If an ambiguous filename is prefaced with a DU: or DIR:
  83.      specification, its expansions will all also contain the directory
  84.      specification.  If the "/X" flag is omitted, the arguments may be any
  85.      set of strings containing no blanks; i.e., the arguments need not be
  86.      filenames. 
  87.  
  88.                                                                         FOR
  89.  
  90.  
  91.  
  92. 2)   FOR 'one string' "another string" \a third string\ /S
  93.  
  94. where the 'S' option is REQUIRED to indicate that the list elements are
  95.      delimited strings.  Any non-blank character except the virgule (/) and
  96.      comma may be used as a delimiter. 
  97.  
  98.                                                                         FOR
  99.  
  100.  
  101.  
  102. 3)   FOR /o
  103.  
  104. where 'o' can be D, R, or N, with the following meanings:
  105.  
  106.      D  --  list all named directories
  107.      Rn --  list all integers up to that contained in register 'n',
  108.           one per line.  The list is zero-based
  109.      Nn --  list all integers up to 'n', one per line (zero-based).
  110.  
  111.                                                                         FOR
  112.  
  113.  
  114.      In all circumstances, only one option is appropriate.  You cannot
  115. construct a list, for example, that is made up of filenames and directory
  116. names. 
  117.  
  118.      The list is written to a system file in the current directory.  The
  119. name of this file (as of the first release) is FORFILES.SYS.  This is an
  120. ordinary ASCII file, so that if you need a list of parameters that cannot
  121. be constructed with FOR.COM, you can create this file with any text editor
  122. that creates ordinary ASCII files. 
  123.  
  124. :N
  125.                                  NEXT.COM
  126.                                  --------
  127.  
  128.      NEXT.COM is used to copy the next item in the list of arguments
  129. (created with FOR.COM) into a shell variable.  The syntax is:
  130.  
  131.                               NEXT <varname>
  132.  
  133. You may use any variable name you like.  The input file ('FORFILES.SYS')
  134. must be in the current directory.  The shell variable file is looked for
  135. first in any directory named 'ROOT' and, if not found there, in the
  136. directory at the root of the path. 
  137.  
  138.      The only option is help, which is exclusive. 
  139.  
  140.      After this command is executed, the contents of the shell variable can
  141. be accessed with RESOLVE.COM or directly via the SH shell. 
  142.  
  143.                                                                        NEXT
  144.  
  145.  
  146.      This program is designed principally for use within a looping command
  147. structure.  This may be a ZEX script, a recursive alias or SUBMIT script,
  148. or a custom shell installed with SHSET (ordinarily combined with an
  149. alias).  The skeleton of such a command structure should be:
  150.  
  151.                     NEXT <var>
  152.                     <conditional test>
  153.                     ...
  154.                     <additional commands as necessary,
  155.                      to be executed if the condition is TRUE>
  156.                     ...
  157.                     <loop command>
  158.  
  159. The additional commands will typically include one or more invokations of
  160. RESOLVE to expand references to the current "FOR" argument (as saved in a
  161. shell variable).  The loop command should be GOTO for ZEX scripts, an alias
  162. name for recursive aliases, a SUBMIT command for recursive SUBMIT scripts,
  163. and a SHCTRL POP instruction for a custom shell. 
  164.  
  165.                                                                        NEXT
  166.  
  167.  
  168.      The conditional test should be performed immediately after NEXT is
  169. run.  Note that there is no way of recognizing the last argument in the
  170. list.  Only when NEXT is run again, and fails, can the end of the list be
  171. detected.  In this condition the shell variable will be set to null (that
  172. is, the name will exist, but will evaluate to nothing) and the ZCPR3
  173. Program Error Code will be set to a value corresponding to 'file not found'
  174. (see the section on error codes).  Thus, when used in a loop, as it is
  175. intended, the possible exit conditions for the loop are:
  176.  
  177.      -  an empty shell variable (IF NUL <varname>).
  178.      -  absence of the file-list (IF  EXIST FORFILES.SYS),
  179.      -  a program error (IF ERROR),
  180.  
  181.  
  182.      The second of these is not recommended because in future releases the
  183. file name may be dynamically changeable, particularly if nested FOR/NEXT
  184. calls within a directory are supported.  The third is not recommended if
  185. your system cannot distinguish between different Program Error Codes. 
  186. :P
  187.                                 PERFORM.COM
  188.                                 -----------
  189.  
  190.  
  191.      PERFORM.COM provides an easier way to perform loops than by using
  192. scripts, custom shells, and aliases.  A single command line can be used
  193. instead.  The syntax is:
  194.  
  195.                           PERFORM <command line>
  196.  
  197.  
  198.      The command line passed to PERFORM will be executed once for every
  199. line in FORFILES.SYS (which is created by FOR.COM).  Two special symbols
  200. within the command line are recognized by PERFORM; the symbols and their
  201. meanings are:
  202.  
  203.      $X   -- the current line from FORFILES.SYS
  204.      $|   -- a substitute multiple-command separator (";").
  205.  
  206.                                                                     PERFORM
  207.  
  208.  
  209. The leading "$" will be stripped off all unrecognized symbols. 
  210.  
  211.      The "$|" symbol must be used if you want to carry out more than one
  212. command for each line in FORFILES.SYS.  Alternatively, you can group these
  213. commands into an alias and simply say "PERFORM <aliasname> [$X]". 
  214.  
  215.      An additional convenience provided by PERFORM is that it always
  216. returns to the directory from which it was called.  This is necessary so
  217. that it can find FORFILES.SYS and its own temporary file.  When writing
  218. scripts for use with NEXT.COM you must attend to this detail yourself.
  219. Note, however, that PERFORM does not provide any new capability beyond that
  220. which can be achieved with NEXT.  Its advantage lies in simpler invokation
  221. and, in some cases, greater speed. 
  222.  
  223.      PERFORM installs itself as a shell, and so the shell stack must not be
  224. full when it is invoked.  Any pending commands in the multiple-command
  225. buffer will be saved when PERFORM is run and restored when it is
  226. completed. 
  227. :A
  228.                                APPLICATIONS
  229.                                ------------
  230.  
  231.  
  232.      This section contains some (unrelated) hints and notes regarding the
  233. use of these three programs.  The few examples presented here are meant to
  234. be illustrative and not exhaustive.  These programs are meant to be tools
  235. with which you can develop custom applications to suit your own needs. 
  236.  
  237.      If the "/Nn" or "/Rn" options are used with FOR.COM and a 1-based list
  238. is needed, the first element can be removed with 'NEXT' and not used. 
  239.  
  240.      NEXT can also be used to skip one or more lines or retrieve the next
  241. line while still processing the "current" one.  For example, consider the
  242. line:
  243.  
  244.       PERFORM ECHO CURRENT IS $X$|NEXT VAR$|RESOLVE ECHO NEXT IS %VAR
  245.  
  246.                                                                Applications
  247.  
  248.  
  249.      Remember that a text editor can be used to create FORFILES.SYS.  If
  250. you have a list of arguments that you want to use repeatedly, and that
  251. cannot be generated by FOR.COM, enter that list into a text file and make a
  252. copy of that file named FORFILES.SYS every time you need to use it. 
  253.  
  254.      Don't forget that PERFORM will strip a "$" off of every unrecognized
  255. symbol, so if you are using RESOLVE to access system file names or
  256. registers, be sure to include an extra "$". 
  257.  
  258.      One of the simplest applications is to create a list of files to copy,
  259. back up, protect, or otherwise manipulate.  For example:
  260.  
  261.                FOR *.DAT *.DOC /X
  262.                PERFORM CRYPT $X$|PPIP B:=$X$|ERA $X
  263.  
  264.                                                                Applications
  265.  
  266.  
  267.      If you are initializing your RAM-disk and want to copy all of the
  268. ST.COM files from named directories to the corresponding user areas of the
  269. RAM-disk, you might use a pair of commands like:
  270.  
  271.                FOR /D
  272.                PERFORM $X$|IF EX ST.COM$|PPIP E:=ST.COM$|FI
  273.  
  274. where the E drive is your RAM-disk.  Note that you may want to load a
  275. special .NDR file or test the directory name before doing the copy. 
  276.  
  277.      If you wanted to perform a similar task, but upon all user areas
  278. rather than just named directories, you might say:
  279.  
  280.                FOR /N32
  281.                PERFORM IF EX $X:JUNK.FIL$|ERA $X:JUNK.FIL$|FI
  282.  
  283.                                                                Applications
  284.  
  285.  
  286.      Numeric lists can be handy for automatically constructing filenames.
  287. For example, suppose you have a mathematical model and you want to run it
  288. repeately, using five different sets of input data and producing five sets
  289. of output, you might say:
  290.  
  291.                FOR /N5
  292.                PERFORM FISHMORT FISHIN$X.DAT FISHMOD$X.OUT
  293.  
  294.  
  295.      You can nest FOR/NEXT tasks by performing them in different
  296. directories.  For example:
  297.  
  298.                FOR <args1>
  299.                PERFORM ROOT:$|FOR <args2>$|PERFORM <task2>
  300.  
  301. :E
  302.                                 ERROR CODES
  303.                                 -----------
  304.  
  305.      These three programs use a consistent set of codes to indicate what
  306. type of error (if any) was encountered during execution.  Upon an error,
  307. the Program Error Code will be set to one of the following values:
  308.  
  309.  
  310.                1    Can't open input file
  311.                2    Can't open output file
  312.                3    Can't read input file
  313.                4    Can't write output file
  314.                5    Can't close output file
  315.  
  316.  
  317.      If your system (i.e., the IF ERROR command) can distinguish these, you
  318. can provide better error responses. 
  319.