xref: /freebsd-src/contrib/ncurses/form/fld_def.c (revision 21817992b3314c908ab50f0bb88d2ee750b9c4ac)
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