This commit is contained in:
Oliver Lehmann 1990-03-24 06:55:37 +00:00
parent 393b893ba0
commit e9c0c12576
17 changed files with 834 additions and 0 deletions

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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;

View File

@ -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);
}

View File

@ -0,0 +1,191 @@
# include <errno.h>
# 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]);
}

View File

@ -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);
}

View File

@ -0,0 +1,190 @@
# include <sgtty.h>
# 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);
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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
}

View File

@ -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));
}

View File

@ -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));
}

View File

@ -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));
}

View File

@ -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));
}