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