#include <sys/types.h>
#include <stdlib.h>
#include "utility.h"
static FIELD default_field =
{
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
NO_JUSTIFICATION,
0,
0,
' ',
A_NORMAL,
A_NORMAL,
O_VISIBLE |
O_ACTIVE |
O_PUBLIC |
O_EDIT |
O_WRAP |
O_BLANK |
O_AUTOSKIP |
O_NULLOK |
O_PASSOK |
O_STATIC,
(FIELD *)0,
(FIELD *)0,
(FIELD *)0,
(FORM *)0,
(FIELDTYPE *)0,
(char *)0,
(char *)0,
(char *)0,
};
FIELD * _DEFAULT_FIELD = &default_field;
static int
MakeType(FIELD *f, va_list *ap)
{
int err = 0;
f->arg = MakeArg(f, ap, &err);
if (err) {
FreeArg(f);
f->type = (FIELDTYPE *)0;
f->arg = (char *)0;
return (FALSE);
}
IncrType(f->type);
return (TRUE);
}
static int
CopyType(FIELD *f, FIELD *fsrc)
{
int err = 0;
f->type = fsrc->type;
f->arg = CopyArg(fsrc, &err);
if (err) {
FreeArg(f);
f->type = (FIELDTYPE *)0;
f->arg = (char *)0;
return (FALSE);
}
IncrType(f->type);
return (TRUE);
}
static void
FreeType(FIELD *f)
{
DecrType(f->type);
FreeArg(f);
}
FIELD *
new_field(int rows, int cols, int frow, int fcol, int nrow, int nbuf)
{
FIELD *f = (FIELD *) 0;
int i, size;
if (rows > 0 && cols > 0 && frow >= 0 && fcol >= 0 && nrow >= 0 &&
nbuf >= 0 && Alloc(f, FIELD)) {
*f = *_DEFAULT_FIELD;
f->rows = rows;
f->cols = cols;
f->frow = frow;
f->fcol = fcol;
f->drows = rows + nrow;
f->dcols = cols;
f->nrow = nrow;
f->nbuf = nbuf;
f->link = f;
if (CopyType(f, _DEFAULT_FIELD)) {
size = TotalBuf(f);
if (arrayAlloc(Buf(f), size, char)) {
(void) memset(Buf(f), ' ', size);
for (i = 0; i <= f->nbuf; ++i)
*(Buffer(f, i + 1) - 1) = '\0';
return (f);
}
}
}
(void) free_field(f);
return ((FIELD *) 0);
}
FIELD *
dup_field(FIELD *field, int frow, int fcol)
{
FIELD *f = (FIELD *) 0;
int size;
if (field && frow >= 0 && fcol >= 0 && Alloc(f, FIELD)) {
*f = *_DEFAULT_FIELD;
f->frow = frow;
f->fcol = fcol;
f->link = f;
f->rows = field->rows;
f->cols = field->cols;
f->drows = field->drows;
f->dcols = field->dcols;
f->maxgrow = field->maxgrow;
f->nrow = field->nrow;
f->nbuf = field->nbuf;
f->just = field->just;
f->fore = field->fore;
f->back = field->back;
f->pad = field->pad;
f->opts = field->opts;
f->usrptr = field->usrptr;
f->status = Status(field, GROWABLE);
if (CopyType(f, field)) {
size = TotalBuf(f);
if (arrayAlloc(Buf(f), size, char)) {
(void) memcpy(Buf(f), Buf(field), size);
return (f);
}
}
}
(void) free_field(f);
return ((FIELD *) 0);
}
FIELD *
link_field(FIELD *field, int frow, int fcol)
{
FIELD *f = (FIELD *) 0;
if (field && frow >= 0 && fcol >= 0 && Alloc(f, FIELD)) {
*f = *_DEFAULT_FIELD;
f->frow = frow;
f->fcol = fcol;
f->link = field->link;
field->link = f;
f->buf = field->buf;
f->rows = field->rows;
f->cols = field->cols;
f->drows = field->drows;
f->dcols = field->dcols;
f->maxgrow = field->maxgrow;
f->nrow = field->nrow;
f->nbuf = field->nbuf;
f->just = field->just;
f->fore = field->fore;
f->back = field->back;
f->pad = field->pad;
f->opts = field->opts;
f->usrptr = field->usrptr;
f->status = Status(field, GROWABLE);
if (CopyType(f, field))
return (f);
}
(void) free_field(f);
return ((FIELD *) 0);
}
int
free_field(FIELD *f)
{
FIELD *p;
if (!f)
return (E_BAD_ARGUMENT);
if (f->form)
return (E_CONNECTED);
if (f->link != f) {
for (p = f->link; p->link != f; p = p->link)
;
p->link = f->link;
} else
Free(Buf(f));
FreeType(f);
Free(f);
return (E_OK);
}
int
field_info(FIELD *f, int *rows, int *cols, int *frow, int *fcol,
int *nrow, int *nbuf)
{
if (!f)
return (E_BAD_ARGUMENT);
*rows = f->rows;
*cols = f->cols;
*frow = f->frow;
*fcol = f->fcol;
*nrow = f->nrow;
*nbuf = f->nbuf;
return (E_OK);
}
int
set_max_field(FIELD *f, int max)
{
BOOLEAN onerow;
if (f == NULL)
return (E_BAD_ARGUMENT);
onerow = OneRow(f);
if (max && ((onerow && f->dcols > max) ||
(!onerow && f->drows > max)))
return (E_BAD_ARGUMENT);
f->maxgrow = max;
Clr(f, GROWABLE);
if (!Opt(f, O_STATIC) && ((!max || onerow && f->dcols < max) ||
(!onerow && f->drows < max))) {
Set(f, GROWABLE);
}
return (E_OK);
}
int
dynamic_field_info(FIELD *f, int *drows, int *dcols, int *max)
{
if (!f)
return (E_BAD_ARGUMENT);
*drows = f->drows;
*dcols = f->dcols;
*max = f->maxgrow;
return (E_OK);
}
int
move_field(FIELD *f, int frow, int fcol)
{
if (! f || frow < 0 || fcol < 0)
return (E_BAD_ARGUMENT);
if (f->form)
return (E_CONNECTED);
f->frow = frow;
f->fcol = fcol;
return (E_OK);
}
int
set_field_type(FIELD *f, FIELDTYPE *ft, ...)
{
va_list ap;
int v = E_SYSTEM_ERROR;
va_start(ap, ft);
f = Field(f);
FreeType(f);
f->type = ft;
if (MakeType(f, &ap))
v = E_OK;
va_end(ap);
return (v);
}
FIELDTYPE *
field_type(FIELD *f)
{
return (Field(f)->type);
}
char *
field_arg(FIELD *f)
{
return (Field(f)->arg);
}
int
set_new_page(FIELD *f, int flag)
{
f = Field(f);
if (f->form)
return (E_CONNECTED);
if (flag)
Set(f, NEW_PAGE);
else
Clr(f, NEW_PAGE);
return (E_OK);
}
int
new_page(FIELD *f)
{
if (Status(Field(f), NEW_PAGE))
return (TRUE);
else
return (FALSE);
}