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_Free_Type (FIELD *field) { assert(field); if (field->type) field->type->ref--; _nc_Free_Argument(field->type,(TypeArgument *)(field->arg)); }
_nc_Copy_Type(FIELD *dst, FIELD const *src) { int err = 0; assert(dst != 0 && src != 0); dst->type = src->type; dst->arg = (void *)_nc_Copy_Argument(src->type, (TypeArgument *)(src->arg), &err); if (err != 0) { _nc_Free_Argument(dst->type, (TypeArgument *)(dst->arg)); dst->type = (FIELDTYPE *)0; dst->arg = (void *)0; return FALSE; } else { if (dst->type != 0) { dst->type->ref++; } return TRUE; } }
/*--------------------------------------------------------------------------- | Facility : libnform | Function : void _nc_Free_Argument(const FIELDTYPE *typ, | TypeArgument * argp ) | | Description : Release memory associated with the argument structure | for the given fieldtype. | | Return Values : - +--------------------------------------------------------------------------*/ void _nc_Free_Argument(const FIELDTYPE * typ, TypeArgument * argp) { if (!typ || !(typ->status & _HAS_ARGS)) return; if (typ->status & _LINKED_TYPE) { assert(argp != 0); _nc_Free_Argument(typ->left ,argp->left ); _nc_Free_Argument(typ->right,argp->right); free(argp); } else { if (typ->freearg) typ->freearg((void *)argp); } }
_nc_Free_Argument(const FIELDTYPE *typ, TypeArgument *argp) { if (typ != 0 && (typ->status & _HAS_ARGS) != 0) { if ((typ->status & _LINKED_TYPE) != 0) { assert(argp != 0); _nc_Free_Argument(typ->left, argp->left); _nc_Free_Argument(typ->right, argp->right); free(argp); } else { if (typ->freearg != (void *)0) { typ->freearg((void *)argp); } } } }
_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; }