summaryrefslogtreecommitdiffstats
path: root/lib/libforms/fields.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libforms/fields.c')
-rw-r--r--lib/libforms/fields.c678
1 files changed, 0 insertions, 678 deletions
diff --git a/lib/libforms/fields.c b/lib/libforms/fields.c
deleted file mode 100644
index ce4187d..0000000
--- a/lib/libforms/fields.c
+++ /dev/null
@@ -1,678 +0,0 @@
-/*-
- * Copyright (c) 1995
- * Paul Richards. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer,
- * verbatim and that no modifications are made prior to this
- * point in the file.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Paul Richards.
- * 4. The name Paul Richards may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY PAUL RICHARDS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL PAUL RICHARDS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- */
-
-#include <strhash.h>
-#include <ctype.h>
-#include <err.h>
-#include <ncurses.h>
-#include <forms.h>
-#include <string.h>
-#include <stdlib.h>
-
-#include "internal.h"
-
-extern hash_table *global_bindings;
-
-struct attr_cmd {
- char *name;
- int attr;
-};
-
-static struct attr_cmd attr_cmds[] = {
- { "standout", 0x00010000},
- { "underline", 0x00020000},
- { "reverse", 0x00040000},
- { "blink", 0x00080000},
- { "bold", 0x00200000 }
-};
-
-int done=0;
-
-int
-init_field(char *key, void *data, void *arg)
-{
- struct Tuple *tuple = (struct Tuple *)data;
- struct Tuple *def_tuple;
- struct Field *def, *field;
- int i;
- int len, lim;
- int strwidth;
-
- field = (struct Field *)tuple->addr;
-
- /* Field definitions are global, at least for now */
- def_tuple = form_get_tuple(global_bindings, field->defname, FT_FIELD_DEF);
- if (!def_tuple) {
- warnx("Field definition not found -- skipping field");
- return (-1);
- }
-
- def = (struct Field *)def_tuple->addr;
- field->height = def->height;
- field->width = def->width;
- field->attr = def->attr;
- field->selattr = def->selattr;
- field->type = def->type;
- switch (field->type) {
- case FF_INPUT:
- field->field.input = malloc(sizeof (struct InputField));
- if (!field->field.input) {
- warnx("Couldn't allocate memory for input field");
- return (-1);
- }
- field->field.input->limit = def->field.input->limit;
-
- /* Force height to one regardless, at least for now :-) */
- field->height = 1;
- if (!field->width && !field->field.input->limit) {
- field->width = calc_string_width(def->field.input->label);
- field->field.input->limit = field->width;
- } else if (!field->width)
- field->width = field->field.input->limit;
- else if (!field->field.input->limit)
- field->field.input->limit = field->width;
- if (field->field.input->limit < field->width)
- field->width = field->field.input->limit;
-
- strwidth = strlen(def->field.input->label);
- field->field.input->input = malloc(strwidth + 1);
- if (!field->field.input->input) {
- warnx("Couldn't allocate memory for input field text");
- return (-1);
- }
- field->field.input->label = malloc(strwidth + 1);
- if (!field->field.input->label) {
- warnx("Couldn't allocate memory for input field label");
- return (-1);
- }
- strncpy(field->field.input->label,
- def->field.input->label,
- strwidth + 1);
- field->field.input->lbl_flag = def->field.input->lbl_flag;
-
- /*
- * If it's a label then clear the input string
- * otherwise copy the default there.
- */
- if (field->field.input->lbl_flag)
- field->field.input->input[0] = '\0';
- else if (field->field.input->label) {
- strncpy(field->field.input->input,
- field->field.input->label,
- strwidth + 1);
- field->field.input->input[strwidth] = 0;
- }
- break;
- case FF_TEXT:
- field->field.text = malloc(sizeof (struct TextField));
- if (!field->field.text) {
- warnx("Couldn't allocate memory for text field");
- return (FS_ERROR);
- }
- strwidth = strlen(def->field.text->text);
- if (!field->width)
- field->width = calc_string_width(def->field.text->text);
- field->field.text->text = malloc(strwidth + 1);
- if (!field->field.text->text) {
- warnx("Couldn't allocate memory for text field text");
- return (FS_ERROR);
- } else
- strncpy(field->field.text->text,
- def->field.text->text,
- strwidth + 1);
- if (!field->height)
- calc_field_height(field, field->field.text->text);
- break;
- case FF_MENU:
- field->field.menu = malloc(sizeof (struct MenuField));
- if (!field->field.menu) {
- warnx("Couldn't allocate memory for menu field");
- return (FS_ERROR);
- }
- field->field.menu->no_options = 0;
- field->height = 1;
- lim = 0;
- for (i=0; i < def->field.menu->no_options; i++) {
- field->field.menu->no_options =
- add_menu_option(field->field.menu,
- def->field.menu->options[i]);
- if (!field->field.menu->no_options) {
- warnx("Couldn't add menu option");
- return (FS_ERROR);
- }
- len = calc_string_width(def->field.menu->options[i]);
- if (len > lim)
- lim = len;
- }
- if (!field->width)
- field->width = lim;
- break;
- case FF_ACTION:
- field->field.action = malloc(sizeof (struct ActionField));
- if (!field->field.action) {
- warnx("Couldn't allocate memory for action field");
- return (FS_ERROR);
- }
- if (!field->width)
- field->width = calc_string_width(def->field.action->text);
- strwidth = strlen(def->field.action->text);
- field->field.action->text = malloc(strwidth + 1);
- if (!field->field.action->text) {
- warnx("Couldn't allocate memory for text field text");
- return (FS_ERROR);
- } else
- strncpy(field->field.action->text,
- def->field.action->text,
- strwidth + 1);
- if (!field->height)
- calc_field_height(field, field->field.action->text);
- field->field.action->fn = def->field.action->fn;
- break;
- default:
- break;
- }
- return (1);
-}
-
-void
-display_field(WINDOW *window, struct Field *field)
-{
- wattrset(window, field->attr);
- wmove(window, field->y, field->x);
- switch (field->type) {
- case FF_TEXT:
- display_text(window, field);
- break;
- case FF_MENU:
- display_menu(window, field);
- break;
- case FF_INPUT:
- display_input(window, field);
- break;
- case FF_ACTION:
- display_action(window, field);
- break;
- case FF_UNKNOWN:
- default:
- break;
- }
- wattrset(window, 0);
- wrefresh(window);
-}
-
-void
-display_text(WINDOW *window, struct Field *field)
-{
-
- if (print_string(window, field->y, field->x, field->height,
- field->width, field->field.text->text) == ERR)
- print_status("Illegal scroll in print_string");
-}
-
-void
-display_input(WINDOW *window, struct Field *field)
-{
- if (field->field.input->lbl_flag) {
- if (print_string(window, field->y, field->x, field->height,
- field->width, field->field.input->label) == ERR)
- print_status("Illegal scroll in print_string");
- } else
- if (print_string(window, field->y, field->x, field->height,
- field->width, field->field.input->input) == ERR)
- print_status("Illegal scroll in print_string");
-}
-
-void
-display_menu(WINDOW *window, struct Field *field)
-{
- if (print_string(window, field->y, field->x,
- field->height, field->width,
- field->field.menu->options[field->field.menu->selected]) == ERR)
- print_status("Illegal scroll in print_string");
-}
-
-void
-display_action(WINDOW *window, struct Field *field)
-{
- if (print_string(window, field->y, field->x, field->height,
- field->width,
- field->field.action->text) == ERR)
- print_status("Illegal scroll in print_string");
-}
-
-int
-do_action(struct Form *form)
-{
- struct Field *field = form->current_field;
- struct Tuple *tuple;
- int ch;
- void (* fn)();
-
- display_action(form->window, field);
- wmove(form->window, field->y, field->x);
-
- for (;;) {
-
- ch = wgetch(form->window);
-
- if (ch == FK_ACCEPT) {
- tuple = form_get_tuple(form->bindings, field->field.action->fn, FT_FUNC);
- if (!tuple) {
- print_status("No function bound to action");
- beep();
- continue;
- } else {
- fn = tuple->addr;
- (*fn)(form);
- return (FS_OK);
- }
- } else
- ch = do_key_bind(form, ch);
-
- if (ch == FS_OK)
- return (FS_OK);
- else if (ch == FS_ERROR)
- continue;
- }
-}
-
-int
-do_menu(struct Form *form)
-{
- struct Field *field = form->current_field;
- int ch;
-
-
- for (;;) {
-
- display_menu(form->window, field);
- wmove(form->window, field->y, field->x);
-
- ch = wgetch(form->window);
-
- switch (ch) {
- case ' ':
- print_status("");
- field->field.menu->selected++;
- if (field->field.menu->selected >= field->field.menu->no_options)
- field->field.menu->selected = 0;
- ch = FS_OK;
- break;
- default:
- ch = do_key_bind(form, ch);
- break;
- }
-
- if (ch == FS_OK)
- return (FS_OK);
- else if (ch == FS_ERROR) {
- beep();
- continue;
- } else {
- print_status("Hit the space bar to toggle through options");
- beep();
- continue;
- }
- }
-}
-
-int
-do_field(struct Form *form)
-{
- struct Tuple *tuple;
- struct Field *field = form->current_field;
- void (* fn)();
- int status;
-
- /* Do field entry tasks */
- if (field->enter) {
- tuple = form_get_tuple(form->bindings, field->enter, FT_FUNC);
-
- if (tuple) {
- fn = tuple->addr;
- (*fn)(form);
- }
- }
-
- switch (field->type) {
- case FF_TEXT:
- status = FS_OK;
- display_text(form->window, field);
- break;
- case FF_INPUT:
- status = do_input(form);
- break;
- case FF_MENU:
- status = do_menu(form);
- break;
- case FF_ACTION:
- status = do_action(form);
- break;
- default:
- status = FF_UNKNOWN;
- beep();
- print_status("Unknown field type");
- form->current_field = form->prev_field;
- break;
- }
-
- /* Do field leave tasks */
- if (field->leave) {
- tuple = form_get_tuple(form->bindings, field->leave, FT_FUNC);
-
- if (tuple) {
- fn = tuple->addr;
- (*fn)(form);
- }
- }
-
- return (status);
-}
-
-int
-parse_attr(WINDOW *window, char *string)
-{
- int inc = 0;
- struct attr_cmd *attr;
-
- if (*(string) == '\\')
- return (1);
-
- while (!isspace(*(string + inc))) {
- inc++;
- }
-
- for (attr = attr_cmds; attr->name; attr++) {
- if (strncmp(attr->name, string, inc))
- continue;
- else {
- wattron(window, attr->attr);
- break;
- }
- }
-
- /* Skip trailing space after the attribute string */
- while (isspace(*(string + inc)))
- inc++;
-
- return (inc);
-}
-
-int
-print_string(WINDOW *window, int y, int x,
- int height, int fwidth, char *string)
-{
- int len, skip;
- int width;
-
- if (!string)
- len = -1;
-
- len = strlen(string);
-
- if (wmove(window, y, x) == ERR)
- return (ERR);
- while (height--) {
- width = fwidth;
- while (width--) {
- if (len-- > 0) {
- if (*string == '\\') {
- string++;
- len--;
- skip = parse_attr(window, string);
- len -= skip;
- string += skip;
- }
- if (waddch(window, *string++) == ERR)
- return (ERR);
- } else if (waddch(window, ' ') == ERR)
- return (ERR);
- }
- if (wmove(window, ++y, x) == ERR)
- return (ERR);
- }
- return (OK);
-}
-
-void
-print_status(char *msg)
-{
- if (wmove(stdscr, LINES-1, 0) == ERR) {
- endwin();
- exit(1);
- }
-
- wclrtoeol(stdscr);
-
- wstandout(stdscr);
- if (wprintw(stdscr, "%s",
- msg) == ERR) {
- endwin();
- exit(1);
- }
- wstandend(stdscr);
- wrefresh(stdscr);
-}
-
-
-int
-do_input(struct Form *form)
-{
- struct Field *field = form->current_field;
- int len;
- int disp_off=0, abspos=0, cursor = 0;
- unsigned int ch;
-
-#define DISPOFF ((len < field->width) ? 0 : len - field->width)
-#define CURSPOS ((len < field->width) ? len : field->width)
-
- len = strlen(field->field.input->input);
- display_input(form->window, field);
-
- cursor = CURSPOS;
- abspos = cursor;
-
- for (;;) {
-
- wmove(form->window, field->y, field->x+cursor);
- wrefresh(form->window);
-
- ch = wgetch(form->window);
- ch = do_key_bind(form, ch);
-
- /*
- * If there was a valid motion command then we've
- * moved to a new field so just return. If the motion
- * command was invalid then just go around and get another
- * keystroke. Otherwise, it was not a motion command.
- */
-
- if (ch == FS_OK)
- return (FS_OK);
- else if (ch == FS_ERROR)
- continue;
-
- print_status("");
-
- if (field->field.input->lbl_flag) {
- field->field.input->lbl_flag = 0;
- }
- if ((ch == FK_CHOME) || (ch == '')) {
- disp_off = 0;
- cursor = 0;
- abspos = 0;
- } else if ((ch == FK_CEND) || (ch == '')) {
- disp_off = DISPOFF;
- abspos = len;
- cursor = CURSPOS;
- } else if (ch == FK_CDEL) {
- if (!(len-abspos))
- beep();
- else {
- bcopy(field->field.input->input+abspos+1,
- field->field.input->input+abspos,
- len - abspos);
- --len;
- }
- } else if ((ch == FK_CLEFT) || (ch == FK_CBS) || (ch == '')) {
- if (!abspos)
- beep();
- else {
- if (ch == FK_CBS) {
- bcopy(field->field.input->input+abspos,
- field->field.input->input+abspos-1,
- len-abspos+1);
- --len;
- }
- --abspos;
- --cursor;
- if ((disp_off) && (cursor < 0)) {
- --disp_off;
- ++cursor;
- }
- }
- } else if ((ch == FK_CRIGHT) || (ch == '')) {
- if (abspos == len)
- beep();
- else {
- ++abspos;
- if (++cursor >= field->width) {
- ++disp_off;
- --cursor;
- }
- }
- } else if ((isprint(ch)) && (len < field->field.input->limit)){
- bcopy(field->field.input->input+abspos,
- field->field.input->input+abspos+1, len-abspos+1);
- field->field.input->input[abspos++] = ch;
- len++;
- if (++cursor > field->width) {
- ++disp_off;
- --cursor;
- }
- } else
- beep();
- print_string(form->window, field->y, field->x, field->height,
- field->width, field->field.input->input+disp_off);
- }
-}
-
-/*
- * Calculate length of printable part of the string,
- * stripping out the attribute modifiers.
- */
-
-int
-calc_string_width(char *string)
-{
- int len, width=0;
-
- if (!string)
- return (0);
-
- len = strlen(string);
-
- while (len) {
- if (*string != '\\') {
- width++;
- len--;
- string++;
- continue;
- } else {
- string++;
- len--;
- if (*string == '\\') {
- string++;
- width++;
- len--;
- continue;
- } else {
- while (!isspace(*string)) {
- string++;
- len--;
- }
- while (isspace(*string)) {
- string ++;
- len--;
- }
- }
- }
- }
-
- return (width);
-}
-
-/* Calculate a default height for a field */
-
-void
-calc_field_height(struct Field *field, char *string)
-{
-
- int len;
-
- len = calc_string_width(string);
-
- if (!field->width) {
- /*
- * This is a failsafe, this routine shouldn't be called
- * with a width of 0, the width should be determined
- * first.
- */
- field->height = 1;
- return;
- }
-
- if (len < field->width) {
- field->height = 1;
- return;
- } else
- field->height = len / field->width;
-
- if ((field->height*field->width) < len)
- field->height++;
-
- return;
-}
-
-void
-exit_form(struct Form *form)
-{
- form->status = FS_EXIT;
-}
-
-void
-cancel_form(struct Form *form)
-{
- form->status = FS_CANCEL;
-}
OpenPOWER on IntegriCloud