<html>
<head>
<title>SWIG Parameter Handling</title>
</head>

<body>
<center>
<h1>SWIG Parameter Handling</h1>

<p>
David M. Beazley <br>
dave-swig@dabeaz.com<br>
January 9, 2007<br>

</b>
</center>

<h2>Introduction</h2>

This document describes the functions related to management of function parameters and parameter lists in the SWIG core. These functions are declared in <tt>Source/Swig/swigparm.h</tt>.   This API is considered to be stable.

<h2>Parameters</h2>

The following utility functions are used to create and copy individual parameters.  In their most basic form, a parameter merely contains a type, a name, and an optional default value.

<p>
<b><tt>Parm *NewParm(SwigType *type, const String_or_char *name)</tt></b>

<blockquote>
Creates a new parameter object with type <tt>type</tt> and name <tt>name</tt>.  The type is stored in the attribute "type" and the name is stored in the attribute "name".
</blockquote>

<p>
<b><tt>Parm *CopyParm(Parm *p)</tt></b>
<blockquote>
Copies a parameter object.  All string attributes are copied in the
process of making the copy.  However, no complex attributes (lists,
hashes, etc.) are copied.
</blockquote>

<h2>Parameter Lists</h2>

<p>
<b><tt>ParmList *CopyParmList(ParmList *p)</tt></b>
<blockquote>
Creates a copy of a parameter list.  A parameter list is merely a linked list of parameters created by NewParm().
</blockquote>

<p>
<b><tt>ParmList *CopyParmListMax(ParmList *p, int count)</tt></b>
<blockquote>
Copies at most <tt>count</tt> parameters from the parameter list <tt>p</tt>.
</blockquote>

<p>
<b><tt>int ParmList_len(ParmList *p)</tt></b>

<blockquote>
Returns the total number of parameters in a parameter list.
</blockquote>

<p>
<b><tt>int ParmList_numrequired(ParmList *p)</tt></b>
<blockquote>
Returns the number of required parameters in a parameter list.   This pertains to invoking a function/method in C/C++.
</blockquote>

<p>
<b><tt>int ParmList_has_defaultargs(ParmList *p)</tt></b>
<blockquote>
Returns 1 if the parameter list has any default arguments.  Otherwise returns 0.
</blockquote>


<h2>Code Generation Functions</h2>

<p>
<b><tt>String *ParmList_str(ParmList *p)</tt></b>
<blockquote>
Creates a C prototype string of the parameters, but without any default values.
</blockquote>

<p>
<b><tt>String *ParmList_str_defaultargs(ParmList *p)</tt></b>
<blockquote>
Creates a C prototype string of the parameters and includes the default values (if any).
</blockquote>

<p>
<b><tt>String *ParmList_protostr(ParmList *p)</tt></b>
<blockquote>
Creates a C prototype string of the parameters. 
</blockquote>


</body>
</html>





