home *** CD-ROM | disk | FTP | other *** search
/ GEMini Atari / GEMini_Atari_CD-ROM_Walnut_Creek_December_1993.iso / zip / gnu / gawk213s.lzh / GAWK213S / VMS_CLI.C < prev    next >
C/C++ Source or Header  |  1993-07-29  |  3KB  |  89 lines

  1. /*
  2.  * vms_cli.c - command line interface routines.
  3.  *                            Pat Rankin, Nov'89
  4.  *    Routines called from vms_gawk.c for DCL parsing.
  5.  */
  6.  
  7. #define  P(foo) ()
  8. #include "config.h"    /* in case we want to suppress 'const' &c */
  9. #include "vms.h"
  10.  
  11. extern u_long CLI$PRESENT(const Dsc *);
  12. extern u_long CLI$GET_VALUE(const Dsc *, Dsc *, short *);
  13. extern u_long CLI$DCL_PARSE(const Dsc *, const void *, ...);
  14. extern u_long SYS$CLI(void *, ...);
  15. extern u_long SYS$FILESCAN(const Dsc *, void *, long *);
  16. extern void  *LIB$ESTABLISH(u_long (*handler)(void *, void *));
  17. extern u_long LIB$SIG_TO_RET(void *, void *);    /* condition handler */
  18.  
  19. /* Cli_Present() - call CLI$PRESENT to determine whether a parameter or     */
  20. /*          qualifier is present on the [already parsed] command line */
  21. u_long
  22. Cli_Present( const char *item )
  23. {
  24.     Dsc item_dsc;
  25.     (void)LIB$ESTABLISH(LIB$SIG_TO_RET);
  26.  
  27.     item_dsc.len = strlen(item_dsc.adr = (char *)item);
  28.     return CLI$PRESENT(&item_dsc);
  29. }
  30.  
  31. /* Cli_Get_Value() - call CLI$GET_VALUE to retreive the value of a */
  32. /*            parameter or qualifier from the command line   */
  33. u_long
  34. Cli_Get_Value( const char *item, char *result, int size )
  35. {
  36.     Dsc item_dsc, res_dsc;
  37.     u_long sts;
  38.     short len = 0;
  39.     (void)LIB$ESTABLISH(LIB$SIG_TO_RET);
  40.  
  41.     item_dsc.len = strlen(item_dsc.adr = (char *)item);
  42.     res_dsc.len = size,  res_dsc.adr = result;
  43.     sts = CLI$GET_VALUE(&item_dsc, &res_dsc, &len);
  44.     result[len] = '\0';
  45.     return sts;
  46. }
  47.  
  48. /* Cli_Parse_Command() - use the $CLI system service (undocumented) to     */
  49. /*            retreive the actual command line (which might be */
  50. /*            "run prog" or "mcr prog [params]") and then call */
  51. /*            CLI$DCL_PARSE to parse it using specified tables */
  52. u_long
  53. Cli_Parse_Command( const void *cmd_tables, const char *cmd_verb )
  54. {
  55.     struct { short len, code; void *adr; } fscn[2];
  56.     struct { char rqtype, rqindx, rqflags, rqstat; unsigned :32;
  57.          Dsc rdesc; unsigned :32; unsigned :32; unsigned :32; } cmd;
  58.     u_long sts;
  59.     int    ltmp;
  60.     char   longbuf[2600];
  61.     (void)LIB$ESTABLISH(LIB$SIG_TO_RET);
  62.  
  63.     memset(&cmd, 0, sizeof cmd);
  64.     cmd.rqtype = CLI$K_GETCMD;        /* command line minus the verb */
  65.     sts = SYS$CLI( &cmd, (void *)0, (void *)0); /* get actual command line */
  66.  
  67.     if (vmswork(sts)) {        /* ok => cli available & verb wasn't "RUN" */
  68.     /* invoked via symbol => have command line (which might be empty) */
  69.     /*    [might also be invoked via mcr or dcl; that's ok]          */
  70.     if (cmd.rqstat == CLI$K_VERB_MCR) {
  71.         /* need to strip image name from MCR invocation   */
  72.         memset(fscn, 0, sizeof fscn);
  73.         fscn[0].code = FSCN$_FILESPEC;    /* full file specification */
  74.         (void)SYS$FILESCAN( &cmd.rdesc, fscn, (long *)0);
  75.         cmd.rdesc.len -= fscn[0].len;    /* shrink size */
  76.         cmd.rdesc.adr += fscn[0].len;    /* advance ptr */
  77.     }
  78.     /* prepend verb and then parse the command line */
  79.     strcat(strcpy(longbuf, cmd_verb), " "),  ltmp = strlen(longbuf);
  80.     if (cmd.rdesc.len + ltmp > sizeof longbuf)
  81.         cmd.rdesc.len = sizeof longbuf - ltmp;
  82.     strncpy(&longbuf[ltmp], cmd.rdesc.adr, cmd.rdesc.len);
  83.     cmd.rdesc.len += ltmp,    cmd.rdesc.adr = longbuf;
  84.     sts = CLI$DCL_PARSE( &cmd.rdesc, cmd_tables);
  85.     }
  86.  
  87.     return sts;
  88. }
  89.