/*--------------------------------------------------------------------------- | Facility : libnform | Function : TypeArgument *_nc_Make_Argument( | const FIELDTYPE *typ, | va_list *ap, | int *err ) | | Description : Create an argument structure for the specified type. | Use the type-dependent argument list to construct | it. | | Return Values : Pointer to argument structure. Maybe NULL. | In case of an error in *err an errorcounter is increased. +--------------------------------------------------------------------------*/ TypeArgument* _nc_Make_Argument(const FIELDTYPE *typ, va_list *ap, int *err) { TypeArgument *res = (TypeArgument *)0; TypeArgument *p; if (typ && (typ->status & _HAS_ARGS)) { assert(err && ap); if (typ->status & _LINKED_TYPE) { p = (TypeArgument *)malloc(sizeof(TypeArgument)); if (p) { p->left = _nc_Make_Argument(typ->left ,ap,err); p->right = _nc_Make_Argument(typ->right,ap,err); return p; } else *err += 1; } else { assert(typ->makearg != 0); if ( !(res=(TypeArgument *)typ->makearg(ap)) ) *err += 1; } } return res; }
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); }