•  Back 
  •  GEMDOS 
  •  Index 
  •  Tree View 
  •  Cross references 
  •  Help page 
  •  Show info about hypertext 
  •  View a new file 
Topic       : TOS - The Operating System
Author      : 
Version     : tos.hyp (December 19, 2008)
Subject     : Programmieren/Atari
Nodes       : 3010
Index Size  : 93790
HCP-Version : 5
Compiled on : Atari
@charset    : atarist
@lang       : 
@default    : Title
@help       : 
@options    : +g -i -s +x +zz -t4
@width      : 70
View Ref-File5.18  ARGV procedure                                               TOS

The ARGV procedure serves for passing extended command lines, and was 
specified officially in the autumn of 1989 by Ken Badertscher (of 
Atari USA). The procedure works as follows:

The environmental variable ARGV indicates that this procedure is being 
used; the value of the variables does not play a part in this, only 
its presence is decisive. The ARGV variable must be the last 
environmental variable, so that the called program can continue to use 
the "front" part as its normal environment.

The extended command line is now simply written as a series of strings 
(NULL-terminated !) after ARGV in the environment. The first string 
here contains the name of the launched program, in the same way that 
it is passed with Pexec (and corresponds to the so far unused 
argv[0]). The following strings contain the individual parameters, in 
which space characters may appear too; the end of the list is 
indicated by a double 0, as for a normal environment.

Beyond that one passes the value 127 with Pexec as the length-byte 
(first byte of the command line), which due to the existing length 
restriction to 125 bytes could not be accepted until now. This allows 
the called program to make sure that the values passed in the 
environment are really valid and have not been left behind by a 
program that does not know the ARGV standard, perhaps.

Depending on whether one wants to pass parameters to programs via ARGV 
or just to read them, one proceeds in one of the following two ways:

∙ ARGV with a launched program

First establish whether the variable ARGV is present in the 
environment. If this is the case and the command line length-byte has 
the value 127, then one finds after the first 0 following ARGV (since 
the variable could have a value) the individual command line 
parameters. At the end one should set the first letter of 'ARGV' to 0 
so that the environment takes the standard form again.

∙ ARGV at the caller

First a new environment has to be created for the program to be 
called. To do this, calculate, say, the length of the environment 
already present, add the length of the command line and allocate a 
corresponding number of bytes. Then copy the existing environment (and 
during this remove any existing ARGV variable), followed by the 
command line parameters one after the other (each NULL-terminated). A 
final NULL concludes the environment. At the end pass the magic value 
127 in the length-byte of the command line.

∙ Extension of the ARGV procedure

A problem with the original definition of the ARGV procedure was not 
being able to pass empty parameters (two zeros following each other 
will terminate the environment !). To be able to pass these 
nevertheless, the procedure was extended as follows:

   . Empty parameters are set in the command line in single quotation 
     marks, and appear in the environment as exactly one space.

   . A value is defined for the variable ARGV: if this starts with 
     'NULL:', the rest of the line contains comma-separated positions 
     of the empty parameters. Example: ARGV=NULL:3,5,9 means that 
     argv[3], argv[5] and argv[9] are empty. The startup code should 
     then be responsible for deleting the corresponding parameters.

Note: To ensure maximum compatibility to old programs, the extended 
ARGV procedure should be used only when empty parameters actually have 
to be passed. In all other cases one should fall back to the original 
definiton.

∙ ARGV procedure as of MagiC 3.0

From MagiC 3 onwards the ARGV procedure is supported by Pexec in three 
different ways:

   . If the length-byte of the command line is 127, Pexec assumes that 
     the calling program supports ARGV and the environment has been 
     manipulated accordingly already; the environment is not changed, 
     therefore.

   . If the length-byte is 254, MagiC expects directly after it the 
     string "ARGV=", followed by a NULL-byte and a list of parameters 
     terminated by two NULL-bytes. By passing "ARGV=NULL..." etc. one 
     can also use the extended ARGV procedure that permits passing of 
     empty parameters (see above).

     Pexec deletes any ARGV present and enters the new environment. 
     The command line consists only of the value 127 as an indicator 
     that the parameters lie in the environment. This procedure is 
     suitable if it is certain that the called program can handle the 
     ARGV procedure.

   . If the length-byte is 255, MagiC expects directly after it a 
     space-separated and NULL-byte terminated list of parameters (as 
     the command line is passed generally). Pexec deletes any ARGV 
     that may be present, creates a list of arguments from the command 
     line and enters these as ARGV into the environment. The program 
     file path that was passed to Pexec will be taken as argv[0]. If 
     this path is invalid the result will be rubbish, so one should 
     pass a sensible program name even with mode 5 of Pexec (create 
     basepage). With mode 7, argv[0] will simply be called "NONAME", 
     since no name is passed in this case.

     The command line has 127 as a length-byte as an indicator of the 
     presence of ARGV. If the length of the command line is < 127, 
     then it will also be copied to the basepage, otherwise the 
     command line consists only of the value 127. This procedure is 
     suitable if the called program is not certain that it understands 
     ARGV.