Please enable JavaScript to view this site.

A-Shell Reference

Updated February 2021

Syntax one:

.ARGTYP(argno)     or     .ARGSIZ(argno)

These two dot functions return the type and size of the specified argument passed to the current SBX, function, or procedure. If argno is invalid, the return value will be -1. The argument types are made up of the bits shown in the following tables.

Syntax two:

.ARGTYP(@arg)     or     .ARGSIZ(@arg)

The concept here is similar to that used for XPUTARG @arg: @arg is treated essentially as a macro for the argument number corresponding to the argument @arg as defined in the function/procedure definition or as retrieved in an SBX using XGETARG(S).

Symbol

Value

Description

ARGTYP_MASK

&h000f

mask for types X,S,F,B,I

ARGTYP_X

&h0000

X type (mutually exclusive)

ARGTYP_S

&h0002

S type ("  "   ")

ARGTYP_F

&h0004

F type ("  "   ")

ARGTYP_B

&h0006

B type ("  "   ")

ARGTYP_I

&h0008

I type ("  "   ")

 

Symbol

Value

Description

ARGTYP_ARRAY

&h0010

Array

ARGTYP_NOSURR

&h0020

No surrogate

ARGTYP_DYN

&h0040

Dynamic variable

ARGTYP_LOCAL

&h0080

Local dynamic variable

ARGTYP_SBR

&h0100

Variable within SBX or XCALL AMOS

ARGTYP_READONLY

&h0200

See notes below

 

Warning: These functions are not recognized by runtime versions prior to 6.1.1373.0, and will simply return the value of the argno passed. You could use this fact to test if the feature is supported at runtime by passing an illegal argno, such as 999 or -2, to .ARGTYP(argno). If supported, the return value will be -1 (error); else if will match the argno passed. If developing code that might possibly have to run on such an old version, use MX_GETVER or the wrapper function Fn'MinAshVer() in fnminsasver.bsi in SOSLIB:[907,10] to check the version first.

ARGTYP_READONLY

This flag will be set if the passed argument is a literal value, expression, or otherwise incapable of receiving an updated value. This provides a good way for routines to be able to decide whether it is worth generating and returning values for output parameters. For example:

Function Fn'Foo(arg1=0 as b2, arg2="" as s0, arg3=-1 as f6)

    ...

    ! calc and return arg3 if not readonly

    if not .ARGTYP(@arg3) and ARGTYP_READONLY then

        <calculate updated arg3 value>

        .xputarg @arg3

    endif

    ...

The new flag is set by the runtime system (beginning in A-Shell 6.4.1553.0) and is independent of the compiler version. Prior versions of the runtime will never set the ARGTYP_READONLY flag and thus logic like that above would would always calculate and output the parameter when running on earlier runtime versions (i.e. dependability over optimization). In the above example, the use of default values will guarantee that the function receives three parameters, but in general, you may want to use the .ARGCNT dot variable, and/or check for special default values, to avoid wasting time, however harmlessly, generating return values for parameters that were not passed.

SBX Example

xgetargs color, rvalue, gvalue, bvalue

xgetarg 5, name

...

if .argtyp(@gvalue) and ARGTYP_B then ...  ! if gvalue arg binary

if .argtyp(3) and ARGTYP_B then ...        ! if 3rd arg binary (same as above)

if .argtyp(@name) and ARGTYP_S then ...    ! if name arg string

 

The above example illustrates that in the case of an SBX, the @arg reference is based on the order that the referenced variable appears in the xgetargs statement, or the argument number associated with it in a preceding xgetarg statement. Usually the @arg syntax is preferred, since it self-adjusts if you alter the parameter list, but in some cases it might be preferable to stick with the numeric argument numbering.

History

2017 September, A-shell 6.5.1616, compiler edit 834:  Add support for .ARGTYP(@arg) and .ARGSIZ(@arg).

2017 July, A-Shell 6.4.1553:  ARGTYP_READONLY added to A-Shell.

2014 September, A-Shell 6.1.1373:  Functions added to A-Shell.