[Info-vax] Command Line Versus Command Line

Arne Vajhøj arne at vajhoej.dk
Thu May 23 15:05:42 EDT 2024


On 5/23/2024 12:16 AM, Lawrence D'Oliveiro wrote:
> VMS really wants you to use a DCL-style syntax for your command lines. It
> does weird things like uppercasing text in the command buffer, except for
> parts in quotes, which are left as-is, but then the quotes are also left
> in place, so command-line parsers have to worry about dealing with text
> that might or might not be quoted.

That is an oversimplified view on a complex issue.

real: ABC def "GIH" "jkl"
parse=traditional:
CLI : ABC DEF GIH jkl
FC  : ABC DEF "GIH" "jkl"
Mix : ABC DEF GIH jkl
C   : abc def GIH jkl
DCL : ABC DEF GIH jkl
parse=extended:
CLI : ABC DEF GIH jkl
FC  : ABC def "GIH" "jkl"
Mix : ABC DEF GIH jkl
C   : ABC def GIH jkl
DCL : ABC DEF GIH jkl

For details see below.

Arne

$ type cli.for
       program cli
       integer*4 p1len,p2len,p3len,p4len
       character*80 p1,p2,p3,p4
       call cli$get_value('p1',p1,p1len)
       call cli$get_value('p2',p2,p2len)
       call cli$get_value('p3',p3,p3len)
       call cli$get_value('p4',p4,p4len)
       write(*,*) 'CLI : '//p1(1:p1len)//' '//p2(1:p2len)//' '
      +                   //p3(1:p3len)//' '//p4(1:p4len)
       end
$ type cli.cld
define verb cli
    image "sys$disk:[]cli.exe"
    parameter p1
    parameter p2
    parameter p3
    parameter p4
$ for cli
$ link cli
$ set comm cli.cld
$ type mix.for
       program mix
       integer*4 cmdlen
       character*80 cmd
       integer*4 p1len,p2len,p3len,p4len
       character*80 p1,p2,p3,p4
       external mixcld
       call lib$get_foreign(cmd,,cmdlen)
       call cli$dcl_parse('cli '//cmd(1:cmdlen),mixcld,,,)
       call cli$get_value('p1',p1,p1len)
       call cli$get_value('p2',p2,p2len)
       call cli$get_value('p3',p3,p3len)
       call cli$get_value('p4',p4,p4len)
       write(*,*) 'Mix : '//p1(1:p1len)//' '//p2(1:p2len)//' '
      +                   //p3(1:p3len)//' '//p4(1:p4len)
       end
$ type mixcld.cld
module mixcld
define verb cli
    parameter p1
    parameter p2
    parameter p3
    parameter p4
$ for mix
$ set command/object mixcld
$ link mix + mixcld
$ type fc.for
       program fc
       integer*4 cmdlen
       character*80 cmd
       call lib$get_foreign(cmd,,cmdlen)
       write(*,*) 'FC  : '//cmd(1:cmdlen)
       end
$ for fc
$ link fc
$ type c.c
#include <stdio.h>

int main(int argc, char *argv[])
{
     printf("C   :");
     for(int i = 1; i < argc; i++) printf(" %s", argv[i]);
     printf("\n");
     return 0;
}
$ cc c
$ link c
$ type dcl.com
$ write sys$output "DCL : ''p1' ''p2' ''p3' ''p4'"





More information about the Info-vax mailing list