diff --git a/Doc/Devel/parm.html b/Doc/Devel/parm.html index 14b604811..1cab0701a 100644 --- a/Doc/Devel/parm.html +++ b/Doc/Devel/parm.html @@ -10,7 +10,7 @@

David M. Beazley
dave-swig@dabeaz.com
-January 2, 2007
+January 9, 2007
@@ -59,12 +59,6 @@ Copies at most count parameters from the parameter list p. Returns the total number of parameters in a parameter list. -

-int ParmList_numarg(ParmList *p) -

-Returns the number of non-ignored parameters in a parameter list. Any parameter with an "ignore" attribute is ignored in the count. -
-

int ParmList_numrequired(ParmList *p)

@@ -95,7 +89,7 @@ Creates a C prototype string of the parameters and includes the default values (

String *ParmList_protostr(ParmList *p)

-Creates a C prototype string of the parameters. Does not include any hidden parameters. +Creates a C prototype string of the parameters.
diff --git a/Source/Modules/allegrocl.cxx b/Source/Modules/allegrocl.cxx index 4c9e2895f..4a9adb861 100644 --- a/Source/Modules/allegrocl.cxx +++ b/Source/Modules/allegrocl.cxx @@ -1790,13 +1790,13 @@ static List *Swig_overload_rank(Node *n, bool script_lang_wrapping) { if (script_lang_wrapping) { Swig_warning(WARN_LANG_OVERLOAD_CONST, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded %s(%s) const ignored. Non-const method at %s:%d used.\n", - Getattr(nodes[j].n, "name"), ParmList_protostr(nodes[j].parms), Getfile(nodes[i].n), Getline(nodes[i].n)); + Getattr(nodes[j].n, "name"), ParmList_errorstr(nodes[j].parms), Getfile(nodes[i].n), Getline(nodes[i].n)); } else { if (!Getattr(nodes[j].n, "overload:ignore")) Swig_warning(WARN_LANG_OVERLOAD_IGNORED, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded method %s(%s) ignored. Method %s(%s) const at %s:%d used.\n", - Getattr(nodes[j].n, "name"), ParmList_protostr(nodes[j].parms), - Getattr(nodes[i].n, "name"), ParmList_protostr(nodes[i].parms), Getfile(nodes[i].n), Getline(nodes[i].n)); + Getattr(nodes[j].n, "name"), ParmList_errorstr(nodes[j].parms), + Getattr(nodes[i].n, "name"), ParmList_errorstr(nodes[i].parms), Getfile(nodes[i].n), Getline(nodes[i].n)); } } nodes[j].error = 1; @@ -1806,13 +1806,13 @@ static List *Swig_overload_rank(Node *n, bool script_lang_wrapping) { if (script_lang_wrapping) { Swig_warning(WARN_LANG_OVERLOAD_CONST, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded %s(%s) const ignored. Non-const method at %s:%d used.\n", - Getattr(nodes[j].n, "name"), ParmList_protostr(nodes[j].parms), Getfile(nodes[i].n), Getline(nodes[i].n)); + Getattr(nodes[j].n, "name"), ParmList_errorstr(nodes[j].parms), Getfile(nodes[i].n), Getline(nodes[i].n)); } else { if (!Getattr(nodes[j].n, "overload:ignore")) Swig_warning(WARN_LANG_OVERLOAD_IGNORED, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded method %s(%s) const ignored. Method %s(%s) at %s:%d used.\n", - Getattr(nodes[j].n, "name"), ParmList_protostr(nodes[j].parms), - Getattr(nodes[i].n, "name"), ParmList_protostr(nodes[i].parms), Getfile(nodes[i].n), Getline(nodes[i].n)); + Getattr(nodes[j].n, "name"), ParmList_errorstr(nodes[j].parms), + Getattr(nodes[i].n, "name"), ParmList_errorstr(nodes[i].parms), Getfile(nodes[i].n), Getline(nodes[i].n)); } } nodes[j].error = 1; @@ -1827,17 +1827,17 @@ static List *Swig_overload_rank(Node *n, bool script_lang_wrapping) { if (script_lang_wrapping) { Swig_warning(WARN_LANG_OVERLOAD_SHADOW, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded %s(%s)%s is shadowed by %s(%s)%s at %s:%d.\n", - Getattr(nodes[j].n, "name"), ParmList_protostr(nodes[j].parms), + Getattr(nodes[j].n, "name"), ParmList_errorstr(nodes[j].parms), SwigType_isconst(Getattr(nodes[j].n, "decl")) ? " const" : "", - Getattr(nodes[i].n, "name"), ParmList_protostr(nodes[i].parms), + Getattr(nodes[i].n, "name"), ParmList_errorstr(nodes[i].parms), SwigType_isconst(Getattr(nodes[i].n, "decl")) ? " const" : "", Getfile(nodes[i].n), Getline(nodes[i].n)); } else { if (!Getattr(nodes[j].n, "overload:ignore")) Swig_warning(WARN_LANG_OVERLOAD_IGNORED, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded method %s(%s)%s ignored. Method %s(%s)%s at %s:%d used.\n", - Getattr(nodes[j].n, "name"), ParmList_protostr(nodes[j].parms), + Getattr(nodes[j].n, "name"), ParmList_errorstr(nodes[j].parms), SwigType_isconst(Getattr(nodes[j].n, "decl")) ? " const" : "", - Getattr(nodes[i].n, "name"), ParmList_protostr(nodes[i].parms), + Getattr(nodes[i].n, "name"), ParmList_errorstr(nodes[i].parms), SwigType_isconst(Getattr(nodes[i].n, "decl")) ? " const" : "", Getfile(nodes[i].n), Getline(nodes[i].n)); } nodes[j].error = 1; @@ -1854,7 +1854,7 @@ static List *Swig_overload_rank(Node *n, bool script_lang_wrapping) { if (nodes[i].error) Setattr(nodes[i].n, "overload:ignore", "1"); Append(result, nodes[i].n); - // Printf(stdout,"[ %d ] %s\n", i, ParmList_protostr(nodes[i].parms)); + // Printf(stdout,"[ %d ] %s\n", i, ParmList_errorstr(nodes[i].parms)); // Swig_print_node(nodes[i].n); } } diff --git a/Source/Modules/emit.cxx b/Source/Modules/emit.cxx index ae274c2e9..a1945718a 100644 --- a/Source/Modules/emit.cxx +++ b/Source/Modules/emit.cxx @@ -106,7 +106,7 @@ void emit_attach_parmmaps(ParmList *l, Wrapper *f) { Printv(f->code, tm, "\n", NIL); np = Getattr(p, "tmap:in:next"); while (p && (p != np)) { - Setattr(p, "ignore", "1"); + /* Setattr(p,"ignore","1"); Deprecate */ p = nextSibling(p); } } else if (tm) { diff --git a/Source/Modules/overload.cxx b/Source/Modules/overload.cxx index 27e080d49..1268a7af2 100644 --- a/Source/Modules/overload.cxx +++ b/Source/Modules/overload.cxx @@ -224,13 +224,13 @@ static List *Swig_overload_rank(Node *n, bool script_lang_wrapping) { if (script_lang_wrapping) { Swig_warning(WARN_LANG_OVERLOAD_CONST, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded %s(%s) const ignored. Non-const method at %s:%d used.\n", - Getattr(nodes[j].n, "name"), ParmList_protostr(nodes[j].parms), Getfile(nodes[i].n), Getline(nodes[i].n)); + Getattr(nodes[j].n, "name"), ParmList_errorstr(nodes[j].parms), Getfile(nodes[i].n), Getline(nodes[i].n)); } else { if (!Getattr(nodes[j].n, "overload:ignore")) Swig_warning(WARN_LANG_OVERLOAD_IGNORED, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded method %s(%s) ignored. Method %s(%s) const at %s:%d used.\n", - Getattr(nodes[j].n, "name"), ParmList_protostr(nodes[j].parms), - Getattr(nodes[i].n, "name"), ParmList_protostr(nodes[i].parms), Getfile(nodes[i].n), Getline(nodes[i].n)); + Getattr(nodes[j].n, "name"), ParmList_errorstr(nodes[j].parms), + Getattr(nodes[i].n, "name"), ParmList_errorstr(nodes[i].parms), Getfile(nodes[i].n), Getline(nodes[i].n)); } } nodes[j].error = 1; @@ -240,13 +240,13 @@ static List *Swig_overload_rank(Node *n, bool script_lang_wrapping) { if (script_lang_wrapping) { Swig_warning(WARN_LANG_OVERLOAD_CONST, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded %s(%s) const ignored. Non-const method at %s:%d used.\n", - Getattr(nodes[j].n, "name"), ParmList_protostr(nodes[j].parms), Getfile(nodes[i].n), Getline(nodes[i].n)); + Getattr(nodes[j].n, "name"), ParmList_errorstr(nodes[j].parms), Getfile(nodes[i].n), Getline(nodes[i].n)); } else { if (!Getattr(nodes[j].n, "overload:ignore")) Swig_warning(WARN_LANG_OVERLOAD_IGNORED, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded method %s(%s) const ignored. Method %s(%s) at %s:%d used.\n", - Getattr(nodes[j].n, "name"), ParmList_protostr(nodes[j].parms), - Getattr(nodes[i].n, "name"), ParmList_protostr(nodes[i].parms), Getfile(nodes[i].n), Getline(nodes[i].n)); + Getattr(nodes[j].n, "name"), ParmList_errorstr(nodes[j].parms), + Getattr(nodes[i].n, "name"), ParmList_errorstr(nodes[i].parms), Getfile(nodes[i].n), Getline(nodes[i].n)); } } nodes[j].error = 1; @@ -261,17 +261,17 @@ static List *Swig_overload_rank(Node *n, bool script_lang_wrapping) { if (script_lang_wrapping) { Swig_warning(WARN_LANG_OVERLOAD_SHADOW, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded %s(%s)%s is shadowed by %s(%s)%s at %s:%d.\n", - Getattr(nodes[j].n, "name"), ParmList_protostr(nodes[j].parms), + Getattr(nodes[j].n, "name"), ParmList_errorstr(nodes[j].parms), SwigType_isconst(Getattr(nodes[j].n, "decl")) ? " const" : "", - Getattr(nodes[i].n, "name"), ParmList_protostr(nodes[i].parms), + Getattr(nodes[i].n, "name"), ParmList_errorstr(nodes[i].parms), SwigType_isconst(Getattr(nodes[i].n, "decl")) ? " const" : "", Getfile(nodes[i].n), Getline(nodes[i].n)); } else { if (!Getattr(nodes[j].n, "overload:ignore")) Swig_warning(WARN_LANG_OVERLOAD_IGNORED, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded method %s(%s)%s ignored. Method %s(%s)%s at %s:%d used.\n", - Getattr(nodes[j].n, "name"), ParmList_protostr(nodes[j].parms), + Getattr(nodes[j].n, "name"), ParmList_errorstr(nodes[j].parms), SwigType_isconst(Getattr(nodes[j].n, "decl")) ? " const" : "", - Getattr(nodes[i].n, "name"), ParmList_protostr(nodes[i].parms), + Getattr(nodes[i].n, "name"), ParmList_errorstr(nodes[i].parms), SwigType_isconst(Getattr(nodes[i].n, "decl")) ? " const" : "", Getfile(nodes[i].n), Getline(nodes[i].n)); } nodes[j].error = 1; @@ -288,7 +288,7 @@ static List *Swig_overload_rank(Node *n, bool script_lang_wrapping) { if (nodes[i].error) Setattr(nodes[i].n, "overload:ignore", "1"); Append(result, nodes[i].n); - // Printf(stdout,"[ %d ] %s\n", i, ParmList_protostr(nodes[i].parms)); + // Printf(stdout,"[ %d ] %s\n", i, ParmList_errorstr(nodes[i].parms)); // Swig_print_node(nodes[i].n); } } diff --git a/Source/Modules/perl5.cxx b/Source/Modules/perl5.cxx index a6273ee80..4fc1a561e 100644 --- a/Source/Modules/perl5.cxx +++ b/Source/Modules/perl5.cxx @@ -974,7 +974,7 @@ public: while (p != 0) { SwigType *pt = Getattr(p, "type"); String *pn = Getattr(p, "name"); - if (!Getattr(p, "ignore")) { + if (!checkAttribute(p,"tmap:in:numinputs","0")) { /* If parameter has been named, use that. Otherwise, just print a type */ if (SwigType_type(pt) != T_VOID) { if (Len(pn) > 0) { @@ -986,12 +986,12 @@ public: i++; p = nextSibling(p); if (p) - if (!Getattr(p, "ignore")) + if (!checkAttribute(p,"tmap:in:numinputs","0")) Putc(',', temp); } else { p = nextSibling(p); if (p) - if ((i > 0) && (!Getattr(p, "ignore"))) + if ((i > 0) && (!checkAttribute(p,"tmap:in:numinputs","0"))) Putc(',', temp); } } diff --git a/Source/Modules/python.cxx b/Source/Modules/python.cxx index 85ccbea67..3fccec273 100644 --- a/Source/Modules/python.cxx +++ b/Source/Modules/python.cxx @@ -1706,7 +1706,7 @@ public: if (Len(pn)) { String *tmp = 0; String *name = pn; - if (!Getattr(p, "hidden")) { + if (!Getattr(p,"hidden")) { name = tmp = Swig_name_make(p, 0, pn, 0, 0); } Printf(kwargs, "(char *) \"%s\",", name); @@ -1739,7 +1739,7 @@ public: if (Getattr(p, "tmap:in:implicitconv")) { const char *convflag = "0"; - if (!Getattr(p, "hidden")) { + if (!Getattr(p,"hidden")) { SwigType *ptype = Getattr(p, "type"); convflag = get_implicitconv_flag(classLookup(ptype)); } @@ -1842,7 +1842,7 @@ public: if (!Getattr(p, "tmap:in:parse") && (tm = Getattr(p, "tmap:freearg"))) { if (Getattr(p, "tmap:freearg:implicitconv")) { const char *convflag = "0"; - if (!Getattr(p, "hidden")) { + if (!Getattr(p,"hidden")) { SwigType *ptype = Getattr(p, "type"); convflag = get_implicitconv_flag(classLookup(ptype)); } diff --git a/Source/Modules/r.cxx b/Source/Modules/r.cxx index bd11a01c5..58ec4ff9a 100644 --- a/Source/Modules/r.cxx +++ b/Source/Modules/r.cxx @@ -1451,14 +1451,14 @@ static List * Swig_overload_rank(Node *n, if (script_lang_wrapping) { Swig_warning(WARN_LANG_OVERLOAD_CONST, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded %s(%s) const ignored. Non-const method at %s:%d used.\n", - Getattr(nodes[j].n,"name"), ParmList_protostr(nodes[j].parms), + Getattr(nodes[j].n,"name"), ParmList_errorstr(nodes[j].parms), Getfile(nodes[i].n), Getline(nodes[i].n)); } else { if (!Getattr(nodes[j].n, "overload:ignore")) Swig_warning(WARN_LANG_OVERLOAD_IGNORED, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded method %s(%s) ignored. Method %s(%s) const at %s:%d used.\n", - Getattr(nodes[j].n,"name"), ParmList_protostr(nodes[j].parms), - Getattr(nodes[i].n,"name"), ParmList_protostr(nodes[i].parms), + Getattr(nodes[j].n,"name"), ParmList_errorstr(nodes[j].parms), + Getattr(nodes[i].n,"name"), ParmList_errorstr(nodes[i].parms), Getfile(nodes[i].n), Getline(nodes[i].n)); } } @@ -1469,14 +1469,14 @@ static List * Swig_overload_rank(Node *n, if (script_lang_wrapping) { Swig_warning(WARN_LANG_OVERLOAD_CONST, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded %s(%s) const ignored. Non-const method at %s:%d used.\n", - Getattr(nodes[j].n,"name"), ParmList_protostr(nodes[j].parms), + Getattr(nodes[j].n,"name"), ParmList_errorstr(nodes[j].parms), Getfile(nodes[i].n), Getline(nodes[i].n)); } else { if (!Getattr(nodes[j].n, "overload:ignore")) Swig_warning(WARN_LANG_OVERLOAD_IGNORED, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded method %s(%s) const ignored. Method %s(%s) at %s:%d used.\n", - Getattr(nodes[j].n,"name"), ParmList_protostr(nodes[j].parms), - Getattr(nodes[i].n,"name"), ParmList_protostr(nodes[i].parms), + Getattr(nodes[j].n,"name"), ParmList_errorstr(nodes[j].parms), + Getattr(nodes[i].n,"name"), ParmList_errorstr(nodes[i].parms), Getfile(nodes[i].n), Getline(nodes[i].n)); } } @@ -1492,18 +1492,18 @@ static List * Swig_overload_rank(Node *n, if (script_lang_wrapping) { Swig_warning(WARN_LANG_OVERLOAD_SHADOW, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded %s(%s)%s is shadowed by %s(%s)%s at %s:%d.\n", - Getattr(nodes[j].n,"name"), ParmList_protostr(nodes[j].parms), + Getattr(nodes[j].n,"name"), ParmList_errorstr(nodes[j].parms), SwigType_isconst(Getattr(nodes[j].n,"decl")) ? " const" : "", - Getattr(nodes[i].n,"name"), ParmList_protostr(nodes[i].parms), + Getattr(nodes[i].n,"name"), ParmList_errorstr(nodes[i].parms), SwigType_isconst(Getattr(nodes[i].n,"decl")) ? " const" : "", Getfile(nodes[i].n),Getline(nodes[i].n)); } else { if (!Getattr(nodes[j].n, "overload:ignore")) Swig_warning(WARN_LANG_OVERLOAD_IGNORED, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded method %s(%s)%s ignored. Method %s(%s)%s at %s:%d used.\n", - Getattr(nodes[j].n,"name"), ParmList_protostr(nodes[j].parms), + Getattr(nodes[j].n,"name"), ParmList_errorstr(nodes[j].parms), SwigType_isconst(Getattr(nodes[j].n,"decl")) ? " const" : "", - Getattr(nodes[i].n,"name"), ParmList_protostr(nodes[i].parms), + Getattr(nodes[i].n,"name"), ParmList_errorstr(nodes[i].parms), SwigType_isconst(Getattr(nodes[i].n,"decl")) ? " const" : "", Getfile(nodes[i].n),Getline(nodes[i].n)); } @@ -1521,7 +1521,7 @@ static List * Swig_overload_rank(Node *n, if (nodes[i].error) Setattr(nodes[i].n, "overload:ignore", "1"); Append(result,nodes[i].n); - // Printf(stdout,"[ %d ] %s\n", i, ParmList_protostr(nodes[i].parms)); + // Printf(stdout,"[ %d ] %s\n", i, ParmList_errorstr(nodes[i].parms)); // Swig_print_node(nodes[i].n); } } diff --git a/Source/Swig/cwrap.c b/Source/Swig/cwrap.c index 4a9e5a4b1..0dd336b31 100644 --- a/Source/Swig/cwrap.c +++ b/Source/Swig/cwrap.c @@ -807,7 +807,7 @@ int Swig_MethodToFunction(Node *n, String *classname, int flags, SwigType *direc SwigType_add_pointer(type); p = NewParm(type, "self"); Setattr(p, "self", "1"); - Setattr(p, "hidden", "1"); + Setattr(p, "hidden","1"); /* Disable the 'this' ownership in 'self' to manage inplace operations like: @@ -1239,7 +1239,7 @@ int Swig_MembersetToFunction(Node *n, String *classname, int flags) { SwigType_add_pointer(t); parms = NewParm(t, "self"); Setattr(parms, "self", "1"); - Setattr(parms, "hidden", "1"); + Setattr(parms, "hidden","1"); Delete(t); ty = Swig_wrapped_member_var_type(type, varcref); @@ -1325,7 +1325,7 @@ int Swig_MembergetToFunction(Node *n, String *classname, int flags) { SwigType_add_pointer(t); parms = NewParm(t, "self"); Setattr(parms, "self", "1"); - Setattr(parms, "hidden", "1"); + Setattr(parms, "hidden","1"); Delete(t); ty = Swig_wrapped_member_var_type(type, varcref); diff --git a/Source/Swig/deprecate.c b/Source/Swig/deprecate.c index 269cf9eee..475d2c6cf 100644 --- a/Source/Swig/deprecate.c +++ b/Source/Swig/deprecate.c @@ -68,3 +68,38 @@ int ParmList_is_compactdefargs(ParmList *p) { return compactdefargs; } + +/* --------------------------------------------------------------------- + * ParmList_errorstr() + * + * Generate a prototype string suitable for use in error/warning messages. + * This function is aware of hidden parameters. + * ---------------------------------------------------------------------- */ + +/* Discussion. This function is used to generate error messages, but take + into account that there might be a hidden parameter. Although this involves + parameter lists, it really isn't a core feature of swigparm.h or parms.c. + This is because the "hidden" attribute of parameters is added elsewhere (cwrap.c). + + For now, this function is placed here because it doesn't really seem to fit in + with the parms.c interface. + +*/ + +String *ParmList_errorstr(ParmList *p) { + String *out = NewStringEmpty(); + while (p) { + if (Getattr(p,"hidden")) { + p = nextSibling(p); + } else { + String *pstr = SwigType_str(Getattr(p, "type"), 0); + Append(out, pstr); + p = nextSibling(p); + if (p) { + Append(out, ","); + } + Delete(pstr); + } + } + return out; +} diff --git a/Source/Swig/parms.c b/Source/Swig/parms.c index 934e6f327..baa1dfbf3 100644 --- a/Source/Swig/parms.c +++ b/Source/Swig/parms.c @@ -81,20 +81,6 @@ ParmList *CopyParmList(ParmList *p) { return CopyParmListMax(p,-1); } -/* ------------------------------------------------------------------ - * int ParmList_numarg() - * ------------------------------------------------------------------ */ - -int ParmList_numarg(ParmList *p) { - int n = 0; - while (p) { - if (!Getattr(p, "ignore")) - n++; - p = nextSibling(p); - } - return n; -} - /* ----------------------------------------------------------------------------- * int ParmList_numrequired(). Return number of required arguments * ----------------------------------------------------------------------------- */ @@ -181,17 +167,13 @@ String *ParmList_str_defaultargs(ParmList *p) { String *ParmList_protostr(ParmList *p) { String *out = NewStringEmpty(); while (p) { - if (Getattr(p, "hidden")) { - p = nextSibling(p); - } else { - String *pstr = SwigType_str(Getattr(p, "type"), 0); - Append(out, pstr); - p = nextSibling(p); - if (p) { - Append(out, ","); - } - Delete(pstr); + String *pstr = SwigType_str(Getattr(p, "type"), 0); + Append(out, pstr); + p = nextSibling(p); + if (p) { + Append(out, ","); } + Delete(pstr); } return out; } diff --git a/Source/Swig/swig.h b/Source/Swig/swig.h index 8ec155ded..dcb425228 100644 --- a/Source/Swig/swig.h +++ b/Source/Swig/swig.h @@ -297,6 +297,9 @@ extern "C" { #include "swigparm.h" +extern String *ParmList_errorstr(ParmList *); +extern int ParmList_is_compactdefargs(ParmList *p); + /* --- Parse tree support --- */ #include "swigtree.h" diff --git a/Source/Swig/swigparm.h b/Source/Swig/swigparm.h index 24c63cc1f..529438bae 100644 --- a/Source/Swig/swigparm.h +++ b/Source/Swig/swigparm.h @@ -18,10 +18,12 @@ extern Parm *CopyParm(Parm *p); extern ParmList *CopyParmList(ParmList *); extern ParmList *CopyParmListMax(ParmList *, int count); extern int ParmList_len(ParmList *); -extern int ParmList_numarg(ParmList *); extern int ParmList_numrequired(ParmList *); +extern int ParmList_has_defaultargs(ParmList *p); + +/* Output functions */ extern String *ParmList_str(ParmList *); extern String *ParmList_str_defaultargs(ParmList *); extern String *ParmList_protostr(ParmList *); -extern int ParmList_is_compactdefargs(ParmList *p); -extern int ParmList_has_defaultargs(ParmList *p); + +