/*--------------------------------------------------------------------------- | Facility : libnform | Function : int free_field( FIELD *field ) | | Description : Frees the storage allocated for the field. | | Return Values : E_OK - success | E_BAD_ARGUMENT - invalid field pointer | E_CONNECTED - field is connected +--------------------------------------------------------------------------*/ int free_field(FIELD * field) { if (!field) RETURN(E_BAD_ARGUMENT); if (field->form) RETURN(E_CONNECTED); if (field == field->link) { if (field->buf) free(field->buf); } else { FIELD *f; for(f=field;f->link != field;f = f->link) {} f->link = field->link; } _nc_Free_Type(field); free(field); RETURN(E_OK); }
set_field_type(FIELD *field, FIELDTYPE *type,...) { va_list ap; int res = E_SYSTEM_ERROR; int err = 0; T((T_CALLED("set_field_type(%p,%p)"), field, type)); va_start(ap, type); Normalize_Field(field); _nc_Free_Type(field); field->type = type; field->arg = (void *)_nc_Make_Argument(field->type, &ap, &err); if (err) { _nc_Free_Argument(field->type, (TypeArgument *)(field->arg)); field->type = (FIELDTYPE *)0; field->arg = (void *)0; } else { res = E_OK; if (field->type) field->type->ref++; } va_end(ap); RETURN(res); }
_nc_set_generic_fieldtype(FIELD *field, FIELDTYPE *ftyp, int (*argiterator) (void **)) { int code = E_SYSTEM_ERROR; int err = 0; if (field) { if (field && field->type) _nc_Free_Type(field); field->type = ftyp; if (ftyp) { if (argiterator) { /* The precondition is that the iterator is reset */ field->arg = (void *)GenericArgument(field->type, argiterator, &err); if (err) { _nc_Free_Argument(field->type, (TypeArgument *)(field->arg)); field->type = (FIELDTYPE *)0; field->arg = (void *)0; } else { code = E_OK; if (field->type) field->type->ref++; } } } else { field->arg = (void *)0; code = E_OK; } } return code; }
free_field(FIELD *field) { T((T_CALLED("free_field(%p)"), field)); if (!field) { RETURN(E_BAD_ARGUMENT); } else if (field->form != 0) { RETURN(E_CONNECTED); } else if (field == field->link) { if (field->buf != 0) free(field->buf); } else { FIELD *f; for (f = field; f->link != field; f = f->link) { } f->link = field->link; } _nc_Free_Type(field); #if USE_WIDEC_SUPPORT if (field->expanded != 0) { int n; for (n = 0; n <= field->nbuf; ++n) { FreeIfNeeded(field->expanded[n]); } free(field->expanded); (void)delwin(field->working); } #endif free(field); RETURN(E_OK); }