![]() |
![]() HP OpenVMS Systemsask the wizard |
![]() |
The Question is: 1. can I define a command, either foreign or in cld, that can have arbitrary characters appended to the name? example: the command is workhard but if the user types workharder or workhardxx1 the same program will be run. 2. having solved 1, can the program now see what the appended characters are? The Answer is : Sort of. In its current implementation, the DCL command interpreter only considers the first four characters of any command. Thus, for instance, the command verb "DELEGATE" would be interpreted as "DELETE". Although a four character window of recognition may not be exactly what you're thinking of, it will do exactly what you have requested. The command verbs WORKHARD, WORKHARDER and WORKHARDXX1 will all activate the same image, but so will WORKSLOWER. Note however, that this is NOT documented behaviour, at present it's only an artifact of the way DCL implements recognition of unique contractions of commands. Indeed there is already latent support in DCL for enabling strict spell checking of all commands. So the wizard would strongly recommend against designing an application which was dependent on this behaviour. However, should you choose to ignore the Wizard's strong recommendation, it IS possible to identify the exact command verb used to invoke the image, but only by parsing the entire command line yourself. The routine CLI$GET_VALUE recognises two special entities, $VERB and $LINE which return the identified verb (up to four characters) and the entire command line. Here is a crude MACRO program which demonstrates their use. Note that MACRO is the true language of Wizard spells and incantations, those that prefer other tongues will have to affect their own translation. .title VerbAndLine ; Program displays the command verb and command line entered at DCL. ; Needs to be defined as a DCL verb as follows: ; $ SET COMMAND SYS$INPUT: ; DEFINE VERB <some-verb> ; IMAGE <this-image> ; Note that the command line should not exceed the length of the variable ; "value". No attempt is made to correct the output length of the value ; when writing output. .PSECT $DATA,rd,wrt,noexe verb: .ASCID /$VERB/ line: .ASCID /$LINE/ value: .ASCID / / .PSECT $CODE,rd,nowrt,exe .ENTRY Start,^M<> PUSHAQ value PUSHAQ verb CALLS #2,G^CLI$GET_VALUE PUSHAQ value CALLS #1,G^LIB$PUT_OUTPUT PUSHAQ value PUSHAQ line CALLS #2,G^CLI$GET_VALUE PUSHAQ value CALLS #1,G^LIB$PUT_OUTPUT RET .END Start Applying this program to the problem as posed: $ SET COMMAND SYS$INPUT: DEFINE VERB WORKHARD IMAGE DKA100:[WIZARD]VERBANDLINE $ WORKHARD WORK WORKHARD $ workharder WORK WORKHARDER $ workhardxx1 WORK WORKHARDXX1 $ run verbandline RUN RUN VERBANDLINE $ workslower WORK WORKSLOWER In its current form, it will not accept any parameters or qualifiers: $ workharder xxx %DCL-W-MAXPARM, too many parameters - reenter command with fewer parameters \XXX\ This could be overcome by defining appropriate verbs and qualifiers, but if that's too much work, you can tell DCL to ignore the remainder of the line by adding a single parameter as follows: $ SET COMMAND SYS$INPUT: DEFINE VERB WORKHARD IMAGE DKA100:[WIZARD]VERBANDLINE PARAMETER P1,TYPE(VALUE=$REST_OF_LINE)
|