static ctype cttable_addDerived (ctkind p_ctk, /*@keep@*/ ctbase p_cnew, ctype p_base);
static ctype cttable_addFull (/*@keep@*/ ctentry p_cnew);
static bool ctentry_isInteresting (ctentry p_c) /*@*/;
-static /*@notnull@*/ /*@only@*/ ctbase ctbase_makeFixedArray (ctype p_b, long p_size) /*@*/ ;
+static /*@notnull@*/ /*@only@*/ ctbase ctbase_makeFixedArray (ctype p_b, size_t p_size) /*@*/ ;
+static bool ctbase_isAnytype (/*@notnull@*/ ctbase p_b) /*@*/ ;
+cstring ctbase_unparseFunctionPointer (ctbase c, /*@only@*/ cstring name) /*@*/ ;
/*
** These are file-static macros (used in ctype.c). No way to
** declare them as static in C.
# define ctentry_setPtr(c,b) ((c)->ptr = (b))
# define ctbase_fixUser(c) (c = ctbase_realType(c))
+
+/*drl added 04/14/2002 */
+# define ctentry_getCtbase(c) ((c)->ctbase)
/*@=allmacros@*/ /*@=macrospec@*/ /*@=namechecks@*/
static ctype cttable_addComplex (/*@notnull@*/ /*@only@*/ ctbase p_cnew);
typedef struct
{
ctype base;
- long size;
+ size_t size;
} *tfixed;
typedef union
return (message ("%t *", c->contents.base));
}
case CT_FIXEDARRAY:
- return (message ("%t [%d]", c->contents.farray->base,
- (int) c->contents.farray->size));
+ if (ctype_isFixedArray ( c->contents.farray->base ) &&(willOutputCode) )
+
+ {
+ cstring tmp, tmp2, ret;
+
+ tmp = ctype_unparse( c->contents.farray->base);
+ tmp2 = cstring_beforeChar(tmp, '[');
+
+ ret = message("%q [%d] %s ",
+ tmp2,
+ c->contents.farray->size,
+ cstring_afterChar(tmp, '[')
+ );
+ return ret;
+ }
+
+ else
+ {
+ return (message ("%t [%d]",
+ c->contents.farray->base,
+ (int) c->contents.farray->size));
+ }
+
case CT_ARRAY:
return (message ("%t []", c->contents.base));
case CT_FCN:
else
{
return (message ("struct { %q }",
- uentryList_unparseAbbrev (c->contents.su->fields)));
+ uentryList_unparse (c->contents.su->fields)));
}
case CT_UNION:
if (cstring_isDefined (c->contents.su->name) &&
enumNameList_unparseBrief (c->contents.cenum->members)));
}
case CT_CONJ:
- if (c->contents.conj->isExplicit || context_getFlag (FLG_SHOWALLCONJS))
+ if (ctbase_isAnytype (c))
+ {
+ return (cstring_makeLiteral ("<any>"));
+ }
+ else if (c->contents.conj->isExplicit || context_getFlag (FLG_SHOWALLCONJS))
{
if (!ctype_isSimple (c->contents.conj->a) ||
!ctype_isSimple (c->contents.conj->b))
uentryList_unparse (c->contents.fcn->params),
c->contents.fcn->rval));
case CT_STRUCT:
+ if (context_getFlag(FLG_GENERATECODE) )
+ {
+ DPRINTF( (message("struct %s { %s }", c->contents.su->name, uentryList_unparse(c->contents.su->fields) ) ));
+ }
return (message ("struct %s { ... } ", c->contents.su->name));
case CT_UNION:
return (message ("union %s { ... }", c->contents.su->name));
case CT_CONJ:
- return (message ("%t", c->contents.conj->a));
+ if (ctbase_isAnytype (c))
+ {
+ return (cstring_makeLiteral ("<any>"));
+ }
+ else
+ {
+ return (message ("%t", c->contents.conj->a));
+ }
BADDEFAULT;
}
BADEXIT;
case CT_ENUMLIST:
return (message ("[enumlist]"));
case CT_CONJ:
- return (message ("%q/%q",
- ctbase_unparseNotypes (ctype_getCtbase (c->contents.conj->a)),
- ctbase_unparseNotypes (ctype_getCtbase (c->contents.conj->b))));
+ if (ctbase_isAnytype (c))
+ {
+ return (cstring_makeLiteral ("<any>"));
+ }
+ else
+ {
+ return (message ("%q/%q",
+ ctbase_unparseNotypes (ctype_getCtbase (c->contents.conj->a)),
+ ctbase_unparseNotypes (ctype_getCtbase (c->contents.conj->b))));
+ }
BADDEFAULT;
}
BADEXIT;
case CT_PTR:
if (ctype_isFunction (c->contents.base))
{
- return ctbase_unparseDeclaration (ctype_getCtbase (c->contents.base), name);
+ return ctbase_unparseFunctionPointer (ctype_getCtbase (c->contents.base), name);
}
else
{
enumNameList_unparseBrief (c->contents.cenum->members),
name));
}
- case CT_CONJ:
- if (c->contents.conj->isExplicit || context_getFlag (FLG_SHOWALLCONJS))
+ case CT_CONJ:
+ if (ctbase_isAnytype (c))
+ {
+ return (message ("<any> %q", name));
+ }
+ else if (c->contents.conj->isExplicit || context_getFlag (FLG_SHOWALLCONJS))
{
if (!ctype_isSimple (c->contents.conj->a) ||
!ctype_isSimple (c->contents.conj->b))
BADEXIT;
}
+
+
+/*drl added 04/22/2002*/
+ /*@only@*/ cstring
+ctbase_doUnparseFunctionPointer (ctbase c, /*@only@*/ cstring name, cstring quals) /*@*/
+{
+ cstring s;
+
+ if (ctbase_isUndefined (c))
+ {
+ return name;
+ }
+
+ if (c->type == CT_FCN)
+ {
+ s = message ("%s (*%q)(%q)", quals, name,
+ uentryList_unparseParamsComplete (c->contents.fcn->params));
+
+ return (ctbase_unparseDeclaration
+ (ctype_getCtbase (c->contents.fcn->rval), s));
+ }
+ else
+ {
+ llassert (c->type == CT_PTR);
+ llassert(FALSE);
+ // s = message("%q", ctype_unparseFunction ( c->contents.base, name) );
+
+ s = message("%q", ctbase_unparse /*Declaration*/ (c) /* name)*/ );
+ return s;
+
+ }
+}
+
+
+/*drl added 04/22/2002*/
+ /*@only@*/ cstring
+ctbase_unparseFunctionPointer (ctbase c, /*@only@*/ cstring name) /*@*/
+{
+ cstring s;
+
+ if (ctbase_isUndefined (c))
+ {
+ return name;
+ }
+
+ if (c->type == CT_FCN)
+ {
+ // llassert(FALSE);
+ s = message ("(*%q)(%q)", name,
+ uentryList_unparseParamsComplete (c->contents.fcn->params));
+
+ return (ctbase_unparseDeclaration
+ (ctype_getCtbase (c->contents.fcn->rval), s));
+ }
+ else
+ {
+ llassert (c->type == CT_PTR);
+ s = message("%q", ctype_unparseFunction ( c->contents.base, name) );
+
+ // s = message("%q", ctbase_unparse /*Declaration*/ (c) /* name)*/ );
+ return s;
+
+ }
+}
+
+
+/*drl added 3/10/2002*/
+
+ /*@only@*/ cstring
+ctbase_unparseFunction (ctbase c, /*@only@*/ cstring name) /*@*/
+{
+ cstring s;
+
+ if (ctbase_isUndefined (c))
+ {
+ return name;
+ }
+
+ if (c->type == CT_FCN)
+ {
+ s = message ("%q(%q)", name,
+ uentryList_unparseParamsComplete (c->contents.fcn->params));
+
+ return (ctbase_unparseDeclaration
+ (ctype_getCtbase (c->contents.fcn->rval), s));
+ }
+ else
+ {
+
+ llassert (c->type == CT_PTR);
+
+
+ s = message("%q", ctbase_unparse /*Declaration*/ (c) /* name)*/ );
+ return s;
+
+ }
+}
+
+
static ctbase ctbase_undump (d_char *c) /*@requires maxRead(*c) >= 2 @*/
{
ctbase res;
case 'F':
{
ctype ct = ctype_undump (c);
- int size;
+ size_t size;
reader_checkChar (c, '/');
- size = reader_getInt (c);
+ size = size_fromInt (reader_getInt (c));
reader_checkChar (c, '|');
return (ctbase_makeFixedArray (ct, size));
}
return (f);
}
+static bool
+ctbase_isExpectFunction (/*@notnull@*/ ctbase ct) /*@*/
+{
+ return (ct->type == CT_EXPFCN);
+}
+
+static ctype
+ctbase_getExpectFunction (/*@notnull@*/ ctbase ct)
+{
+ llassert (ctbase_isExpectFunction (ct));
+ return ct->contents.base;
+}
+
static bool
ctbase_genMatch (ctbase c1, ctbase c2, bool force, bool arg, bool def, bool deep)
{
}
static /*@notnull@*/ /*@only@*/ ctbase
-ctbase_makeFixedArray (ctype b, long size)
+ctbase_makeFixedArray (ctype b, size_t size)
{
ctbase c = ctbase_new ();
return (c);
}
+static bool ctbase_isAnytype (/*@notnull@*/ ctbase b)
+{
+ /*
+ ** A unknown|dne conj is a special representation for an anytype.
+ */
+
+ if (b->type == CT_CONJ)
+ {
+ /*@access ctype@*/
+ return (b->contents.conj->a == ctype_unknown
+ && b->contents.conj->b == ctype_dne);
+ /*@noaccess ctype@*/
+ }
+
+ return FALSE;
+}
+
static ctype
ctbase_getConjA (/*@notnull@*/ ctbase c)
{
called by ctype_getArraySize
*/
-long int ctbase_getArraySize (ctbase ctb)
+size_t ctbase_getArraySize (ctbase ctb)
{
- llassert (ctbase_isDefined (ctb) );
-
- llassert (ctbase_isFixedArray(ctb) );
+ /*drl 1/25/2002 fixed discovered by Jim Francis */
+ ctbase r;
- return (ctb->contents.farray->size);
+ llassert (ctbase_isDefined (ctb) );
+ r = ctbase_realType (ctb);
+ llassert (ctbase_isFixedArray(r) );
+ return (r->contents.farray->size);
}