import source from 1.3.40
[external/swig.git] / Source / Swig / parms.c
1 /* -----------------------------------------------------------------------------
2  * See the LICENSE file for information on copyright, usage and redistribution
3  * of SWIG, and the README file for authors - http://www.swig.org/release.html.
4  *
5  * parms.c
6  *
7  * Parameter list class.
8  * ----------------------------------------------------------------------------- */
9
10 char cvsroot_parms_c[] = "$Id: parms.c 11080 2009-01-24 13:15:51Z bhy $";
11
12 #include "swig.h"
13
14 /* ------------------------------------------------------------------------
15  * NewParm()
16  *
17  * Create a new parameter from datatype 'type' and name 'name'.
18  * ------------------------------------------------------------------------ */
19
20 Parm *NewParm(SwigType *type, const_String_or_char_ptr name) {
21   Parm *p = NewHash();
22   set_nodeType(p, "parm");
23   if (type) {
24     SwigType *ntype = Copy(type);
25     Setattr(p, "type", ntype);
26     Delete(ntype);
27   }
28   Setattr(p, "name", name);
29   return p;
30 }
31
32 /* ------------------------------------------------------------------------
33  * CopyParm()
34  * ------------------------------------------------------------------------ */
35
36 Parm *CopyParm(Parm *p) {
37   Parm *np = NewHash();
38   Iterator ki;
39   for (ki = First(p); ki.key; ki = Next(ki)) {
40     if (DohIsString(ki.item)) {
41       DOH *c = Copy(ki.item);
42       Setattr(np,ki.key,c);
43       Delete(c);
44     }
45   }
46   Setfile(np, Getfile(p));
47   Setline(np, Getline(p));
48   return np;
49 }
50
51 /* ------------------------------------------------------------------
52  * CopyParmListMax()
53  * CopyParmList()
54  * ------------------------------------------------------------------ */
55
56 ParmList *CopyParmListMax(ParmList *p, int count) {
57   Parm *np;
58   Parm *pp = 0;
59   Parm *fp = 0;
60
61   if (!p)
62     return 0;
63
64   while (p) {
65     if (count == 0) break;
66     np = CopyParm(p);
67     if (pp) {
68       set_nextSibling(pp, np);
69       Delete(np);
70     } else {
71       fp = np;
72     }
73     pp = np;
74     p = nextSibling(p);
75     count--;
76   }
77   return fp;
78 }
79
80 ParmList *CopyParmList(ParmList *p) {
81   return CopyParmListMax(p,-1);
82 }
83
84 /* -----------------------------------------------------------------------------
85  * int ParmList_numrequired().  Return number of required arguments
86  * ----------------------------------------------------------------------------- */
87
88 int ParmList_numrequired(ParmList *p) {
89   int i = 0;
90   while (p) {
91     SwigType *t = Getattr(p, "type");
92     String *value = Getattr(p, "value");
93     if (value)
94       return i;
95     if (!(SwigType_type(t) == T_VOID))
96       i++;
97     else
98       break;
99     p = nextSibling(p);
100   }
101   return i;
102 }
103
104 /* -----------------------------------------------------------------------------
105  * int ParmList_len()
106  * ----------------------------------------------------------------------------- */
107
108 int ParmList_len(ParmList *p) {
109   int i = 0;
110   while (p) {
111     i++;
112     p = nextSibling(p);
113   }
114   return i;
115 }
116
117 /* ---------------------------------------------------------------------
118  * ParmList_str()
119  *
120  * Generates a string of parameters
121  * ---------------------------------------------------------------------- */
122
123 String *ParmList_str(ParmList *p) {
124   String *out = NewStringEmpty();
125   while (p) {
126     String *pstr = SwigType_str(Getattr(p, "type"), Getattr(p, "name"));
127     Append(out, pstr);
128     p = nextSibling(p);
129     if (p) {
130       Append(out, ",");
131     }
132     Delete(pstr);
133   }
134   return out;
135 }
136
137 /* ---------------------------------------------------------------------
138  * ParmList_str_defaultargs()
139  *
140  * Generates a string of parameters including default arguments
141  * ---------------------------------------------------------------------- */
142
143 String *ParmList_str_defaultargs(ParmList *p) {
144   String *out = NewStringEmpty();
145   while (p) {
146     String *value = Getattr(p, "value");
147     String *pstr = SwigType_str(Getattr(p, "type"), Getattr(p, "name"));
148     Append(out, pstr);
149     if (value) {
150       Printf(out, "=%s", value);
151     }
152     p = nextSibling(p);
153     if (p) {
154       Append(out, ",");
155     }
156     Delete(pstr);
157   }
158   return out;
159 }
160
161 /* ---------------------------------------------------------------------
162  * ParmList_protostr()
163  *
164  * Generate a prototype string.
165  * ---------------------------------------------------------------------- */
166
167 String *ParmList_protostr(ParmList *p) {
168   String *out = NewStringEmpty();
169   while (p) {
170     String *pstr = SwigType_str(Getattr(p, "type"), 0);
171     Append(out, pstr);
172     p = nextSibling(p);
173     if (p) {
174       Append(out, ",");
175     }
176     Delete(pstr);
177   }
178   return out;
179 }
180
181 /* ---------------------------------------------------------------------
182  * ParmList_has_defaultargs()
183  *
184  * Returns 1 if the parameter list passed in is has one or more default
185  * arguments. Otherwise returns 0.
186  * ---------------------------------------------------------------------- */
187
188 int ParmList_has_defaultargs(ParmList *p) {
189   while (p) {
190     if (Getattr(p, "value")) {
191       return 1;
192     }
193     p = nextSibling(p);
194   }
195   return 0;
196 }