diff options
author | Joseph Hunkeler <jhunkeler@gmail.com> | 2015-07-08 20:46:52 -0400 |
---|---|---|
committer | Joseph Hunkeler <jhunkeler@gmail.com> | 2015-07-08 20:46:52 -0400 |
commit | fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4 (patch) | |
tree | bdda434976bc09c864f2e4fa6f16ba1952b1e555 /pkg/cl/param.h | |
download | iraf-linux-fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4.tar.gz |
Initial commit
Diffstat (limited to 'pkg/cl/param.h')
-rw-r--r-- | pkg/cl/param.h | 220 |
1 files changed, 220 insertions, 0 deletions
diff --git a/pkg/cl/param.h b/pkg/cl/param.h new file mode 100644 index 00000000..4e9d8118 --- /dev/null +++ b/pkg/cl/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 */ |