summaryrefslogtreecommitdiff
path: root/usr/src/cmd/fmli/oh/if_form.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/cmd/fmli/oh/if_form.c')
-rw-r--r--usr/src/cmd/fmli/oh/if_form.c1857
1 files changed, 0 insertions, 1857 deletions
diff --git a/usr/src/cmd/fmli/oh/if_form.c b/usr/src/cmd/fmli/oh/if_form.c
deleted file mode 100644
index bb951f44ae..0000000000
--- a/usr/src/cmd/fmli/oh/if_form.c
+++ /dev/null
@@ -1,1857 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License (the "License").
- * You may not use this file except in compliance with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-
-/*
- * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- */
-
-/* Copyright (c) 1984, 1985, 1986, 1987, 1988, 1989 AT&T */
-/* All Rights Reserved */
-
-
-#include <ctype.h>
-#include <stdio.h>
-#include <string.h>
-#include <curses.h>
-#include <sys/types.h> /* EFT abs k16 */
-#include "wish.h"
-#include "menudefs.h"
-#include "message.h"
-#include "token.h"
-#include "vtdefs.h"
-#include "ctl.h"
-#include "slk.h"
-#include "actrec.h"
-#include "typetab.h"
-#include "winp.h"
-#include "form.h"
-#include "fm_mn_par.h"
-#include "objform.h"
-#include "eval.h"
-#include "terror.h"
-#include "var_arrays.h"
-#include "moremacros.h"
-#include "interrupt.h"
-#include "sizes.h"
-
-
-#define FM_KEYS 13
-#define FM_INTR PAR_INTR
-#define FM_ONINTR PAR_ONINTR
-#define FM_DONE PAR_DONE
-#define FM_TITLE 3
-#define FM_LIFE 4
-#define FM_INIT 5
-#define FM_BEGROW 6
-#define FM_BEGCOL 7
-#define FM_HELP 8
-#define FM_REREAD 9
-#define FM_CLOSE 10
-#define FM_ALTSLKS 11
-#define FM_FRMMSG 12
-
-#define FM_FLD_KEYS 27
-
-/* defined above abs
-#define FM_INTR PAR_INTR
-#define FM_ONINTR PAR_ONINTR
-*/
-#define FM_ACTI PAR_ACTION
-#define FM_NAME PAR_NAME
-#define FM_FROW 4
-#define FM_FCOL 5
-#define FM_NROW 6
-#define FM_NCOL 7
-#define FM_ROWS 8
-#define FM_COLS 9
-#define FM_FLEN 10
-#define FM_VALUE 11
-#define FM_RMENU 12
-#define FM_CHOICEMSG 13
-#define FM_VALID 14
-#define FM_NOECHO 15
-#define FM_MENUO 16
-#define FM_SHOW 17
-#define FM_SCROLL 18
-#define FM_WRAP 19
-#define FM_PAGE 20
-#define FM_BUTT 21
-#define FM_VALMSG 22
-#define FM_INACTIVE 23
-#define FM_FIELDMSG 24
-#define FM_LININFO 25
-#define FM_AUTOADVANCE 26
-
-static struct attribute Fm_tab[FM_KEYS] = {
- { "interrupt", RET_STR|EVAL_ALWAYS, NULL, NULL, 0 },
- { "oninterrupt",RET_STR|EVAL_ALWAYS, NULL, NULL, 0 },
- { "done", RET_ARGS|EVAL_ALWAYS, "", NULL, 0 },
- { "form", RET_STR|EVAL_ONCE, "Form", NULL, 0 },
- { "lifetime", RET_STR|EVAL_ALWAYS, "longterm", NULL, 0 },
- { "init", RET_BOOL|EVAL_ALWAYS, "", NULL, 0 },
- { "begrow", RET_INT|EVAL_ONCE, "any", NULL, 0 },
- { "begcol", RET_INT|EVAL_ONCE, "any", NULL, 0 },
- { "help", RET_ARGS|EVAL_ALWAYS, "", NULL, 0 },
- { "reread", RET_BOOL|EVAL_ALWAYS, NULL, NULL, 0 },
- { "close", RET_BOOL|EVAL_ONCE, NULL, NULL, 0 },
- { "altslks", RET_BOOL|EVAL_ONCE, NULL, NULL, 0 },
- { "framemsg", RET_STR|EVAL_ONCE, "", NULL, 0 }
-};
-
-static struct attribute Fm_fld_tab[FM_FLD_KEYS] = {
- { "interrupt", RET_STR|EVAL_ALWAYS, NULL, NULL, 0 },
- { "oninterrupt",RET_STR|EVAL_ALWAYS, NULL, NULL, 0 },
- { "action", RET_ARGS|EVAL_ALWAYS, "", NULL, 0 },
- { "name", RET_STR|EVAL_ONCE, NULL, NULL, 0 },
- { "frow", RET_INT|EVAL_ONCE, "-1", NULL, 0 },
- { "fcol", RET_INT|EVAL_ONCE, "-1", NULL, 0 },
- { "nrow", RET_INT|EVAL_ONCE, "-1", NULL, 0 },
- { "ncol", RET_INT|EVAL_ONCE, "-1", NULL, 0 },
- { "rows", RET_INT|EVAL_ONCE, "1", NULL, 0 }, /* abs f15 */
- { "columns", RET_INT|EVAL_ONCE, "-1", NULL, 0 },
- { "flen", RET_INT|EVAL_ONCE, NULL, NULL, 0 },
- { "value", MAKE_COPY|RET_STR|EVAL_SOMETIMES,"", NULL, 0 },
- { "rmenu", RET_LIST|EVAL_ONCE|EV_SQUIG,"", NULL, 0 },
- { "choicemsg", RET_STR|EVAL_ONCE, NULL, NULL, 0 },
- { "valid", RET_BOOL|EVAL_SOMETIMES,"", NULL, 0 },
- { "noecho", RET_BOOL|EVAL_ONCE, NULL, NULL, 0 },
- { "menuonly", RET_BOOL|EVAL_ONCE, NULL, NULL, 0 },
- { "show", RET_BOOL|EVAL_SOMETIMES,"", NULL, 0 },
- { "scroll", RET_BOOL|EVAL_ONCE, NULL, NULL, 0 },
- { "wrap", RET_BOOL|EVAL_ONCE, NULL, NULL, 0 },
- { "page", RET_STR|EVAL_ONCE, "1", NULL, 0 },
- { "button", RET_INT|EVAL_ONCE, "0", NULL, 0 },
- { "invalidmsg", RET_STR|EVAL_SOMETIMES, NULL, NULL, 0 },
- { "inactive", RET_BOOL|EVAL_SOMETIMES, NULL, NULL, 0 },
- { "fieldmsg", RET_STR|EVAL_ALWAYS, NULL, NULL, 0 },
- { "lininfo", RET_STR|EVAL_ALWAYS, NULL, NULL, 0 },
- { "autoadvance",RET_BOOL|EVAL_ONCE, NULL, NULL, 0 }
-};
-
-char *itoa();
-
-#define DEVirt(X) (((forminfo *) Cur_rec->odptr)->visible[X])
-#define CURforminfo() ((forminfo *) Cur_rec->odptr)
-#define CURform() (&(((forminfo *) Cur_rec->odptr)->fm_mn))
-#define CURattr(x, y) ((CURform()->multi + x)->attrs[y])
-#define NUMvis() (array_len(((forminfo *) Cur_rec->odptr)->visible))
-#define NUMactive() (((forminfo *) Cur_rec->odptr)->numactive)
-#define VALS() (((forminfo *) Cur_rec->odptr)->mulvals)
-#define PTRS() (((forminfo *) Cur_rec->odptr)->holdptrs)
-#define NUMflds() (array_len(((forminfo *) Cur_rec->odptr)->fm_mn.multi))
-#define CURfield() (((forminfo *) Cur_rec->odptr)->curfield)
-#define CURffield() (objform_disp(DEVirt(((forminfo *) Cur_rec->odptr)->curfield), CURforminfo()))
-#define SET_curfield(X) (((forminfo *) Cur_rec->odptr)->curfield) = X
-#define CURpage() ((((forminfo *) Cur_rec->odptr)->curpage))
-#define LASTpage() ((((forminfo *) Cur_rec->odptr)->lastpage))
-#define NUMSTR(X) (strcpy(Field_str + 1, itoa((long)X, 10)), Field_str) /* abs k16 */
-
-extern int Mouse_row; /* Row offset of the mouse */
-extern int Mouse_col; /* Column offset of the mouse */
-extern int Toggle; /* when to "toggle" field choices (if_init.c) */
-
-#define NX_ANY 0 /* pseudo flag */
-#define NX_NOCUR 1
-#define NX_ADVANCE 2
-
-extern char *shrink_str();
-extern char *expand();
-extern char *getaltenv();
-extern struct actrec *ar_create(), *ar_current();
-
-static void chg_curfield();
-static int objform_close();
-static int objform_reinit();
-static int objform_reread();
-static int objform_current();
-static int objform_noncur();
-static int objform_ctl();
-static int objform_stream();
-static int fld_ck();
-static int is_valid();
-static struct fm_mn parse_form();
-
-static struct actrec *Cur_rec; /* current activation record */
-static char *Equal = "=";
-static char *Field_str = "F000";
-
-#define QUERY -1
-#define TOOBIG 1000
-#define TOOSMALL -1000
-
-/*
- * Returns the virtual index of the given actual field number ........
- *
- * The ACTUAL number is the order that the field appears in the form's
- * definition file.
- *
- * The VIRTUAL number is the index into the VISIBLE array of fields
- * (i.e., the subset of ACTUAL fields that contains only those fields
- * that appear on the "current page" or whose "show" descriptor = "true").
- */
-int
-virt(i)
-register int i;
-{
- register int j;
- int lcv;
-
- lcv = NUMvis();
- for (j = 0; j < lcv; j++)
- if (DEVirt(j) == i)
- return(j);
- return(0); /* not exactly right but better than garbage.. */
- /* ..since no one checks the return value */
-}
-
-/*
-** Starting with start, recalculate the values until they are
-** all set. This works by faking out each value into being
-** a control sequence and then substituting the real value for
-** the control sequence
-*/
-int
-redo_vals(start)
-int start;
-{
- int changed;
- register char *envbuf;
- register int i;
- char *hold1, *hold2;
- char buf[BUFSIZ];
- int lcv;
-
- upseqno(CURform());
-
- envbuf = buf;
- lcv = NUMflds();
- for (i = start; i < lcv; i++) {
- strcpy(envbuf, NUMSTR(i + 1));
- strcat(envbuf, "=\001");
- strcat(envbuf, NUMSTR(i + 1));
- putAltenv(envbuf);
- }
-
- changed = FALSE;
- lcv = NUMflds();
- for (i = start; i < lcv; i++) {
- int dofree, maxamt, amt;
-
- dofree = 0;
- hold1 = multi_eval(CURform(), i, FM_VALUE);
- maxamt = BUFSIZ - strlen(NUMSTR(i + 1)) - 2;
- if ((amt = strlen(hold1)) > maxamt) {
- /*
- * Value is greater than 1K so malloc
- * enough space to hold it.
- */
- maxamt = amt + strlen(NUMSTR(i + 1)) + 2;
- if ((envbuf = (char *) malloc(maxamt)) == NULL)
- fatal(NOMEM, nil);
- dofree++;
- }
- else {
- /*
- * ... otherwise, use static 1K buffer
- */
- envbuf = buf;
- dofree = 0;
- }
- strcpy(envbuf, NUMSTR(i + 1));
- changed |= strcmp(hold1, (hold2 = getaltenv(VALS(), envbuf)) ?
- hold2 : nil) == 0;
- strcat(envbuf, Equal);
- strncat(envbuf, hold1, maxamt);
- putAltenv(envbuf);
- putaltenv(&VALS(), envbuf);
- if (dofree) /* if buffer was malloc'd, free it */
- free(envbuf);
- }
- while (changed) {
- changed = FALSE;
- lcv = NUMflds();
- for (i = start; i < lcv; i++) {
- register char *p;
- int dofree, amt, maxamt;
-
- dofree = 0;
- envbuf = buf;
- strcpy(envbuf, NUMSTR(i + 1));
- hold1 = getaltenv(VALS(), envbuf);
- for (p = NULL; p = strchr(hold1, '\001'); )
- *p = '$';
- if (!p)
- continue;
- hold2 = expand(hold1);
- maxamt = BUFSIZ - strlen(NUMSTR(i + 1)) - 2;
- if ((amt = strlen(hold2)) > maxamt) {
- /*
- * Value is greater than 1K so malloc
- * enough space to hold it.
- */
- maxamt = amt + strlen(NUMSTR(i + 1)) + 2;
- if ((envbuf = (char *) malloc(maxamt)) == NULL)
- fatal(NOMEM, nil);
- strcpy(envbuf, NUMSTR(i + 1));
- dofree++;
- }
- else {
- /*
- * ... otherwise, use static 1K buffer
- */
- dofree = 0;
- }
- strcat(envbuf, Equal);
- strncat(envbuf, hold2, maxamt);
- changed = TRUE;
- free(hold2);
- putaltenv(&VALS(), envbuf);
- putAltenv(envbuf);
- if (dofree)
- free(envbuf);
- }
- }
- return (0);
-}
-
-/*
-** Returns the current value of the field, fieldno.
-*/
-char *
-curval(fieldno)
-int fieldno;
-{
- return(getaltenv(VALS(), NUMSTR(fieldno + 1)));
-}
-
-/*
-** Figure out which fields are on the screen as decided by the show
-** function values.
-*/
-int
-fm_vislist(ptr)
-forminfo *ptr;
-{
- int i, num;
- struct fm_mn *fm_mn;
- char *page;
- int lcv;
-
- fm_mn = &(ptr->fm_mn);
- if (!ptr->visible) {
- ptr->slks = (int *) array_create(sizeof(int),array_len(fm_mn->multi));
- ptr->visible = (int *) array_create(sizeof(int), NUMflds());
- }
- else {
- array_trunc(ptr->visible);
- array_trunc(ptr->slks);
- }
-
- lcv = NUMflds();
- NUMactive() = 0;
- for (i = 0; i < lcv; i++) {
- if (atoi(multi_eval(fm_mn, i, FM_BUTT))) {
- /*
- * SLK definition
- */
- if (multi_eval(fm_mn, i, FM_SHOW))
- ptr->slks = (int *) array_append(ptr->slks, (char *) &i);
- }
- else {
- /*
- * FIELD definition
- */
- page = multi_eval(fm_mn, i, FM_PAGE);
- num = atoi(page);
- if (num > LASTpage())
- LASTpage() = num; /* record last page */
- /*
- * Only make visible fields on the CURRENT
- * page ...
- */
- if ((num <= 0) || !page)
- continue;
- else if ((num == CURpage()) ||
- (strcmp(page, "all") == 0) || (*page == '*')) {
- /*
- * add field to visible list ...
- * keep track of the number of active fields
- * for this page ...
- */
- ptr->visible = (int *) array_append(ptr->visible, &i);
- if (multi_eval(fm_mn, i, FM_SHOW) &&
- (!multi_eval(fm_mn, i, FM_INACTIVE)))
- NUMactive()++;
- }
- }
- }
- return (0);
-}
-
-
-static int
-objform_reinit(a)
-struct actrec *a;
-{
- Cur_rec = a;
- if (sing_eval(CURform(), FM_REREAD))
- return(objform_reread(a));
- return(SUCCESS);
-}
-
-/*
-** A front end to parser() which will set up most of the defaults for
-** a form.
-*/
-static struct fm_mn
-parse_form(flags, info_or_file, fp)
-int flags;
-char *info_or_file;
-FILE *fp;
-{
- struct fm_mn fm_mn;
-
- fm_mn.single.attrs = NULL;
- fm_mn.multi = NULL;
- filldef(&fm_mn.single, Fm_tab, FM_KEYS);
- parser(flags, info_or_file, Fm_tab, FM_KEYS, &fm_mn.single,
- Fm_fld_tab, FM_FLD_KEYS, &fm_mn.multi, fp);
- return(fm_mn);
-}
-
-/*
-** Read the form object indicated by this actrec, if a->id > 0
-** then the object is being reread.
-*/
-static int
-objform_reread(a)
-struct actrec *a;
-{
- extern struct slk Defslk[MAX_SLK + 1];
- extern struct slk Formslk[];
- forminfo *fi;
- register int i, but;
- char *label, *intr, *onintr, *get_def();
- int lcv;
- FILE *fp = NULL;
-
- Cur_rec = a;
- fi = CURforminfo();
-
- /* make sure file exists and is readable (if there is a file)
- * The "flags" say if a->path is the information
- * itself or the file of where the information sits. abs k15
- */
- if (!(fi->flags & INLINE))
- if ((fp = fopen(a->path, "r")) == NULL)
- {
- if (a->id >= 0) /* if frame is already posted */
- warn(NOT_UPDATED, a->path);
- else
- warn(FRAME_NOPEN, a->path);
- return(FAIL);
- }
- if (a->id >= 0)
- freeitup(CURform()); /* if posted then free it old one */
- fi->fm_mn = parse_form(fi->flags, a->path, fp); /* abs k14.0 */
- if ((CURform())->single.attrs == NULL) {
-#ifdef _DEBUG4
- _debug4(stderr, "Couldn't parse it\n");
-#endif
- return(FAIL);
- }
- (CURform())->seqno = 1;
- if (PTRS())
- free(PTRS());
- if (NUMflds() && (PTRS() = (char **) calloc(NUMflds(), sizeof(char *))) == NULL)
- fatal(NOMEM, nil);
- lcv = NUMflds();
- for (i = 0; i < lcv; i++)
- PTRS()[i] = (char *) NULL;
-
- fi->visible = NULL; /* initialize array of visible fields */
- fi->slks = NULL; /* initialize array of object's SLKS */
- redo_vals(0); /* initialize field values */
- fm_vislist(CURforminfo()); /* set up visible field list */
- if (a->id < 0)
- SET_curfield(-1);
-
- /*
- * If "init=false" or Form is empty then cleanup
- */
- if (!sing_eval(CURform(), FM_INIT) || (NUMactive() <= 0))
- {
- if (a->id >= 0) /* form is already posted */
- {
- if (a->lifetime == AR_INITIAL)
- {
- mess_temp("can't close this frame");
- mess_lock();
- }
- else
- {
- ar_close(a, FALSE);
- return(FAIL);
- }
- }
- else
- {
- sing_eval(CURform(), FM_CLOSE);
- objform_noncur(a, TRUE); /* takes ARGs out of Altenv */
- freeitup(CURform());
- return(FAIL);
- }
- }
-
- /*
- * update the interrupt descriptors in the activation rec
- */
- ar_ctl(a, CTSETINTR, get_sing_def(CURform(), FM_INTR), NULL, NULL, NULL, NULL, NULL);
- ar_ctl(a, CTSETONINTR, get_sing_def(CURform(), FM_ONINTR), NULL, NULL, NULL, NULL, NULL);
- /*
- * Set up object specific SLK array
- */
- set_top_slks(Formslk);
- memcpy((char *)a->slks, (char *)Defslk, sizeof(Defslk));
- lcv = array_len(fi->slks);
- for (i = 0; i < lcv; i++) {
- but = atoi(multi_eval(CURform(), fi->slks[i], FM_BUTT)) - 1;
- if (but < 0 || but >= MAX_SLK) /* abs */
- continue;
- label = multi_eval(CURform(), fi->slks[i], FM_NAME);
- intr = get_def(CURform(),fi->slks[i], FM_INTR);
- onintr = get_def(CURform(),fi->slks[i], FM_ONINTR);
- set_obj_slk(&(a->slks[but]), label, TOK_SLK1 + but, intr, onintr);
- }
-
- if (a->id >= 0) /* go to first field, first page */
- {
- vt_current(form_ctl(a->id, CTGETVT));
- CURpage() = 1;
- fm_vislist(CURforminfo());
- form_ctl(a->id, CTSETPAGE, TRUE, 1, fi->lastpage);
- nextfield(0, 0, 1, NX_ANY);
- form_ctl(a->id, CTSETDIRTY);
-
- /* used to just go to first field of current page..
- ar_ctl(a, CTCLEARWIN, 0, NULL, NULL, NULL, NULL, NULL);
- nextfield(0, 0, 1, NX_ANY);
- form_ctl(a->id, CTSETDIRTY);
- */
- }
- (void) ar_ctl(Cur_rec, CTSETMSG, FALSE, NULL, NULL, NULL, NULL, NULL); /* was AR_cur. abs k15 */
- return(SUCCESS);
-}
-
-/*
-** Frees up the structures and evaluates the "close" function.
-*/
-static int
-objform_close(a)
-struct actrec *a;
-{
- register int i, lcv;
- char *p, *strchr();
-
- Cur_rec = a;
- form_close(a->id); /* remove the form FIRST */
- copyAltenv(VALS());
- sing_eval(CURform(), FM_CLOSE); /* evaluate close function */
- objform_noncur(a, FALSE); /* remove ARGs from Altenv */
-
- /*
- * Free information IN the forminfo structure
- */
- freeitup(CURform()); /* the form parse table */
- if (PTRS()) /* holdptrs array */
- free(PTRS());
- lcv = array_len(VALS());
- for (i = 0; i < lcv; i++) { /* form specific variables */
- char namebuf[BUFSIZ]; /* (e.g., F1, F2, .... ) */
-
- if (p = strchr(VALS()[0], '='))
- *p = '\0';
- strcpy(namebuf, VALS()[0]);
- if (p)
- *p = '=';
- delaltenv(&VALS(), namebuf);
- }
- array_destroy(VALS()); /* variables array */
- array_destroy(((forminfo *)a->odptr)->slks); /* visible SLKS */
- array_destroy(((forminfo *)a->odptr)->visible); /* visible fields */
-
- /*
- * Free information in the activation record
- */
- free(a->odptr); /* the forminfo structure */
- free(a->slks); /* object specific SLKS */
- free(a->path); /* form definition file */
-
- return(SUCCESS);
-}
-
-/*
-** Takes this objects's information out of the major altenv.
-*/
-static int
-objform_noncur(a, all)
-struct actrec *a;
-bool all;
-{
- register int i;
- register char *p;
- int lcv;
-
- Cur_rec = a;
- lcv = array_len(VALS());
- for (i = 0; i < lcv; i++) {
- char namebuf[BUFSIZ];
-
- if (p = strchr(VALS()[i], '='))
- *p = '\0';
- strcpy(namebuf, VALS()[i]);
- if (p)
- *p = '=';
- delAltenv(namebuf);
- }
- if (all)
- return(form_noncurrent());
- else
- return(SUCCESS);
-}
-
-/*
-** Sets up the major alternate environment based on the values
-** for the altenv that pertains to this object.
-*/
-static int
-objform_current(a)
-struct actrec *a;
-{
- char *choice;
- static char *Form_Choice = "Form_Choice";
-
- /*
- * Make the form "current" and make the first field
- * current if this is the first time.
- */
- Cur_rec = a;
- form_current(a->id);
- if (CURfield() == -1)
- nextfield(0, 0, 1, NX_ANY);
- /*
- * Initialize the field with the value of variable "Form_Choice"
- * (variable holds the selected item(s) from a choices menu)
- */
- if (choice = getAltenv(Form_Choice)) {
- copyAltenv(VALS());
- if (set_curval(strsave(choice)) == SUCCESS) {
- fm_vislist(CURforminfo());
- redo_vals(CURfield() + 1);
- form_ctl(Cur_rec->id, CTSETDIRTY);
- if (multi_eval(CURform(), CURfield(), FM_AUTOADVANCE))
- nextfield(atoi(CURattr(CURfield(),FM_FROW)->cur),
- atoi(CURattr(CURfield(),FM_FCOL)->cur),
- 1, NX_NOCUR);
- }
- delAltenv(Form_Choice);
- }
- else
- copyAltenv(VALS());
-
- set_form_field(a->id, CURfield());
- return(SUCCESS);
-}
-
-/*
-** Sets up the major alternate environment based on the values
-** for the altenv that pertains to this object.
-** Does min neccessary to make object "temporarily" current,
-** invisible to the user.
-*/
-static int
-objform_temp_cur(a)
-struct actrec *a;
-{
- /*
- * Make the form "current"
- */
- Cur_rec = a;
- form_current(a->id);
- if (CURfield() == -1)
- nextfield(0, 0, 1, NX_ANY);
- copyAltenv(VALS());
-
- return(SUCCESS);
-}
-
-/*
-** Evaluates many of the fields to return a form structure that includes
-** name, value, their positions, editing capabilities and a structure
-** that is held here and is used by the low-level form code to pertain
-** to each field.
-*/
-static formfield
-objform_disp(n, fi)
-int n;
-forminfo *fi;
-{
- register int i;
- struct fm_mn *ptr;
- formfield m;
-
- ptr = &(fi->fm_mn);
- if (n >= (int)NUMvis() || n < 0) /* abs k17 */
- m.name = NULL;
- else
- {
- i = DEVirt(n);
- m.name = multi_eval(ptr, i, FM_NAME);
- m.value = (char *) curval(i);
- m.frow = atoi(multi_eval(ptr, i, FM_FROW));
- m.fcol = atoi(multi_eval(ptr, i, FM_FCOL));
- m.nrow = atoi(multi_eval(ptr, i, FM_NROW));
- m.ncol = atoi(multi_eval(ptr, i, FM_NCOL));
- m.rows = atoi(multi_eval(ptr, i, FM_ROWS));
- m.cols = atoi(multi_eval(ptr, i, FM_COLS));
- if (multi_eval(ptr, i, FM_INACTIVE))
- m.flags = I_FANCY;
- else
- m.flags = I_BLANK|I_FANCY|I_FILL;
- if (!multi_eval(ptr, i, FM_SHOW))
- m.flags |= I_NOSHOW;
- m.ptr = PTRS() + i;
- if (multi_eval(ptr, i, FM_WRAP))
- m.flags |= I_WRAP;
- if (multi_eval(ptr, i, FM_SCROLL))
- m.flags |= I_SCROLL;
- if (LASTpage() > 1)
- m.flags |= I_NOPAGE;
- if (multi_eval(ptr, i, FM_NOECHO)) {
- m.flags |= I_INVISIBLE;
- m.flags &= ~(I_BLANK | I_FILL);
- }
- if (multi_eval(ptr, i, FM_AUTOADVANCE))
- m.flags |= I_AUTOADV;
-
- if (m.cols <= 0 || m.rows <= 0 || m.frow < 0 || m.fcol < 0)
- { /* field not active */
- m.cols = 1;
- m.rows = 1;
- m.frow = -1; /* title bar line */
- m.fcol = 0;
- m.flags = I_NOEDIT;
- m.value = "";
- }
- }
- return(m);
-}
-
-/*
-** Evaluates the help field and returns a token for it.
-*/
-static token
-objform_help(rec)
-struct actrec *rec;
-{
- token make_action();
-
- Cur_rec = rec;
- return(make_action(sing_eval(CURform(), FM_HELP)));
-}
-
-/*
-** Forms have no arguments to give, so that must fail. All else is
-** passed on.
-*/
-static int
-objform_ctl(rec, cmd, arg1, arg2, arg3, arg4, arg5, arg6)
-struct actrec *rec;
-int cmd;
-int arg1, arg2, arg3, arg4, arg5, arg6;
-{
- Cur_rec = rec;
- switch (cmd)
- {
- case CTGETARG:
- return(FAIL);
- case CTSETMSG:
- if (arg1 == TRUE) {
- /*
- * if arg1 == TRUE then the frame message was
- * generated "externally" (i.e., via the message
- * built-it). Update the "framemsg" descriptor
- * accordingly.
- */
- char *newmsg, *get_mess_frame();
-
- newmsg = get_mess_frame();
- set_single_default(CURform(), FM_FRMMSG, newmsg);
- }
- else
- mess_frame(sing_eval(CURform(), FM_FRMMSG));
- return(SUCCESS);
- case CTSETLIFE:
- {
- char *life;
-
- /* used CURform, Cur_rec before F15. abs */
- life = sing_eval((&(((forminfo *) rec->odptr)->fm_mn)), FM_LIFE);
- setlifetime(rec, life);
- return(SUCCESS);
- }
- default:
- return(form_ctl(rec->id, cmd, arg1, arg2, arg3, arg4, arg5, arg6));
- }
-}
-
-/*
-** Calls path_to_ar() and nextpath_to_ar() to decide whether this is a
-** reopen or a first open. If it is the latter, it sets up the actrec
-** and calls ar_create().
-*/
-int
-IF_ofopen(args)
-register char **args;
-{
- register int i;
- struct actrec a, *first_rec, *path_to_ar(), *nextpath_to_ar();
- extern struct slk Defslk[MAX_SLK + 1];
- int startrow, startcol;
- int do_inline;
- int type;
- char *life;
- char *begcol, *begrow;
- register struct fm_mn *fm_mn;
- forminfo *fi;
- char envbuf[6];
-
- a.serial = 0;
- a.slks = (struct slk *)NULL;
- a.prevrec = (struct actrec *)NULL;
- a.nextrec = (struct actrec *)NULL;
- a.backup = (struct actrec *)NULL;
-
- if (strCcmp(args[0], "-i") == 0)
- {
- do_inline = TRUE;
- Cur_rec = path_to_ar(args[1]);
- }
- else
- {
- do_inline = FALSE;
- Cur_rec = path_to_ar(args[0]);
- }
- for (first_rec = Cur_rec; Cur_rec; ) {
- char *env;
-
- strcpy(envbuf, "ARG1");
- for (i = do_inline ? 2 : 1;
- (env = getaltenv(VALS(), envbuf)) && args[i];
- envbuf[3]++, i++)
- if (strcmp(args[i], env))
- break;
- if (!args[i] && !env) {
- ar_current(Cur_rec, TRUE); /* abs k15 */
- return(SUCCESS);
- }
- Cur_rec = nextpath_to_ar(Cur_rec);
- if (Cur_rec == first_rec)
- break;
- }
- fi = (forminfo *)new(forminfo);
- fi->flags = do_inline ? INLINE : 0;
- fi->mulvals = NULL;
- fm_mn = &(fi->fm_mn);
- a.odptr = (char *) fi;
- a.id = -1;
- fm_mn->single.attrs = NULL;
- if (do_inline)
- a.path = strsave(args[1]);
- else
- a.path = strsave(args[0]);
- if ((a.slks = (struct slk *) malloc(sizeof(Defslk))) == NULL)
- fatal(NOMEM, nil);
- a.fcntbl[AR_CLOSE] = objform_close;
- a.fcntbl[AR_HELP] = (int (*)())objform_help; /* added cast abs */
- a.fcntbl[AR_REREAD] = objform_reread;
- a.fcntbl[AR_REINIT] = objform_reinit;
- a.fcntbl[AR_CURRENT] = objform_current;
- a.fcntbl[AR_TEMP_CUR] = objform_temp_cur; /* abs k15 */
- a.fcntbl[AR_NONCUR] = objform_noncur;
- a.fcntbl[AR_CTL] = objform_ctl;
- a.fcntbl[AR_ODSH] = objform_stream;
- Cur_rec = &a;
- CURpage() = 1;
- setupenv(fi->flags, args, &VALS());
- if (objform_reread(&a) == FAIL)
- return(FAIL);
- /* return(NULL); abs */
- type = 0;
- life = sing_eval(CURform(), FM_LIFE);
- begrow = sing_eval(fm_mn, FM_BEGROW);
- begcol = sing_eval(fm_mn, FM_BEGCOL);
- life_and_pos(&a, life, begrow, begcol, &startrow, &startcol, &type);
- a.id = form_default(shrink_str(sing_eval(fm_mn, FM_TITLE), MAX_TITLE),
- type, startrow, startcol, objform_disp, (char *)fi);
- if (sing_eval(fm_mn, FM_ALTSLKS))
- a.flags = AR_ALTSLKS | AR_NORESHAPE;
- else
- a.flags = AR_NORESHAPE;
- if (a.id == FAIL)
- return(FAIL);
- form_ctl(a.id, CTSETPAGE, FALSE, CURpage(), LASTpage());
- return((int) ar_current(Cur_rec = (struct actrec *) ar_create(&a), FALSE));
-}
-
-/*
-** Set the value of the current field.
-*/
-int
-set_curval(str)
-char *str;
-{
- char *s;
- char *tmp=NULL;
- char buf[BUFSIZ];
- char *envbuf;
-
- strcpy(buf, NUMSTR(CURfield() + 1));
- form_ctl(Cur_rec->id, CTGETARG, &tmp);
- if (strcmp(str, s = getaltenv(VALS(), buf)) || strcmp(str,tmp)) {
- /*
- * If the current value and the passed value are
- * different then add the passed value (str) to
- * the environment
- */
- int dofree, maxamt, amt;
-
- dofree = 0;
- maxamt = BUFSIZ - strlen(NUMSTR(CURfield() + 1)) - 2;
- if ((amt = strlen(str)) > maxamt) {
- /*
- * Value is greater than 1K so malloc
- * enough space to hold it.
- */
- maxamt = amt + strlen(NUMSTR(CURfield() + 1)) + 2;
- if ((envbuf = (char *) malloc(maxamt)) == NULL)
- fatal(NOMEM, nil);
- dofree++;
- }
- else {
- /*
- * ... otherwise, use static 1K buffer
- */
- envbuf = buf;
- dofree = 0;
- }
- set_cur(CURform(), CURfield(), FM_VALUE, strsave(str));
- strcpy(envbuf, NUMSTR(CURfield() + 1));
- strcat(envbuf, Equal);
- strncat(envbuf, str, maxamt);
- putaltenv(&VALS(), envbuf);
- putAltenv(envbuf);
- if (dofree)
- free(envbuf);
- return(SUCCESS);
- }
- return(FAIL);
-}
-
-static int chk_page();
-
-/*
- * CHK_FORM returns the actual number of the FIRST field that
- * is invalid ....
- */
-static int
-chk_form()
-{
- register int n, page, fldnum;
- int savefield, savepage, retval;
-
- /*
- * Save current form page/field
- */
- savepage = CURpage();
- savefield = CURfield();
-
- /*
- * if the current page has an invalid field then return
- * its field number
- */
- if ((fldnum = chk_page(CURpage())) >= 0) {
- SET_curfield(savefield);
- return(fldnum);
- }
-
- /*
- * For each page of the form, scan the list of
- * fields and validate those that were not touched.
- * (Start with the page AFTER the current page and wrap around)
- */
- retval = -1;
- page = CURpage();
- for (n = 1; n < LASTpage(); n++) {
- page = (page % LASTpage()) + 1;
- if ((fldnum = chk_page(page)) >= 0) {
- retval = fldnum;
- break;
- }
- }
-
- /*
- * restore current form page/field
- */
- if (CURpage() != savepage) {
- CURpage() = savepage;
- fm_vislist(CURforminfo()); /* create new visible list */
- }
- SET_curfield(savefield);
- return(retval);
-}
-
-/*
- * CHK_PAGE will make sure that all visible fields of "page" are valid.
- */
-static int
-chk_page(page)
-int page;
-{
- register int i, j, lcv;
- register struct attribute *attr;
-
- if (page != CURpage()) { /* compute new visible list? */
- CURpage() = page;
- fm_vislist(CURforminfo());
- }
- for (i = 0, lcv = NUMvis(); i < lcv; i++) {
- j = DEVirt(i);
- /*
- * check the flags of the appropriate "attribute"
- * structure to see if the field has ever been "touched"
- * (visited) ...
- */
- if (multi_eval(CURform(), j, FM_MENUO))
- attr = CURattr(j, FM_MENUO);
- else
- attr = CURattr(j, FM_VALID);
- if (multi_eval(CURform(), j, FM_SHOW) && attr &&
- !(attr->flags & ATTR_TOUCHED)) {
- attr->flags |= ATTR_TOUCHED;
- SET_curfield(j);
- if (fld_ck(j) != SUCCESS)
- return(j);
- }
- }
- return(-1);
-}
-
-/*
-** Given a form_field structure, it will get the value of the current
-** field and see if it is A) different and B) valid. If the value is
-** different all sorts of recalculation must go on (the show function,
-** all the new values). If the value is valid, it returns SUCCESS,
-** so that the function calling it can navigate or close.
-*/
-int
-fld_get_ck(form_field)
-formfield *form_field;
-{
- char *s;
- char buf[BUFSIZ];
-
- if ( form_field->flags & I_SCROLL )
- s = NULL;
- else
- s = (form_field->rows * form_field->cols >= BUFSIZ) ? NULL : buf;
- form_ctl(Cur_rec->id, CTGETARG, &s);
- if (set_curval(s) == SUCCESS) {
- redo_vals(CURfield() + 1);
- fm_vislist(CURforminfo());
- form_ctl(Cur_rec->id, CTSETDIRTY);
- }
- return(is_valid(s));
-}
-
-/*
- * FLD_IS_VALID will check to see if a field is valid by retrieving, and
- * not computing, the value of "$FN" ...
- */
-static int
-fld_ck(i)
-int i;
-{
- char *s;
- char buf[BUFSIZ];
-
- strcpy(buf, NUMSTR(i + 1));
- s = getaltenv(VALS(), buf);
- return(is_valid(s));
-}
-
-static int
-is_valid(s)
-char *s;
-{
- int ret;
- char *str;
-
- ret = SUCCESS;
- if (!multi_eval(CURform(), CURfield(), FM_VALID)) {
- if ((str=multi_eval(CURform(), CURfield(), FM_VALMSG)) && *str)
- mess_temp(str);
- else
- warn(VALID, s);
- mess_lock();
- ret = FAIL;
- }
- else if (multi_eval(CURform(), CURfield(), FM_MENUO)) {
- char **list;
-
- if ((list = (char **) multi_eval(CURform(), CURfield(), FM_RMENU)) &&
- *list != '\0')
- {
- int i, lcv;
-
- lcv = array_len(list) - 1;
- for (i = 1; i < lcv; i++)
- if (strcmp(s, list[i]) == 0)
- break;
- if (i == lcv) {
- if ((str = multi_eval(CURform(), CURfield(), FM_VALMSG)) && *str)
- mess_temp(str);
- else
- warn(VALID, s);
- mess_lock();
- ret = FAIL;
- }
- }
- else {
- if ((str = multi_eval(CURform(), CURfield(), FM_VALMSG)) && *str)
- mess_temp(str);
- else
- warn(VALID, s);
- mess_lock();
- ret = FAIL;
- }
- }
- return(ret);
-}
-
-/*
-** Move to another field.
-*/
-static void
-chg_curfield(virtnum)
-int virtnum;
-{
- int num;
-
- num = DEVirt(virtnum);
- if (CURfield() == num)
- return;
- SET_curfield(num);
- set_form_field(Cur_rec->id, num);
-}
-
-/*
-** Calculates the next field to go to. Mode is either positive or
-** negative 1 for forward and backward navigation. Canbecur
-** decides whether the current field should be eliminated from the
-** choices for nextfield().
-*/
-int
-nextfield(currow, curcol, mode, flags)
-int currow;
-int curcol;
-register int mode;
-int flags;
-{
- register int i, j, frow, fcol;
- int curi, rows, cols;
- int newcurrow, newcurcol;
- int leastcol, leastrow, leasti;
- struct fm_mn *curf;
- int no_current, page_advance;
- int lcv;
- int f_error, oldfield, oldpage; /* abs */
- int try; /* abs k17 */
-
- oldfield = CURfield(); /* abs */
- oldpage = CURpage(); /* abs */
- no_current = page_advance = 0;
- if (flags & NX_NOCUR)
- no_current++;
- if (flags & NX_ADVANCE)
- page_advance++;
-
- curf = CURform();
- leastrow = mode * TOOBIG;
- leastcol = mode * TOOBIG;
- newcurrow = mode * TOOBIG;
- newcurcol = mode * TOOBIG;
- curi = -1;
- leasti = -1;
- lcv = NUMvis();
- for (i = 0; i < lcv; i++)
- {
- /*
- * First eliminate fields that can be eliminated
- *
- * IF ...
- * 1. field is inactive/non showable OR
- * 2. field is current and isn't eligible OR
- * 3. either rows or cols <= 0 OR
- * 4. frow or fcol < 0
- *
- * THEN skip the field
- *
- * NOTE: The reason that fields that do not satisfy
- * (3) and (4) are visible is that one can
- * have a field name with no field associated
- * with it .... (ETI does not have such a
- * field/field-name association)
- *
- */
- j = DEVirt(i);
- if (multi_eval(curf, j, FM_INACTIVE) ||
- (!multi_eval(curf, j, FM_SHOW)) ||
- ((j == CURfield()) && no_current))
- continue;
-
- rows = atoi(multi_eval(curf, j, FM_ROWS));
- cols = atoi(multi_eval(curf, j, FM_COLS));
- frow = atoi(multi_eval(curf, j, FM_FROW));
- fcol = atoi(multi_eval(curf, j, FM_FCOL));
- if (rows <= 0 || cols <= 0 || frow < 0 || fcol < 0)
- continue;
-
- /*
- * Determine whether the "ith" visible field is next
- * A few comments here would help !!!
- */
- if ((mode * frow >= mode * currow) && (mode * frow <= mode * newcurrow))
- {
- if (((mode * frow > mode * currow) ||
- (mode * fcol >= mode * curcol)) &&
- ((mode * frow < mode * newcurrow) ||
- (mode * fcol < mode * newcurcol)))
- {
- newcurcol = fcol;
- newcurrow = frow;
- curi = i;
- continue;
- }
- }
- if ((mode * frow <= mode * leastrow))
- {
- if ((mode * frow < mode * leastrow) ||
- (mode * fcol <= mode * leastcol))
- {
- leastcol = fcol;
- leastrow = frow;
- leasti = i;
- }
- }
- } /* end for i=0.. */
- if ((newcurrow == mode * TOOBIG) && (newcurcol == mode * TOOBIG))
- {
- /*
- * User has reached a page boundary (i.e., there is no
- * next/previous field on the current page)
- */
- if (LASTpage() != 1 && page_advance)
- {
- /*
- * If this is a multi-page form AND the page should be
- * automatically advanced on page boundaries then ...
- */
- if (mode < 0) /* prev field */
- { /* find the prev page with visible fields abs k17 */
- f_error = TRUE; /* abs k17 */
- for (try = LASTpage(); try > 1; try--) /* abs k17 */
- { /* abs k17 */
- if (CURpage() != 1)
- CURpage()--;
- else
- CURpage() = LASTpage();
- fm_vislist(CURforminfo());
- if ((int)NUMvis() > 0) /* abs k17 */
- { /* abs k17 */
- f_error = FALSE; /* abs k17 */
- break; /* abs k17 */
- } /* abs k17 */
- } /* abs k17 */
-
- if (!f_error) /* abs k17 */
- f_error = form_ctl(Cur_rec->id, CTSETPAGE, TRUE, CURpage(),
- LASTpage());
- if (f_error)
- {
- CURpage() = oldpage;
- CURfield() = oldfield;
- fm_vislist(CURforminfo());
- form_ctl(Cur_rec->id, CTSETPAGE, TRUE, oldpage, LASTpage());
- mess_temp("Cannot display the previous page: page may be too large");
- mess_lock();
- return (0);
- }
- CURfield() = -1; /* abs */
- nextfield(1000, 1000, -1, NX_ANY);
- return (0);
- }
- else /* next field */
- { /* find the next page with visible fields abs k17 */
- f_error = TRUE; /* abs k17 */
- for (try = LASTpage(); try > 1; try--) /* abs k17 */
- { /* abs k17 */
- if (CURpage() != LASTpage())
- CURpage()++;
- else
- CURpage() = 1;
- fm_vislist(CURforminfo());
- if ((int)NUMvis() > 0) /* abs k17 */
- { /* abs k17 */
- f_error = FALSE; /* abs k17 */
- break; /* abs k17 */
- } /* abs k17 */
- } /* abs k17 */
-
- if (!f_error) /* abs k17 */
- f_error = form_ctl(Cur_rec->id, CTSETPAGE, TRUE, CURpage(),
- LASTpage());
- if (f_error)
- {
- CURpage() = oldpage;
- CURfield() = oldfield;
- fm_vislist(CURforminfo());
- form_ctl(Cur_rec->id, CTSETPAGE, TRUE, oldpage, LASTpage());
- mess_temp("Cannot display the next page: page may be too large");
- mess_lock();
- return (0);
- }
- CURfield() = -1; /* abs */
- nextfield(0, 0, 1, NX_ANY);
- return (0);
- }
- }
- else
- {
- /*
- * simply wrap around to the top/bottom of the page
- */
- curi = leasti;
- }
- }
- if (curi < 0)
- curi = virt(CURfield()); /* zero or one active field */
-
- chg_curfield(curi);
- return (0);
-}
-
-token
-seek_field(row, col)
-int row, col;
-{
- register int i, j, lcv;
- struct fm_mn *curf;
- int frow, fcol, foundfield;
-
- curf = CURform();
- lcv = NUMvis();
- foundfield = -1;
- /*
- * since row,col is 0,0 use 1,1 scale for offset
- */
- for (i = 0; i < lcv; i++) {
- /*
- * First eliminate fields that can be eliminated
- */
- j = DEVirt(i);
- if ((multi_eval(curf, j, FM_SHOW)) &&
- ((frow = atoi(multi_eval(curf, j, FM_FROW))) <= row) &&
- (atoi(multi_eval(curf, j, FM_ROWS)) + frow > row) &&
- ((fcol = atoi(multi_eval(curf, j, FM_FCOL))) <= col) &&
- (atoi(multi_eval(curf, j, FM_COLS)) + fcol > col)) {
- foundfield = i;
- break;
- }
- }
- if (foundfield < 0 || multi_eval(curf, foundfield, FM_INACTIVE))
- return(TOK_BADCHAR);
- else {
- chg_curfield(foundfield);
- return(TOK_NOP);
- }
-}
-
-/* return values */
-#define TOGGLE 1
-#define LONGLIST 2
-#define ACTION 3
-
-/*
-** Checks an "rmenu" to see if it is a small list (toggle choices
-** if less than "threshold" members), a large list or a command.
-*/
-int
-testlist(list)
-char **list;
-{
- if (list[0][0] == '{') {
- if (((int)array_len(list) - 2) <= Toggle) /* account for "{ }" */
- return(TOGGLE);
- return(LONGLIST);
- }
- return(ACTION);
-}
-
-char *Choice_list[3] =
-{
- "OPEN",
- "MENU",
- "-i"
-};
-
-/*
-** Turns an rmenu field into a command.
-*/
-token
-rmenuaction(list)
-register char **list;
-{
- extern char *Args[];
- extern int Arg_count;
- int lcv;
-
- if (testlist(list) == LONGLIST) {
- register int i;
- register IOSTRUCT *out;
- /* char **help;
- */
- out = io_open(EV_USE_STRING, NULL);
-
- putastr("menu=Choices\n", out);
- putastr("lifetime=shortterm\n", out);
-
- /* Shouldn't evaluate help when choices is pressed!! abs.
- * putastr("Help=", out);
- * help = (char **) sing_eval(CURform(), FM_HELP);
- * lcv = array_len(help);
- * for (i = 0; i < lcv; i++) {
- * putastr(help[i], out);
- * putac(' ', out);
- * }
- * putac('\n', out);
- */
- lcv = array_len(list) - 1;
- for (i = 1; i < lcv; i++) {
- putac('\n', out);
- putastr("name=\"", out);
- putastr(list[i], out);
- putastr("\"\n", out);
- putastr("lininfo=\"", out);
- putastr(list[i], out);
- putastr("\"\n", out);
- putastr("action=`set -l Form_Choice=\"", out);
- putastr(list[i], out);
- putastr("\"`close", out);
- putac('\n', out);
- putac('\n', out);
- }
- putastr("name=\nbutton=1\naction=badchar\n", out);
- putastr("name=\nbutton=2\naction=badchar\n", out);
- putastr("name=\nbutton=4\naction=badchar\n", out);
- putastr("name=\nbutton=5\naction=badchar\n", out);
- putastr("name=\nbutton=7\naction=badchar\n", out);
- putastr("name=\nbutton=8\naction=badchar\n", out);
-
- for (Arg_count = 0; Arg_count < 3; Arg_count++) {
- if (Args[Arg_count])
- free(Args[Arg_count]); /* les */
-
- Args[Arg_count] = strsave(Choice_list[Arg_count]);
- }
-
- if (Args[Arg_count])
- free(Args[Arg_count]); /* les */
-
- Args[Arg_count++] = io_string(out);
- io_close(out);
-
- if (Args[Arg_count])
- free(Args[Arg_count]); /* les */
-
- Args[Arg_count] = NULL;
- return(TOK_OPEN);
- }
- return(setaction(list));
-}
-
-/*
-** Processes characters after the editor.
-*/
-token
-post_stream(t)
-register token t;
-{
- formfield form_field;
- char *str;
- char **list;
- int *slks;
- int i, len;
- int num, fnum;
- int nextflags, flag;
- char *s;
- int lcv;
- int f_error; /* abs */
- token make_action();
-
- nextflags = flag = 0;
- form_field = CURffield();
-
- s = NULL;
- if (t >= TOK_SLK1 && t <= TOK_SLK16) {
- slks = CURforminfo()->slks;
- num = t - TOK_SLK1 + 1;
- lcv = array_len(slks);
- for(i = 0; i < lcv; i++)
- if (atoi(multi_eval(CURform(), slks[i], FM_BUTT)) == num) {
- form_ctl(Cur_rec->id, CTGETARG, &s);
- t = setaction(multi_eval(CURform(), slks[i], FM_ACTI));
- break;
- }
- }
- switch(t) {
- case TOK_BPRESSED:
- return(TOK_NOP); /* do nothing on a button press */
- case TOK_BRELEASED:
- return((token) seek_field(Mouse_row, Mouse_col));
- case TOK_OPTIONS:
- t = TOK_NOP;
- if (list = (char **) multi_eval(CURform(), CURfield(), FM_RMENU)) {
- int i;
- char *str;
-
- if ((str = multi_eval(CURform(), CURfield(), FM_CHOICEMSG)) && *str) {
- mess_temp(str);
- mess_lock(); /* don't overwrite it !!! */
- }
- len = array_len(list);
- if (len == 0 || (len <= 2 && list[0][0] == '{')) {
- if (!(str && *str))
- mess_temp("There are no choices available");
- }
- else if (testlist(list) == TOGGLE) {
- char *s;
-
- s = getaltenv(VALS(), NUMSTR(CURfield() + 1));
- len -= 2;
- list = list + 1;
-
- for (i = 0; i < len - 1; i++)
- if (strcmp(s, list[i]) == 0)
- break;
- if (set_curval(strsave(list[(i + 1) % len])) == SUCCESS) {
- fm_vislist(CURforminfo());
- redo_vals(CURfield() + 1);
- form_ctl(Cur_rec->id, CTSETDIRTY);
- }
- }
- else
- t = rmenuaction(list);
- }
- break;
- case TOK_RESET:
- {
- char *s = NULL;
-
- form_ctl(Cur_rec->id, CTGETARG, &s);
- de_const(CURform(), CURfield(), FM_VALUE);
- redo_vals(CURfield());
- fm_vislist(CURforminfo());
- form_ctl(Cur_rec->id, CTSETDIRTY);
- t = TOK_NOP;
- break;
- }
- case TOK_DONE:
- t = TOK_BADCHAR;
- if (fld_get_ck(&form_field) != SUCCESS)
- t = TOK_NOP;
- else if ((fnum = chk_form()) >= 0) {
- int page;
-
- /*
- * fnum is the actual (rather than the virtual)
- * field num
- */
- page = atoi(multi_eval(CURform(), fnum, FM_PAGE));
- if (page != CURpage()) {
- /*
- * make the new page visible
- */
- CURpage() = page;
- fm_vislist(CURforminfo());
- form_ctl(Cur_rec->id, CTSETPAGE, TRUE, CURpage(), LASTpage());
- }
- chg_curfield(virt(fnum));
- t = TOK_NOP;
- }
- else if (str = sing_eval(CURform(), FM_DONE))
- t = make_action(str);
- else {
- warn(VALID, "");
- mess_lock();
- }
- break;
- case TOK_UP:
- nextflags |= NX_ADVANCE;
- /* fall through */
- case TOK_PREVIOUS:
- case TOK_BTAB: /* added backtab mapping. abs k16 */
- nextflags |= NX_NOCUR;
- if (fld_get_ck(&form_field) == SUCCESS)
- nextfield(atoi(multi_eval(CURform(), CURfield(), FM_FROW)),
- atoi(multi_eval(CURform(), CURfield(), FM_FCOL)),
- -1, nextflags);
- else
- set_form_field(Cur_rec->id, CURfield());
- t = TOK_NOP;
- break;
- case TOK_DOWN:
- nextflags |= NX_ADVANCE;
- /* fall through */
- case TOK_TIME:
- case TOK_SAVE:
- case TOK_NEXT:
- nextflags |= NX_NOCUR;
- if (fld_get_ck(&form_field) == SUCCESS)
- nextfield(atoi(multi_eval(CURform(), CURfield(), FM_FROW)),
- atoi(multi_eval(CURform(), CURfield(), FM_FCOL)),
- 1, nextflags);
- else
- set_form_field(Cur_rec->id, CURfield());
- t = TOK_NOP;
- break;
- case TOK_PPAGE:
- if (fld_get_ck(&form_field) == SUCCESS)
- { /* find the prev page with visible fields. abs k17 */
- int oldpage = CURpage(); /* abs k17 */
-
- if (CURpage() == 1) /* abs k17 */
- {
- set_form_field(Cur_rec->id, CURfield());
- t = TOK_BADCHAR;
- break;
- }
- else
- {
- while (CURpage() != 1) /* abs k17 */
- { /* abs k17 */
- CURpage()--;
- fm_vislist(CURforminfo());
- if ((int)NUMvis() > 0) /* abs k17 */
- { /* abs k17 */
- f_error = FALSE; /* abs k17 */
- break; /* abs k17 */
- } /* abs k17 */
- else /* abs k17 */
- f_error = TRUE; /* abs k17 */
- } /* abs k17 */
-
- if (!f_error) /* abs k17 */
- f_error = form_ctl(Cur_rec->id, CTSETPAGE, TRUE,
- CURpage(), LASTpage());
- if (f_error) /* bad page .. go back to old one */
- {
- CURpage() = oldpage; /* abs k17 */
- fm_vislist(CURforminfo());
- f_error = form_ctl(Cur_rec->id, CTSETPAGE, TRUE,
- CURpage(), LASTpage());
- mess_temp("Cannot display the previous page: page may be too large");
- mess_lock();
- }
- else
- nextfield(0, 0, 1, NX_ANY);
- }
- }
- else
- set_form_field(Cur_rec->id, CURfield());
- t = TOK_NOP;
- break;
- case TOK_NPAGE:
- if (fld_get_ck(&form_field) == SUCCESS)
- { /* find the next page with visible fields. abs k17 */
- int oldpage = CURpage(); /* abs k17 */
-
- if (CURpage() == LASTpage()) /* abs k17 */
- {
- set_form_field(Cur_rec->id, CURfield());
- t = TOK_BADCHAR;
- break;
- }
- else
- {
- while (CURpage() != LASTpage() ) /* abs k17 */
- { /* abs k17 */
- CURpage()++;
- fm_vislist(CURforminfo());
- if ((int)NUMvis() > 0) /* abs k17 */
- { /* abs k17 */
- f_error = FALSE; /* abs k17 */
- break; /* abs k17 */
- } /* abs k17 */
- else /* abs k17 */
- f_error = TRUE; /* abs k17 */
- } /* abs k17 */
-
- if (!f_error) /* abs k17 */
- f_error = form_ctl(Cur_rec->id, CTSETPAGE, TRUE,
- CURpage(), LASTpage());
- if (f_error) /* bad page .. go back to old one */
- {
- CURpage() = oldpage; /* abs k17 */
- fm_vislist(CURforminfo());
- f_error = form_ctl(Cur_rec->id, CTSETPAGE, TRUE,
- CURpage(), LASTpage());
- mess_temp("Cannot display the next page: page may be too large");
- mess_lock();
- }
- else
- nextfield(0, 0, 1, NX_ANY);
- }
- }
- else
- set_form_field(Cur_rec->id, CURfield());
- t = TOK_NOP;
- break;
- }
- return(t);
-}
-
-/*
-** Processes characters before the editor.
-*/
-int
-pre_stream(t)
-register token t;
-{
- formfield form_field;
-
- /* les */
-/* if ( isprint(t)) ** only looks at 8 bits. abs k17 */
- if ( t > 037 && t < 0177 )
- return t;
- /*******/
-
- form_field = CURffield();
- switch(t) {
- case TOK_END:
- nextfield(1000, 1000, -1, NX_ANY);
- t = TOK_NOP;
- break;
- case TOK_BEG:
- nextfield(0, 0, 1, NX_ANY);
- t = TOK_NOP;
- break;
- case TOK_BTAB:
- if (fld_get_ck(&form_field) == SUCCESS)
- nextfield(atoi(multi_eval(CURform(), CURfield(), FM_FROW)),
- atoi(multi_eval(CURform(), CURfield(), FM_FCOL)),
- -1, NX_NOCUR | NX_ADVANCE);
- else
- set_form_field(Cur_rec->id, CURfield());
- t = TOK_NOP;
- break;
- case TOK_TAB:
- t = TOK_SAVE;
- case TOK_WDWMGMT:
- break;
- }
- return(t);
-}
-
-/*
-** Sets up the stream for forms.
-*/
-static int
-objform_stream(a, t)
-struct actrec *a;
-token t;
-{
- int (*func[5])();
- register int olifetime;
- extern int field_stream();
-
- Cur_rec = a;
- olifetime = Cur_rec->lifetime;
- Cur_rec->lifetime = AR_PERMANENT;
- func[0] = pre_stream;
- func[1] = field_stream;
- func[2] = (int (*)())post_stream; /* added cast abs */
- func[3] = NULL;
- t = stream(t, func);
- Cur_rec->lifetime = olifetime;
- return(t);
-}
-
-int
-set_form_field(id, field_num)
-int id, field_num;
-{
- char *str;
- char *lininfo;
- char buf[BUFSIZ];
- struct attribute *attr;
-
- /*
- * mark the attribute as touched (visited) ...
- */
- if (multi_eval(CURform(), field_num, FM_MENUO))
- attr = CURattr(field_num, FM_MENUO);
- else
- attr = CURattr(field_num, FM_VALID);
- if (attr)
- attr->flags |= ATTR_TOUCHED;
-
- /*
- * set "LININFO" variable to the value of the "lininfo"
- * descriptor for field_num
- */
- lininfo = multi_eval(CURform(), field_num, FM_LININFO);
- if (strlen(lininfo)) {
- sprintf(buf, "LININFO=%s", lininfo);
- putAltenv(buf);
- }
- else
- delAltenv("LININFO");
-
- /*
- * display on the message line the "fieldmsg" for field_num
- */
- if ((str = multi_eval(CURform(), field_num, FM_FIELDMSG)) && *str)
- mess_temp(str);
- form_ctl(id, CTSETPOS, virt(field_num), 0, 0);
- return (0);
-}