home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / gawk-2.15.6-src.tgz / tar.out / fsf / gawk / vms / vms_gawk.c < prev    next >
C/C++ Source or Header  |  1996-09-28  |  9KB  |  251 lines

  1. /*
  2.  * vms_gawk.c -- parse GAWK command line using DCL syntax ]
  3.  */
  4.  
  5. /*
  6.  * Copyright (C) 1991-1993 the Free Software Foundation, Inc.
  7.  *
  8.  * This file is part of GAWK, the GNU implementation of the
  9.  * AWK Progamming Language.
  10.  *
  11.  * GAWK is free software; you can redistribute it and/or modify
  12.  * it under the terms of the GNU General Public License as published by
  13.  * the Free Software Foundation; either version 2 of the License, or
  14.  * (at your option) any later version.
  15.  *
  16.  * GAWK is distributed in the hope that it will be useful,
  17.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  18.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  19.  * GNU General Public License for more details.
  20.  *
  21.  * You should have received a copy of the GNU General Public License
  22.  * along with GAWK; see the file COPYING.  If not, write to
  23.  * the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  24.  */
  25.  
  26. /*
  27.  * vms_gawk.c - routines to parse the command line as a native DCL command
  28.  *           rather than as a foreign command string.
  29.  *                            Pat Rankin, Nov'89
  30.  *                        [ revised for 2.12, May'91 ]
  31.  */
  32.  
  33. #include "awk.h"
  34. #include "vms.h"
  35. #define COMMAND_NAME "GAWK"    /* verb name & for 'usage' message(s) */
  36. #define USAGE_PROG_RQRD 1
  37. #define USAGE_FILE_RQRD 2
  38. #define USAGE_BAD_COMBO 3
  39. #define USAGE_RUN_CMD    4
  40. #define STS$M_INHIB_MSG 0x10000000
  41.  
  42. #define Present(arg)        vmswork(Cli_Present(arg))
  43. #define Get_Value(arg,buf,siz)    vmswork(Cli_Get_Value(arg,buf,siz))
  44.  
  45. extern void   gawk_cmd();    /* created with $ SET COMMAND/OBJECT */
  46. #define GAWK_CMD ((const void *)gawk_cmd)
  47. extern void   _exit(int);
  48. static int    vms_usage(int);
  49.  
  50. #define ARG_SIZ 250
  51. union arg_w_prefix {    /* structure used to simplify prepending of "-" */
  52.     char     value[2+ARG_SIZ+1];
  53.     struct {
  54.     char prefix[2];        /* for "-?" */
  55.     char buf[ARG_SIZ];
  56.     char suffix[1];        /* room for '\0' */
  57.     } arg;
  58. };
  59.  
  60. #define chk_option(qualifier,optname)    \
  61.     if (Present(qualifier))    \
  62.     strcat(strcat(buf.arg.buf, W_cnt++ ? "," : ""), optname)
  63.  
  64.  
  65. /* vms_gawk() - parse GAWK command line using DCL and convert it into the */
  66. /*           appropriate "-arg" values for compatability with GNU code  */
  67. int
  68. vms_gawk()
  69. {
  70.     u_long sts;
  71.     union arg_w_prefix buf;
  72.     char misc_args[10], *misc_argp;
  73.     int  argc, W_cnt;
  74.  
  75.     /* check "GAWK_P1"--it's required; its presence will tip us off */
  76.     sts = Cli_Present("GAWK_P1");
  77.     if (CondVal(sts) == CondVal(CLI$_SYNTAX)) {
  78.     /* syntax error indicates that we weren't invoked as a native DCL
  79.        command, so we'll now attempt to generate a command from the
  80.        foreign command string and parse that.
  81.     */
  82.     sts = Cli_Parse_Command(GAWK_CMD, COMMAND_NAME);
  83.     if (vmswork(sts))
  84.         sts = Cli_Present("GAWK_P1");
  85.     }
  86.     if (vmswork(sts))        /* command parsed successfully */
  87.     v_add_arg(argc = 0, COMMAND_NAME);    /* save "GAWK" as argv[0] */
  88.     else if (CondVal(sts) == CondVal(CLI$_INSFPRM))
  89.     return vms_usage(USAGE_FILE_RQRD);  /* insufficient parameters */
  90.     else if (CondVal(sts) == CondVal(CLI$_CONFLICT))
  91.     return vms_usage(USAGE_BAD_COMBO);  /* conflicting qualifiers (/input+/command) */
  92.     else if (CondVal(sts) == CondVal(CLI$_RUNUSED))
  93.     return vms_usage(USAGE_RUN_CMD);    /* RUN GAWK won't work (no command line) */
  94.     else
  95.     return 0;    /* forced to rely on original parsing */
  96.  
  97.     if (Present("USAGE"))    /* give usage message and quit */
  98.     return vms_usage(0);
  99.     else if (! (Present("PROGRAM") || Present("PROGFILE")) )
  100.     return vms_usage(USAGE_PROG_RQRD);  /* missing required option */
  101.  
  102.     misc_argp = misc_args;
  103.     *misc_argp++ = '-';        /* now points at &misc_args[1] */
  104. #if 0        /* as of 2.12, -a and -e are obsolete */
  105.     if (Present("REG_EXPR")) {
  106.     if (Present("REG_EXPR.AWK"))        /* /reg_exp=awk -> -a */
  107.         *misc_argp++ = 'a';
  108.     else if (Present("REG_EXPR.EGREP")    /* /reg_exp=egrep -> -e */
  109.           || Present("REG_EXPR.POSIX"))    /* /reg_exp=posix -> -e */
  110.         *misc_argp++ = 'e';
  111.     }
  112. #endif    /* 0 */
  113. #if 0    /* gawk 2.11.1 */
  114.     if (Present("STRICT"))        /* /strict -> -c */
  115.     *misc_argp++ = 'c';
  116.     if (Present("COPYRIGHT"))        /* /copyright -> -C */
  117.     *misc_argp++ = 'C';
  118.     if (Present("VERSION"))        /* /version -> -V */
  119.     *misc_argp++ = 'V';
  120. #else    /* gawk 2.12 and later */
  121.     W_cnt = 0,    buf.arg.buf[0] = '\0';
  122.     strncpy(buf.arg.prefix, "-W", 2);
  123.     chk_option("LINT","lint");
  124.     chk_option("POSIX","posix");
  125.     chk_option("STRICT","compat");
  126.     chk_option("COPYRIGHT","copyright");
  127.     chk_option("VERSION","version");
  128.     if (W_cnt > 0)            /* got something */
  129.     v_add_arg(++argc, strdup(buf.value));
  130. #endif    /*0*/
  131. #ifdef DEBUG
  132.     if (Present("DEBUG")) {
  133. #if 0
  134.     int both = Present("DEBUG.ALL");
  135.     if (both || Present("DEBUG.EXECUTION"))
  136.         *misc_argp++ = 'd';
  137.     if (both || Present("DEBUG.PARSE"))
  138. #endif
  139.         *misc_argp++ = 'D';
  140.     }
  141. #endif
  142.     *misc_argp = '\0';        /* terminate misc_args[] */
  143.     if (misc_argp > &misc_args[1])    /* got something */
  144.     v_add_arg(++argc, misc_args);    /* store it/them */
  145.  
  146.     if (Present("FIELD_SEP")) {     /* field separator */
  147.     strncpy(buf.arg.prefix, "-F", 2);
  148.     if (Get_Value("FIELD_SEP", buf.arg.buf, sizeof buf.arg.buf))
  149.         v_add_arg(++argc, strdup(buf.value));
  150.     }
  151.     if (Present("VARIABLES")) {     /* variables to init prior to BEGIN */
  152.     strncpy(buf.arg.prefix, "-v", 2);
  153.     while (Get_Value("VARIABLES", buf.arg.buf, sizeof buf.arg.buf))
  154.         v_add_arg(++argc, strdup(buf.value));
  155.     }
  156.     if (Present("PROGFILE")) {        /* program files, /input=file -> -f file */
  157.     strncpy(buf.arg.prefix, "-f", 2);
  158.     while (Get_Value("PROGFILE", buf.arg.buf, sizeof buf.arg.buf))
  159.         v_add_arg(++argc, strdup(buf.value));
  160.     v_add_arg(++argc, "--");
  161.     } else if (Present("PROGRAM")) {    /* program text, /program -> 'text' */
  162.     v_add_arg(++argc, "--");
  163.     if (Get_Value("PROGRAM", buf.value, sizeof buf.value))
  164.         v_add_arg(++argc, strdup(buf.value));
  165.     }
  166.  
  167.     /* we know that "GAWK_P1" is present [data files and/or 'var=value'] */
  168.     while (Get_Value("GAWK_P1", buf.value, sizeof buf.value))
  169.     v_add_arg(++argc, strdup(buf.value));
  170.  
  171.     if (Present("OUTPUT")) {    /* let other parser treat this as 'stdout' */
  172.     strncpy(buf.arg.prefix, ">$", 2);
  173.     if (Get_Value("OUTPUT", buf.arg.buf, sizeof buf.arg.buf))
  174.         v_add_arg(++argc, strdup(buf.value));
  175.     }
  176.  
  177.     return ++argc;        /*(increment to account for arg[0])*/
  178. }
  179.  
  180. /* vms_usage() - display one or more messages and then terminate */
  181. static int    /* note: doesn't return anything; allows 'return vms_usage()' */
  182. vms_usage( int complaint )
  183. {
  184.     static const char
  185.     *usage_txt = "\n\
  186. usage:    %s  /COMMANDS=\"awk program text\"  data_file[,data_file,...] \n\
  187.    or    %s  /INPUT=awk_file  data_file[,\"Var=value\",data_file,...] \n\
  188.    or    %s  /INPUT=(awk_file1,awk_file2,...)  data_file[,...] \n\
  189. ",
  190.     *options_txt = "\n\
  191. options:  /FIELD_SEPARATOR=\"FS_value\" \n\
  192.    -      /VARIABLES=(\"Var1=value1\",\"Var2=value2\",...) \n\
  193.    -      /LINT  /POSIX  /[NO]STRICT  /VERSION    /COPYRIGHT  /USAGE \n\
  194.    -      /OUTPUT=out_file \n\
  195. ",
  196.     *no_prog = "missing required element: /COMMANDS or /INPUT",
  197.     *no_file = "missing required element: data_file \n\
  198.        (use \"SYS$INPUT:\" to read data lines from the terminal)",
  199.     *bad_combo = "invalid combination of qualifiers \n\
  200.        (/INPUT=awk_file and /COMMANDS=\"awk program\" are mutually exclusive)",
  201.     *run_used = "\"RUN\" was used; required command components missing";
  202.     int status, argc;
  203.  
  204.     fflush(stdout);
  205.     switch (complaint) {
  206.       case USAGE_PROG_RQRD:
  207.     fprintf(stderr, "\n%%%s-W-%s, %s \n", COMMAND_NAME, "PROG_RQRD", no_prog);
  208.     status = CLI$_VALREQ | STS$M_INHIB_MSG;
  209.     break;
  210.       case USAGE_FILE_RQRD:
  211.     if (Present("USAGE")) {
  212.         status = 1;        /* clean exit */
  213.     } else if (Present("COPYRIGHT") || Present("VERSION")) {
  214.         v_add_arg(argc=0, COMMAND_NAME);    /* save "GAWK" as argv[0] */
  215. #if 0
  216.         v_add_arg(++argc, Present("COPYRIGHT") ? "-C" : "-V");
  217. #else
  218.         v_add_arg(++argc, "-W");
  219.         v_add_arg(++argc, Present("COPYRIGHT") ? "copyright" : "version");
  220. #endif
  221.         v_add_arg(++argc, "{}");        /* kludge to suppress 'usage' */
  222.         v_add_arg(++argc, "NL:");        /* dummy input for kludge */
  223.         return ++argc;            /* count argv[0] too */
  224.     } else {
  225.         fprintf(stderr, "\n%%%s-W-%s, %s \n", COMMAND_NAME, "FILE_RQRD", no_file);
  226.         status = CLI$_INSFPRM | STS$M_INHIB_MSG;
  227.     }
  228.     break;
  229.       case USAGE_BAD_COMBO:
  230.     fprintf(stderr, "\n%%%s-W-%s, %s \n", COMMAND_NAME, "BAD_COMBO", bad_combo);
  231.     status = CLI$_CONFLICT | STS$M_INHIB_MSG;
  232.     break;
  233.       case USAGE_RUN_CMD:
  234.     fprintf(stderr, "\n%%%s-W-%s, %s \n", COMMAND_NAME, "RUN_CMD", run_used);
  235.     status = CLI$_NOOPTPRS | STS$M_INHIB_MSG;
  236.     break;
  237.       default:
  238.     status = 1;
  239.     break;
  240.     }
  241.     fprintf(stderr, usage_txt, COMMAND_NAME, COMMAND_NAME, COMMAND_NAME);
  242.     fprintf(stderr, options_txt);
  243.     fflush(stderr);
  244.  
  245.     errno = EVMSERR;
  246.     vaxc$errno = status;
  247.     _exit(status);
  248.     /* NOTREACHED */
  249.     return 0;
  250. }
  251.