#include <sys/types.h>
#include "utility.h"
typedef struct {
PTF_int class;
PTF_int act;
} REQUEST;
static REQUEST parse(int);
#define COMMAND(x) (x.class)
#define CALL(x, f) (x.class ? (*x.class) (x.act, f) : E_SYSTEM_ERROR)
static REQUEST carray [MAX_FORM_COMMAND - MIN_FORM_COMMAND + 1] =
{
_page_navigation, _next_page,
_page_navigation, _prev_page,
_page_navigation, _first_page,
_page_navigation, _last_page,
_field_navigation, _next_field,
_field_navigation, _prev_field,
_field_navigation, _first_field,
_field_navigation, _last_field,
_field_navigation, _snext_field,
_field_navigation, _sprev_field,
_field_navigation, _sfirst_field,
_field_navigation, _slast_field,
_field_navigation, _left_field,
_field_navigation, _right_field,
_field_navigation, _up_field,
_field_navigation, _down_field,
_data_navigation, _next_char,
_data_navigation, _prev_char,
_data_navigation, _next_line,
_data_navigation, _prev_line,
_data_navigation, _next_word,
_data_navigation, _prev_word,
_data_navigation, _beg_field,
_data_navigation, _end_field,
_data_navigation, _beg_line,
_data_navigation, _end_line,
_data_navigation, _left_char,
_data_navigation, _right_char,
_data_navigation, _up_char,
_data_navigation, _down_char,
_misc_request, _new_line,
_data_manipulation, _ins_char,
_data_manipulation, _ins_line,
_data_manipulation, _del_char,
_misc_request, _del_prev,
_data_manipulation, _del_line,
_data_manipulation, _del_word,
_data_manipulation, _clr_eol,
_data_manipulation, _clr_eof,
_data_manipulation, _clr_field,
_misc_request, _ovl_mode,
_misc_request, _ins_mode,
_data_navigation, _scr_fline,
_data_navigation, _scr_bline,
_data_navigation, _scr_fpage,
_data_navigation, _scr_bpage,
_data_navigation, _scr_fhpage,
_data_navigation, _scr_bhpage,
_data_navigation, _scr_fchar,
_data_navigation, _scr_bchar,
_data_navigation, _scr_hfline,
_data_navigation, _scr_hbline,
_data_navigation, _scr_hfhalf,
_data_navigation, _scr_hbhalf,
_misc_request, _validation,
_misc_request, _next_choice,
_misc_request, _prev_choice,
};
static REQUEST FAIL = { (PTF_int) 0, (PTF_int) 0 };
int
_page_navigation(PTF_int act, FORM *f)
{
int v;
if (_validate(f)) {
term_field(f);
term_form(f);
v = (*act) (f);
init_form(f);
init_field(f);
} else
v = E_INVALID_FIELD;
return (v);
}
int
_field_navigation(PTF_int act, FORM *f)
{
int v;
if (_validate(f)) {
term_field(f);
v = (*act) (f);
init_field(f);
} else
v = E_INVALID_FIELD;
return (v);
}
int
_data_navigation(PTF_int act, FORM *f)
{
return ((*act) (f));
}
int
_data_manipulation(PTF_int act, FORM *f)
{
int v = E_REQUEST_DENIED;
FIELD * c = C(f);
if (Opt(c, O_EDIT))
if ((v = (*act) (f)) == E_OK)
Set(f, WIN_CHG);
return (v);
}
int
_misc_request(PTF_int act, FORM *f)
{
return ((*act) (f));
}
int
form_driver(FORM *f, int c)
{
int v;
REQUEST x;
if (f) {
if (Status(f, DRIVER))
v = E_BAD_STATE;
else if (Status(f, POSTED)) {
x = parse(c);
if (COMMAND(x))
v = CALL(x, f);
else {
if (isascii(c) && isprint(c) &&
CheckChar(C(f), c))
v = _data_entry(f, c);
else
v = E_UNKNOWN_COMMAND;
}
(void) _update_current(f);
} else
v = E_NOT_POSTED;
} else
v = E_BAD_ARGUMENT;
return (v);
}
static REQUEST
parse(int c)
{
if (c < MIN_FORM_COMMAND || c > MAX_FORM_COMMAND)
return (FAIL);
return (carray[c - MIN_FORM_COMMAND]);
}