aboutsummaryrefslogtreecommitdiff
path: root/pkg/vocl/param.h
diff options
context:
space:
mode:
authorJoseph Hunkeler <jhunkeler@gmail.com>2015-07-08 20:46:52 -0400
committerJoseph Hunkeler <jhunkeler@gmail.com>2015-07-08 20:46:52 -0400
commitfa080de7afc95aa1c19a6e6fc0e0708ced2eadc4 (patch)
treebdda434976bc09c864f2e4fa6f16ba1952b1e555 /pkg/vocl/param.h
downloadiraf-linux-fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4.tar.gz
Initial commit
Diffstat (limited to 'pkg/vocl/param.h')
-rw-r--r--pkg/vocl/param.h220
1 files changed, 220 insertions, 0 deletions
diff --git a/pkg/vocl/param.h b/pkg/vocl/param.h
new file mode 100644
index 00000000..4e9d8118
--- /dev/null
+++ b/pkg/vocl/param.h
@@ -0,0 +1,220 @@
+/*
+ * PARAM.H -- In-core broken-out form of parameter file ("pfile") entry.
+ * main line is a list of pfile structs, one per parameter file, starting
+ * at parhead; these each head a list of params found in that file.
+ *
+ * USES operand.h and config.h
+ */
+
+/* ----------
+ * reference chart showing how
+ * the bits in p_type are set and the p_val/p_min/p_max fields are used for
+ * various kinds of parameter "type" specs possible in a parameter file.
+
+
+all legal p_type bit val/min/max fields: which v_x and its meaning
+ combinations spec as
+OT_XXXX PT_XXXX written
+B I R S L F S/C A p_val p_min p_max in file
+- - - - - - - - --------------- --------------- --------------- -------
+x v_i, bool - - b
+ x v_i, int v_i, min val v_i, max val i
+ x v_r, real v_r, min val v_r, max val r
+ x v_s, string - v_i, max length s
+x x v_a, bool arr. - - ab
+ x x v_a, int arr. v_i, min val v_i, max val ai
+ x x v_a, real arr. v_r, min val. v_r, max val ar
+ x x v_a, str. arr. - v_i, max length as
+x x v_s, fname - *b
+ x x v_s, fname v_i, min val* v_i, max val* *i
+ x x v_s, fname v_r, min val* v_r, max val* *r
+ x x v_s, fname - - *s
+ x x v_s, fname v_s, min fname v_s, max fname f
+ x x x v_s, fname v_s, min fname* v_s, max fname* *f
+ x x v_s, struct - v_i, max length struct
+ x x x v_s, fname - *struct
+
+
+Notes:
+1) S/C refers to any one of PT_STRUCT|PT_GCUR|PT_IMCUR|PT_UKEY|PT_PSET; their
+ param representation is identical. Similarly, the file spec "struct" may
+ be gcur, imcur, pset, ukey, or pset.
+2) * min/max applies to contents of list file after it is read and converted
+ to the given base type, not to p_val.
+3) "fname" means exactly MAXFILNAM chars are allocated, in-line, with
+ the parameter regardless of how many are used. there is a permanent '\0'
+ at v_s[MAXFILNAM-1].
+4) note that PT_STRUCT|PT_GCUR|PT_IMCUR|PT_UKEY|PT_PSET|PT_FILNAM all imply
+ OT_STRING but that, among these, only PT_FILNAM have ranges. They may be
+ considered qualifiers of OT_STRING.
+5) the max length of a list entry is always MAXLIN.
+6) these are not all the same as in the parameter file, such as struct
+ length being stored in p_max. these must be properly placed when handling
+ *.field param requests and when printing the in-core param structs back out.
+7) min and max fields for arrays refer to all elements within the array.
+8) only the scalar types bool, int, real and string may be arrays, and
+ arrays may not be list-directed.
+9) for a string array, the array is a list of pointers.
+*/
+
+#define PF_INDIRECT ')' /* indirection metacharacter, ")param" */
+#define PF_DELIM ',' /* field delimiter within pfile */
+#define PF_MAXLIN (132+2) /* max pfile line length, plus \n \0 */
+#define PF_COMMENT '#' /* starts a line of comment */
+#define PF_NFIELDS 7 /* number of fields in a pfile line */
+#define PF_NOSTRUCT '*' /* next line is NOT struct initialization*/
+#define PF_SZMINSTR 160 /* p_min field for string type params */
+#define PF_SZMAXSTR 64 /* p_max field for string type params */
+
+struct param {
+ char *p_name; /* name of parameter */
+ struct pfile *p_pfp; /* pointer back to pfile */
+ int p_type; /* type bits; see below */
+ int p_mode; /* bit-packed mode fields. see below. */
+ struct operand p_valo; /* value; or length if struct, file if list*/
+ struct operand p_mino; /* p_val min and */
+ struct operand p_maxo; /* max values */
+ char *p_prompt; /* prompt string */
+ FILE *p_listfp; /* if PT_LIST: fp of list file, if open */
+ char *p_listval; /* buffer for list element (SZ_LINE) */
+ struct param *p_np; /* pointer to next param, or NULL */
+ short p_flags; /* see p_flags below */
+ short p_lenval; /* buflen of p_valo.o_val.v_s if string */
+};
+
+/* Shorthand for referencing the values of the value, min, and max
+ * fields. e.g. p_val.v_s = *char
+ */
+#define p_val p_valo.o_val
+#define p_min p_mino.o_val
+#define p_max p_maxo.o_val
+#define p_aval p_valo.o_val.v_a->a_ptr
+
+
+/* names of bits in p_type.
+ * these describe more information about the parameter.
+ * lower 4 bits are same as for operands; see operand.h.
+ */
+#define PT_LIST 0000020 /* values are in a file, not in pfile */
+#define PT_FILNAM 0000040 /* string is a bonafide filename */
+#define PT_STRUCT 0000100 /* used for structs */
+#define PT_GCUR 0000200 /* graphics cursor values structure */
+#define PT_IMCUR 0000400 /* image cursor values structure */
+#define PT_UKEY 0001000 /* user keystroke values sructure */
+#define PT_PSET 0002000 /* parameter set pointer parameter */
+
+/* attributes if PT_FILNAM */
+#define PT_FER 0004000 /* file must exist and be readable */
+#define PT_FEW 0010000 /* " writable */
+#define PT_FNOE 0020000 /* file must not exist */
+#define PT_FTXT 0040000 /* file is a text file */
+#define PT_FBIN 0100000 /* " binary " */
+
+#define PT_ARRAY 0200000 /* parameter is an array */
+
+/* names of mode bits in p_mode.
+ */
+#define M_AUTO 0001 /* auto mode: be as quiet as possible */
+#define M_QUERY 0002 /* query: ask user about value */
+#define M_HIDDEN 0004 /* hidden: param normally not visible */
+#define M_LEARN 0010 /* learn: write out local copy when done*/
+#define M_MENU 0020 /* menu: call eparam at exec time */
+#define M_FAKE 0040 /* never flush this param to a pfile */
+#define M_LOCAL 0100 /* Local var, not param. */
+
+
+/* p_flags bits.
+ * misc characteristics of the parameter.
+ * see pfilecopy() and pfcopyback() for details of P_SET/CLSET/QUERY.
+ */
+#define P_IMIN 0001 /* min value is indefinite */
+#define P_UMIN 0002 /* min value is undefined */
+#define P_IMAX 0004 /* max value is indefinite */
+#define P_UMAX 0010 /* max value is undefined */
+#define P_LEOF 0020 /* set when see eof on list file */
+#define P_SET 0040 /* set in explicit assignment statement */
+#define P_CLSET 0100 /* set on command line of task */
+#define P_QUERY 0200 /* set from a query */
+#define P_CL 0400 /* parameter is a CL parameter */
+
+/* mode code letters in param file; recognized in either case */
+#define PF_AUTO 'a'
+#define PF_QUERY 'q'
+#define PF_HIDDEN 'h'
+#define PF_LEARN 'l'
+#define PF_MENU 'm'
+
+/* ----------
+ * one per loaded parameter file.
+ * the ltask at ltp is used to get the param file's name (ltp->lt_lname),
+ * its directory (osdir(lt_pname)), and package prefix (lt_pkp->pk_name).
+ * pf_n use varies. always incremented for each command line argument set by
+ * posargset, etal. LT_BUILTIN tasks then use it directly to determine how
+ * many params there are since $nargs is not added in that case. other
+ * PF_FAKE pfiles use it to create $nargs then reset it to 0 and use it
+ * to count each unmatched param reference that is satisfied by a postional
+ * arg (see paramsrch). Other than to set $nargs, it is unused by tasks that
+ * do not have fake pfiles.
+ * N.B. the way restor() is written, it is important that a param list is
+ * never created with some params above and some below its task's topd.
+ */
+struct pfile {
+ struct pfile *pf_npf; /* ptr to next pfile, else NULL */
+ struct pfile *pf_oldpfp; /* ptr to old pfile, if copy */
+ struct ltask *pf_ltp; /* ptr to this pfile's ltask */
+ struct pfile *pf_npset; /* ptr to next pset in group */
+ struct param *pf_psetp; /* ptr to pset-param if pset */
+ struct param *pf_pp; /* ptr to first params */
+ struct param *pf_lastpp; /* last param off pfile */
+ short pf_n; /* no. of params; see above */
+ short pf_flags; /* see flags below */
+ char pf_pfilename[SZ_FNAME+1]; /* file to be updated */
+};
+
+/* pf_flags */
+#define PF_UPDATE 001 /* at least one param has P_SET set */
+#define PF_FAKE 002 /* made on the fly for an ltask without
+ * a pfile. should never be written out.
+ */
+#define PF_COPY 004 /* this is only the working copy of tasks
+ * pfile; it is never to be written out.
+ */
+#define PF_PSETREF 010 /* pfile contains a pset parameter */
+
+/* size of param and pfile structs, IN INTS, for proper dictionary control.
+ */
+#define PARAMSIZ btoi (sizeof (struct param))
+#define PFILESIZ btoi (sizeof (struct pfile))
+
+/* Variable types used in parsing of declaration types.
+ */
+#define V_BOOL 0
+#define V_INT 1
+#define V_REAL 2
+#define V_STRING 3
+#define V_GCUR 4
+#define V_IMCUR 5
+#define V_UKEY 6
+#define V_PSET 7
+#define V_STRUCT 8
+#define V_FILE 9
+
+
+char *nextfield(); /* cracks next pfile line field */
+char *makelower(); /* upper to lower, in place and return */
+
+struct param *paramfind(); /* searches for a param on a given pfile*/
+struct param *paramsrch(); /* search, make sure param is there */
+struct param *lookup_param(); /* search standard path for a param */
+struct param *newparam(); /* allocate and link a new param */
+struct param *addparam(); /* make a new param off given pfile */
+struct param *newfakeparam(); /* add a fake param to pfile */
+struct pfile *pfilesrch(); /* read named pfile or ltask pfile */
+struct pfile *pfileload(); /* load pfile for ltask into memory */
+struct pfile *pfileread(); /* read and make params from a pfile */
+struct pfile *pfilefind(); /* look for pfile with given name */
+struct pfile *newpfile(); /* add a new pfile off parhead */
+struct pfile *pfilecopy(); /* make an in-core copy of a pfile */
+
+int defpar(); /* determine whether param exists */
+int defvar(); /* determine whether envvar exists */