From fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4 Mon Sep 17 00:00:00 2001 From: Joseph Hunkeler Date: Wed, 8 Jul 2015 20:46:52 -0400 Subject: Initial commit --- pkg/cl/gquery.c | 207 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 207 insertions(+) create mode 100644 pkg/cl/gquery.c (limited to 'pkg/cl/gquery.c') diff --git a/pkg/cl/gquery.c b/pkg/cl/gquery.c new file mode 100644 index 00000000..6c6a9f03 --- /dev/null +++ b/pkg/cl/gquery.c @@ -0,0 +1,207 @@ +/* Copyright(c) 1986 Association of Universities for Research in Astronomy Inc. + */ + +#define import_spp +#define import_libc +#define import_stdio +#include + +#include "config.h" +#include "operand.h" +#include "param.h" +#include "grammar.h" +#include "task.h" +#include "clmodes.h" +#include "proto.h" + + +/* Contains modified portions of modes.c for range checking etc. for use + * by EPARAM. The problem with modes.c is that it not only checks ranges, + * but does direct i/o to the terminal. + */ + +extern int cldebug; +static char *e1 = "Not in batch"; +static char *e2 = "Parameter value is out of range"; + + +/* GQUERY -- Determine if the value of a parameter given by the user is OK. + * Also, store the new value in the parameter; in the case of a list + * structured parameter, the new value is the name of a new list file. + * This routine is called by EPARAM to verify that the new parameter value + * is inrange and set the new value if so. + */ +char * +gquery ( + struct param *pp, + char *string +) +{ + register char *ip; + char buf[SZ_LINE]; + char *query_status, *nlp, *errmsg; + int arrflag, offset, bastype, batch; + struct operand o; + char *strcpy(), *index(); + + bastype = pp->p_type & OT_BASIC; + batch = firstask->t_flags & T_BATCH; + arrflag = pp->p_type & PT_ARRAY; + + if (arrflag) + offset = getoffset(pp); + + if (batch) { + errmsg = e1; + return (errmsg); + } else + query_status = strcpy (buf, string); + + ip = buf; + + /* Set o to the current value of the parameter. Beware that some + * of the logical branches which follow assume that struct o has + * been initialized to the current value of the parameter. + */ + if (pp->p_type & PT_LIST) { + setopundef (&o); + } else if (arrflag) { + poffset (offset); + paramget (pp, FN_VALUE); + o = popop (); + } else + o = pp->p_valo; + + /* Handle eof, a null-length line (lone carriage return), + * and line with more than SZ_LINE chars. Ignore leading whitespace + * if basic type is not string. + */ + if (query_status == NULL) + goto testval; + + /* Ignore leading whitespace if it is not significant for this + * datatype. Do this before testing for empty line, so that a + * return such as " \n" is equivalent to "\n". I.e., do not + * penalize the user if they type the space bar by accident before + * typing return to accept the default value. + */ + if (bastype != OT_STRING || (pp->p_type & PT_LIST)) + while (*ip == ' ' || *ip == '\t') + ip++; + + if (*ip == '\n') { + /* Blank lines usually just accept the current value + * but if the param in a string and is undefined, + * it sets the string to a (defined) nullstring. + */ + if (bastype == OT_STRING && opundef (&o)) { + *ip = '\0'; + o = makeop (ip, bastype); + } else + goto testval; + } + + /* Cancel the newline. */ + if ((nlp = index (ip, '\n')) != NULL) + *nlp = '\0'; + + /* Finally, we have handled the pathological cases. + */ + if (pp->p_type & PT_LIST) + o = makeop (string, OT_STRING); + else + o = makeop (ip, bastype); + +testval: + if (*string == '@') + errmsg = "OK"; + else if (pp->p_type & PT_LIST) + errmsg = "OK"; + else if (inrange (pp, &o)) + errmsg = "OK"; + else { + errmsg = e2; + return (errmsg); + } + + if (cldebug) { + eprintf ("changing `%s.p_val' to ", pp->p_name); + fprop (stderr, &o); + eprintf ("\n"); + } + + /* Update param with new value. + */ + pushop (&o); + if (arrflag) + poffset (offset); + + paramset (pp, FN_VALUE); + pp->p_flags |= P_SET; + + return ("OK"); +} + + +/* MINMAX -- Format the minimum and maximum values of a parameter, if any. + */ +char * +minmax ( + register struct param *pp +) +{ + static char message[SZ_LINE]; + + /* Show the ranges if they are defined and this is a parameter + * type that has ranges. + */ + if (range_check (pp)) { + char str[SZ_LINE]; + struct operand o; + + o.o_type = pp->p_type & OT_BASIC; + + sprintf (message, " (minimum="); + if (!(pp->p_flags & (P_IMIN|P_UMIN))) { + o.o_val = pp->p_min; + sprop (str, &o); + strcat (message, str); + } + strcat (message, ": maximum="); + if (!(pp->p_flags & (P_IMAX|P_UMAX))) { + o.o_val = pp->p_max; + sprop (str, &o); + strcat(message, str); + } + strcat (message, ")"); + } else + message[0] = EOS; + + return (message); +} + + +/* ENUMIN -- Format the enumeration string for a parameter. + */ +char * +enumin ( + register struct param *pp +) +{ + static char message[SZ_LINE]; + + if (!(pp->p_flags & (P_IMIN|P_UMIN))) { + char str[SZ_LINE]; + struct operand o; + + sprintf (message, " choose: "); + + o.o_type = pp->p_type & OT_BASIC; + o.o_val = pp->p_min; + sprop (str, &o); + strcat (message, str); + } else + message[0] = EOS; + + return (message); +} -- cgit