/*
* Copyright (c) 1998, 1999 The University of Utah and
* the Computer Systems Laboratory at the University of Utah (CSL).
*
* This file is part of Flick, the Flexible IDL Compiler Kit.
*
* Flick is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* Flick is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Flick; see the file COPYING. If not, write to
* the Free Software Foundation, 59 Temple Place #330, Boston, MA 02111, USA.
*/
#include <mom/libaoi.h>
#include <mom/c/pg_corbaxx.hh>
/*
* `isVariable' returns 1 if the given AOI type is variable-length, as defined
* by Section 14.8 of the CORBA 2.0 specification. If the AOI type is not
* variable-length, `isVariable' returns 0.
*/
int pg_corbaxx::isVariable(aoi_type t)
{
unsigned int i;
switch (t->kind) {
case AOI_ANY: /* ``Untyped'' any values, not in CORBA. */
case AOI_TYPE_TAG: /* `CORBA::TypeCode' values. */
case AOI_TYPED: /* Type-tagged `any' values. */
case AOI_INTERFACE:
case AOI_FWD_INTRFC:
return 1;
break;
case AOI_ARRAY: {
unsigned min, max;
aoi_array *aa = &(t->aoi_type_u_u.array_def);
if (aa->flgs & AOI_ARRAY_FLAG_NULL_TERMINATED_STRING)
/* IT's a bounded or unbounded string. */
return 1;
aoi_get_array_len(in_aoi, aa, &min, &max);
if (min == max)
/* It's an array. */
return isVariable(aa->element_type);
else
/* It's a sequence. */
return 1;
break;
}
case AOI_STRUCT:
for (i = 0;
i < t->aoi_type_u_u.struct_def.slots.slots_len;
++i)
if (isVariable(t->aoi_type_u_u.struct_def.slots.
slots_val[i].type))
return 1;
break;
case AOI_UNION:
for (i = 0;
i < t->aoi_type_u_u.union_def.cases.cases_len;
++i)
if (isVariable(t->aoi_type_u_u.union_def.cases.
cases_val[i].var.type))
return 1;
if (t->aoi_type_u_u.union_def.dfault)
if (isVariable(t->aoi_type_u_u.union_def.dfault->type))
return 1;
break;
case AOI_INDIRECT:
return isVariable(in_aoi->
defs.defs_val[t->aoi_type_u_u.indirect_ref].
binding);
break;
default:
break;
}
return 0;
}
/* End of file. */
syntax highlighted by Code2HTML, v. 0.9.1