From e9c0c1257619ee91ed32da94e6a352c64fe6f6c9 Mon Sep 17 00:00:00 2001 From: Oliver Lehmann Date: Sat, 24 Mar 1990 06:55:37 +0000 Subject: [PATCH] ING_DB --- WEGA/contrib/ingres/dbs/src/form/alloc.c | 42 +++++ WEGA/contrib/ingres/dbs/src/form/error.c | 27 +++ WEGA/contrib/ingres/dbs/src/form/form.h | 71 ++++++++ WEGA/contrib/ingres/dbs/src/form/free.c | 21 +++ WEGA/contrib/ingres/dbs/src/form/getchar.c | 191 +++++++++++++++++++++ WEGA/contrib/ingres/dbs/src/form/input.c | 83 +++++++++ WEGA/contrib/ingres/dbs/src/form/main.c | 190 ++++++++++++++++++++ WEGA/contrib/ingres/dbs/src/form/menue.c | 21 +++ WEGA/contrib/ingres/dbs/src/form/next.c | 16 ++ WEGA/contrib/ingres/dbs/src/form/output.c | 58 +++++++ WEGA/contrib/ingres/dbs/src/form/string.c | 48 ++++++ WEGA/contrib/ingres/dbs/src/form/var.c | 17 ++ WEGA/contrib/ingres/dbs/src/form/var_f4.c | 13 ++ WEGA/contrib/ingres/dbs/src/form/var_f8.c | 9 + WEGA/contrib/ingres/dbs/src/form/var_i1.c | 9 + WEGA/contrib/ingres/dbs/src/form/var_i2.c | 9 + WEGA/contrib/ingres/dbs/src/form/var_i4.c | 9 + 17 files changed, 834 insertions(+) create mode 100644 WEGA/contrib/ingres/dbs/src/form/alloc.c create mode 100644 WEGA/contrib/ingres/dbs/src/form/error.c create mode 100644 WEGA/contrib/ingres/dbs/src/form/form.h create mode 100644 WEGA/contrib/ingres/dbs/src/form/free.c create mode 100644 WEGA/contrib/ingres/dbs/src/form/getchar.c create mode 100644 WEGA/contrib/ingres/dbs/src/form/input.c create mode 100644 WEGA/contrib/ingres/dbs/src/form/main.c create mode 100644 WEGA/contrib/ingres/dbs/src/form/menue.c create mode 100644 WEGA/contrib/ingres/dbs/src/form/next.c create mode 100644 WEGA/contrib/ingres/dbs/src/form/output.c create mode 100644 WEGA/contrib/ingres/dbs/src/form/string.c create mode 100644 WEGA/contrib/ingres/dbs/src/form/var.c create mode 100644 WEGA/contrib/ingres/dbs/src/form/var_f4.c create mode 100644 WEGA/contrib/ingres/dbs/src/form/var_f8.c create mode 100644 WEGA/contrib/ingres/dbs/src/form/var_i1.c create mode 100644 WEGA/contrib/ingres/dbs/src/form/var_i2.c create mode 100644 WEGA/contrib/ingres/dbs/src/form/var_i4.c diff --git a/WEGA/contrib/ingres/dbs/src/form/alloc.c b/WEGA/contrib/ingres/dbs/src/form/alloc.c new file mode 100644 index 0000000..4f7486b --- /dev/null +++ b/WEGA/contrib/ingres/dbs/src/form/alloc.c @@ -0,0 +1,42 @@ +# include "form.h" + +struct MM_form *MMalloc(frame, line, col, len, var) +register struct MM_form **frame; +int line; +int col; +int len; +char *var; +{ + register struct MM_form *form; + register struct MM_form *f; + register int i; + extern char *calloc(); + + i = sizeof (struct MM_form); + if (!var) + i += len + 1; + if (!(f = (struct MM_form *) calloc(1, i))) + return ((struct MM_form *) 0); + + if (form = *frame) + { + f->f_next = form; + f->f_prev = form->f_prev; + form->f_prev->f_next = f; + form->f_prev = f; + } + else + { + *frame = f; + f->f_next = f; + f->f_prev = f; + f->f_mode = F_START; + } + + f->f_line = line; + f->f_col = col; + f->f_len = len; + f->f_field = var? var: ((char *) f) + sizeof (struct MM_form); + + return (f); +} diff --git a/WEGA/contrib/ingres/dbs/src/form/error.c b/WEGA/contrib/ingres/dbs/src/form/error.c new file mode 100644 index 0000000..4c9a41c --- /dev/null +++ b/WEGA/contrib/ingres/dbs/src/form/error.c @@ -0,0 +1,27 @@ +# include "form.h" + +static int _Error; + +MMclr_error() +{ + if (!_Error) + return (0); + + MMclr_line(1, 1); + MM_repos(); + _Error = 0; + + return (1); +} + + +MMerror(error_text) +register char *error_text; +{ + MMclr_line(1, 1); + MM_ptis(error_text); + MM_repos(); + _Error = 1; + + return (1); +} diff --git a/WEGA/contrib/ingres/dbs/src/form/form.h b/WEGA/contrib/ingres/dbs/src/form/form.h new file mode 100644 index 0000000..e0cdba0 --- /dev/null +++ b/WEGA/contrib/ingres/dbs/src/form/form.h @@ -0,0 +1,71 @@ +# include "../conf/gen.h" + +struct MM_form +{ + struct MM_form *f_next; /* next field */ + struct MM_form *f_prev; /* previous field */ + int (*f_func)(); /* field function */ + int (*f_help)(); /* help function */ + char *f_var; /* field variable */ + char *f_format; /* format of variable */ + short f_mode; /* field specifications */ + short f_line; /* line no. of field */ + short f_col; /* column no. of field */ + short f_len; /* length of field */ + char *f_field; /* fieldbuffer */ +}; + + + /* field specifications */ +# define F_START 020000 /* (first) start field */ +# define F_OUTPUT 000001 /* output field */ +# define F_MENUE 000002 /* menue field */ +# define F_INPUT 000004 /* input field */ +# define F_VALUE 000010 /* value field */ +# define F_FIELD 000017 /* field type bits */ +# define F_NEED 000020 /* needed input field */ +# define F_SENDED 000040 /* input just given */ +# define F_FILLED 000100 /* in/output filled in */ + +# define F_I1 000200 /* variable of type i1 */ +# define F_I2 000400 /* variable of type i2 */ +# define F_I4 001000 /* variable of type i4 */ +# define F_F4 002000 /* variable of type f4 */ +# define F_F8 004000 /* variable of type f8 */ +# define F_C 010000 /* variable of type c */ +# define F_TYPE (F_I1 | F_I2 | F_I4 | F_F4 | F_F8 | F_C) + + + /* screen sequences */ +# define CS_CD 0 /* clear rest of screen */ +# define CS_CE 1 /* clear rest of line */ +# define CS_CM 2 /* move cursor */ +# define CS_SO 3 /* invers on */ +# define CS_SE 4 /* invers off */ + + + /* function keys */ +# define C_CONTINUE -11 /* next record(s) */ +# define C_DELETE -12 /* delete one char */ +# define C_FIELD -13 /* cursor field begin */ +# define C_HELP -14 /* select help */ +# define C_INSERT -15 /* insert one char */ +# define C_LEFT -16 /* cursor left */ +# define C_MENUE -17 /* select menue */ +# define C_NEXT -18 /* next field */ +# define C_PREV -19 /* previous field */ +# define C_QUIT -20 /* quit frame */ +# define C_RIGHT -21 /* cursor right */ + + +# ifndef SIGN_EXT +# define AAi1toi2(val) MM_i1toi2(val) +# endif + + +extern struct MM_form *MM_need(); +extern struct MM_form *MMalloc(); +extern char *MM_cs[CS_SE + 1]; +extern int MM_cs_cm; +extern int MMline; +extern int MMcol; diff --git a/WEGA/contrib/ingres/dbs/src/form/free.c b/WEGA/contrib/ingres/dbs/src/form/free.c new file mode 100644 index 0000000..d6070f7 --- /dev/null +++ b/WEGA/contrib/ingres/dbs/src/form/free.c @@ -0,0 +1,21 @@ +# include "form.h" + +MMfree(frame) +register struct MM_form **frame; +{ + register struct MM_form *form; + register struct MM_form *f; + + if (form = *frame) + { + do + { + f = form->f_next; + free(form); + } while ((form = f) != *frame); + + *frame = (struct MM_form *) 0; + } + + return (1); +} diff --git a/WEGA/contrib/ingres/dbs/src/form/getchar.c b/WEGA/contrib/ingres/dbs/src/form/getchar.c new file mode 100644 index 0000000..29810d8 --- /dev/null +++ b/WEGA/contrib/ingres/dbs/src/form/getchar.c @@ -0,0 +1,191 @@ +# include +# include "form.h" + +struct MM_tree +{ + struct MM_tree *t_other; + struct MM_tree *t_next; + short t_char; + short t_code; +}; +static struct MM_tree *_Tree; + +# define PEEKS 10 +static int _Peek_ch[PEEKS]; +static int _Peek_ptr; + +static int _translate(key_string) +char **key_string; +{ + register char *k; + register int key_char; + register int c; + + k = *key_string; + key_char = *k++; + if (key_char == '\\') + { + key_char = 0; + while ((c = *k++) >= '0' && c <= '7') + key_char = (key_char << 3) | (c &= 7); + } + else + { + k++; + key_char &= 0377; + } + *key_string = k; + + return ((key_char == '\t')? 0: key_char); +} + + +MM_incode(key_string, key_code) +char *key_string; +int key_code; +{ + register struct MM_tree *tree; + register struct MM_tree *t; + register int key_char; + register struct MM_tree *prev; + extern char *calloc(); + + prev = t = (struct MM_tree *) 0; + tree = _Tree; + while (key_char = _translate(&key_string)) + { + if (!tree) + { +new_node: + if (!(t = (struct MM_tree *) calloc(1, sizeof (struct MM_tree)))) + return (0); + + t->t_char = key_char; + if (tree) + tree->t_other = t; + else if (prev) + prev->t_next = t; + else + _Tree = t; + prev = t; + tree = (struct MM_tree *) 0; + continue; + } +other_node: + if (tree->t_char == key_char) + { + if (tree->t_code) + return (0); + tree = tree->t_next; + continue; + } + if (t = tree->t_other) + { + tree = t; + goto other_node; + } + else + goto new_node; + } + if (!t || t->t_code) + return (0); + t->t_code = key_code; + + return (1); +} + + +MM_outcode(key_string, key_code) +char *key_string; +int key_code; +{ + register int len; + register char *ka; + register char *ke; + extern char *malloc(); + + ka = ke = key_string; + len = 0; + while (*ke++ = _translate(&key_string)) + len++; + MM_cs[key_code] = ke = malloc(len + 1); + MMsmove(ka, ke); + if (key_code == CS_CM) + MM_cs_cm = _translate(&key_string); + + return (1); +} + + +MM_backup(character) +register int character; +{ + _Peek_ch[_Peek_ptr++] = character; + + return (1); +} + + +static int _getchar() +{ + register int ret_ch; + char ch; + extern int errno; + + if (_Peek_ptr) + ret_ch = _Peek_ch[--_Peek_ptr]; + else + { +interrupted_system_call: + errno = 0; + switch (read(0, &ch, 1)) + { + case -1: + if (errno == EINTR) + goto interrupted_system_call; + /* fall through */ + + case 0: + ret_ch = C_QUIT; + break; + + default: + ret_ch = ch; + ret_ch &= 0377; + } + MMclr_error(); + } + + return (ret_ch); +} + + +MM_getchar() +{ + register int character; + register struct MM_tree *tree; + register int peekptr; + char peekch[PEEKS]; + + tree = _Tree; + peekptr = 0; +next_char: + peekch[peekptr++] = character = _getchar(); +same_char: + if (tree->t_char == character) + { + if (tree->t_code) + return (tree->t_code); + tree = tree->t_next; + goto next_char; + } + if (tree->t_other) + { + tree = tree->t_other; + goto same_char; + } + while (--peekptr) + MM_backup(peekch[peekptr]); + + return (peekch[0]); +} diff --git a/WEGA/contrib/ingres/dbs/src/form/input.c b/WEGA/contrib/ingres/dbs/src/form/input.c new file mode 100644 index 0000000..0aa7fce --- /dev/null +++ b/WEGA/contrib/ingres/dbs/src/form/input.c @@ -0,0 +1,83 @@ +# include "form.h" + +MM_input(form) +register struct MM_form *form; +{ + register char *p; + + p = form->f_var; + switch (form->f_mode & F_TYPE) + { + case F_I2: + *((short *) p) = 0; + break; + + case F_I4: + *((long *) p) = 0; + break; + +# ifndef NO_F4 + case F_F4: + *((float *) p) = 0; + break; +# endif + + case F_F8: + *((double *) p) = 0; + break; + + default: + *p = 0; + } + form->f_field[form->f_len] = 0; + if (form->f_format) + sscanf(form->f_field, form->f_format, p); + else + MMsmove(form->f_field, form->f_var); + + return (1); +} + + +struct MM_form *MM_need(frame) +register struct MM_form *frame; +{ + register struct MM_form *form; + + form = frame; + do + { + if ((form->f_mode & F_NEED) && !(form->f_mode & F_FILLED)) + { + MMerror(" BITTE Wert eingegeben "); + return (form); + } + } + while ((form = form->f_next) != frame); + + return ((struct MM_form *) 0); +} + + +MMin_field(form, func, help, need) +register struct MM_form *form; +int (*func)(); +int (*help)(); +register int need; +{ + register int len; + + if (form->f_mode & F_FIELD) + return (0); + + form->f_mode |= F_INPUT; + if (need) + form->f_mode |= F_NEED; + form->f_func = func; + form->f_help = help; + form->f_field[len = form->f_len] = 0; + while (len--) + form->f_field[len] = ' '; + + return (1); +} diff --git a/WEGA/contrib/ingres/dbs/src/form/main.c b/WEGA/contrib/ingres/dbs/src/form/main.c new file mode 100644 index 0000000..503e2ab --- /dev/null +++ b/WEGA/contrib/ingres/dbs/src/form/main.c @@ -0,0 +1,190 @@ +# include +# include "form.h" + +# define cbreak() (_Tty.sg_flags |= CBREAK) +# define no_cbreak() (_Tty.sg_flags &= ~CBREAK) + +# define echo() (_Tty.sg_flags |= ECHO) +# define no_echo() (_Tty.sg_flags &= ~ECHO) + +# define nl() (_Tty.sg_flags |= CRMOD) +# define no_nl() (_Tty.sg_flags &= ~CRMOD) + +# define raw() (_Tty.sg_flags |= RAW) +# define no_raw() (_Tty.sg_flags &= ~RAW) + +# define tabs() (_Tty.sg_flags |= XTABS) +# define no_tabs() (_Tty.sg_flags &= ~XTABS) + +# define reset_tty() (_Tty.sg_flags = _Tty_flags) +# define save_tty() (_Tty_flags = _Tty.sg_flags) + +# define get_tty() (gtty(_Tty_fd, &_Tty)) +# define set_tty() (stty(_Tty_fd, &_Tty)) + +static int _Tty_fd; +static int _Tty_flags; +static struct sgttyb _Tty; + + +MMinit_form(clear) +register int clear; +{ + register int file; + register char *p; + register int code; + char buf[255]; + extern char *getenv(); + + if (!(p = getenv("TERM"))) + return (0); + MMsmove(p, &buf[MMsmove("/usr/lib/form/", buf)]); + if ((file = open(buf, 0)) < 0) + return (0); + + for (_Tty_fd = 0; _Tty_fd < 20; _Tty_fd++) + if (isatty(_Tty_fd)) + break; + if ((get_tty() < 0) || (set_tty() < 0)) + return (0); + + save_tty(); + + no_cbreak(); + no_echo(); + no_nl(); + raw(); + no_tabs(); + + set_tty(); + ioctl(0, TIOCFLUSH, 0); + ioctl(1, TIOCFLUSH, 1); + + for ( ; ; ) + { + for (p = buf; ; p++) + { + if (read(file, p, 1) != 1) + { + close(file); + if (clear) + MMclr_screen(1, 1); + return (1); + } + if (*p == '\n') + { + *p++ = 0; + *p = 0; + break; + } + } + p = buf; + switch (*p++) + { + case 'C': + code = C_CONTINUE; + break; + + case 'D': + code = C_DELETE; + break; + + case 'F': + code = C_FIELD; + break; + + case 'H': + code = C_HELP; + break; + + case 'I': + code = C_INSERT; + break; + + case 'L': + code = C_LEFT; + break; + + case 'M': + code = C_MENUE; + break; + + case 'N': + code = C_NEXT; + break; + + case 'P': + code = C_PREV; + break; + + case 'Q': + code = C_QUIT; + break; + + case 'R': + code = C_RIGHT; + break; + + case 'c': + switch (*p++) + { + case 'd': + code = CS_CD; + break; + + case 'e': + code = CS_CE; + break; + + case 'm': + code = CS_CM; + break; + + default: + continue; + } + break; + + case 's': + switch (*p++) + { + case 'e': + code = CS_SE; + break; + + case 'o': + code = CS_SO; + break; + + default: + continue; + } + break; + + default: + continue; + } + if (*p++ != '\t') + continue; + + if (code < 0) + MM_incode(p, code); + else + MM_outcode(p, code); + } +} + + +MMexit_form(clear) +register int clear; +{ + if (clear) + MMclr_screen(1, 1); + + reset_tty(); + set_tty(); + ioctl(0, TIOCFLUSH, 0); + ioctl(1, TIOCFLUSH, 1); + + return (1); +} diff --git a/WEGA/contrib/ingres/dbs/src/form/menue.c b/WEGA/contrib/ingres/dbs/src/form/menue.c new file mode 100644 index 0000000..a153013 --- /dev/null +++ b/WEGA/contrib/ingres/dbs/src/form/menue.c @@ -0,0 +1,21 @@ +# include "form.h" + +MMmen_field(form, func, help, menue_text) +register struct MM_form *form; +int (*func)(); +int (*help)(); +register char *menue_text; +{ + register int len; + + if (form->f_mode & F_FIELD) + return (0); + + form->f_mode |= F_MENUE; + form->f_func = func; + form->f_help = help; + MMpmove(menue_text, form->f_field, len = form->f_len, ' '); + form->f_field[len] = 0; + + return (1); +} diff --git a/WEGA/contrib/ingres/dbs/src/form/next.c b/WEGA/contrib/ingres/dbs/src/form/next.c new file mode 100644 index 0000000..58068e1 --- /dev/null +++ b/WEGA/contrib/ingres/dbs/src/form/next.c @@ -0,0 +1,16 @@ +# include "form.h" + +MMnext() +{ + register int character; + register int ret_val; + + MMerror(" RECHERCHE FORTSETZEN ? "); + + if (ret_val = ((character = MM_getchar()) != C_CONTINUE)) + MM_backup(character); + else + MMerror(" RECHERCHE LAEUFT "); + + return (ret_val); +} diff --git a/WEGA/contrib/ingres/dbs/src/form/output.c b/WEGA/contrib/ingres/dbs/src/form/output.c new file mode 100644 index 0000000..865a07f --- /dev/null +++ b/WEGA/contrib/ingres/dbs/src/form/output.c @@ -0,0 +1,58 @@ +# include "form.h" + +MM_output(form) +register struct MM_form *form; +{ + register char *p; + + p = form->f_var; + switch (form->f_mode & F_TYPE) + { + case F_I1: + sprintf(form->f_field, form->f_format, ctoi(p)); + break; + + case F_I2: + sprintf(form->f_field, form->f_format, *((short *) p)); + break; + + case F_I4: + sprintf(form->f_field, form->f_format, *((long *) p)); + break; + +# ifndef NO_F4 + case F_F4: + sprintf(form->f_field, form->f_format, *((float *) p)); + break; +# endif + + case F_F8: + sprintf(form->f_field, form->f_format, *((double *) p)); + break; + + default: + if (form->f_format) + sprintf(form->f_field, form->f_format, p); + else + MMpmove(p, form->f_field, form->f_len, ' '); + } + + return (1); +} + + +MMout_field(form, output_text) +register struct MM_form *form; +register char *output_text; +{ + register int len; + + if (form->f_mode & F_FIELD) + return (0); + + form->f_mode |= F_OUTPUT; + MMpmove(output_text, form->f_field, len = form->f_len, ' '); + form->f_field[len] = 0; + + return (1); +} diff --git a/WEGA/contrib/ingres/dbs/src/form/string.c b/WEGA/contrib/ingres/dbs/src/form/string.c new file mode 100644 index 0000000..dde9235 --- /dev/null +++ b/WEGA/contrib/ingres/dbs/src/form/string.c @@ -0,0 +1,48 @@ +# include "form.h" + +char *MM_cs[CS_SE + 1]; + +MM_ptis(string) +register char *string; +{ + MM_pts(MM_cs[CS_SO]); + MM_pts(string); + MM_pts(MM_cs[CS_SE]); + + return (1); +} + + +MM_pts(string) +register char *string; +{ + register int time_out; + register int esc; + register int len; + + esc = *string != 033; + len = 0; + while (*string) + { + write(1, string++, 1); + len++; + if (esc) + continue; + for (time_out = 1000; time_out; --time_out) + continue; + } + + return (len); +} + + +MM_pta(string, length) +register char *string; +register int length; +{ + string[length] = 0; + for (length -= MM_pts(string); length > 0; --length) + write(1, " ", 1); + + return (1); +} diff --git a/WEGA/contrib/ingres/dbs/src/form/var.c b/WEGA/contrib/ingres/dbs/src/form/var.c new file mode 100644 index 0000000..c43b881 --- /dev/null +++ b/WEGA/contrib/ingres/dbs/src/form/var.c @@ -0,0 +1,17 @@ +# include "form.h" + +MM_var(form, var, format, type) +register struct MM_form *form; +register char *var; +register char *format; +register int type; +{ + if (!(form->f_mode & (F_INPUT | F_VALUE)) || (form->f_mode & F_TYPE)) + return (0); + + form->f_mode |= type; + form->f_var = var; + form->f_format = format; + + return (1); +} diff --git a/WEGA/contrib/ingres/dbs/src/form/var_f4.c b/WEGA/contrib/ingres/dbs/src/form/var_f4.c new file mode 100644 index 0000000..eb991bf --- /dev/null +++ b/WEGA/contrib/ingres/dbs/src/form/var_f4.c @@ -0,0 +1,13 @@ +# include "form.h" + +MMvarf4(form, var, format) +register struct MM_form *form; +register char *var; +register char *format; +{ +# ifdef NO_F4 + return (MM_var(form, var, format, F_F8)); +# else + return (MM_var(form, var, format, F_F4)); +# endif +} diff --git a/WEGA/contrib/ingres/dbs/src/form/var_f8.c b/WEGA/contrib/ingres/dbs/src/form/var_f8.c new file mode 100644 index 0000000..ccf3eec --- /dev/null +++ b/WEGA/contrib/ingres/dbs/src/form/var_f8.c @@ -0,0 +1,9 @@ +# include "form.h" + +MMvarf8(form, var, format) +register struct MM_form *form; +register char *var; +register char *format; +{ + return (MM_var(form, var, format, F_F8)); +} diff --git a/WEGA/contrib/ingres/dbs/src/form/var_i1.c b/WEGA/contrib/ingres/dbs/src/form/var_i1.c new file mode 100644 index 0000000..4fec064 --- /dev/null +++ b/WEGA/contrib/ingres/dbs/src/form/var_i1.c @@ -0,0 +1,9 @@ +# include "form.h" + +MMvari1(form, var, format) +register struct MM_form *form; +register char *var; +register char *format; +{ + return (MM_var(form, var, format, F_I1)); +} diff --git a/WEGA/contrib/ingres/dbs/src/form/var_i2.c b/WEGA/contrib/ingres/dbs/src/form/var_i2.c new file mode 100644 index 0000000..3ab8e5f --- /dev/null +++ b/WEGA/contrib/ingres/dbs/src/form/var_i2.c @@ -0,0 +1,9 @@ +# include "form.h" + +MMvari2(form, var, format) +register struct MM_form *form; +register char *var; +register char *format; +{ + return (MM_var(form, var, format, F_I2)); +} diff --git a/WEGA/contrib/ingres/dbs/src/form/var_i4.c b/WEGA/contrib/ingres/dbs/src/form/var_i4.c new file mode 100644 index 0000000..21aaf67 --- /dev/null +++ b/WEGA/contrib/ingres/dbs/src/form/var_i4.c @@ -0,0 +1,9 @@ +# include "form.h" + +MMvari4(form, var, format) +register struct MM_form *form; +register char *var; +register char *format; +{ + return (MM_var(form, var, format, F_I4)); +}