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/vocl/lists.c | 121 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 121 insertions(+) create mode 100644 pkg/vocl/lists.c (limited to 'pkg/vocl/lists.c') diff --git a/pkg/vocl/lists.c b/pkg/vocl/lists.c new file mode 100644 index 00000000..547af32d --- /dev/null +++ b/pkg/vocl/lists.c @@ -0,0 +1,121 @@ +/* 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 "mem.h" +#include "operand.h" +#include "param.h" +#include "task.h" +#include "errs.h" +#include "proto.h" + + +/* + * LISTS -- Access lists for list-structured parameters. + */ + +extern char *eofstr; +extern char *nullstr; +extern int cldebug; + + +/* READLIST -- Read next value from list-structured parameter *pp and return + * an operand. Operand will be UNDEF if there was no file or cannot open the + * named file (this will generate a query for the param) or eofstr if eof. + * As a special case, check for the value of the param being the string "stdin" + * and read from the current standard input if it is. + * Call error() if get ferror while reading or can't open list file. + */ +struct operand +readlist (struct param *pp) +{ + struct operand result; + int bastype; + char *line; + + result.o_type = OT_INT; /* in case we make an undef op */ + line = pp->p_listval; + + if ((pp->p_valo.o_type & OT_UNDEF) || *pp->p_val.v_s == '\0') { + /* no list file name. */ + pp->p_flags &= ~P_LEOF; + setopundef (&result); + return (result); + } + + if (pp->p_listfp == NULL && !(pp->p_flags & P_LEOF)) { + char *filename = pp->p_val.v_s; + if (!strcmp (filename, "STDIN") || !strcmp (filename, "stdin")) + pp->p_listfp = currentask->t_stdin; + else if ((pp->p_listfp = fopen (filename, "r")) == NULL) { + /* should we tell user what's happening? + cl_error (E_UERR|E_P, "can not open list file `%s'", + pp->p_val.v_s); + */ + setopundef (&result); + return (result); + } + } + + bastype = pp->p_type & OT_BASIC; + + if (pp->p_listfp != NULL) { +again: fgets (line, SZ_LINE, pp->p_listfp); + if (ferror (pp->p_listfp)) { + closelist (pp); + /* Don't just let it go as undefined if get an actual error. */ + cl_error (E_UERR|E_P, "list file read err"); + + } else if (feof (pp->p_listfp)) { + closelist (pp); + pp->p_flags |= P_LEOF; + result = makeop (eofstr, OT_STRING); + + } else { + char *index(), *nlp, *ip; + + nlp = index (line, '\n'); + if (nlp != NULL) + *nlp = '\0'; + + /* If not simple list structured struct type parameter (used + * to get raw lines from a text file), ignore blank lines and + * comments lines in the list. + */ + if (bastype != OT_STRING || + pp->p_type & (PT_FILNAM|PT_GCUR|PT_IMCUR|PT_UKEY)) { + + for (ip=line; *ip && (*ip == ' ' || *ip == '\t'); ip++) + ; + if (*ip == EOS || *ip == '#') + goto again; + } + + result = makeop (line, bastype); + } + + } else + result = makeop (eofstr, OT_STRING); + + return (result); +} + + +/* CLOSELIST -- Close the list file in list-structured param pp. + * We assume (pp->p_type & PT_LIST) but do check that the file is not + * already closed and that we're not closing the real stdin. + */ +void +closelist (register struct param *pp) +{ + if (pp->p_listfp != NULL) { + if (pp->p_listfp != stdin) + fclose (pp->p_listfp); + pp->p_listfp = NULL; + } +} -- cgit