Added field and character checking.

This commit is contained in:
blymn 2001-01-30 06:44:42 +00:00
parent 790e1a7fb4
commit 99af4c1003
5 changed files with 120 additions and 42 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: driver.c,v 1.3 2001/01/23 01:59:29 blymn Exp $ */
/* $NetBSD: driver.c,v 1.4 2001/01/30 06:44:42 blymn Exp $ */
/*-
* Copyright (c) 1998-1999 Brett Lymn
@ -112,12 +112,13 @@ form_driver(FORM *form, int c)
old_field = form->cur_field;
fieldp = form->fields[form->cur_field];
update_page = update_field = 0;
status = E_OK;
if (c < REQ_MIN_REQUEST) {
if (isprint(c)) {
next_field:
fieldp = form->fields[form->cur_field];
buf = fieldp->buffers[0];
pos = fieldp->start_char + fieldp->cursor_xpos
@ -160,6 +161,23 @@ form_driver(FORM *form, int c)
if (c > REQ_MAX_COMMAND)
return E_UNKNOWN_COMMAND;
if ((c >= REQ_NEXT_PAGE) && (c <= REQ_DOWN_FIELD)) {
/* first check the field we are in is ok */
if (_formi_validate_field(form) != E_OK)
return E_INVALID_FIELD;
if (form->field_term != NULL)
form->field_term(form);
/*
* if we have a page movement then the form term
* needs to be called too
*/
if ((c <= REQ_LAST_PAGE) && (form->form_term != NULL))
form->form_term(form);
}
switch (c) {
case REQ_NEXT_PAGE:
if (form->page < form->max_page) {
@ -168,10 +186,10 @@ form_driver(FORM *form, int c)
update_page = 1;
if (_formi_pos_first_field(form) != E_OK) {
form->page = old_page;
return E_REQUEST_DENIED;
status = E_REQUEST_DENIED;
}
} else
return E_REQUEST_DENIED;
status = E_REQUEST_DENIED;
break;
case REQ_PREV_PAGE:
@ -181,10 +199,10 @@ form_driver(FORM *form, int c)
update_page = 1;
if (_formi_pos_first_field(form) != E_OK) {
form->page = old_page;
return E_REQUEST_DENIED;
status = E_REQUEST_DENIED;
}
} else
return E_REQUEST_DENIED;
status = E_REQUEST_DENIED;
break;
case REQ_FIRST_PAGE:
@ -193,7 +211,7 @@ form_driver(FORM *form, int c)
update_page = 1;
if (_formi_pos_first_field(form) != E_OK) {
form->page = old_page;
return E_REQUEST_DENIED;
status = E_REQUEST_DENIED;
}
break;
@ -203,27 +221,19 @@ form_driver(FORM *form, int c)
update_page = 1;
if (_formi_pos_first_field(form) != E_OK) {
form->page = old_page;
return E_REQUEST_DENIED;
status = E_REQUEST_DENIED;
}
break;
case REQ_NEXT_FIELD:
status = _formi_pos_new_field(form, _FORMI_FORWARD,
FALSE);
if (status != E_OK) {
return status;
}
update_field = 1;
break;
case REQ_PREV_FIELD:
status = _formi_pos_new_field(form, _FORMI_BACKWARD,
FALSE);
if (status != E_OK)
return status;
update_field = 1;
break;
@ -240,18 +250,12 @@ form_driver(FORM *form, int c)
case REQ_SNEXT_FIELD:
status = _formi_pos_new_field(form, _FORMI_FORWARD,
TRUE);
if (status != E_OK)
return status;
update_field = 1;
break;
case REQ_SPREV_FIELD:
status = _formi_pos_new_field(form, _FORMI_BACKWARD,
TRUE);
if (status != E_OK)
return status;
update_field = 1;
break;
@ -278,9 +282,6 @@ form_driver(FORM *form, int c)
case REQ_UP_FIELD:
case REQ_DOWN_FIELD:
status = traverse_form_links(form, c);
if (status != E_OK)
return status;
update_field = 1;
break;
@ -295,7 +296,6 @@ form_driver(FORM *form, int c)
* into a previous field request. Otherwise
* fallthrough to the field handler.
*/
fieldp = form->fields[old_field];
if ((form->opts & O_BS_OVERLOAD) == O_BS_OVERLOAD) {
if ((fieldp->start_char == 0) &&
(fieldp->start_line == 0) &&
@ -317,7 +317,6 @@ form_driver(FORM *form, int c)
* into a next field request. Otherwise
* fallthrough to the field handler.
*/
fieldp = form->fields[old_field];
if ((form->opts & O_NL_OVERLOAD) == O_NL_OVERLOAD) {
if ((fieldp->start_char == 0) &&
(fieldp->start_line == 0) &&
@ -395,6 +394,25 @@ form_driver(FORM *form, int c)
break;
}
}
/* call the field and form init functions if required. */
if ((c >= REQ_NEXT_PAGE) && (c <= REQ_DOWN_FIELD)) {
if (form->field_init != NULL)
form->field_init(form);
/*
* if we have a page movement then the form init
* needs to be called too
*/
if ((c <= REQ_LAST_PAGE) && (form->form_init != NULL))
form->form_init(form);
/*
* if there was an error just return now...
*/
if (status != E_OK)
return status;
}
if (update_field < 0)
return update_field;

View File

@ -1,4 +1,4 @@
/* $NetBSD: form.h,v 1.6 2001/01/23 01:59:29 blymn Exp $ */
/* $NetBSD: form.h,v 1.7 2001/01/30 06:44:42 blymn Exp $ */
/*-
* Copyright (c) 1998-1999 Brett Lymn
@ -65,7 +65,11 @@ typedef unsigned int Form_Options;
#define O_STATIC 0x100 /* Field is not dynamic */
#define O_PASSOK 0x200 /* ??? */
/* Form driver requests */
/*
* Form driver requests - be VERY careful about changing the ordering
* of the requests below. The form driver code depends on a particular
* order for the requests.
*/
#define REQ_MIN_REQUEST 0x100 /* must equal value of the first request */
#define REQ_NEXT_PAGE 0x100 /* next page in form */

View File

@ -1,4 +1,4 @@
/* $NetBSD: internals.c,v 1.7 2001/01/23 02:01:56 blymn Exp $ */
/* $NetBSD: internals.c,v 1.8 2001/01/30 06:44:42 blymn Exp $ */
/*-
* Copyright (c) 1998-1999 Brett Lymn
@ -56,6 +56,8 @@ FILE *dbg = NULL;
#define JOIN_PREV 3
#define JOIN_PREV_NW 4 /* previous join, don't wrap the joined line */
static void
_formi_do_char_validation(FIELD *field, FIELDTYPE *type, char c, int *ret_val);
static void
_formi_do_validation(FIELD *field, FIELDTYPE *type, int *ret_val);
static int
@ -382,7 +384,7 @@ _formi_join_line(FIELD *field, char *str, unsigned int pos, int direction)
* the first non-blank character.
*/
unsigned
skip_blanks(char *string, unsigned int start)
_formi_skip_blanks(char *string, unsigned int start)
{
unsigned int i;
@ -843,6 +845,13 @@ _formi_add_char(FIELD *field, unsigned int pos, char c)
if (field->buffers[0].string == NULL) {
set_field_buffer(field, 0, "");
}
if (_formi_validate_char(field, c) != E_OK) {
#ifdef DEBUG
fprintf(dbg, "add_char: char %c failed char validation\n", c);
#endif
return E_INVALID_FIELD;
}
#ifdef DEBUG
fprintf(dbg, "add_char: pos=%d, char=%c\n", pos, c);
@ -1410,6 +1419,47 @@ _formi_manipulate_field(FORM *form, int c)
return 1;
}
/*
* Validate the give character by passing it to any type character
* checking routines, if they exist.
*/
int
_formi_validate_char(FIELD *field, char c)
{
int ret_val;
if (field->type == NULL)
return E_OK;
ret_val = E_INVALID_FIELD;
_formi_do_char_validation(field, field->type, c, &ret_val);
return ret_val;
}
/*
* Perform the validation of the character, invoke all field_type validation
* routines. If the field is ok then update ret_val to E_OK otherwise
* ret_val is not changed.
*/
static void
_formi_do_char_validation(FIELD *field, FIELDTYPE *type, char c, int *ret_val)
{
if ((type->flags & _TYPE_IS_LINKED) == _TYPE_IS_LINKED) {
_formi_do_char_validation(field, type->link->next, c, ret_val);
_formi_do_char_validation(field, type->link->prev, c, ret_val);
} else {
if (type->char_check == NULL)
*ret_val = E_OK;
else {
if (type->char_check((int)(unsigned char) c,
field->args) == TRUE)
*ret_val = E_OK;
}
}
}
/*
* Validate the current field. If the field validation returns success then
* return E_OK otherwise return E_INVALID_FIELD.
@ -1419,7 +1469,8 @@ int
_formi_validate_field(FORM *form)
{
FIELD *cur;
int ret_val;
char *bp;
int ret_val, count;
if ((form == NULL) || (form->fields == NULL) ||
@ -1428,12 +1479,15 @@ _formi_validate_field(FORM *form)
cur = form->fields[form->cur_field];
if (((form->opts & O_PASSOK) == O_PASSOK) && (cur->buf0_status = 0))
if (((cur->opts & O_PASSOK) == O_PASSOK) && (cur->buf0_status = 0))
return E_OK;
if (((form->opts & O_NULLOK) == O_NULLOK) &&
(cur->buffers[0].string[0] == '\0'))
return E_OK;
bp = cur->buffers[0].string;
count = _formi_skip_blanks(bp, 0);
if (((cur->opts & O_NULLOK) != O_NULLOK) &&
(cur->buffers[0].string[count] == '\0'))
return E_INVALID_FIELD;
/* if there is no type then just accept the field */
if (cur->type == NULL)

View File

@ -1,4 +1,4 @@
/* $NetBSD: internals.h,v 1.3 2001/01/21 11:43:43 blymn Exp $ */
/* $NetBSD: internals.h,v 1.4 2001/01/30 06:44:42 blymn Exp $ */
/*-
* Copyright (c) 1998-1999 Brett Lymn
@ -75,7 +75,7 @@ struct _formi_page_struct
/* function prototypes */
unsigned
skip_blanks(char *, unsigned int);
_formi_skip_blanks(char *, unsigned int);
int
_formi_add_char(FIELD *cur, unsigned pos, char c);
int
@ -101,6 +101,8 @@ _formi_stitch_fields(FORM *form);
int
_formi_update_field(FORM *form, int old_field);
int
_formi_validate_char(FIELD *field, char c);
int
_formi_validate_field(FORM *form);
#ifdef DEBUG

View File

@ -1,4 +1,4 @@
/* $NetBSD: type_enum.c,v 1.4 2001/01/23 01:57:01 blymn Exp $ */
/* $NetBSD: type_enum.c,v 1.5 2001/01/30 06:44:43 blymn Exp $ */
/*-
* Copyright (c) 1998-1999 Brett Lymn
@ -131,14 +131,14 @@ match_enum(char **choices, unsigned num_choices, bool ignore_case,
unsigned i, start, enum_start, blen, elen, trailing;
bool cur_match;
start = skip_blanks(this, 0);
start = _formi_skip_blanks(this, 0);
blen = strlen(&this[start]);
#ifdef DEBUG
fprintf(dbg, "match_enum: start %d, blen %d\n", start, blen);
#endif
for (i = 0; i < num_choices; i++) {
enum_start = skip_blanks(choices[i], 0);
enum_start = _formi_skip_blanks(choices[i], 0);
elen = strlen(&choices[i][enum_start]);
#ifdef DEBUG
fprintf(dbg, "match_enum: checking choice \'%s\'\n",
@ -187,7 +187,7 @@ match_enum(char **choices, unsigned num_choices, bool ignore_case,
* better match....
*/
if (!no_blanks && cur_match) {
trailing = skip_blanks(this, start + blen);
trailing = _formi_skip_blanks(this, start + blen);
if (this[trailing] == '\0') {
#ifdef DEBUG
fprintf(dbg,