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.