コード例 #1
0
ファイル: fld_def.c プロジェクト: Andersbakken/CMake
/*---------------------------------------------------------------------------
|   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;
}
コード例 #2
0
ファイル: fld_type.c プロジェクト: ajinkya93/OpenBSD
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);
}