blob: 79af2f8d2f6a9bda25baf7a10b896627694aaa28 [file] [log] [blame]
Guido van Rossume15dee51995-07-18 14:12:02 +00001/***********************************************************
2Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
4
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossume15dee51995-07-18 14:12:02 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossume15dee51995-07-18 14:12:02 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossume15dee51995-07-18 14:12:02 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossume15dee51995-07-18 14:12:02 +000029
30******************************************************************/
31
32/* Abstract Object Interface (many thanks to Jim Fulton) */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000033
Guido van Rossume15dee51995-07-18 14:12:02 +000034#include "Python.h"
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +000035#include <ctype.h>
Guido van Rossume15dee51995-07-18 14:12:02 +000036
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000037/* Shorthands to return certain errors */
Guido van Rossume15dee51995-07-18 14:12:02 +000038
39static PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000040type_error(msg)
41 char *msg;
Guido van Rossume15dee51995-07-18 14:12:02 +000042{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000043 PyErr_SetString(PyExc_TypeError, msg);
44 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +000045}
46
Guido van Rossum052b7e11996-11-11 15:08:19 +000047static PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000048null_error()
Guido van Rossume15dee51995-07-18 14:12:02 +000049{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000050 if (!PyErr_Occurred())
51 PyErr_SetString(PyExc_SystemError,
52 "null argument to internal routine");
53 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +000054}
55
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000056/* Operations on any object */
57
58int
59PyObject_Cmp(o1, o2, result)
60 PyObject *o1;
61 PyObject *o2;
62 int *result;
63{
64 int r;
65
66 if (o1 == NULL || o2 == NULL) {
67 null_error();
68 return -1;
69 }
70 r = PyObject_Compare(o1, o2);
71 if (PyErr_Occurred())
72 return -1;
73 *result = r;
Guido van Rossume15dee51995-07-18 14:12:02 +000074 return 0;
75}
Guido van Rossume15dee51995-07-18 14:12:02 +000076
77PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +000078PyObject_Type(o)
79 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +000080{
81 PyObject *v;
82
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000083 if (o == NULL)
84 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +000085 v = (PyObject *)o->ob_type;
86 Py_INCREF(v);
87 return v;
88}
89
90int
Guido van Rossum8ba873b1995-09-18 21:17:59 +000091PyObject_Length(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000092 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +000093{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000094 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +000095
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000096 if (o == NULL) {
97 null_error();
98 return -1;
99 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000100
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000101 m = o->ob_type->tp_as_sequence;
102 if (m && m->sq_length)
103 return m->sq_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000104
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000105 return PyMapping_Length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000106}
107
108PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000109PyObject_GetItem(o, key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000110 PyObject *o;
111 PyObject *key;
Guido van Rossume15dee51995-07-18 14:12:02 +0000112{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000113 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000114
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000115 if (o == NULL || key == NULL)
116 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000117
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000118 m = o->ob_type->tp_as_mapping;
119 if (m && m->mp_subscript)
120 return m->mp_subscript(o, key);
Guido van Rossume15dee51995-07-18 14:12:02 +0000121
Guido van Rossum21308241998-08-13 16:44:44 +0000122 if (o->ob_type->tp_as_sequence) {
123 if (PyInt_Check(key))
124 return PySequence_GetItem(o, PyInt_AsLong(key));
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000125 else if (PyLong_Check(key)) {
126 long key_value = PyLong_AsLong(key);
127 if (key_value == -1 && PyErr_Occurred())
128 return NULL;
129 return PySequence_GetItem(o, key_value);
130 }
Guido van Rossum21308241998-08-13 16:44:44 +0000131 return type_error("sequence index must be integer");
132 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000133
134 return type_error("unsubscriptable object");
Guido van Rossume15dee51995-07-18 14:12:02 +0000135}
136
137int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000138PyObject_SetItem(o, key, value)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000139 PyObject *o;
140 PyObject *key;
141 PyObject *value;
Guido van Rossume15dee51995-07-18 14:12:02 +0000142{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000143 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000144
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000145 if (o == NULL || key == NULL || value == NULL) {
146 null_error();
147 return -1;
148 }
149 m = o->ob_type->tp_as_mapping;
150 if (m && m->mp_ass_subscript)
151 return m->mp_ass_subscript(o, key, value);
Guido van Rossume15dee51995-07-18 14:12:02 +0000152
Guido van Rossum21308241998-08-13 16:44:44 +0000153 if (o->ob_type->tp_as_sequence) {
154 if (PyInt_Check(key))
155 return PySequence_SetItem(o, PyInt_AsLong(key), value);
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000156 else if (PyLong_Check(key)) {
157 long key_value = PyLong_AsLong(key);
158 if (key_value == -1 && PyErr_Occurred())
159 return -1;
160 return PySequence_SetItem(o, key_value, value);
161 }
Guido van Rossum21308241998-08-13 16:44:44 +0000162 type_error("sequence index must be integer");
163 return -1;
164 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000165
166 type_error("object does not support item assignment");
167 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000168}
169
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000170int
171PyObject_DelItem(o, key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000172 PyObject *o;
173 PyObject *key;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000174{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000175 PyMappingMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000176
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000177 if (o == NULL || key == NULL) {
178 null_error();
179 return -1;
180 }
181 m = o->ob_type->tp_as_mapping;
182 if (m && m->mp_ass_subscript)
183 return m->mp_ass_subscript(o, key, (PyObject*)NULL);
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000184
Guido van Rossum21308241998-08-13 16:44:44 +0000185 if (o->ob_type->tp_as_sequence) {
186 if (PyInt_Check(key))
187 return PySequence_DelItem(o, PyInt_AsLong(key));
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000188 else if (PyLong_Check(key)) {
189 long key_value = PyLong_AsLong(key);
190 if (key_value == -1 && PyErr_Occurred())
191 return -1;
192 return PySequence_DelItem(o, key_value);
193 }
Guido van Rossum21308241998-08-13 16:44:44 +0000194 type_error("sequence index must be integer");
195 return -1;
196 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000197
198 type_error("object does not support item deletion");
199 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000200}
201
Guido van Rossum4c08d552000-03-10 22:55:18 +0000202int PyObject_AsCharBuffer(PyObject *obj,
203 const char **buffer,
204 int *buffer_len)
205{
206 PyBufferProcs *pb;
207 const char *pp;
208 int len;
209
210 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
211 null_error();
212 return -1;
213 }
214 pb = obj->ob_type->tp_as_buffer;
215 if ( pb == NULL ||
216 pb->bf_getcharbuffer == NULL ||
217 pb->bf_getsegcount == NULL ) {
218 PyErr_SetString(PyExc_TypeError,
219 "expected a character buffer object");
220 goto onError;
221 }
222 if ( (*pb->bf_getsegcount)(obj,NULL) != 1 ) {
223 PyErr_SetString(PyExc_TypeError,
224 "expected a single-segment buffer object");
225 goto onError;
226 }
227 len = (*pb->bf_getcharbuffer)(obj,0,&pp);
228 if (len < 0)
229 goto onError;
230 *buffer = pp;
231 *buffer_len = len;
232 return 0;
233
234 onError:
235 return -1;
236}
237
238int PyObject_AsReadBuffer(PyObject *obj,
239 const void **buffer,
240 int *buffer_len)
241{
242 PyBufferProcs *pb;
243 void *pp;
244 int len;
245
246 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
247 null_error();
248 return -1;
249 }
250 pb = obj->ob_type->tp_as_buffer;
251 if ( pb == NULL ||
252 pb->bf_getreadbuffer == NULL ||
253 pb->bf_getsegcount == NULL ) {
254 PyErr_SetString(PyExc_TypeError,
255 "expected a readable buffer object");
256 goto onError;
257 }
258 if ( (*pb->bf_getsegcount)(obj,NULL) != 1 ) {
259 PyErr_SetString(PyExc_TypeError,
260 "expected a single-segment buffer object");
261 goto onError;
262 }
263 len = (*pb->bf_getreadbuffer)(obj,0,&pp);
264 if (len < 0)
265 goto onError;
266 *buffer = pp;
267 *buffer_len = len;
268 return 0;
269
270 onError:
271 return -1;
272}
273
274int PyObject_AsWriteBuffer(PyObject *obj,
275 void **buffer,
276 int *buffer_len)
277{
278 PyBufferProcs *pb;
279 void*pp;
280 int len;
281
282 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
283 null_error();
284 return -1;
285 }
286 pb = obj->ob_type->tp_as_buffer;
287 if ( pb == NULL ||
288 pb->bf_getwritebuffer == NULL ||
289 pb->bf_getsegcount == NULL ) {
290 PyErr_SetString(PyExc_TypeError,
291 "expected a writeable buffer object");
292 goto onError;
293 }
294 if ( (*pb->bf_getsegcount)(obj,NULL) != 1 ) {
295 PyErr_SetString(PyExc_TypeError,
296 "expected a single-segment buffer object");
297 goto onError;
298 }
299 len = (*pb->bf_getwritebuffer)(obj,0,&pp);
300 if (len < 0)
301 goto onError;
302 *buffer = pp;
303 *buffer_len = len;
304 return 0;
305
306 onError:
307 return -1;
308}
309
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000310/* Operations on numbers */
311
312int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000313PyNumber_Check(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000314 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000315{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000316 return o && o->ob_type->tp_as_number;
Guido van Rossume15dee51995-07-18 14:12:02 +0000317}
318
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000319/* Binary operators */
Guido van Rossume15dee51995-07-18 14:12:02 +0000320
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000321#define BINOP(v, w, opname, ropname, thisfunc) \
322 if (PyInstance_Check(v) || PyInstance_Check(w)) \
Guido van Rossume15dee51995-07-18 14:12:02 +0000323 return PyInstance_DoBinOp(v, w, opname, ropname, thisfunc)
324
325PyObject *
326PyNumber_Or(v, w)
327 PyObject *v, *w;
328{
329 extern int PyNumber_Coerce();
330
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000331 BINOP(v, w, "__or__", "__ror__", PyNumber_Or);
Guido van Rossume15dee51995-07-18 14:12:02 +0000332 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000333 PyObject *x = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000334 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
335 if (PyNumber_Coerce(&v, &w) != 0)
336 return NULL;
337 if ((f = v->ob_type->tp_as_number->nb_or) != NULL)
338 x = (*f)(v, w);
339 Py_DECREF(v);
340 Py_DECREF(w);
341 if (f != NULL)
342 return x;
343 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000344 return type_error("bad operand type(s) for |");
Guido van Rossume15dee51995-07-18 14:12:02 +0000345}
346
347PyObject *
348PyNumber_Xor(v, w)
349 PyObject *v, *w;
350{
351 extern int PyNumber_Coerce();
352
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000353 BINOP(v, w, "__xor__", "__rxor__", PyNumber_Xor);
Guido van Rossume15dee51995-07-18 14:12:02 +0000354 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000355 PyObject *x = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000356 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
357 if (PyNumber_Coerce(&v, &w) != 0)
358 return NULL;
359 if ((f = v->ob_type->tp_as_number->nb_xor) != NULL)
360 x = (*f)(v, w);
361 Py_DECREF(v);
362 Py_DECREF(w);
363 if (f != NULL)
364 return x;
365 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000366 return type_error("bad operand type(s) for ^");
Guido van Rossume15dee51995-07-18 14:12:02 +0000367}
368
369PyObject *
370PyNumber_And(v, w)
371 PyObject *v, *w;
372{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000373 BINOP(v, w, "__and__", "__rand__", PyNumber_And);
Guido van Rossume15dee51995-07-18 14:12:02 +0000374 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000375 PyObject *x = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000376 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
377 if (PyNumber_Coerce(&v, &w) != 0)
378 return NULL;
379 if ((f = v->ob_type->tp_as_number->nb_and) != NULL)
380 x = (*f)(v, w);
381 Py_DECREF(v);
382 Py_DECREF(w);
383 if (f != NULL)
384 return x;
385 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000386 return type_error("bad operand type(s) for &");
Guido van Rossume15dee51995-07-18 14:12:02 +0000387}
388
389PyObject *
390PyNumber_Lshift(v, w)
391 PyObject *v, *w;
392{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000393 BINOP(v, w, "__lshift__", "__rlshift__", PyNumber_Lshift);
Guido van Rossume15dee51995-07-18 14:12:02 +0000394 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000395 PyObject *x = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000396 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
397 if (PyNumber_Coerce(&v, &w) != 0)
398 return NULL;
399 if ((f = v->ob_type->tp_as_number->nb_lshift) != NULL)
400 x = (*f)(v, w);
401 Py_DECREF(v);
402 Py_DECREF(w);
403 if (f != NULL)
404 return x;
405 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000406 return type_error("bad operand type(s) for <<");
Guido van Rossume15dee51995-07-18 14:12:02 +0000407}
408
409PyObject *
410PyNumber_Rshift(v, w)
411 PyObject *v, *w;
412{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000413 BINOP(v, w, "__rshift__", "__rrshift__", PyNumber_Rshift);
Guido van Rossume15dee51995-07-18 14:12:02 +0000414 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000415 PyObject *x = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000416 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
417 if (PyNumber_Coerce(&v, &w) != 0)
418 return NULL;
419 if ((f = v->ob_type->tp_as_number->nb_rshift) != NULL)
420 x = (*f)(v, w);
421 Py_DECREF(v);
422 Py_DECREF(w);
423 if (f != NULL)
424 return x;
425 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000426 return type_error("bad operand type(s) for >>");
Guido van Rossume15dee51995-07-18 14:12:02 +0000427}
428
429PyObject *
430PyNumber_Add(v, w)
431 PyObject *v, *w;
432{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000433 PySequenceMethods *m;
434
435 BINOP(v, w, "__add__", "__radd__", PyNumber_Add);
436 m = v->ob_type->tp_as_sequence;
437 if (m && m->sq_concat)
438 return (*m->sq_concat)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000439 else if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000440 PyObject *x = NULL;
441 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
Guido van Rossume15dee51995-07-18 14:12:02 +0000442 if (PyNumber_Coerce(&v, &w) != 0)
443 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000444 if ((f = v->ob_type->tp_as_number->nb_add) != NULL)
445 x = (*f)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000446 Py_DECREF(v);
447 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000448 if (f != NULL)
449 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000450 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000451 return type_error("bad operand type(s) for +");
Guido van Rossume15dee51995-07-18 14:12:02 +0000452}
453
454PyObject *
455PyNumber_Subtract(v, w)
456 PyObject *v, *w;
457{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000458 BINOP(v, w, "__sub__", "__rsub__", PyNumber_Subtract);
Guido van Rossume15dee51995-07-18 14:12:02 +0000459 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000460 PyObject *x = NULL;
461 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
Guido van Rossume15dee51995-07-18 14:12:02 +0000462 if (PyNumber_Coerce(&v, &w) != 0)
463 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000464 if ((f = v->ob_type->tp_as_number->nb_subtract) != NULL)
465 x = (*f)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000466 Py_DECREF(v);
467 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000468 if (f != NULL)
469 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000470 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000471 return type_error("bad operand type(s) for -");
Guido van Rossume15dee51995-07-18 14:12:02 +0000472}
473
474PyObject *
475PyNumber_Multiply(v, w)
476 PyObject *v, *w;
477{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000478 PyTypeObject *tp = v->ob_type;
479 PySequenceMethods *m;
480
481 BINOP(v, w, "__mul__", "__rmul__", PyNumber_Multiply);
Guido van Rossume15dee51995-07-18 14:12:02 +0000482 if (tp->tp_as_number != NULL &&
483 w->ob_type->tp_as_sequence != NULL &&
484 !PyInstance_Check(v)) {
485 /* number*sequence -- swap v and w */
486 PyObject *tmp = v;
487 v = w;
488 w = tmp;
489 tp = v->ob_type;
490 }
491 if (tp->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000492 PyObject *x = NULL;
493 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
Guido van Rossume15dee51995-07-18 14:12:02 +0000494 if (PyInstance_Check(v)) {
495 /* Instances of user-defined classes get their
496 other argument uncoerced, so they may
497 implement sequence*number as well as
498 number*number. */
499 Py_INCREF(v);
500 Py_INCREF(w);
501 }
502 else if (PyNumber_Coerce(&v, &w) != 0)
503 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000504 if ((f = v->ob_type->tp_as_number->nb_multiply) != NULL)
505 x = (*f)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000506 Py_DECREF(v);
507 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000508 if (f != NULL)
509 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000510 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000511 m = tp->tp_as_sequence;
512 if (m && m->sq_repeat) {
Andrew M. Kuchling1991ddc2000-02-14 22:22:04 +0000513 long mul_value;
514
515 if (PyInt_Check(w)) {
516 mul_value = PyInt_AsLong(w);
517 }
518 else if (PyLong_Check(w)) {
519 mul_value = PyLong_AsLong(w);
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000520 if (mul_value == -1 && PyErr_Occurred())
Andrew M. Kuchling1991ddc2000-02-14 22:22:04 +0000521 return NULL;
522 }
523 else {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000524 return type_error(
Guido van Rossume15dee51995-07-18 14:12:02 +0000525 "can't multiply sequence with non-int");
Andrew M. Kuchling1991ddc2000-02-14 22:22:04 +0000526 }
527 return (*m->sq_repeat)(v, (int)mul_value);
Guido van Rossume15dee51995-07-18 14:12:02 +0000528 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000529 return type_error("bad operand type(s) for *");
Guido van Rossume15dee51995-07-18 14:12:02 +0000530}
531
532PyObject *
533PyNumber_Divide(v, w)
534 PyObject *v, *w;
535{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000536 BINOP(v, w, "__div__", "__rdiv__", PyNumber_Divide);
Guido van Rossume15dee51995-07-18 14:12:02 +0000537 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000538 PyObject *x = NULL;
539 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
Guido van Rossume15dee51995-07-18 14:12:02 +0000540 if (PyNumber_Coerce(&v, &w) != 0)
541 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000542 if ((f = v->ob_type->tp_as_number->nb_divide) != NULL)
543 x = (*f)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000544 Py_DECREF(v);
545 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000546 if (f != NULL)
547 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000548 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000549 return type_error("bad operand type(s) for /");
Guido van Rossume15dee51995-07-18 14:12:02 +0000550}
551
552PyObject *
553PyNumber_Remainder(v, w)
554 PyObject *v, *w;
555{
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000556 if (PyString_Check(v))
Guido van Rossume15dee51995-07-18 14:12:02 +0000557 return PyString_Format(v, w);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000558 else if (PyUnicode_Check(v))
559 return PyUnicode_Format(v, w);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000560 BINOP(v, w, "__mod__", "__rmod__", PyNumber_Remainder);
Guido van Rossume15dee51995-07-18 14:12:02 +0000561 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000562 PyObject *x = NULL;
563 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
Guido van Rossume15dee51995-07-18 14:12:02 +0000564 if (PyNumber_Coerce(&v, &w) != 0)
565 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000566 if ((f = v->ob_type->tp_as_number->nb_remainder) != NULL)
567 x = (*f)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000568 Py_DECREF(v);
569 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000570 if (f != NULL)
571 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000572 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000573 return type_error("bad operand type(s) for %");
Guido van Rossume15dee51995-07-18 14:12:02 +0000574}
575
576PyObject *
577PyNumber_Divmod(v, w)
578 PyObject *v, *w;
579{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000580 BINOP(v, w, "__divmod__", "__rdivmod__", PyNumber_Divmod);
581 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000582 PyObject *x = NULL;
583 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000584 if (PyNumber_Coerce(&v, &w) != 0)
585 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000586 if ((f = v->ob_type->tp_as_number->nb_divmod) != NULL)
587 x = (*f)(v, w);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000588 Py_DECREF(v);
589 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000590 if (f != NULL)
591 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000592 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000593 return type_error("bad operand type(s) for divmod()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000594}
595
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000596/* Power (binary or ternary) */
Guido van Rossume15dee51995-07-18 14:12:02 +0000597
598static PyObject *
599do_pow(v, w)
600 PyObject *v, *w;
601{
602 PyObject *res;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000603 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *, PyObject *));
604 BINOP(v, w, "__pow__", "__rpow__", do_pow);
Guido van Rossume15dee51995-07-18 14:12:02 +0000605 if (v->ob_type->tp_as_number == NULL ||
606 w->ob_type->tp_as_number == NULL) {
607 PyErr_SetString(PyExc_TypeError,
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000608 "pow(x, y) requires numeric arguments");
Guido van Rossume15dee51995-07-18 14:12:02 +0000609 return NULL;
610 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000611 if (PyNumber_Coerce(&v, &w) != 0)
612 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000613 if ((f = v->ob_type->tp_as_number->nb_power) != NULL)
614 res = (*f)(v, w, Py_None);
615 else
616 res = type_error("pow(x, y) not defined for these operands");
Guido van Rossume15dee51995-07-18 14:12:02 +0000617 Py_DECREF(v);
618 Py_DECREF(w);
619 return res;
620}
621
622PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000623PyNumber_Power(v, w, z)
Guido van Rossume15dee51995-07-18 14:12:02 +0000624 PyObject *v, *w, *z;
625{
626 PyObject *res;
627 PyObject *v1, *z1, *w2, *z2;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000628 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *, PyObject *));
Guido van Rossume15dee51995-07-18 14:12:02 +0000629
630 if (z == Py_None)
631 return do_pow(v, w);
632 /* XXX The ternary version doesn't do class instance coercions */
633 if (PyInstance_Check(v))
634 return v->ob_type->tp_as_number->nb_power(v, w, z);
635 if (v->ob_type->tp_as_number == NULL ||
636 z->ob_type->tp_as_number == NULL ||
637 w->ob_type->tp_as_number == NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000638 return type_error("pow(x, y, z) requires numeric arguments");
Guido van Rossume15dee51995-07-18 14:12:02 +0000639 }
640 if (PyNumber_Coerce(&v, &w) != 0)
641 return NULL;
642 res = NULL;
643 v1 = v;
644 z1 = z;
645 if (PyNumber_Coerce(&v1, &z1) != 0)
646 goto error2;
647 w2 = w;
648 z2 = z1;
649 if (PyNumber_Coerce(&w2, &z2) != 0)
650 goto error1;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000651 if ((f = v1->ob_type->tp_as_number->nb_power) != NULL)
652 res = (*f)(v1, w2, z2);
653 else
654 res = type_error(
655 "pow(x, y, z) not defined for these operands");
Guido van Rossume15dee51995-07-18 14:12:02 +0000656 Py_DECREF(w2);
657 Py_DECREF(z2);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000658 error1:
Guido van Rossume15dee51995-07-18 14:12:02 +0000659 Py_DECREF(v1);
660 Py_DECREF(z1);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000661 error2:
Guido van Rossume15dee51995-07-18 14:12:02 +0000662 Py_DECREF(v);
663 Py_DECREF(w);
664 return res;
665}
666
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000667/* Unary operators and functions */
Guido van Rossume15dee51995-07-18 14:12:02 +0000668
669PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000670PyNumber_Negative(o)
671 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000672{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000673 PyNumberMethods *m;
674
675 if (o == NULL)
676 return null_error();
677 m = o->ob_type->tp_as_number;
678 if (m && m->nb_negative)
679 return (*m->nb_negative)(o);
680
681 return type_error("bad operand type for unary -");
Guido van Rossume15dee51995-07-18 14:12:02 +0000682}
683
684PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000685PyNumber_Positive(o)
686 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000687{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000688 PyNumberMethods *m;
689
690 if (o == NULL)
691 return null_error();
692 m = o->ob_type->tp_as_number;
693 if (m && m->nb_positive)
694 return (*m->nb_positive)(o);
695
696 return type_error("bad operand type for unary +");
Guido van Rossume15dee51995-07-18 14:12:02 +0000697}
698
699PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000700PyNumber_Invert(o)
701 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000702{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000703 PyNumberMethods *m;
704
705 if (o == NULL)
706 return null_error();
707 m = o->ob_type->tp_as_number;
708 if (m && m->nb_invert)
709 return (*m->nb_invert)(o);
710
711 return type_error("bad operand type for unary ~");
Guido van Rossume15dee51995-07-18 14:12:02 +0000712}
713
714PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000715PyNumber_Absolute(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000716 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000717{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000718 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000719
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000720 if (o == NULL)
721 return null_error();
722 m = o->ob_type->tp_as_number;
723 if (m && m->nb_absolute)
724 return m->nb_absolute(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000725
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000726 return type_error("bad operand type for abs()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000727}
728
Guido van Rossum9e896b32000-04-05 20:11:21 +0000729/* Add a check for embedded NULL-bytes in the argument. */
730static PyObject *
731int_from_string(s, len)
732 const char *s;
733 int len;
734{
735 char *end;
736 PyObject *x;
737
738 x = PyInt_FromString((char*)s, &end, 10);
739 if (x == NULL)
740 return NULL;
741 if (end != s + len) {
742 PyErr_SetString(PyExc_ValueError,
743 "null byte in argument for int()");
744 Py_DECREF(x);
745 return NULL;
746 }
747 return x;
748}
749
Guido van Rossume15dee51995-07-18 14:12:02 +0000750PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000751PyNumber_Int(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000752 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000753{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000754 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000755 const char *buffer;
756 int buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +0000757
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000758 if (o == NULL)
759 return null_error();
Guido van Rossum9e896b32000-04-05 20:11:21 +0000760 if (PyInt_Check(o)) {
761 Py_INCREF(o);
762 return o;
763 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000764 if (PyString_Check(o))
Guido van Rossum9e896b32000-04-05 20:11:21 +0000765 return int_from_string(PyString_AS_STRING(o),
766 PyString_GET_SIZE(o));
767 if (PyUnicode_Check(o))
768 return PyInt_FromUnicode(PyUnicode_AS_UNICODE(o),
769 PyUnicode_GET_SIZE(o),
770 10);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000771 m = o->ob_type->tp_as_number;
772 if (m && m->nb_int)
773 return m->nb_int(o);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000774 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
Guido van Rossum9e896b32000-04-05 20:11:21 +0000775 return int_from_string((char*)buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +0000776
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000777 return type_error("object can't be converted to int");
Guido van Rossume15dee51995-07-18 14:12:02 +0000778}
779
Guido van Rossum9e896b32000-04-05 20:11:21 +0000780/* Add a check for embedded NULL-bytes in the argument. */
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000781static PyObject *
Guido van Rossum4c08d552000-03-10 22:55:18 +0000782long_from_string(s, len)
783 const char *s;
784 int len;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000785{
Guido van Rossum4c08d552000-03-10 22:55:18 +0000786 char *end;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000787 PyObject *x;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000788
Guido van Rossum4c08d552000-03-10 22:55:18 +0000789 x = PyLong_FromString((char*)s, &end, 10);
Guido van Rossum9e896b32000-04-05 20:11:21 +0000790 if (x == NULL)
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000791 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000792 if (end != s + len) {
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000793 PyErr_SetString(PyExc_ValueError,
794 "null byte in argument for long()");
Guido van Rossum9e896b32000-04-05 20:11:21 +0000795 Py_DECREF(x);
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000796 return NULL;
797 }
798 return x;
799}
800
Guido van Rossume15dee51995-07-18 14:12:02 +0000801PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000802PyNumber_Long(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000803 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000804{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000805 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000806 const char *buffer;
807 int buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +0000808
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000809 if (o == NULL)
810 return null_error();
Guido van Rossum9e896b32000-04-05 20:11:21 +0000811 if (PyLong_Check(o)) {
812 Py_INCREF(o);
813 return o;
814 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000815 if (PyString_Check(o))
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000816 /* need to do extra error checking that PyLong_FromString()
817 * doesn't do. In particular long('9.5') must raise an
818 * exception, not truncate the float.
819 */
Guido van Rossum4c08d552000-03-10 22:55:18 +0000820 return long_from_string(PyString_AS_STRING(o),
821 PyString_GET_SIZE(o));
Guido van Rossum9e896b32000-04-05 20:11:21 +0000822 if (PyUnicode_Check(o))
823 /* The above check is done in PyLong_FromUnicode(). */
824 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(o),
825 PyUnicode_GET_SIZE(o),
826 10);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000827 m = o->ob_type->tp_as_number;
828 if (m && m->nb_long)
829 return m->nb_long(o);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000830 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
831 return long_from_string(buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +0000832
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000833 return type_error("object can't be converted to long");
Guido van Rossume15dee51995-07-18 14:12:02 +0000834}
835
836PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000837PyNumber_Float(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000838 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000839{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000840 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000841
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000842 if (o == NULL)
843 return null_error();
Guido van Rossum9e896b32000-04-05 20:11:21 +0000844 if (PyFloat_Check(o)) {
845 Py_INCREF(o);
846 return o;
847 }
Guido van Rossum4c08d552000-03-10 22:55:18 +0000848 if (!PyString_Check(o)) {
849 m = o->ob_type->tp_as_number;
850 if (m && m->nb_float)
851 return m->nb_float(o);
852 }
853 return PyFloat_FromString(o, NULL);
Guido van Rossume15dee51995-07-18 14:12:02 +0000854}
855
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000856/* Operations on sequences */
Guido van Rossume15dee51995-07-18 14:12:02 +0000857
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000858int
859PySequence_Check(s)
860 PyObject *s;
Guido van Rossume15dee51995-07-18 14:12:02 +0000861{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000862 return s != NULL && s->ob_type->tp_as_sequence;
Guido van Rossume15dee51995-07-18 14:12:02 +0000863}
864
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000865int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000866PySequence_Length(s)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000867 PyObject *s;
Guido van Rossume15dee51995-07-18 14:12:02 +0000868{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000869 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000870
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000871 if (s == NULL) {
872 null_error();
873 return -1;
874 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000875
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000876 m = s->ob_type->tp_as_sequence;
877 if (m && m->sq_length)
878 return m->sq_length(s);
Guido van Rossume15dee51995-07-18 14:12:02 +0000879
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000880 type_error("len() of unsized object");
881 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000882}
883
884PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000885PySequence_Concat(s, o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000886 PyObject *s;
887 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000888{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000889 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000890
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000891 if (s == NULL || o == NULL)
892 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000893
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000894 m = s->ob_type->tp_as_sequence;
895 if (m && m->sq_concat)
896 return m->sq_concat(s, o);
897
898 return type_error("object can't be concatenated");
Guido van Rossume15dee51995-07-18 14:12:02 +0000899}
900
901PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000902PySequence_Repeat(o, count)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000903 PyObject *o;
904 int count;
Guido van Rossume15dee51995-07-18 14:12:02 +0000905{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000906 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000907
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000908 if (o == NULL)
909 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000910
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000911 m = o->ob_type->tp_as_sequence;
912 if (m && m->sq_repeat)
913 return m->sq_repeat(o, count);
914
915 return type_error("object can't be repeated");
Guido van Rossume15dee51995-07-18 14:12:02 +0000916}
917
918PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000919PySequence_GetItem(s, i)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000920 PyObject *s;
921 int i;
Guido van Rossume15dee51995-07-18 14:12:02 +0000922{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000923 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000924
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000925 if (s == NULL)
926 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000927
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000928 m = s->ob_type->tp_as_sequence;
929 if (m && m->sq_item) {
930 if (i < 0) {
931 if (m->sq_length) {
932 int l = (*m->sq_length)(s);
933 if (l < 0)
934 return NULL;
935 i += l;
936 }
937 }
938 return m->sq_item(s, i);
939 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000940
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000941 return type_error("unindexable object");
Guido van Rossume15dee51995-07-18 14:12:02 +0000942}
943
944PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000945PySequence_GetSlice(s, i1, i2)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000946 PyObject *s;
947 int i1;
948 int i2;
Guido van Rossume15dee51995-07-18 14:12:02 +0000949{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000950 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000951
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000952 if (!s) return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000953
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000954 m = s->ob_type->tp_as_sequence;
955 if (m && m->sq_slice) {
956 if (i1 < 0 || i2 < 0) {
957 if (m->sq_length) {
958 int l = (*m->sq_length)(s);
959 if (l < 0)
960 return NULL;
961 if (i1 < 0)
962 i1 += l;
963 if (i2 < 0)
964 i2 += l;
965 }
966 }
967 return m->sq_slice(s, i1, i2);
968 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000969
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000970 return type_error("unsliceable object");
Guido van Rossume15dee51995-07-18 14:12:02 +0000971}
972
973int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000974PySequence_SetItem(s, i, o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000975 PyObject *s;
976 int i;
977 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000978{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000979 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000980
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000981 if (s == NULL) {
982 null_error();
983 return -1;
984 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000985
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000986 m = s->ob_type->tp_as_sequence;
987 if (m && m->sq_ass_item) {
988 if (i < 0) {
989 if (m->sq_length) {
990 int l = (*m->sq_length)(s);
991 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +0000992 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000993 i += l;
994 }
995 }
996 return m->sq_ass_item(s, i, o);
997 }
998
999 type_error("object doesn't support item assignment");
1000 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001001}
1002
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001003int
1004PySequence_DelItem(s, i)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001005 PyObject *s;
1006 int i;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001007{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001008 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001009
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001010 if (s == NULL) {
1011 null_error();
1012 return -1;
1013 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001014
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001015 m = s->ob_type->tp_as_sequence;
1016 if (m && m->sq_ass_item) {
1017 if (i < 0) {
1018 if (m->sq_length) {
1019 int l = (*m->sq_length)(s);
1020 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001021 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001022 i += l;
1023 }
1024 }
1025 return m->sq_ass_item(s, i, (PyObject *)NULL);
1026 }
1027
1028 type_error("object doesn't support item deletion");
1029 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001030}
1031
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001032int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001033PySequence_SetSlice(s, i1, i2, o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001034 PyObject *s;
1035 int i1;
1036 int i2;
1037 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +00001038{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001039 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001040
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001041 if (s == NULL) {
1042 null_error();
1043 return -1;
1044 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001045
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001046 m = s->ob_type->tp_as_sequence;
1047 if (m && m->sq_ass_slice) {
1048 if (i1 < 0 || i2 < 0) {
1049 if (m->sq_length) {
1050 int l = (*m->sq_length)(s);
1051 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001052 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001053 if (i1 < 0)
1054 i1 += l;
1055 if (i2 < 0)
1056 i2 += l;
1057 }
1058 }
1059 return m->sq_ass_slice(s, i1, i2, o);
1060 }
1061 type_error("object doesn't support slice assignment");
1062 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001063}
1064
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001065int
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001066PySequence_DelSlice(s, i1, i2)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001067 PyObject *s;
1068 int i1;
1069 int i2;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001070{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001071 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001072
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001073 if (s == NULL) {
1074 null_error();
1075 return -1;
1076 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001077
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001078 m = s->ob_type->tp_as_sequence;
1079 if (m && m->sq_ass_slice) {
1080 if (i1 < 0 || i2 < 0) {
1081 if (m->sq_length) {
1082 int l = (*m->sq_length)(s);
1083 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001084 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001085 if (i1 < 0)
1086 i1 += l;
1087 if (i2 < 0)
1088 i2 += l;
1089 }
1090 }
1091 return m->sq_ass_slice(s, i1, i2, (PyObject *)NULL);
1092 }
1093 type_error("object doesn't support slice deletion");
1094 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001095}
1096
Guido van Rossume15dee51995-07-18 14:12:02 +00001097PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001098PySequence_Tuple(v)
1099 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001100{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001101 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001102
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001103 if (v == NULL)
1104 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001105
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001106 if (PyTuple_Check(v)) {
1107 Py_INCREF(v);
1108 return v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001109 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001110
1111 if (PyList_Check(v))
1112 return PyList_AsTuple(v);
1113
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001114 /* There used to be code for strings here, but tuplifying strings is
1115 not a common activity, so I nuked it. Down with code bloat! */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001116
1117 /* Generic sequence object */
1118 m = v->ob_type->tp_as_sequence;
1119 if (m && m->sq_item) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001120 int i;
1121 PyObject *t;
1122 int n = PySequence_Length(v);
1123 if (n < 0)
1124 return NULL;
1125 t = PyTuple_New(n);
1126 if (t == NULL)
1127 return NULL;
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001128 for (i = 0; ; i++) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001129 PyObject *item = (*m->sq_item)(v, i);
1130 if (item == NULL) {
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001131 if (PyErr_ExceptionMatches(PyExc_IndexError))
1132 PyErr_Clear();
1133 else {
1134 Py_DECREF(t);
1135 t = NULL;
1136 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001137 break;
1138 }
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001139 if (i >= n) {
1140 if (n < 500)
1141 n += 10;
1142 else
1143 n += 100;
1144 if (_PyTuple_Resize(&t, n, 0) != 0)
1145 break;
1146 }
1147 PyTuple_SET_ITEM(t, i, item);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001148 }
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001149 if (i < n && t != NULL)
1150 _PyTuple_Resize(&t, i, 0);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001151 return t;
1152 }
1153
1154 /* None of the above */
1155 return type_error("tuple() argument must be a sequence");
Guido van Rossume15dee51995-07-18 14:12:02 +00001156}
1157
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001158PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001159PySequence_List(v)
1160 PyObject *v;
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001161{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001162 PySequenceMethods *m;
Guido van Rossum4669fb41997-04-02 05:31:09 +00001163
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001164 if (v == NULL)
1165 return null_error();
1166
1167 if (PyList_Check(v))
1168 return PyList_GetSlice(v, 0, PyList_GET_SIZE(v));
1169
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001170 m = v->ob_type->tp_as_sequence;
1171 if (m && m->sq_item) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001172 int i;
1173 PyObject *l;
1174 int n = PySequence_Length(v);
1175 if (n < 0)
1176 return NULL;
1177 l = PyList_New(n);
1178 if (l == NULL)
1179 return NULL;
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001180 for (i = 0; ; i++) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001181 PyObject *item = (*m->sq_item)(v, i);
1182 if (item == NULL) {
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001183 if (PyErr_ExceptionMatches(PyExc_IndexError))
1184 PyErr_Clear();
1185 else {
1186 Py_DECREF(l);
1187 l = NULL;
1188 }
1189 break;
1190 }
1191 if (i < n)
1192 PyList_SET_ITEM(l, i, item);
1193 else if (PyList_Append(l, item) < 0) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001194 Py_DECREF(l);
1195 l = NULL;
1196 break;
1197 }
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001198 }
1199 if (i < n && l != NULL) {
1200 if (PyList_SetSlice(l, i, n, (PyObject *)NULL) != 0) {
1201 Py_DECREF(l);
1202 l = NULL;
1203 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001204 }
1205 return l;
Guido van Rossum4669fb41997-04-02 05:31:09 +00001206 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001207 return type_error("list() argument must be a sequence");
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001208}
1209
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001210PyObject *
1211PySequence_Fast(v, m)
1212 PyObject *v;
1213 const char* m;
1214{
1215 if (v == NULL)
1216 return null_error();
1217
1218 if (PyList_Check(v) || PyTuple_Check(v)) {
1219 Py_INCREF(v);
1220 return v;
1221 }
1222
1223 v = PySequence_Tuple(v);
1224 if (v == NULL && PyErr_ExceptionMatches(PyExc_TypeError))
1225 return type_error(m);
1226
1227 return v;
1228}
1229
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001230int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001231PySequence_Count(s, o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001232 PyObject *s;
1233 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +00001234{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001235 int l, i, n, cmp, err;
1236 PyObject *item;
Guido van Rossume15dee51995-07-18 14:12:02 +00001237
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001238 if (s == NULL || o == NULL) {
1239 null_error();
1240 return -1;
1241 }
1242
1243 l = PySequence_Length(s);
1244 if (l < 0)
1245 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001246
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001247 n = 0;
1248 for (i = 0; i < l; i++) {
1249 item = PySequence_GetItem(s, i);
1250 if (item == NULL)
1251 return -1;
1252 err = PyObject_Cmp(item, o, &cmp);
1253 Py_DECREF(item);
1254 if (err < 0)
1255 return err;
1256 if (cmp == 0)
1257 n++;
1258 }
1259 return n;
Guido van Rossume15dee51995-07-18 14:12:02 +00001260}
1261
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001262int
1263PySequence_Contains(w, v) /* v in w */
1264 PyObject *w;
1265 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001266{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001267 int i, cmp;
1268 PyObject *x;
1269 PySequenceMethods *sq;
Guido van Rossume15dee51995-07-18 14:12:02 +00001270
Guido van Rossum46c6b202000-02-28 15:01:46 +00001271 if(PyType_HasFeature(w->ob_type, Py_TPFLAGS_HAVE_SEQUENCE_IN)) {
1272 sq = w->ob_type->tp_as_sequence;
1273 if(sq != NULL && sq->sq_contains != NULL)
1274 return (*sq->sq_contains)(w, v);
1275 }
1276
1277 /* If there is no better way to check whether an item is is contained,
1278 do it the hard way */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001279 sq = w->ob_type->tp_as_sequence;
1280 if (sq == NULL || sq->sq_item == NULL) {
1281 PyErr_SetString(PyExc_TypeError,
1282 "'in' or 'not in' needs sequence right argument");
1283 return -1;
1284 }
1285
1286 for (i = 0; ; i++) {
1287 x = (*sq->sq_item)(w, i);
1288 if (x == NULL) {
Guido van Rossum08570de1998-05-28 19:24:35 +00001289 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001290 PyErr_Clear();
1291 break;
1292 }
1293 return -1;
1294 }
1295 cmp = PyObject_Compare(v, x);
1296 Py_XDECREF(x);
1297 if (cmp == 0)
1298 return 1;
1299 if (PyErr_Occurred())
1300 return -1;
1301 }
1302
1303 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001304}
1305
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001306/* Backwards compatibility */
1307#undef PySequence_In
1308int
1309PySequence_In(w, v)
1310 PyObject *w;
1311 PyObject *v;
1312{
1313 return PySequence_Contains(w, v);
1314}
1315
1316int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001317PySequence_Index(s, o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001318 PyObject *s;
1319 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +00001320{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001321 int l, i, cmp, err;
1322 PyObject *item;
Guido van Rossume15dee51995-07-18 14:12:02 +00001323
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001324 if (s == NULL || o == NULL) {
1325 null_error();
1326 return -1;
1327 }
1328
1329 l = PySequence_Length(s);
1330 if (l < 0)
1331 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001332
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001333 for (i = 0; i < l; i++) {
1334 item = PySequence_GetItem(s, i);
1335 if (item == NULL)
1336 return -1;
1337 err = PyObject_Cmp(item, o, &cmp);
1338 Py_DECREF(item);
1339 if (err < 0)
1340 return err;
1341 if (cmp == 0)
1342 return i;
1343 }
1344
1345 PyErr_SetString(PyExc_ValueError, "sequence.index(x): x not in list");
1346 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001347}
1348
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001349/* Operations on mappings */
1350
1351int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001352PyMapping_Check(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001353 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +00001354{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001355 return o && o->ob_type->tp_as_mapping;
Guido van Rossume15dee51995-07-18 14:12:02 +00001356}
1357
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001358int
1359PyMapping_Length(o)
1360 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +00001361{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001362 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001363
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001364 if (o == NULL) {
1365 null_error();
1366 return -1;
1367 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001368
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001369 m = o->ob_type->tp_as_mapping;
1370 if (m && m->mp_length)
1371 return m->mp_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001372
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001373 type_error("len() of unsized object");
1374 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001375}
1376
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001377PyObject *
1378PyMapping_GetItemString(o, key)
1379 PyObject *o;
1380 char *key;
1381{
1382 PyObject *okey, *r;
1383
1384 if (key == NULL)
1385 return null_error();
1386
1387 okey = PyString_FromString(key);
1388 if (okey == NULL)
1389 return NULL;
1390 r = PyObject_GetItem(o, okey);
1391 Py_DECREF(okey);
1392 return r;
1393}
1394
1395int
1396PyMapping_SetItemString(o, key, value)
1397 PyObject *o;
1398 char *key;
1399 PyObject *value;
1400{
1401 PyObject *okey;
1402 int r;
1403
1404 if (key == NULL) {
1405 null_error();
1406 return -1;
1407 }
1408
1409 okey = PyString_FromString(key);
1410 if (okey == NULL)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001411 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001412 r = PyObject_SetItem(o, okey, value);
1413 Py_DECREF(okey);
1414 return r;
1415}
1416
1417int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001418PyMapping_HasKeyString(o, key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001419 PyObject *o;
1420 char *key;
Guido van Rossume15dee51995-07-18 14:12:02 +00001421{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001422 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001423
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001424 v = PyMapping_GetItemString(o, key);
1425 if (v) {
1426 Py_DECREF(v);
1427 return 1;
1428 }
1429 PyErr_Clear();
1430 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001431}
1432
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001433int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001434PyMapping_HasKey(o, key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001435 PyObject *o;
1436 PyObject *key;
Guido van Rossume15dee51995-07-18 14:12:02 +00001437{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001438 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001439
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001440 v = PyObject_GetItem(o, key);
1441 if (v) {
1442 Py_DECREF(v);
1443 return 1;
1444 }
1445 PyErr_Clear();
1446 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001447}
1448
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001449/* Operations on callable objects */
1450
1451/* XXX PyCallable_Check() is in object.c */
1452
Guido van Rossume15dee51995-07-18 14:12:02 +00001453PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001454PyObject_CallObject(o, a)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001455 PyObject *o, *a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001456{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001457 PyObject *r;
1458 PyObject *args = a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001459
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001460 if (args == NULL) {
1461 args = PyTuple_New(0);
1462 if (args == NULL)
1463 return NULL;
1464 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001465
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001466 r = PyEval_CallObject(o, args);
1467
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +00001468 if (args != a) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001469 Py_DECREF(args);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +00001470 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001471
1472 return r;
1473}
Guido van Rossume15dee51995-07-18 14:12:02 +00001474
1475PyObject *
1476#ifdef HAVE_STDARG_PROTOTYPES
1477/* VARARGS 2 */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001478PyObject_CallFunction(PyObject *callable, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001479#else
1480/* VARARGS */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001481 PyObject_CallFunction(va_alist) va_dcl
Guido van Rossume15dee51995-07-18 14:12:02 +00001482#endif
1483{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001484 va_list va;
1485 PyObject *args, *retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001486#ifdef HAVE_STDARG_PROTOTYPES
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001487 va_start(va, format);
Guido van Rossume15dee51995-07-18 14:12:02 +00001488#else
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001489 PyObject *callable;
1490 char *format;
1491 va_start(va);
1492 callable = va_arg(va, PyObject *);
1493 format = va_arg(va, char *);
Guido van Rossume15dee51995-07-18 14:12:02 +00001494#endif
1495
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001496 if (callable == NULL) {
1497 va_end(va);
1498 return null_error();
1499 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001500
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001501 if (format)
1502 args = Py_VaBuildValue(format, va);
1503 else
1504 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001505
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001506 va_end(va);
1507
1508 if (args == NULL)
1509 return NULL;
1510
1511 if (!PyTuple_Check(args)) {
1512 PyObject *a;
1513
1514 a = PyTuple_New(1);
1515 if (a == NULL)
1516 return NULL;
1517 if (PyTuple_SetItem(a, 0, args) < 0)
1518 return NULL;
1519 args = a;
1520 }
1521 retval = PyObject_CallObject(callable, args);
1522
1523 Py_DECREF(args);
1524
1525 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001526}
1527
1528PyObject *
1529#ifdef HAVE_STDARG_PROTOTYPES
1530/* VARARGS 2 */
1531PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
1532#else
1533/* VARARGS */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001534 PyObject_CallMethod(va_alist) va_dcl
Guido van Rossume15dee51995-07-18 14:12:02 +00001535#endif
1536{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001537 va_list va;
1538 PyObject *args, *func = 0, *retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001539#ifdef HAVE_STDARG_PROTOTYPES
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001540 va_start(va, format);
Guido van Rossume15dee51995-07-18 14:12:02 +00001541#else
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001542 PyObject *o;
1543 char *name;
1544 char *format;
1545 va_start(va);
1546 o = va_arg(va, PyObject *);
1547 name = va_arg(va, char *);
1548 format = va_arg(va, char *);
Guido van Rossume15dee51995-07-18 14:12:02 +00001549#endif
1550
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001551 if (o == NULL || name == NULL) {
1552 va_end(va);
1553 return null_error();
1554 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001555
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001556 func = PyObject_GetAttrString(o, name);
1557 if (func == NULL) {
1558 va_end(va);
1559 PyErr_SetString(PyExc_AttributeError, name);
1560 return 0;
1561 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001562
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001563 if (!PyCallable_Check(func)) {
1564 va_end(va);
1565 return type_error("call of non-callable attribute");
1566 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001567
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001568 if (format && *format)
1569 args = Py_VaBuildValue(format, va);
1570 else
1571 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001572
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001573 va_end(va);
Guido van Rossume15dee51995-07-18 14:12:02 +00001574
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001575 if (!args)
1576 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001577
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001578 if (!PyTuple_Check(args)) {
1579 PyObject *a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001580
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001581 a = PyTuple_New(1);
1582 if (a == NULL)
1583 return NULL;
1584 if (PyTuple_SetItem(a, 0, args) < 0)
1585 return NULL;
1586 args = a;
1587 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001588
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001589 retval = PyObject_CallObject(func, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00001590
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001591 Py_DECREF(args);
1592 Py_DECREF(func);
1593
1594 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001595}