home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 22 gnu / 22-gnu.zip / gnuawk.zip / vms / vms_cli.c < prev    next >
C/C++ Source or Header  |  1996-11-03  |  3KB  |  92 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. #ifndef _STRING_H
  11. #include <string.h>
  12. #endif
  13.  
  14. extern U_Long CLI$PRESENT(const Dsc *);
  15. extern U_Long CLI$GET_VALUE(const Dsc *, Dsc *, short *);
  16. extern U_Long CLI$DCL_PARSE(const Dsc *, const void *, ...);
  17. extern U_Long sys$cli(void *, ...);
  18. extern U_Long sys$filescan(const Dsc *, void *, long *);
  19. extern void  *lib$establish(U_Long (*handler)(void *, void *));
  20. extern U_Long lib$sig_to_ret(void *, void *);    /* condition handler */
  21.  
  22. /* Cli_Present() - call CLI$PRESENT to determine whether a parameter or     */
  23. /*          qualifier is present on the [already parsed] command line */
  24. U_Long
  25. Cli_Present( const char *item )
  26. {
  27.     Dsc item_dsc;
  28.     (void)lib$establish(lib$sig_to_ret);
  29.  
  30.     item_dsc.len = strlen(item_dsc.adr = (char *)item);
  31.     return CLI$PRESENT(&item_dsc);
  32. }
  33.  
  34. /* Cli_Get_Value() - call CLI$GET_VALUE to retreive the value of a */
  35. /*            parameter or qualifier from the command line   */
  36. U_Long
  37. Cli_Get_Value( const char *item, char *result, int size )
  38. {
  39.     Dsc item_dsc, res_dsc;
  40.     U_Long sts;
  41.     short len = 0;
  42.     (void)lib$establish(lib$sig_to_ret);
  43.  
  44.     item_dsc.len = strlen(item_dsc.adr = (char *)item);
  45.     res_dsc.len = size,  res_dsc.adr = result;
  46.     sts = CLI$GET_VALUE(&item_dsc, &res_dsc, &len);
  47.     result[len] = '\0';
  48.     return sts;
  49. }
  50.  
  51. /* Cli_Parse_Command() - use the $CLI system service (undocumented) to     */
  52. /*            retreive the actual command line (which might be */
  53. /*            "run prog" or "mcr prog [params]") and then call */
  54. /*            CLI$DCL_PARSE to parse it using specified tables */
  55. U_Long
  56. Cli_Parse_Command( const void *cmd_tables, const char *cmd_verb )
  57. {
  58.     struct { short len, code; void *adr; } fscn[2];
  59.     struct { char rqtype, rqindx, rqflags, rqstat; unsigned :32;
  60.          Dsc rdesc; unsigned :32; unsigned :32; unsigned :32; } cmd;
  61.     U_Long sts;
  62.     int    ltmp;
  63.     char   longbuf[2600];
  64.     (void)lib$establish(lib$sig_to_ret);
  65.  
  66.     memset(&cmd, 0, sizeof cmd);
  67.     cmd.rqtype = CLI$K_GETCMD;        /* command line minus the verb */
  68.     sts = sys$cli(&cmd, (void *)0, (void *)0);    /* get actual command line */
  69.  
  70.     if (vmswork(sts)) {        /* ok => cli available & verb wasn't "RUN" */
  71.     /* invoked via symbol => have command line (which might be empty) */
  72.     /*    [might also be invoked via mcr or dcl; that's ok]          */
  73.     if (cmd.rqstat == CLI$K_VERB_MCR) {
  74.         /* need to strip image name from MCR invocation   */
  75.         memset(fscn, 0, sizeof fscn);
  76.         fscn[0].code = FSCN$_FILESPEC;    /* full file specification */
  77.         (void)sys$filescan(&cmd.rdesc, fscn, (long *)0);
  78.         cmd.rdesc.len -= fscn[0].len;    /* shrink size */
  79.         cmd.rdesc.adr += fscn[0].len;    /* advance ptr */
  80.     }
  81.     /* prepend verb and then parse the command line */
  82.     strcat(strcpy(longbuf, cmd_verb), " "),  ltmp = strlen(longbuf);
  83.     if (cmd.rdesc.len + ltmp > sizeof longbuf)
  84.         cmd.rdesc.len = sizeof longbuf - ltmp;
  85.     strncpy(&longbuf[ltmp], cmd.rdesc.adr, cmd.rdesc.len);
  86.     cmd.rdesc.len += ltmp,    cmd.rdesc.adr = longbuf;
  87.     sts = CLI$DCL_PARSE( &cmd.rdesc, cmd_tables);
  88.     }
  89.  
  90.     return sts;
  91. }
  92.