📄 form.c.orig
字号:
/* Last update: 02/08/88 00:18 AM (Edition: 56) */#include <stdio.h>#include <ctype.h>#include <signal.h>#include "form.h"#include "field.h"#include "term.h"#include "basic.h"char Screen [SCRLINE][SCRCOL+1];char Form_name[20] = ""; /* current form name */char Exitc; /* field exit char */ char Enter_mode [20]; /* display before input field */char Exit_mode [20]; /* display after input field */struct field Field[MAXFIELD]; /* field nodes */int Fno; /* next field to use (or count) */unsigned char Fhead[SCRLINE]; /* 1st field index on each line */unsigned char Flcount[SCRLINE]; /* number of fields on this line */unsigned char Lastdata = 24; /* last line with data on form */char Varfile [MAXFNAME]; /* output variable file name */extern int Form_msg; /* defined in msg.c */extern unsigned char Shell; /* output shell script type */int sig_interrupt();int sig_stop();/*----------------------------------------------------------------------+| || show_form : display a given form file || |+----------------------------------------------------------------------*/show_form (fname)char *fname; /* name of form file, NULL = stdin, 1 = redisplay */ { int i, j; int idx; /* index to current field */ unsigned size; unsigned off; unsigned len; /* string length */ int pend; /* previous end position */ char *lp; /* line pointer (for speed) */ char *p; extern char *Prgname; ENTER(show_form); if (fname != (char *)1 && /* redisplay */ (fname == NULL || strcmp (fname, Form_name) != 0)) { if (!load_form (fname)) RETURN (0); } screen (SCR_ERASE); for (i=0; i<SCRLINE; i++) { p = lp = Screen[i]; if (Flcount[i] != 0) { pend = 0; for (j=0, idx=Fhead[i]; j<Flcount[i]; j++, idx++) { size = Field[idx].f_len; off = Field[idx].f_off; put_string (p, off-pend); put_string (Enter_mode, 0); put_string (lp + off, size); put_string (Exit_mode, 0); p = lp + off + size; pend = off + size; } } if ((len = strlen (p)) == 0) continue; put_string (p, len); put_char ('\r'); } RETURN (1); }/*----------------------------------------------------------------------+| || edit_form : edit a form on all the input fields || |+----------------------------------------------------------------------*/edit_form (fname, action)char *fname; /* name of the form to edit */int (*action) (); /* action routine to check at end of each field */ { unsigned fdx = 0; /* current cursor in field index */ struct field *fp; /* pointer to current edit field */ int n; /* action routine return status */ int efopt; /* option to edit field */ ENTER(edit_form); signal (SIGINT, sig_interrupt); signal (SIGTSTP, sig_stop); term_init (); cbreakio (1); if (!show_form (fname)) goto end; if (Fno == 0) goto end; form_msg ((char *)NULL, 1, 1); screen (SCR_KEYXMIT); while (1) { fp = &Field[fdx]; efopt = EF_BOF; do { if (fp->f_attr & FA_SELECTION) sel_field (fdx); else edit_field (fdx, efopt); if (!action) break; n = (*action) (fdx, &Screen[fp->f_line-1][fp->f_off], fp->f_len, Exitc); switch (n) { when EF_ERR: efopt = EF_BOF; when EF_FILL: efopt = EF_FILL; } } while (n != EF_OK); if ((Exitc & 0x80) == 0x80) { switch (Exitc & 0x7f) { when KU: Exitc = CTRL('P'); when KD: Exitc = CTRL('N'); } } switch (Exitc) { when CTRL('L'): show_form ((char *)1); when CTRL('M'): goto wrout; when CTRL('J'): goto wrout; when CTRL('P'): fdx = closest (fdx, -1); when CTRL('N'): fdx = closest (fdx, 1); when CTRL('T'): fdx = (fdx == 0) ? Fno-1 : (fdx-1); when CTRL('I'): if (++fdx == Fno) fdx = 0; otherwise: show_summary (); show_form ((char *)1); } }wrout: write_var (); poscur (Lastdata, (unsigned char)1, "\n"); screen (SCR_EEOL);end: screen (SCR_NOKEYXMIT); cbreakio (0); term_close (); EXIT; }/*-------------------------------------------------------------05/08/86-+| || write_var : write field variables to a file || |+----------------------------------------------------------------------*/write_var () { register int i; FILE *fd; /* output file pointer */ char *p; char *op; char c; char buf[80+1]; char obuf[80+1]; struct field *f; ENTER(write_var); if (!strlen (Varfile)) EXIT; if ((fd = fopen (Varfile, "w")) == NULL) { fprintf (stderr, "write_var: can not open file %s for write\r\n", Varfile); exit (1); } for (i=0; i<Fno; i++) { f = &Field[i]; if (f-> f_var != NULL) { get_field (i, buf); p = buf; op = obuf; while (c = *p++) { switch (c) { when '\'': if (Shell== PERL) *op++ = '\\'; else { *op++ ='\'';*op++ ='"'; *op++ ='\'';*op++ ='"'; } when '!': if (Shell == CSH) *op++ = '\\'; } *op++ = c; } *op = EOS; fprintf (fd, "%s%s='%s'%s\n", (Shell==CSH)?"set ":((Shell==PERL)?"$":""), f-> f_var, obuf, (Shell == PERL) ? ";" : ""); } } fclose (fd); EXIT; }/*-------------------------------------------------------------01/12/88-+| || sig_interrupt : Interrupt signal handler || |+----------------------------------------------------------------------*/sig_interrupt () { ENTER (sig_interrupt); form_msg ("Aborted by user\n", 24+1, 1); screen (SCR_NORMAL); cbreakio (1); exit (1); }/*-------------------------------------------------------------01/12/88-+| || sig_stop : Stop signal handler || |+----------------------------------------------------------------------*/sig_stop () { ENTER (sig_stop); form_msg ("stopped by user\n", 24+1, 1); screen (SCR_NORMAL); cbreakio (0); kill (getpid(), SIGSTOP); put_string ("Press CTRL L to refresh display: ", 33); cbreakio (1); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -