/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License, Version 1.0 only * (the "License"). You may not use this file except in compliance * with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE * or http://www.opensolaris.org/os/licensing. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at usr/src/OPENSOLARIS.LICENSE. * If applicable, add the following below this CDDL HEADER, with the * fields enclosed by brackets "[]" replaced with your own identifying * information: Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END */ /* Copyright (c) 1988 AT&T */ /* All Rights Reserved */ /* * Copyright (c) 1997, by Sun Microsystems, Inc. * All rights reserved. */ #pragma ident "%Z%%M% %I% %E% SMI" /* SVr4.0 1.4 */ /*LINTLIBRARY*/ #include #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) /* command array(carray) order is significant(see form.h REQ_*) */ static REQUEST carray [MAX_FORM_COMMAND - MIN_FORM_COMMAND + 1] = { _page_navigation, _next_page, /* REQ_NEXT_PAGE */ _page_navigation, _prev_page, /* REQ_PREV_PAGE */ _page_navigation, _first_page, /* REQ_FIRST_PAGE */ _page_navigation, _last_page, /* REQ_LAST_PAGE */ _field_navigation, _next_field, /* REQ_NEXT_FIELD */ _field_navigation, _prev_field, /* REQ_PREV_FIELD */ _field_navigation, _first_field, /* REQ_FIRST_FIELD */ _field_navigation, _last_field, /* REQ_LAST_FIELD */ _field_navigation, _snext_field, /* REQ_SNEXT_FIELD */ _field_navigation, _sprev_field, /* REQ_SPREV_FIELD */ _field_navigation, _sfirst_field, /* REQ_SFIRST_FIELD */ _field_navigation, _slast_field, /* REQ_SLAST_FIELD */ _field_navigation, _left_field, /* REQ_LEFT_FIELD */ _field_navigation, _right_field, /* REQ_RIGHT_FIELD */ _field_navigation, _up_field, /* REQ_UP_FIELD */ _field_navigation, _down_field, /* REQ_DOWN_FIELD */ _data_navigation, _next_char, /* REQ_NEXT_CHAR */ _data_navigation, _prev_char, /* REQ_PREV_CHAR */ _data_navigation, _next_line, /* REQ_NEXT_LINE */ _data_navigation, _prev_line, /* REQ_PREV_LINE */ _data_navigation, _next_word, /* REQ_NEXT_WORD */ _data_navigation, _prev_word, /* REQ_PREV_WORD */ _data_navigation, _beg_field, /* REQ_BEG_FIELD */ _data_navigation, _end_field, /* REQ_END_FIELD */ _data_navigation, _beg_line, /* REQ_BEG_LINE */ _data_navigation, _end_line, /* REQ_END_LINE */ _data_navigation, _left_char, /* REQ_LEFT_CHAR */ _data_navigation, _right_char, /* REQ_RIGHT_CHAR */ _data_navigation, _up_char, /* REQ_UP_CHAR */ _data_navigation, _down_char, /* REQ_DOWN_CHAR */ _misc_request, _new_line, /* REQ_NEW_LINE */ _data_manipulation, _ins_char, /* REQ_INS_CHAR */ _data_manipulation, _ins_line, /* REQ_INS_LINE */ _data_manipulation, _del_char, /* REQ_DEL_CHAR */ _misc_request, _del_prev, /* REQ_DEL_PREV */ _data_manipulation, _del_line, /* REQ_DEL_LINE */ _data_manipulation, _del_word, /* REQ_DEL_WORD */ _data_manipulation, _clr_eol, /* REQ_CLR_EOL */ _data_manipulation, _clr_eof, /* REQ_CLR_EOF */ _data_manipulation, _clr_field, /* REQ_CLR_FIELD */ _misc_request, _ovl_mode, /* REQ_OVL_MODE */ _misc_request, _ins_mode, /* REQ_INS_MODE */ _data_navigation, _scr_fline, /* REQ_SCR_FLINE */ _data_navigation, _scr_bline, /* REQ_SCR_BLINE */ _data_navigation, _scr_fpage, /* REQ_SCR_FPAGE */ _data_navigation, _scr_bpage, /* REQ_SCR_BPAGE */ _data_navigation, _scr_fhpage, /* REQ_SCR_FHPAGE */ _data_navigation, _scr_bhpage, /* REQ_SCR_BHPAGE */ _data_navigation, _scr_fchar, /* REQ_SCR_FCHAR */ _data_navigation, _scr_bchar, /* REQ_SCR_BCHAR */ _data_navigation, _scr_hfline, /* REQ_SCR_HFLINE */ _data_navigation, _scr_hbline, /* REQ_SCR_HBLINE */ _data_navigation, _scr_hfhalf, /* REQ_SCR_HFHALF */ _data_navigation, _scr_hbhalf, /* REQ_SCR_HBHALF */ _misc_request, _validation, /* REQ_VALIDATION */ _misc_request, _next_choice, /* REQ_NEXT_CHOICE */ _misc_request, _prev_choice, /* REQ_PREV_CHOICE */ }; static REQUEST FAIL = { (PTF_int) 0, (PTF_int) 0 }; /* _page_navigation - service page navigation request */ 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); } /* _field_navigation - service inter-field navigation request */ 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); } /* _data_navigation - service intra-field navagation request */ int _data_navigation(PTF_int act, FORM *f) { return ((*act) (f)); } /* _data_manipulation - service data modification request */ 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]); }