1*0cf98320Schristos /* $NetBSD: form.c,v 1.17 2021/04/13 13:13:04 christos Exp $ */
241859428Sblymn
341859428Sblymn /*-
441859428Sblymn * Copyright (c) 1998-1999 Brett Lymn
541859428Sblymn * (blymn@baea.com.au, brett_lymn@yahoo.com.au)
641859428Sblymn * All rights reserved.
741859428Sblymn *
841859428Sblymn * This code has been donated to The NetBSD Foundation by the Author.
941859428Sblymn *
1041859428Sblymn * Redistribution and use in source and binary forms, with or without
1141859428Sblymn * modification, are permitted provided that the following conditions
1241859428Sblymn * are met:
1341859428Sblymn * 1. Redistributions of source code must retain the above copyright
1441859428Sblymn * notice, this list of conditions and the following disclaimer.
1541859428Sblymn * 2. The name of the author may not be used to endorse or promote products
16c03a48d6Swiz * derived from this software without specific prior written permission
1741859428Sblymn *
1841859428Sblymn * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
1941859428Sblymn * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
2041859428Sblymn * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
2141859428Sblymn * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
2241859428Sblymn * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
2341859428Sblymn * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2441859428Sblymn * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2541859428Sblymn * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2641859428Sblymn * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
2741859428Sblymn * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2841859428Sblymn *
2941859428Sblymn *
3041859428Sblymn */
3141859428Sblymn
32a2ed7b2dSlukem #include <sys/cdefs.h>
33*0cf98320Schristos __RCSID("$NetBSD: form.c,v 1.17 2021/04/13 13:13:04 christos Exp $");
34a2ed7b2dSlukem
3541859428Sblymn #include <stdlib.h>
3641859428Sblymn #include <strings.h>
3741859428Sblymn #include <form.h>
3841859428Sblymn #include "internals.h"
3941859428Sblymn
4041859428Sblymn extern FIELD _formi_default_field;
4141859428Sblymn
4241859428Sblymn FORM _formi_default_form = {
4341859428Sblymn FALSE, /* true if performing a init or term function */
4441859428Sblymn FALSE, /* the form is posted */
45c0219226Sblymn FALSE, /* make field list circular if true */
4641859428Sblymn NULL, /* window for the form */
4741859428Sblymn NULL, /* subwindow for the form */
48919001b4Sblymn NULL, /* use this window for output */
4941859428Sblymn NULL, /* user defined pointer */
5041859428Sblymn 0, /* options for the form */
5141859428Sblymn NULL, /* function called when form posted and
5241859428Sblymn after page change */
5341859428Sblymn NULL, /* function called when form is unposted and
5441859428Sblymn before page change */
5541859428Sblymn NULL, /* function called when form posted and after
5641859428Sblymn current field changes */
5741859428Sblymn NULL, /* function called when form unposted and
5841859428Sblymn before current field changes */
5941859428Sblymn 0, /* number of fields attached */
6041859428Sblymn 0, /* current field */
6141859428Sblymn 0, /* current page of form */
6241859428Sblymn 0, /* number of pages in the form */
6341859428Sblymn NULL, /* dynamic array of fields that start
6441859428Sblymn the pages */
6541859428Sblymn {NULL, NULL}, /* sorted field list */
6641859428Sblymn NULL /* array of fields attached to this form. */
6741859428Sblymn };
6841859428Sblymn
6941859428Sblymn /*
7041859428Sblymn * Set the window associated with the form
7141859428Sblymn */
7241859428Sblymn int
set_form_win(FORM * form,WINDOW * win)7341859428Sblymn set_form_win(FORM *form, WINDOW *win)
7441859428Sblymn {
75919001b4Sblymn if (form == NULL) {
7641859428Sblymn _formi_default_form.win = win;
77919001b4Sblymn _formi_default_form.scrwin = win;
78919001b4Sblymn } else {
7941859428Sblymn if (form->posted == TRUE)
8041859428Sblymn return E_POSTED;
81919001b4Sblymn else {
8241859428Sblymn form->win = win;
83919001b4Sblymn form->scrwin = win;
84919001b4Sblymn }
8541859428Sblymn }
8641859428Sblymn
8741859428Sblymn return E_OK;
8841859428Sblymn }
8941859428Sblymn
9041859428Sblymn /*
9141859428Sblymn * Return the window used by the given form
9241859428Sblymn */
9341859428Sblymn WINDOW *
form_win(FORM * form)9441859428Sblymn form_win(FORM *form)
9541859428Sblymn {
9641859428Sblymn if (form == NULL)
9741859428Sblymn return _formi_default_form.win;
9841859428Sblymn else
9941859428Sblymn return form->win;
10041859428Sblymn }
10141859428Sblymn
10241859428Sblymn /*
10341859428Sblymn * Set the subwindow for the form.
10441859428Sblymn */
10541859428Sblymn int
set_form_sub(FORM * form,WINDOW * window)10641859428Sblymn set_form_sub(FORM *form, WINDOW *window)
10741859428Sblymn {
108919001b4Sblymn if (form == NULL) {
10941859428Sblymn _formi_default_form.subwin = window;
110919001b4Sblymn _formi_default_form.scrwin = window;
111919001b4Sblymn } else {
11241859428Sblymn if (form->posted == TRUE)
11341859428Sblymn return E_POSTED;
114919001b4Sblymn else {
11541859428Sblymn form->subwin = window;
116919001b4Sblymn form->scrwin = window;
117919001b4Sblymn }
11841859428Sblymn }
11941859428Sblymn
12041859428Sblymn return E_OK;
12141859428Sblymn }
12241859428Sblymn
12341859428Sblymn /*
12441859428Sblymn * Return the subwindow for the given form.
12541859428Sblymn */
12641859428Sblymn WINDOW *
form_sub(FORM * form)12741859428Sblymn form_sub(FORM *form)
12841859428Sblymn {
12941859428Sblymn if (form == NULL)
13041859428Sblymn return _formi_default_form.subwin;
13141859428Sblymn else
13241859428Sblymn return form->subwin;
13341859428Sblymn }
13441859428Sblymn
13541859428Sblymn /*
13641859428Sblymn * Return the minimum size required to contain the form.
13741859428Sblymn */
13841859428Sblymn int
scale_form(FORM * form,int * rows,int * cols)13941859428Sblymn scale_form(FORM *form, int *rows, int *cols)
14041859428Sblymn {
14141859428Sblymn int i, max_row, max_col, temp;
14241859428Sblymn
14341859428Sblymn if ((form->fields == NULL) || (form->fields[0] == NULL))
14441859428Sblymn return E_NOT_CONNECTED;
14541859428Sblymn
14641859428Sblymn max_row = 0;
14741859428Sblymn max_col = 0;
14841859428Sblymn
14941859428Sblymn for (i = 0; i < form->field_count; i++) {
15041859428Sblymn temp = form->fields[i]->form_row + form->fields[i]->rows;
15141859428Sblymn max_row = (temp > max_row)? temp : max_row;
15241859428Sblymn temp = form->fields[i]->form_col + form->fields[i]->cols;
15341859428Sblymn max_col = (temp > max_col)? temp : max_col;
15441859428Sblymn }
15541859428Sblymn
15641859428Sblymn (*rows) = max_row;
15741859428Sblymn (*cols) = max_col;
15841859428Sblymn
15941859428Sblymn return E_OK;
16041859428Sblymn }
16141859428Sblymn
16241859428Sblymn /*
16341859428Sblymn * Set the user defined pointer for the form given.
16441859428Sblymn */
16541859428Sblymn int
set_form_userptr(FORM * form,void * ptr)166af28ef95Sblymn set_form_userptr(FORM *form, void *ptr)
16741859428Sblymn {
16841859428Sblymn if (form == NULL)
16941859428Sblymn _formi_default_form.userptr = ptr;
17041859428Sblymn else
17141859428Sblymn form->userptr = ptr;
17241859428Sblymn
17341859428Sblymn return E_OK;
17441859428Sblymn }
17541859428Sblymn
17641859428Sblymn /*
17741859428Sblymn * Return the user defined pointer associated with the given form.
17841859428Sblymn */
179af28ef95Sblymn void *
form_userptr(FORM * form)18041859428Sblymn form_userptr(FORM *form)
18141859428Sblymn {
18241859428Sblymn
18341859428Sblymn if (form == NULL)
18441859428Sblymn return _formi_default_form.userptr;
18541859428Sblymn else
18641859428Sblymn return form->userptr;
18741859428Sblymn }
18841859428Sblymn
18941859428Sblymn /*
19041859428Sblymn * Set the form options to the given ones.
19141859428Sblymn */
19241859428Sblymn int
set_form_opts(FORM * form,Form_Options options)19341859428Sblymn set_form_opts(FORM *form, Form_Options options)
19441859428Sblymn {
19541859428Sblymn if (form == NULL)
19641859428Sblymn _formi_default_form.opts = options;
19741859428Sblymn else
19841859428Sblymn form->opts = options;
19941859428Sblymn
20041859428Sblymn return E_OK;
20141859428Sblymn }
20241859428Sblymn
20341859428Sblymn /*
20441859428Sblymn * Turn the given options on for the form.
20541859428Sblymn */
20641859428Sblymn int
form_opts_on(FORM * form,Form_Options options)20741859428Sblymn form_opts_on(FORM *form, Form_Options options)
20841859428Sblymn {
20941859428Sblymn if (form == NULL)
21041859428Sblymn _formi_default_form.opts |= options;
21141859428Sblymn else
21241859428Sblymn form->opts |= options;
21341859428Sblymn
21441859428Sblymn return E_OK;
21541859428Sblymn }
21641859428Sblymn
21741859428Sblymn /*
21841859428Sblymn * Turn the given options off for the form.
21941859428Sblymn */
22041859428Sblymn int
form_opts_off(FORM * form,Form_Options options)22141859428Sblymn form_opts_off(FORM *form, Form_Options options)
22241859428Sblymn {
22341859428Sblymn if (form == NULL)
22441859428Sblymn _formi_default_form.opts &= ~options;
22541859428Sblymn else
22641859428Sblymn form->opts &= ~options;
22741859428Sblymn
22841859428Sblymn
22941859428Sblymn return E_OK;
23041859428Sblymn }
23141859428Sblymn
23241859428Sblymn /*
23341859428Sblymn * Return the options set for the given form.
23441859428Sblymn */
23541859428Sblymn Form_Options
form_opts(FORM * form)23641859428Sblymn form_opts(FORM *form)
23741859428Sblymn {
23841859428Sblymn if (form == NULL)
23941859428Sblymn return _formi_default_form.opts;
24041859428Sblymn else
24141859428Sblymn return form->opts;
24241859428Sblymn }
24341859428Sblymn
24441859428Sblymn /*
24541859428Sblymn * Set the form init function for the given form
24641859428Sblymn */
24741859428Sblymn int
set_form_init(FORM * form,Form_Hook func)24841859428Sblymn set_form_init(FORM *form, Form_Hook func)
24941859428Sblymn {
25041859428Sblymn if (form == NULL)
25141859428Sblymn _formi_default_form.form_init = func;
25241859428Sblymn else
25341859428Sblymn form->form_init = func;
25441859428Sblymn
25541859428Sblymn return E_OK;
25641859428Sblymn }
25741859428Sblymn
25841859428Sblymn /*
25941859428Sblymn * Return the init function associated with the given form.
26041859428Sblymn */
26141859428Sblymn Form_Hook
form_init(FORM * form)26241859428Sblymn form_init(FORM *form)
26341859428Sblymn {
26441859428Sblymn if (form == NULL)
26541859428Sblymn return _formi_default_form.form_init;
26641859428Sblymn else
26741859428Sblymn return form->form_init;
26841859428Sblymn }
26941859428Sblymn
27041859428Sblymn /*
27141859428Sblymn * Set the function to be called on form termination.
27241859428Sblymn */
27341859428Sblymn int
set_form_term(FORM * form,Form_Hook function)27441859428Sblymn set_form_term(FORM *form, Form_Hook function)
27541859428Sblymn {
27641859428Sblymn if (form == NULL)
27741859428Sblymn _formi_default_form.form_term = function;
27841859428Sblymn else
27941859428Sblymn form->form_term = function;
28041859428Sblymn
28141859428Sblymn return E_OK;
28241859428Sblymn }
28341859428Sblymn
28441859428Sblymn /*
28541859428Sblymn * Return the function defined for the termination function.
28641859428Sblymn */
28741859428Sblymn Form_Hook
form_term(FORM * form)28841859428Sblymn form_term(FORM *form)
28941859428Sblymn {
29041859428Sblymn
29141859428Sblymn if (form == NULL)
29241859428Sblymn return _formi_default_form.form_term;
29341859428Sblymn else
29441859428Sblymn return form->form_term;
29541859428Sblymn }
29641859428Sblymn
29741859428Sblymn
29841859428Sblymn /*
29941859428Sblymn * Attach the given fields to the form.
30041859428Sblymn */
30141859428Sblymn int
set_form_fields(FORM * form,FIELD ** fields)30241859428Sblymn set_form_fields(FORM *form, FIELD **fields)
30341859428Sblymn {
30441859428Sblymn int num_fields = 0, i, maxpg = 1, status;
30541859428Sblymn
30641859428Sblymn if (form == NULL)
30741859428Sblymn return E_BAD_ARGUMENT;
30841859428Sblymn
30941859428Sblymn if (form->posted == TRUE)
31041859428Sblymn return E_POSTED;
31141859428Sblymn
31241859428Sblymn if (fields == NULL)
31341859428Sblymn return E_BAD_ARGUMENT;
31441859428Sblymn
31541859428Sblymn while (fields[num_fields] != NULL) {
31641859428Sblymn if ((fields[num_fields]->parent != NULL) &&
31741859428Sblymn (fields[num_fields]->parent != form))
31841859428Sblymn return E_CONNECTED;
31941859428Sblymn num_fields++;
32041859428Sblymn }
32141859428Sblymn
32241859428Sblymn /* disconnect old fields, if any */
32341859428Sblymn if (form->fields != NULL) {
32441859428Sblymn for (i = 0; i < form->field_count; i++) {
32541859428Sblymn form->fields[i]->parent = NULL;
32641859428Sblymn form->fields[i]->index = -1;
32741859428Sblymn }
32841859428Sblymn }
32941859428Sblymn
33041859428Sblymn /* kill old page pointers if any */
33141859428Sblymn if (form->page_starts != NULL)
33241859428Sblymn free(form->page_starts);
33341859428Sblymn
33441859428Sblymn form->field_count = num_fields;
33541859428Sblymn
33641859428Sblymn /* now connect the new fields to the form */
33741859428Sblymn for (i = 0; i < num_fields; i++) {
33841859428Sblymn fields[i]->parent = form;
33941859428Sblymn fields[i]->index = i;
34041859428Sblymn /* set the page number of the field */
34141859428Sblymn if (fields[i]->page_break == 1)
34241859428Sblymn maxpg++;
34341859428Sblymn fields[i]->page = maxpg;
34441859428Sblymn }
34541859428Sblymn
34641859428Sblymn form->fields = fields;
34741859428Sblymn form->cur_field = 0;
34841859428Sblymn form->max_page = maxpg;
34941859428Sblymn if ((status = _formi_find_pages(form)) != E_OK)
35041859428Sblymn return status;
35141859428Sblymn
35241859428Sblymn /* sort the fields and set the navigation pointers */
35341859428Sblymn _formi_sort_fields(form);
35441859428Sblymn _formi_stitch_fields(form);
35541859428Sblymn
35641859428Sblymn return E_OK;
35741859428Sblymn }
35841859428Sblymn
35941859428Sblymn /*
36041859428Sblymn * Return the fields attached to the form given.
36141859428Sblymn */
36241859428Sblymn FIELD **
form_fields(FORM * form)36341859428Sblymn form_fields(FORM *form)
36441859428Sblymn {
36541859428Sblymn if (form == NULL)
36641859428Sblymn return NULL;
36741859428Sblymn
36841859428Sblymn return form->fields;
36941859428Sblymn }
37041859428Sblymn
37141859428Sblymn /*
37241859428Sblymn * Return the number of fields attached to the given form.
37341859428Sblymn */
37441859428Sblymn int
field_count(FORM * form)37541859428Sblymn field_count(FORM *form)
37641859428Sblymn {
37741859428Sblymn if (form == NULL)
37841859428Sblymn return -1;
37941859428Sblymn
38041859428Sblymn return form->field_count;
38141859428Sblymn }
38241859428Sblymn
38341859428Sblymn /*
38441859428Sblymn * Move the given field to the row and column given.
38541859428Sblymn */
38641859428Sblymn int
move_field(FIELD * fptr,int frow,int fcol)38741859428Sblymn move_field(FIELD *fptr, int frow, int fcol)
38841859428Sblymn {
38941859428Sblymn FIELD *field = (fptr == NULL) ? &_formi_default_field : fptr;
39041859428Sblymn
39141859428Sblymn if (field->parent != NULL)
39241859428Sblymn return E_CONNECTED;
39341859428Sblymn
39441859428Sblymn field->form_row = frow;
39541859428Sblymn field->form_col = fcol;
39641859428Sblymn
39741859428Sblymn return E_OK;
39841859428Sblymn }
39941859428Sblymn
40041859428Sblymn /*
40141859428Sblymn * Set the page of the form to the given page.
40241859428Sblymn */
40341859428Sblymn int
set_form_page(FORM * form,int page)40441859428Sblymn set_form_page(FORM *form, int page)
40541859428Sblymn {
40641859428Sblymn if (form == NULL)
40741859428Sblymn return E_BAD_ARGUMENT;
40841859428Sblymn
40941859428Sblymn if (form->in_init == TRUE)
41041859428Sblymn return E_BAD_STATE;
41141859428Sblymn
41241859428Sblymn if (page > form->max_page)
41341859428Sblymn return E_BAD_ARGUMENT;
41441859428Sblymn
41541859428Sblymn form->page = page;
41641859428Sblymn return E_OK;
41741859428Sblymn }
41841859428Sblymn
41941859428Sblymn /*
4203ebef9c4Sblymn * Return the maximum page of the form.
4213ebef9c4Sblymn */
4223ebef9c4Sblymn int
form_max_page(FORM * form)4233ebef9c4Sblymn form_max_page(FORM *form)
4243ebef9c4Sblymn {
4253ebef9c4Sblymn if (form == NULL)
4263ebef9c4Sblymn return _formi_default_form.max_page;
4273ebef9c4Sblymn else
4283ebef9c4Sblymn return form->max_page;
4293ebef9c4Sblymn }
4303ebef9c4Sblymn
4313ebef9c4Sblymn /*
43241859428Sblymn * Return the current page of the form.
43341859428Sblymn */
43441859428Sblymn int
form_page(FORM * form)43541859428Sblymn form_page(FORM *form)
43641859428Sblymn {
43741859428Sblymn if (form == NULL)
43846683adcSblymn return E_BAD_ARGUMENT;
43941859428Sblymn
44041859428Sblymn return form->page;
44141859428Sblymn }
44241859428Sblymn
44341859428Sblymn /*
44441859428Sblymn * Set the current field to the field given.
44541859428Sblymn */
44641859428Sblymn int
set_current_field(FORM * form,FIELD * field)44741859428Sblymn set_current_field(FORM *form, FIELD *field)
44841859428Sblymn {
44941859428Sblymn if (form == NULL)
45041859428Sblymn return E_BAD_ARGUMENT;
45141859428Sblymn
45241859428Sblymn if (form->in_init == TRUE)
45341859428Sblymn return E_BAD_STATE;
45441859428Sblymn
45541859428Sblymn if (field == NULL)
45641859428Sblymn return E_INVALID_FIELD;
45741859428Sblymn
45841859428Sblymn if ((field->parent == NULL) || (field->parent != form))
45941859428Sblymn return E_INVALID_FIELD; /* field is not of this form */
46041859428Sblymn
46141859428Sblymn form->cur_field = field->index;
46246683adcSblymn
46346683adcSblymn /* XXX update page if posted??? */
46441859428Sblymn return E_OK;
46541859428Sblymn }
46641859428Sblymn
46741859428Sblymn /*
46841859428Sblymn * Return the current field of the given form.
46941859428Sblymn */
47041859428Sblymn FIELD *
current_field(FORM * form)47141859428Sblymn current_field(FORM *form)
47241859428Sblymn {
47341859428Sblymn if (form == NULL)
47441859428Sblymn return NULL;
47541859428Sblymn
47641859428Sblymn if (form->fields == NULL)
47741859428Sblymn return NULL;
47841859428Sblymn
47941859428Sblymn return form->fields[form->cur_field];
48041859428Sblymn }
48141859428Sblymn
48241859428Sblymn /*
48341859428Sblymn * Allocate a new form with the given fields.
48441859428Sblymn */
48541859428Sblymn FORM *
new_form(FIELD ** fields)48641859428Sblymn new_form(FIELD **fields)
48741859428Sblymn {
48841859428Sblymn FORM *new;
48941859428Sblymn
490*0cf98320Schristos if ((new = malloc(sizeof(*new))) == NULL)
49141859428Sblymn return NULL;
49241859428Sblymn
49341859428Sblymn
49441859428Sblymn /* copy in the defaults... */
495*0cf98320Schristos memcpy(new, &_formi_default_form, sizeof(*new));
49641859428Sblymn
49741859428Sblymn if (new->win == NULL)
498919001b4Sblymn new->scrwin = stdscr; /* something for curses to write to */
49941859428Sblymn
50041859428Sblymn if (fields != NULL) { /* attach the fields, if any */
50141859428Sblymn if (set_form_fields(new, fields) < 0) {
50241859428Sblymn free(new); /* field attach failed, back out */
50341859428Sblymn return NULL;
50441859428Sblymn }
50541859428Sblymn }
50641859428Sblymn
50741859428Sblymn return new;
50841859428Sblymn }
50941859428Sblymn
51041859428Sblymn /*
51141859428Sblymn * Free the given form.
51241859428Sblymn */
51341859428Sblymn int
free_form(FORM * form)51441859428Sblymn free_form(FORM *form)
51541859428Sblymn {
51641859428Sblymn int i;
51741859428Sblymn
51841859428Sblymn if (form == NULL)
51941859428Sblymn return E_BAD_ARGUMENT;
52041859428Sblymn
52141859428Sblymn if (form->posted == TRUE)
52241859428Sblymn return E_POSTED;
52341859428Sblymn
52441859428Sblymn for (i = 0; i < form->field_count; i++) {
52541859428Sblymn /* detach all the fields from the form */
52641859428Sblymn form->fields[i]->parent = NULL;
52741859428Sblymn form->fields[i]->index = -1;
52841859428Sblymn }
52941859428Sblymn
53041859428Sblymn free(form);
53141859428Sblymn
53241859428Sblymn return E_OK;
53341859428Sblymn }
53441859428Sblymn
53541859428Sblymn /*
53641859428Sblymn * Tell if the current field of the form has offscreen data ahead
53741859428Sblymn */
53841859428Sblymn int
data_ahead(FORM * form)53941859428Sblymn data_ahead(FORM *form)
54041859428Sblymn {
54141859428Sblymn FIELD *cur;
54241859428Sblymn
54341859428Sblymn if ((form == NULL) || (form->fields == NULL)
54441859428Sblymn || (form->fields[0] == NULL))
54541859428Sblymn return FALSE;
54641859428Sblymn
54741859428Sblymn cur = form->fields[form->cur_field];
5487ffbe072Sblymn
54946683adcSblymn /*XXXX wrong */
55019f07fb2Sblymn if (cur->cur_line->expanded > cur->cols)
55141859428Sblymn return TRUE;
55241859428Sblymn
55341859428Sblymn return FALSE;
55441859428Sblymn }
55541859428Sblymn
55641859428Sblymn /*
55741859428Sblymn * Tell if current field of the form has offscreen data behind
55841859428Sblymn */
55941859428Sblymn int
data_behind(FORM * form)56041859428Sblymn data_behind(FORM *form)
56141859428Sblymn {
56241859428Sblymn FIELD *cur;
56341859428Sblymn
56441859428Sblymn if ((form == NULL) || (form->fields == NULL)
56541859428Sblymn || (form->fields[0] == NULL))
56641859428Sblymn return FALSE;
56741859428Sblymn
56841859428Sblymn cur = form->fields[form->cur_field];
56941859428Sblymn
57047eb37d5Sblymn if (cur->start_char > 0)
57141859428Sblymn return TRUE;
57241859428Sblymn
57341859428Sblymn return FALSE;
57441859428Sblymn }
57541859428Sblymn
57641859428Sblymn /*
57741859428Sblymn * Position the form cursor.
57841859428Sblymn */
57941859428Sblymn int
pos_form_cursor(FORM * form)58041859428Sblymn pos_form_cursor(FORM *form)
58141859428Sblymn {
58241859428Sblymn FIELD *cur;
58341859428Sblymn int row, col;
58441859428Sblymn
58541859428Sblymn if ((form == NULL) || (form->fields == NULL) ||
58641859428Sblymn (form->fields[0] == NULL))
58741859428Sblymn return E_BAD_ARGUMENT;
58841859428Sblymn
58941859428Sblymn if (form->posted != 1)
59041859428Sblymn return E_NOT_POSTED;
59141859428Sblymn
59241859428Sblymn cur = form->fields[form->cur_field];
593919001b4Sblymn row = cur->form_row;
594919001b4Sblymn col = cur->form_col;
595919001b4Sblymn
596919001b4Sblymn /* if the field is public then show the cursor pos */
597919001b4Sblymn if ((cur->opts & O_PUBLIC) == O_PUBLIC) {
598919001b4Sblymn row += cur->cursor_ypos;
599919001b4Sblymn col += cur->cursor_xpos;
6003f76420bSblymn if (cur->cursor_xpos >= cur->cols) {
6013f76420bSblymn col = cur->form_col;
6023f76420bSblymn row++;
6033f76420bSblymn }
604919001b4Sblymn }
605919001b4Sblymn
60623a151b4Schristos _formi_dbg_printf("%s: row=%d, col=%d\n", __func__, row, col);
60741859428Sblymn
608919001b4Sblymn wmove(form->scrwin, row, col);
60941859428Sblymn
61041859428Sblymn return E_OK;
61141859428Sblymn }
612