10e3d5408SPeter Wemm /****************************************************************************
2*21817992SBaptiste Daroussin * Copyright 2020,2021 Thomas E. Dickey *
3e1865124SBaptiste Daroussin * Copyright 1998-2012,2014 Free Software Foundation, Inc. *
40e3d5408SPeter Wemm * *
50e3d5408SPeter Wemm * Permission is hereby granted, free of charge, to any person obtaining a *
60e3d5408SPeter Wemm * copy of this software and associated documentation files (the *
70e3d5408SPeter Wemm * "Software"), to deal in the Software without restriction, including *
80e3d5408SPeter Wemm * without limitation the rights to use, copy, modify, merge, publish, *
90e3d5408SPeter Wemm * distribute, distribute with modifications, sublicense, and/or sell *
100e3d5408SPeter Wemm * copies of the Software, and to permit persons to whom the Software is *
110e3d5408SPeter Wemm * furnished to do so, subject to the following conditions: *
120e3d5408SPeter Wemm * *
130e3d5408SPeter Wemm * The above copyright notice and this permission notice shall be included *
140e3d5408SPeter Wemm * in all copies or substantial portions of the Software. *
150e3d5408SPeter Wemm * *
160e3d5408SPeter Wemm * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS *
170e3d5408SPeter Wemm * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *
180e3d5408SPeter Wemm * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. *
190e3d5408SPeter Wemm * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
200e3d5408SPeter Wemm * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
210e3d5408SPeter Wemm * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR *
220e3d5408SPeter Wemm * THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
230e3d5408SPeter Wemm * *
240e3d5408SPeter Wemm * Except as contained in this notice, the name(s) of the above copyright *
250e3d5408SPeter Wemm * holders shall not be used in advertising or otherwise to promote the *
260e3d5408SPeter Wemm * sale, use or other dealings in this Software without prior written *
270e3d5408SPeter Wemm * authorization. *
280e3d5408SPeter Wemm ****************************************************************************/
290e3d5408SPeter Wemm
300e3d5408SPeter Wemm /****************************************************************************
314a1a9510SRong-En Fan * Author: Juergen Pfeifer, 1995,1997 *
320e3d5408SPeter Wemm ****************************************************************************/
330e3d5408SPeter Wemm
340e3d5408SPeter Wemm #include "form.priv.h"
350e3d5408SPeter Wemm
36*21817992SBaptiste Daroussin MODULE_ID("$Id: fld_def.c,v 1.44 2021/03/27 23:49:53 tom Exp $")
370e3d5408SPeter Wemm
380e3d5408SPeter Wemm /* this can't be readonly */
394a1a9510SRong-En Fan static FIELD default_field =
404a1a9510SRong-En Fan {
410e3d5408SPeter Wemm 0, /* status */
420e3d5408SPeter Wemm 0, /* rows */
430e3d5408SPeter Wemm 0, /* cols */
440e3d5408SPeter Wemm 0, /* frow */
450e3d5408SPeter Wemm 0, /* fcol */
460e3d5408SPeter Wemm 0, /* drows */
470e3d5408SPeter Wemm 0, /* dcols */
480e3d5408SPeter Wemm 0, /* maxgrow */
490e3d5408SPeter Wemm 0, /* nrow */
500e3d5408SPeter Wemm 0, /* nbuf */
510e3d5408SPeter Wemm NO_JUSTIFICATION, /* just */
520e3d5408SPeter Wemm 0, /* page */
530e3d5408SPeter Wemm 0, /* index */
540e3d5408SPeter Wemm (int)' ', /* pad */
550e3d5408SPeter Wemm A_NORMAL, /* fore */
560e3d5408SPeter Wemm A_NORMAL, /* back */
57aae38d10SBaptiste Daroussin STD_FIELD_OPTS, /* opts */
580e3d5408SPeter Wemm (FIELD *)0, /* snext */
590e3d5408SPeter Wemm (FIELD *)0, /* sprev */
600e3d5408SPeter Wemm (FIELD *)0, /* link */
610e3d5408SPeter Wemm (FORM *)0, /* form */
620e3d5408SPeter Wemm (FIELDTYPE *)0, /* type */
630e3d5408SPeter Wemm (char *)0, /* arg */
644a1a9510SRong-En Fan (FIELD_CELL *)0, /* buf */
650e3d5408SPeter Wemm (char *)0 /* usrptr */
664a1a9510SRong-En Fan NCURSES_FIELD_EXTENSION
670e3d5408SPeter Wemm };
680e3d5408SPeter Wemm
697a656419SBaptiste Daroussin FORM_EXPORT_VAR(FIELD *) _nc_Default_Field = &default_field;
704a1a9510SRong-En Fan
710e3d5408SPeter Wemm /*---------------------------------------------------------------------------
720e3d5408SPeter Wemm | Facility : libnform
730e3d5408SPeter Wemm | Function : TypeArgument *_nc_Make_Argument(
740e3d5408SPeter Wemm | const FIELDTYPE *typ,
750e3d5408SPeter Wemm | va_list *ap,
760e3d5408SPeter Wemm | int *err )
770e3d5408SPeter Wemm |
780e3d5408SPeter Wemm | Description : Create an argument structure for the specified type.
794a1a9510SRong-En Fan | Use the type-dependent argument list to construct
800e3d5408SPeter Wemm | it.
810e3d5408SPeter Wemm |
820e3d5408SPeter Wemm | Return Values : Pointer to argument structure. Maybe NULL.
830e3d5408SPeter Wemm | In case of an error in *err an error counter is increased.
840e3d5408SPeter Wemm +--------------------------------------------------------------------------*/
857a656419SBaptiste Daroussin FORM_EXPORT(TypeArgument *)
_nc_Make_Argument(const FIELDTYPE * typ,va_list * ap,int * err)864a1a9510SRong-En Fan _nc_Make_Argument(const FIELDTYPE *typ, va_list *ap, int *err)
870e3d5408SPeter Wemm {
880e3d5408SPeter Wemm TypeArgument *res = (TypeArgument *)0;
890e3d5408SPeter Wemm
904a1a9510SRong-En Fan if (typ != 0 && (typ->status & _HAS_ARGS) != 0)
910e3d5408SPeter Wemm {
924a1a9510SRong-En Fan assert(err != 0 && ap != (va_list *)0);
934a1a9510SRong-En Fan if ((typ->status & _LINKED_TYPE) != 0)
940e3d5408SPeter Wemm {
95*21817992SBaptiste Daroussin TypeArgument *p = typeMalloc(TypeArgument, 1);
964a1a9510SRong-En Fan
974a1a9510SRong-En Fan if (p != 0)
980e3d5408SPeter Wemm {
990e3d5408SPeter Wemm p->left = _nc_Make_Argument(typ->left, ap, err);
1000e3d5408SPeter Wemm p->right = _nc_Make_Argument(typ->right, ap, err);
1010e3d5408SPeter Wemm return p;
1020e3d5408SPeter Wemm }
1030e3d5408SPeter Wemm else
1040e3d5408SPeter Wemm {
1050e3d5408SPeter Wemm *err += 1;
1060e3d5408SPeter Wemm }
1070e3d5408SPeter Wemm }
1084a1a9510SRong-En Fan else
1094a1a9510SRong-En Fan {
1104a1a9510SRong-En Fan assert(typ->makearg != (void *)0);
1114a1a9510SRong-En Fan if (!(res = (TypeArgument *)typ->makearg(ap)))
1124a1a9510SRong-En Fan {
1134a1a9510SRong-En Fan *err += 1;
1144a1a9510SRong-En Fan }
1154a1a9510SRong-En Fan }
1164a1a9510SRong-En Fan }
1170e3d5408SPeter Wemm return res;
1180e3d5408SPeter Wemm }
1190e3d5408SPeter Wemm
1200e3d5408SPeter Wemm /*---------------------------------------------------------------------------
1210e3d5408SPeter Wemm | Facility : libnform
1220e3d5408SPeter Wemm | Function : TypeArgument *_nc_Copy_Argument(const FIELDTYPE *typ,
1230e3d5408SPeter Wemm | const TypeArgument *argp,
1240e3d5408SPeter Wemm | int *err )
1250e3d5408SPeter Wemm |
1260e3d5408SPeter Wemm | Description : Create a copy of an argument structure for the specified
1270e3d5408SPeter Wemm | type.
1280e3d5408SPeter Wemm |
1290e3d5408SPeter Wemm | Return Values : Pointer to argument structure. Maybe NULL.
1300e3d5408SPeter Wemm | In case of an error in *err an error counter is increased.
1310e3d5408SPeter Wemm +--------------------------------------------------------------------------*/
1327a656419SBaptiste Daroussin FORM_EXPORT(TypeArgument *)
_nc_Copy_Argument(const FIELDTYPE * typ,const TypeArgument * argp,int * err)1334a1a9510SRong-En Fan _nc_Copy_Argument(const FIELDTYPE *typ, const TypeArgument *argp, int *err)
1340e3d5408SPeter Wemm {
1350e3d5408SPeter Wemm TypeArgument *res = (TypeArgument *)0;
1360e3d5408SPeter Wemm
1374a1a9510SRong-En Fan if (typ != 0 && (typ->status & _HAS_ARGS) != 0)
1380e3d5408SPeter Wemm {
1394a1a9510SRong-En Fan assert(err != 0 && argp != 0);
1404a1a9510SRong-En Fan if ((typ->status & _LINKED_TYPE) != 0)
1410e3d5408SPeter Wemm {
142*21817992SBaptiste Daroussin TypeArgument *p = typeMalloc(TypeArgument, 1);
1434a1a9510SRong-En Fan
1444a1a9510SRong-En Fan if (p != 0)
1450e3d5408SPeter Wemm {
1460e3d5408SPeter Wemm p->left = _nc_Copy_Argument(typ, argp->left, err);
1470e3d5408SPeter Wemm p->right = _nc_Copy_Argument(typ, argp->right, err);
1480e3d5408SPeter Wemm return p;
1490e3d5408SPeter Wemm }
1500e3d5408SPeter Wemm *err += 1;
1510e3d5408SPeter Wemm }
1520e3d5408SPeter Wemm else
1530e3d5408SPeter Wemm {
1544a1a9510SRong-En Fan if (typ->copyarg != (void *)0)
1550e3d5408SPeter Wemm {
1560e3d5408SPeter Wemm if (!(res = (TypeArgument *)(typ->copyarg((const void *)argp))))
1574a1a9510SRong-En Fan {
1580e3d5408SPeter Wemm *err += 1;
1590e3d5408SPeter Wemm }
1604a1a9510SRong-En Fan }
1610e3d5408SPeter Wemm else
1624a1a9510SRong-En Fan {
1630e3d5408SPeter Wemm res = (TypeArgument *)argp;
1640e3d5408SPeter Wemm }
1650e3d5408SPeter Wemm }
1664a1a9510SRong-En Fan }
1670e3d5408SPeter Wemm return res;
1680e3d5408SPeter Wemm }
1690e3d5408SPeter Wemm
1700e3d5408SPeter Wemm /*---------------------------------------------------------------------------
1710e3d5408SPeter Wemm | Facility : libnform
1720e3d5408SPeter Wemm | Function : void _nc_Free_Argument(const FIELDTYPE *typ,
1730e3d5408SPeter Wemm | TypeArgument * argp )
1740e3d5408SPeter Wemm |
1750e3d5408SPeter Wemm | Description : Release memory associated with the argument structure
1760e3d5408SPeter Wemm | for the given fieldtype.
1770e3d5408SPeter Wemm |
1780e3d5408SPeter Wemm | Return Values : -
1790e3d5408SPeter Wemm +--------------------------------------------------------------------------*/
1807a656419SBaptiste Daroussin FORM_EXPORT(void)
_nc_Free_Argument(const FIELDTYPE * typ,TypeArgument * argp)1814a1a9510SRong-En Fan _nc_Free_Argument(const FIELDTYPE *typ, TypeArgument *argp)
1820e3d5408SPeter Wemm {
1834a1a9510SRong-En Fan if (typ != 0 && (typ->status & _HAS_ARGS) != 0)
1840e3d5408SPeter Wemm {
1854a1a9510SRong-En Fan if ((typ->status & _LINKED_TYPE) != 0)
1864a1a9510SRong-En Fan {
18773f0a83dSXin LI if (argp != 0)
18873f0a83dSXin LI {
1890e3d5408SPeter Wemm _nc_Free_Argument(typ->left, argp->left);
1900e3d5408SPeter Wemm _nc_Free_Argument(typ->right, argp->right);
1910e3d5408SPeter Wemm free(argp);
1920e3d5408SPeter Wemm }
19373f0a83dSXin LI }
1940e3d5408SPeter Wemm else
1950e3d5408SPeter Wemm {
1964a1a9510SRong-En Fan if (typ->freearg != (void *)0)
1974a1a9510SRong-En Fan {
1980e3d5408SPeter Wemm typ->freearg((void *)argp);
1990e3d5408SPeter Wemm }
2000e3d5408SPeter Wemm }
2014a1a9510SRong-En Fan }
2024a1a9510SRong-En Fan }
2030e3d5408SPeter Wemm
2040e3d5408SPeter Wemm /*---------------------------------------------------------------------------
2050e3d5408SPeter Wemm | Facility : libnform
2060e3d5408SPeter Wemm | Function : bool _nc_Copy_Type( FIELD *dst, FIELD const *src )
2070e3d5408SPeter Wemm |
2080e3d5408SPeter Wemm | Description : Copy argument structure of field src to field dst
2090e3d5408SPeter Wemm |
2100e3d5408SPeter Wemm | Return Values : TRUE - copy worked
2114a1a9510SRong-En Fan | FALSE - error occurred
2120e3d5408SPeter Wemm +--------------------------------------------------------------------------*/
2137a656419SBaptiste Daroussin FORM_EXPORT(bool)
_nc_Copy_Type(FIELD * dst,FIELD const * src)2144a1a9510SRong-En Fan _nc_Copy_Type(FIELD *dst, FIELD const *src)
2150e3d5408SPeter Wemm {
2160e3d5408SPeter Wemm int err = 0;
2170e3d5408SPeter Wemm
2184a1a9510SRong-En Fan assert(dst != 0 && src != 0);
2190e3d5408SPeter Wemm
2200e3d5408SPeter Wemm dst->type = src->type;
2210e3d5408SPeter Wemm dst->arg = (void *)_nc_Copy_Argument(src->type, (TypeArgument *)(src->arg), &err);
2220e3d5408SPeter Wemm
2234a1a9510SRong-En Fan if (err != 0)
2240e3d5408SPeter Wemm {
2250e3d5408SPeter Wemm _nc_Free_Argument(dst->type, (TypeArgument *)(dst->arg));
2260e3d5408SPeter Wemm dst->type = (FIELDTYPE *)0;
2270e3d5408SPeter Wemm dst->arg = (void *)0;
2280e3d5408SPeter Wemm return FALSE;
2290e3d5408SPeter Wemm }
2300e3d5408SPeter Wemm else
2310e3d5408SPeter Wemm {
2324a1a9510SRong-En Fan if (dst->type != 0)
2334a1a9510SRong-En Fan {
2340e3d5408SPeter Wemm dst->type->ref++;
2354a1a9510SRong-En Fan }
2360e3d5408SPeter Wemm return TRUE;
2370e3d5408SPeter Wemm }
2380e3d5408SPeter Wemm }
2390e3d5408SPeter Wemm
2400e3d5408SPeter Wemm /*---------------------------------------------------------------------------
2410e3d5408SPeter Wemm | Facility : libnform
2420e3d5408SPeter Wemm | Function : void _nc_Free_Type( FIELD *field )
2430e3d5408SPeter Wemm |
2440e3d5408SPeter Wemm | Description : Release Argument structure for this field
2450e3d5408SPeter Wemm |
2460e3d5408SPeter Wemm | Return Values : -
2470e3d5408SPeter Wemm +--------------------------------------------------------------------------*/
2487a656419SBaptiste Daroussin FORM_EXPORT(void)
_nc_Free_Type(FIELD * field)2490e3d5408SPeter Wemm _nc_Free_Type(FIELD *field)
2500e3d5408SPeter Wemm {
2514a1a9510SRong-En Fan assert(field != 0);
2524a1a9510SRong-En Fan if (field->type != 0)
2534a1a9510SRong-En Fan {
2540e3d5408SPeter Wemm field->type->ref--;
2550e3d5408SPeter Wemm _nc_Free_Argument(field->type, (TypeArgument *)(field->arg));
2560e3d5408SPeter Wemm }
25706bfebdeSXin LI }
2580e3d5408SPeter Wemm
2590e3d5408SPeter Wemm /*---------------------------------------------------------------------------
2600e3d5408SPeter Wemm | Facility : libnform
2610e3d5408SPeter Wemm | Function : FIELD *new_field( int rows, int cols,
2620e3d5408SPeter Wemm | int frow, int fcol,
2630e3d5408SPeter Wemm | int nrow, int nbuf )
2640e3d5408SPeter Wemm |
2650e3d5408SPeter Wemm | Description : Create a new field with this many 'rows' and 'cols',
2660e3d5408SPeter Wemm | starting at 'frow/fcol' in the subwindow of the form.
2670e3d5408SPeter Wemm | Allocate 'nrow' off-screen rows and 'nbuf' additional
2680e3d5408SPeter Wemm | buffers. If an error occurs, errno is set to
2690e3d5408SPeter Wemm |
2700e3d5408SPeter Wemm | E_BAD_ARGUMENT - invalid argument
2710e3d5408SPeter Wemm | E_SYSTEM_ERROR - system error
2720e3d5408SPeter Wemm |
2730e3d5408SPeter Wemm | Return Values : Pointer to the new field or NULL if failure.
2740e3d5408SPeter Wemm +--------------------------------------------------------------------------*/
2757a656419SBaptiste Daroussin FORM_EXPORT(FIELD *)
new_field(int rows,int cols,int frow,int fcol,int nrow,int nbuf)2764a1a9510SRong-En Fan new_field(int rows, int cols, int frow, int fcol, int nrow, int nbuf)
2770e3d5408SPeter Wemm {
2784a1a9510SRong-En Fan static const FIELD_CELL blank = BLANK;
2794a1a9510SRong-En Fan static const FIELD_CELL zeros = ZEROS;
2804a1a9510SRong-En Fan
2810e3d5408SPeter Wemm FIELD *New_Field = (FIELD *)0;
2820e3d5408SPeter Wemm int err = E_BAD_ARGUMENT;
2830e3d5408SPeter Wemm
2844a1a9510SRong-En Fan T((T_CALLED("new_field(%d,%d,%d,%d,%d,%d)"), rows, cols, frow, fcol, nrow, nbuf));
2850e3d5408SPeter Wemm if (rows > 0 &&
2860e3d5408SPeter Wemm cols > 0 &&
2870e3d5408SPeter Wemm frow >= 0 &&
2880e3d5408SPeter Wemm fcol >= 0 &&
2890e3d5408SPeter Wemm nrow >= 0 &&
2900e3d5408SPeter Wemm nbuf >= 0 &&
2910e3d5408SPeter Wemm ((err = E_SYSTEM_ERROR) != 0) && /* trick: this resets the default error */
2925ca44d1cSRong-En Fan (New_Field = typeMalloc(FIELD, 1)) != 0)
2930e3d5408SPeter Wemm {
29406bfebdeSXin LI T((T_CREATE("field %p"), (void *)New_Field));
2950e3d5408SPeter Wemm *New_Field = default_field;
29673f0a83dSXin LI New_Field->rows = (short)rows;
29773f0a83dSXin LI New_Field->cols = (short)cols;
2980e3d5408SPeter Wemm New_Field->drows = rows + nrow;
2990e3d5408SPeter Wemm New_Field->dcols = cols;
30073f0a83dSXin LI New_Field->frow = (short)frow;
30173f0a83dSXin LI New_Field->fcol = (short)fcol;
3020e3d5408SPeter Wemm New_Field->nrow = nrow;
30373f0a83dSXin LI New_Field->nbuf = (short)nbuf;
3040e3d5408SPeter Wemm New_Field->link = New_Field;
3050e3d5408SPeter Wemm
3064a1a9510SRong-En Fan #if USE_WIDEC_SUPPORT
3074a1a9510SRong-En Fan New_Field->working = newpad(1, Buffer_Length(New_Field) + 1);
3085ca44d1cSRong-En Fan New_Field->expanded = typeCalloc(char *, 1 + (unsigned)nbuf);
3094a1a9510SRong-En Fan #endif
3104a1a9510SRong-En Fan
3110e3d5408SPeter Wemm if (_nc_Copy_Type(New_Field, &default_field))
3120e3d5408SPeter Wemm {
3130e3d5408SPeter Wemm size_t len;
3140e3d5408SPeter Wemm
3150e3d5408SPeter Wemm len = Total_Buffer_Size(New_Field);
3164a1a9510SRong-En Fan if ((New_Field->buf = (FIELD_CELL *)malloc(len)))
3170e3d5408SPeter Wemm {
3180e3d5408SPeter Wemm /* Prefill buffers with blanks and insert terminating zeroes
3190e3d5408SPeter Wemm between buffers */
3204a1a9510SRong-En Fan int i, j;
3214a1a9510SRong-En Fan int cells = Buffer_Length(New_Field);
3220e3d5408SPeter Wemm
3230e3d5408SPeter Wemm for (i = 0; i <= New_Field->nbuf; i++)
3240e3d5408SPeter Wemm {
3254a1a9510SRong-En Fan FIELD_CELL *buffer = &(New_Field->buf[(cells + 1) * i]);
3264a1a9510SRong-En Fan
3274a1a9510SRong-En Fan for (j = 0; j < cells; ++j)
3284a1a9510SRong-En Fan {
3294a1a9510SRong-En Fan buffer[j] = blank;
3300e3d5408SPeter Wemm }
3314a1a9510SRong-En Fan buffer[j] = zeros;
3324a1a9510SRong-En Fan }
3334a1a9510SRong-En Fan returnField(New_Field);
3340e3d5408SPeter Wemm }
3350e3d5408SPeter Wemm }
3360e3d5408SPeter Wemm }
3370e3d5408SPeter Wemm
3380e3d5408SPeter Wemm if (New_Field)
3390e3d5408SPeter Wemm free_field(New_Field);
3400e3d5408SPeter Wemm
3410e3d5408SPeter Wemm SET_ERROR(err);
3424a1a9510SRong-En Fan returnField((FIELD *)0);
3430e3d5408SPeter Wemm }
3440e3d5408SPeter Wemm
3450e3d5408SPeter Wemm /*---------------------------------------------------------------------------
3460e3d5408SPeter Wemm | Facility : libnform
3470e3d5408SPeter Wemm | Function : int free_field( FIELD *field )
3480e3d5408SPeter Wemm |
3490e3d5408SPeter Wemm | Description : Frees the storage allocated for the field.
3500e3d5408SPeter Wemm |
3510e3d5408SPeter Wemm | Return Values : E_OK - success
3520e3d5408SPeter Wemm | E_BAD_ARGUMENT - invalid field pointer
3530e3d5408SPeter Wemm | E_CONNECTED - field is connected
3540e3d5408SPeter Wemm +--------------------------------------------------------------------------*/
3557a656419SBaptiste Daroussin FORM_EXPORT(int)
free_field(FIELD * field)3567a69bbfbSPeter Wemm free_field(FIELD *field)
3570e3d5408SPeter Wemm {
35806bfebdeSXin LI T((T_CALLED("free_field(%p)"), (void *)field));
3590e3d5408SPeter Wemm if (!field)
3600e3d5408SPeter Wemm {
3614a1a9510SRong-En Fan RETURN(E_BAD_ARGUMENT);
3624a1a9510SRong-En Fan }
3634a1a9510SRong-En Fan else if (field->form != 0)
3644a1a9510SRong-En Fan {
3654a1a9510SRong-En Fan RETURN(E_CONNECTED);
3664a1a9510SRong-En Fan }
3674a1a9510SRong-En Fan else if (field == field->link)
3684a1a9510SRong-En Fan {
3694a1a9510SRong-En Fan if (field->buf != 0)
3700e3d5408SPeter Wemm free(field->buf);
3710e3d5408SPeter Wemm }
3720e3d5408SPeter Wemm else
3730e3d5408SPeter Wemm {
3740e3d5408SPeter Wemm FIELD *f;
3750e3d5408SPeter Wemm
3760e3d5408SPeter Wemm for (f = field; f->link != field; f = f->link)
3774a1a9510SRong-En Fan {
3784a1a9510SRong-En Fan }
3790e3d5408SPeter Wemm f->link = field->link;
3800e3d5408SPeter Wemm }
3810e3d5408SPeter Wemm _nc_Free_Type(field);
3824a1a9510SRong-En Fan #if USE_WIDEC_SUPPORT
3834a1a9510SRong-En Fan if (field->expanded != 0)
3844a1a9510SRong-En Fan {
3854a1a9510SRong-En Fan int n;
3864a1a9510SRong-En Fan
3874a1a9510SRong-En Fan for (n = 0; n <= field->nbuf; ++n)
3884a1a9510SRong-En Fan {
3894a1a9510SRong-En Fan FreeIfNeeded(field->expanded[n]);
3904a1a9510SRong-En Fan }
3914a1a9510SRong-En Fan free(field->expanded);
3924a1a9510SRong-En Fan (void)delwin(field->working);
3934a1a9510SRong-En Fan }
3944a1a9510SRong-En Fan #endif
3950e3d5408SPeter Wemm free(field);
3960e3d5408SPeter Wemm RETURN(E_OK);
3970e3d5408SPeter Wemm }
3980e3d5408SPeter Wemm
3990e3d5408SPeter Wemm /* fld_def.c ends here */
400