home bbs files messages ]

Forums before death by AOL, social media and spammers... "We can't have nice things"

   comp.os.vms      DEC's VAX* line of computers & VMS.      264,096 messages   

[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]

   Message 262,387 of 264,096   
   =?UTF-8?Q?Arne_Vajh=C3=B8j?= to Lawrence D'Oliveiro   
   Re: Local Versus Global Command Options   
   15 Feb 25 20:21:12   
   
   From: arne@vajhoej.dk   
      
   On 2/15/2025 4:32 PM, Lawrence D'Oliveiro wrote:   
   > On Sat, 15 Feb 2025 12:22:59 -0700, Mark Berryman wrote:   
   >> So, IMHO, DCL is superior in this regard.   
   >   
   > Unfortunately, no. The fundamental problem with DEC OSes (and this   
   > includes Windows) is that the command line is passed to the program as a   
   > single string buffer. On *nix systems, it is passed as an array of   
   > strings.   
   >   
   > You should be familiar with the well-known problem of one program invoking   
   > another with a command that might include characters with special meanings   
   > to a shell. On a *nix system, there is a simple way to avoid those special   
   > meanings: the first program invokes the second program directly, without   
   > going through a shell.   
   >   
   > Nowadays, there is even a simple library call to do this   
   > .   
   >   
   > This is not so easy to do with a DEC-style command line.   
      
   How do you get those "characters with special meanings   
   to a shell" interpreted instead of passed on VMS?   
      
   All my trivial attempts failed:   
      
   $ type self.pas   
   [inherit('sys$library:pascal$lib_routines', 'sys$library:starlet')]   
   program self(input,output);   
      
   [external]   
   function decc$system(%immed cmd : c_str_t) : integer; external;   
      
   type   
       pstr = varying [255] of char;   
      
   var   
       cmdlin : pstr;   
      
   begin   
       lib$get_foreign(cmdlin.body, , cmdlin.length);   
       if cmdlin <> '' then begin   
          writeln(cmdlin);   
       end else begin   
          decc$system(malloc_c_str('mcr sys$disk:[]self ''a'' ''b'' ''c'''));   
          lib$spawn('mcr sys$disk:[]self ''a'' ''b'' ''c''');   
          lib$do_command('mcr sys$disk:[]self ''a'' ''b'' ''c''');   
       end;   
   end.   
   $ pas self   
   $ link self   
   $ a = 1   
   $ b = 2   
   $ c = 3   
   $ mcr sys$disk:[]self 'a' 'b' 'c'   
   1 2 3   
   $ r self   
   'a' 'b' 'c'   
   'a' 'b' 'c'   
   'a' 'b' 'c'   
      
   $ type self2.c   
   #include    
   #include    
      
   #include    
   #include    
      
   int main(int argc, char *argv[])   
   {   
        $DESCRIPTOR(cmddesc, "mcr sys$disk:[]self2 'a' 'b' 'c'");   
        if(argc > 1)   
        {   
            for(int i = 1; i < argc; i++) printf(" %s", argv[i]);   
            printf("\n");   
        }   
        else   
        {   
            system("mcr sys$disk:[]self2 'a' 'b' 'c'");   
            lib$spawn(&cmddesc);   
            lib$do_command(&cmddesc);   
        }   
        return 0;   
   }   
      
   $ cc self2   
   $ link self2   
   $ a = 1   
   $ b = 2   
   $ c = 3   
   $ mcr sys$disk:[]self 'a' 'b' 'c'   
     1 2 3   
   $ r self2   
     'a' 'b' 'c'   
     'a' 'b' 'c'   
     'a' 'b' 'c'   
      
   Arne   
      
   --- SoupGate-DOS v1.05   
    * Origin: you cannot sedate... all the things you hate (1:229/2)   

[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]


(c) 1994,  bbs@darkrealms.ca