xref: /freebsd/contrib/ncurses/form/fld_newftyp.c (revision fb47a3769c514735bceb2822a64e5e70c3d2f7a4)
1 /****************************************************************************
2  * Copyright (c) 1998-2009,2010 Free Software Foundation, Inc.              *
3  *                                                                          *
4  * Permission is hereby granted, free of charge, to any person obtaining a  *
5  * copy of this software and associated documentation files (the            *
6  * "Software"), to deal in the Software without restriction, including      *
7  * without limitation the rights to use, copy, modify, merge, publish,      *
8  * distribute, distribute with modifications, sublicense, and/or sell       *
9  * copies of the Software, and to permit persons to whom the Software is    *
10  * furnished to do so, subject to the following conditions:                 *
11  *                                                                          *
12  * The above copyright notice and this permission notice shall be included  *
13  * in all copies or substantial portions of the Software.                   *
14  *                                                                          *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  *
16  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               *
17  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   *
18  * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   *
19  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    *
20  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    *
21  * THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               *
22  *                                                                          *
23  * Except as contained in this notice, the name(s) of the above copyright   *
24  * holders shall not be used in advertising or otherwise to promote the     *
25  * sale, use or other dealings in this Software without prior written       *
26  * authorization.                                                           *
27  ****************************************************************************/
28 
29 /****************************************************************************
30  *   Author:  Juergen Pfeifer, 1995,1997                                    *
31  ****************************************************************************/
32 
33 #include "form.priv.h"
34 
35 MODULE_ID("$Id: fld_newftyp.c,v 1.19 2010/01/23 21:14:36 tom Exp $")
36 
37 static FIELDTYPE default_fieldtype =
38 {
39   0,				/* status                                      */
40   0L,				/* reference count                             */
41   (FIELDTYPE *)0,		/* pointer to left  operand                    */
42   (FIELDTYPE *)0,		/* pointer to right operand                    */
43   NULL,				/* makearg function                            */
44   NULL,				/* copyarg function                            */
45   NULL,				/* freearg function                            */
46   INIT_FT_FUNC(NULL),		/* field validation function                   */
47   INIT_FT_FUNC(NULL),		/* Character check function                    */
48   INIT_FT_FUNC(NULL),		/* enumerate next function                     */
49   INIT_FT_FUNC(NULL),		/* enumerate previous function                 */
50 #if NCURSES_INTEROP_FUNCS
51   NULL				/* generic callback alternative to makearg     */
52 #endif
53 };
54 
55 NCURSES_EXPORT_VAR(FIELDTYPE *)
56 _nc_Default_FieldType = &default_fieldtype;
57 
58 /*---------------------------------------------------------------------------
59 |   Facility      :  libnform
60 |   Function      :  FIELDTYPE *new_fieldtype(
61 |                       bool (* const field_check)(FIELD *,const void *),
62 |                       bool (* const char_check) (int, const void *) )
63 |
64 |   Description   :  Create a new fieldtype. The application programmer must
65 |                    write a field_check and a char_check function and give
66 |                    them as input to this call.
67 |                    If an error occurs, errno is set to
68 |                       E_BAD_ARGUMENT  - invalid arguments
69 |                       E_SYSTEM_ERROR  - system error (no memory)
70 |
71 |   Return Values :  Fieldtype pointer or NULL if error occurred
72 +--------------------------------------------------------------------------*/
73 NCURSES_EXPORT(FIELDTYPE *)
74 new_fieldtype(bool (*const field_check) (FIELD *, const void *),
75 	      bool (*const char_check) (int, const void *))
76 {
77   FIELDTYPE *nftyp = (FIELDTYPE *)0;
78 
79   T((T_CALLED("new_fieldtype(%p,%p)"), field_check, char_check));
80   if ((field_check) || (char_check))
81     {
82       nftyp = typeMalloc(FIELDTYPE, 1);
83 
84       if (nftyp)
85 	{
86 	  T((T_CREATE("fieldtype %p"), (void *)nftyp));
87 	  *nftyp = default_fieldtype;
88 #if NCURSES_INTEROP_FUNCS
89 	  nftyp->fieldcheck.ofcheck = field_check;
90 	  nftyp->charcheck.occheck = char_check;
91 #else
92 	  nftyp->fcheck = field_check;
93 	  nftyp->ccheck = char_check;
94 #endif
95 	}
96       else
97 	{
98 	  SET_ERROR(E_SYSTEM_ERROR);
99 	}
100     }
101   else
102     {
103       SET_ERROR(E_BAD_ARGUMENT);
104     }
105   returnFieldType(nftyp);
106 }
107 
108 /*---------------------------------------------------------------------------
109 |   Facility      :  libnform
110 |   Function      :  int free_fieldtype(FIELDTYPE *typ)
111 |
112 |   Description   :  Release the memory associated with this fieldtype.
113 |
114 |   Return Values :  E_OK            - success
115 |                    E_CONNECTED     - there are fields referencing the type
116 |                    E_BAD_ARGUMENT  - invalid fieldtype pointer
117 +--------------------------------------------------------------------------*/
118 NCURSES_EXPORT(int)
119 free_fieldtype(FIELDTYPE *typ)
120 {
121   T((T_CALLED("free_fieldtype(%p)"), (void *)typ));
122 
123   if (!typ)
124     RETURN(E_BAD_ARGUMENT);
125 
126   if (typ->ref != 0)
127     RETURN(E_CONNECTED);
128 
129   if (typ->status & _RESIDENT)
130     RETURN(E_CONNECTED);
131 
132   if (typ->status & _LINKED_TYPE)
133     {
134       if (typ->left)
135 	typ->left->ref--;
136       if (typ->right)
137 	typ->right->ref--;
138     }
139   free(typ);
140   RETURN(E_OK);
141 }
142 
143 /* fld_newftyp.c ends here */
144