blob: 82eec95a828a73db1c7a4b2dc48ab351c28c6507 [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) */
33
34#include "Python.h"
35
36#define Py_TRY(E) if(!(E)) return NULL
37#define Py_ASSERT(EXP,E,V) if(!(EXP)) return PyErr_SetString(E,V), (void*)NULL
38#define SPAM printf("line %d\n",__LINE__)
39
40static PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +000041Py_ReturnMethodError(name)
42 char *name;
Guido van Rossume15dee51995-07-18 14:12:02 +000043{
44 if(! name) name = "Unknown Error";
45 PyErr_SetString(PyExc_AttributeError,name);
46 return 0;
47}
48
Guido van Rossum052b7e11996-11-11 15:08:19 +000049static PyObject *
Guido van Rossume15dee51995-07-18 14:12:02 +000050Py_ReturnNullError()
51{
52 if(! PyErr_Occurred())
53 PyErr_SetString(PyExc_SystemError,
54 "null argument to internal routine");
55 return 0;
56}
57
58int
Guido van Rossum8ba873b1995-09-18 21:17:59 +000059PyObject_Cmp(o1, o2, result)
60 PyObject *o1;
61 PyObject *o2;
62 int *result;
Guido van Rossume15dee51995-07-18 14:12:02 +000063{
64 int r;
65
66 if(! o1 || ! o2) return Py_ReturnNullError(),-1;
67 r=PyObject_Compare(o1,o2);
68 if(PyErr_Occurred()) return -1;
69 *result=r;
70 return 0;
71}
72
73#if 0 /* Already in object.c */
74int
Guido van Rossum8ba873b1995-09-18 21:17:59 +000075PyCallable_Check(x)
76 PyObject *x;
Guido van Rossume15dee51995-07-18 14:12:02 +000077{
78 if (x == NULL)
79 return 0;
80 if (x->ob_type->tp_call != NULL ||
81 PyFunction_Check(x) ||
82 PyMethod_Check(x) ||
83 PyCFunction_Check(x) ||
84 PyClass_Check(x))
85 return 1;
86 if (PyInstance_Check(x)) {
87 PyObject *call = PyObject_GetAttrString(x, "__call__");
88 if (call == NULL) {
Guido van Rossum8ba873b1995-09-18 21:17:59 +000089 PyErr_Clear();
Guido van Rossume15dee51995-07-18 14:12:02 +000090 return 0;
91 }
92 /* Could test recursively but don't, for fear of endless
93 recursion if some joker sets self.__call__ = self */
94 Py_DECREF(call);
95 return 1;
96 }
97 return 0;
98}
99#endif
100
101PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000102PyObject_Type(o)
103 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000104{
105 PyObject *v;
106
107 if(! o) return Py_ReturnNullError();
108 v = (PyObject *)o->ob_type;
109 Py_INCREF(v);
110 return v;
111}
112
113int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000114PyObject_Length(o)
115 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000116{
117 PySequenceMethods *m;
118
119 if(! o) return Py_ReturnNullError(),-1;
120
121 if((m=o->ob_type->tp_as_sequence) && m->sq_length)
122 return m->sq_length(o);
123
124 return PyMapping_Length(o);
125}
126
127PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000128PyObject_GetItem(o, key)
129 PyObject *o;
130 PyObject *key;
Guido van Rossume15dee51995-07-18 14:12:02 +0000131{
132 PyMappingMethods *m;
133
134 if(! o || ! key) return Py_ReturnNullError();
135
136 if((m=o->ob_type->tp_as_mapping) && m->mp_subscript)
137 return m->mp_subscript(o,key);
138
139 if(PyInt_Check(key))
140 return PySequence_GetItem(o,PyInt_AsLong(key));
141
142 PyErr_SetString(PyExc_TypeError,"expected integer index");
143 return NULL;
144}
145
146int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000147PyObject_SetItem(o, key, value)
148 PyObject *o;
149 PyObject *key;
150 PyObject *value;
Guido van Rossume15dee51995-07-18 14:12:02 +0000151{
152 PyMappingMethods *m;
153
154 if(! o || ! key || ! value) return Py_ReturnNullError(),-1;
155 if((m=o->ob_type->tp_as_mapping) && m->mp_ass_subscript)
156 return m->mp_ass_subscript(o,key,value);
157
158 if(PyInt_Check(key))
159 return PySequence_SetItem(o,PyInt_AsLong(key),value);
160
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000161 PyErr_SetString(PyExc_TypeError,"expected integer index");
Guido van Rossume15dee51995-07-18 14:12:02 +0000162 return -1;
163}
164
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000165int
166PyObject_DelItem(o, key)
167 PyObject *o;
168 PyObject *key;
169{
170 PyMappingMethods *m;
171
172 if(! o || ! key) return Py_ReturnNullError(),-1;
173 if((m=o->ob_type->tp_as_mapping) && m->mp_ass_subscript)
174 return m->mp_ass_subscript(o,key,(PyObject*)NULL);
175
176 if(PyInt_Check(key))
177 return PySequence_SetItem(o,PyInt_AsLong(key),(PyObject*)NULL);
178
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000179 PyErr_SetString(PyExc_TypeError,"expected integer index");
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000180 return -1;
181}
182
Guido van Rossume15dee51995-07-18 14:12:02 +0000183int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000184PyNumber_Check(o)
185 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000186{
187 return o && o->ob_type->tp_as_number;
188}
189
190
191#define BINOP(opname, ropname, thisfunc) \
192 if (!PyInstance_Check(v) && !PyInstance_Check(w)) \
193 ; \
194 else \
195 return PyInstance_DoBinOp(v, w, opname, ropname, thisfunc)
196
197PyObject *
198PyNumber_Or(v, w)
199 PyObject *v, *w;
200{
201 extern int PyNumber_Coerce();
202
203 BINOP("__or__", "__ror__", PyNumber_Or);
204 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000205 PyObject *x = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000206 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
207 if (PyNumber_Coerce(&v, &w) != 0)
208 return NULL;
209 if ((f = v->ob_type->tp_as_number->nb_or) != NULL)
210 x = (*f)(v, w);
211 Py_DECREF(v);
212 Py_DECREF(w);
213 if (f != NULL)
214 return x;
215 }
216 PyErr_SetString(PyExc_TypeError, "bad operand type(s) for |");
217 return NULL;
218}
219
220PyObject *
221PyNumber_Xor(v, w)
222 PyObject *v, *w;
223{
224 extern int PyNumber_Coerce();
225
226 BINOP("__xor__", "__rxor__", PyNumber_Xor);
227 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000228 PyObject *x = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000229 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
230 if (PyNumber_Coerce(&v, &w) != 0)
231 return NULL;
232 if ((f = v->ob_type->tp_as_number->nb_xor) != NULL)
233 x = (*f)(v, w);
234 Py_DECREF(v);
235 Py_DECREF(w);
236 if (f != NULL)
237 return x;
238 }
239 PyErr_SetString(PyExc_TypeError, "bad operand type(s) for ^");
240 return NULL;
241}
242
243PyObject *
244PyNumber_And(v, w)
245 PyObject *v, *w;
246{
247 BINOP("__and__", "__rand__", PyNumber_And);
248 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000249 PyObject *x = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000250 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
251 if (PyNumber_Coerce(&v, &w) != 0)
252 return NULL;
253 if ((f = v->ob_type->tp_as_number->nb_and) != NULL)
254 x = (*f)(v, w);
255 Py_DECREF(v);
256 Py_DECREF(w);
257 if (f != NULL)
258 return x;
259 }
260 PyErr_SetString(PyExc_TypeError, "bad operand type(s) for &");
261 return NULL;
262}
263
264PyObject *
265PyNumber_Lshift(v, w)
266 PyObject *v, *w;
267{
268 BINOP("__lshift__", "__rlshift__", PyNumber_Lshift);
269 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000270 PyObject *x = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000271 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
272 if (PyNumber_Coerce(&v, &w) != 0)
273 return NULL;
274 if ((f = v->ob_type->tp_as_number->nb_lshift) != NULL)
275 x = (*f)(v, w);
276 Py_DECREF(v);
277 Py_DECREF(w);
278 if (f != NULL)
279 return x;
280 }
281 PyErr_SetString(PyExc_TypeError, "bad operand type(s) for <<");
282 return NULL;
283}
284
285PyObject *
286PyNumber_Rshift(v, w)
287 PyObject *v, *w;
288{
289 BINOP("__rshift__", "__rrshift__", PyNumber_Rshift);
290 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000291 PyObject *x = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000292 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
293 if (PyNumber_Coerce(&v, &w) != 0)
294 return NULL;
295 if ((f = v->ob_type->tp_as_number->nb_rshift) != NULL)
296 x = (*f)(v, w);
297 Py_DECREF(v);
298 Py_DECREF(w);
299 if (f != NULL)
300 return x;
301 }
302 PyErr_SetString(PyExc_TypeError, "bad operand type(s) for >>");
303 return NULL;
304}
305
306PyObject *
307PyNumber_Add(v, w)
308 PyObject *v, *w;
309{
310 BINOP("__add__", "__radd__", PyNumber_Add);
311 if (v->ob_type->tp_as_sequence != NULL)
312 return (*v->ob_type->tp_as_sequence->sq_concat)(v, w);
313 else if (v->ob_type->tp_as_number != NULL) {
314 PyObject *x;
315 if (PyNumber_Coerce(&v, &w) != 0)
316 return NULL;
317 x = (*v->ob_type->tp_as_number->nb_add)(v, w);
318 Py_DECREF(v);
319 Py_DECREF(w);
320 return x;
321 }
322 PyErr_SetString(PyExc_TypeError, "bad operand type(s) for +");
323 return NULL;
324}
325
326PyObject *
327PyNumber_Subtract(v, w)
328 PyObject *v, *w;
329{
330 BINOP("__sub__", "__rsub__", PyNumber_Subtract);
331 if (v->ob_type->tp_as_number != NULL) {
332 PyObject *x;
333 if (PyNumber_Coerce(&v, &w) != 0)
334 return NULL;
335 x = (*v->ob_type->tp_as_number->nb_subtract)(v, w);
336 Py_DECREF(v);
337 Py_DECREF(w);
338 return x;
339 }
340 PyErr_SetString(PyExc_TypeError, "bad operand type(s) for -");
341 return NULL;
342}
343
344PyObject *
345PyNumber_Multiply(v, w)
346 PyObject *v, *w;
347{
348 PyTypeObject *tp;
349 tp = v->ob_type;
350 BINOP("__mul__", "__rmul__", PyNumber_Multiply);
351 if (tp->tp_as_number != NULL &&
352 w->ob_type->tp_as_sequence != NULL &&
353 !PyInstance_Check(v)) {
354 /* number*sequence -- swap v and w */
355 PyObject *tmp = v;
356 v = w;
357 w = tmp;
358 tp = v->ob_type;
359 }
360 if (tp->tp_as_number != NULL) {
361 PyObject *x;
362 if (PyInstance_Check(v)) {
363 /* Instances of user-defined classes get their
364 other argument uncoerced, so they may
365 implement sequence*number as well as
366 number*number. */
367 Py_INCREF(v);
368 Py_INCREF(w);
369 }
370 else if (PyNumber_Coerce(&v, &w) != 0)
371 return NULL;
372 x = (*v->ob_type->tp_as_number->nb_multiply)(v, w);
373 Py_DECREF(v);
374 Py_DECREF(w);
375 return x;
376 }
377 if (tp->tp_as_sequence != NULL) {
378 if (!PyInt_Check(w)) {
379 PyErr_SetString(PyExc_TypeError,
380 "can't multiply sequence with non-int");
381 return NULL;
382 }
383 return (*tp->tp_as_sequence->sq_repeat)
384 (v, (int)PyInt_AsLong(w));
385 }
386 PyErr_SetString(PyExc_TypeError, "bad operand type(s) for *");
387 return NULL;
388}
389
390PyObject *
391PyNumber_Divide(v, w)
392 PyObject *v, *w;
393{
394 BINOP("__div__", "__rdiv__", PyNumber_Divide);
395 if (v->ob_type->tp_as_number != NULL) {
396 PyObject *x;
397 if (PyNumber_Coerce(&v, &w) != 0)
398 return NULL;
399 x = (*v->ob_type->tp_as_number->nb_divide)(v, w);
400 Py_DECREF(v);
401 Py_DECREF(w);
402 return x;
403 }
404 PyErr_SetString(PyExc_TypeError, "bad operand type(s) for /");
405 return NULL;
406}
407
408PyObject *
409PyNumber_Remainder(v, w)
410 PyObject *v, *w;
411{
412 if (PyString_Check(v)) {
413 return PyString_Format(v, w);
414 }
415 BINOP("__mod__", "__rmod__", PyNumber_Remainder);
416 if (v->ob_type->tp_as_number != NULL) {
417 PyObject *x;
418 if (PyNumber_Coerce(&v, &w) != 0)
419 return NULL;
420 x = (*v->ob_type->tp_as_number->nb_remainder)(v, w);
421 Py_DECREF(v);
422 Py_DECREF(w);
423 return x;
424 }
425 PyErr_SetString(PyExc_TypeError, "bad operand type(s) for %");
426 return NULL;
427}
428
429PyObject *
430PyNumber_Divmod(v, w)
431 PyObject *v, *w;
432{
433 PyObject *res;
434
435 if (PyInstance_Check(v) || PyInstance_Check(w))
436 return PyInstance_DoBinOp(v, w, "__divmod__", "__rdivmod__",
437 PyNumber_Divmod);
438 if (v->ob_type->tp_as_number == NULL ||
439 w->ob_type->tp_as_number == NULL) {
440 PyErr_SetString(PyExc_TypeError,
441 "divmod() requires numeric or class instance arguments");
442 return NULL;
443 }
444 if (PyNumber_Coerce(&v, &w) != 0)
445 return NULL;
446 res = (*v->ob_type->tp_as_number->nb_divmod)(v, w);
447 Py_DECREF(v);
448 Py_DECREF(w);
449 return res;
450}
451
452
453static PyObject *
454do_pow(v, w)
455 PyObject *v, *w;
456{
457 PyObject *res;
458 if (PyInstance_Check(v) || PyInstance_Check(w))
459 return PyInstance_DoBinOp(v, w, "__pow__", "__rpow__", do_pow);
460 if (v->ob_type->tp_as_number == NULL ||
461 w->ob_type->tp_as_number == NULL) {
462 PyErr_SetString(PyExc_TypeError,
463 "pow() requires numeric arguments");
464 return NULL;
465 }
466 if (PyFloat_Check(w) && PyFloat_AsDouble(v) < 0.0) {
467 if (!PyErr_Occurred())
468 PyErr_SetString(PyExc_ValueError,
469 "negative number to float power");
470 return NULL;
471 }
472 if (PyNumber_Coerce(&v, &w) != 0)
473 return NULL;
474 res = (*v->ob_type->tp_as_number->nb_power)(v, w, Py_None);
475 Py_DECREF(v);
476 Py_DECREF(w);
477 return res;
478}
479
480PyObject *
481PyNumber_Power(v,w,z)
482 PyObject *v, *w, *z;
483{
484 PyObject *res;
485 PyObject *v1, *z1, *w2, *z2;
486
487 if (z == Py_None)
488 return do_pow(v, w);
489 /* XXX The ternary version doesn't do class instance coercions */
490 if (PyInstance_Check(v))
491 return v->ob_type->tp_as_number->nb_power(v, w, z);
492 if (v->ob_type->tp_as_number == NULL ||
493 z->ob_type->tp_as_number == NULL ||
494 w->ob_type->tp_as_number == NULL) {
495 PyErr_SetString(PyExc_TypeError, "pow() requires numeric arguments");
496 return NULL;
497 }
498 if (PyNumber_Coerce(&v, &w) != 0)
499 return NULL;
500 res = NULL;
501 v1 = v;
502 z1 = z;
503 if (PyNumber_Coerce(&v1, &z1) != 0)
504 goto error2;
505 w2 = w;
506 z2 = z1;
507 if (PyNumber_Coerce(&w2, &z2) != 0)
508 goto error1;
509 res = (*v1->ob_type->tp_as_number->nb_power)(v1, w2, z2);
510 Py_DECREF(w2);
511 Py_DECREF(z2);
512 error1:
513 Py_DECREF(v1);
514 Py_DECREF(z1);
515 error2:
516 Py_DECREF(v);
517 Py_DECREF(w);
518 return res;
519}
520
521
522PyObject *
523PyNumber_Negative(v)
524 PyObject *v;
525{
526 if (v->ob_type->tp_as_number != NULL)
527 return (*v->ob_type->tp_as_number->nb_negative)(v);
528 PyErr_SetString(PyExc_TypeError, "bad operand type(s) for unary -");
529 return NULL;
530}
531
532PyObject *
533PyNumber_Positive(v)
534 PyObject *v;
535{
536 if (v->ob_type->tp_as_number != NULL)
537 return (*v->ob_type->tp_as_number->nb_positive)(v);
538 PyErr_SetString(PyExc_TypeError, "bad operand type(s) for unary +");
539 return NULL;
540}
541
542PyObject *
543PyNumber_Invert(v)
544 PyObject *v;
545{
546 PyObject * (*f) Py_FPROTO((PyObject *));
547 if (v->ob_type->tp_as_number != NULL &&
548 (f = v->ob_type->tp_as_number->nb_invert) != NULL)
549 return (*f)(v);
550 PyErr_SetString(PyExc_TypeError, "bad operand type(s) for unary ~");
551 return NULL;
552}
553
554PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000555PyNumber_Absolute(o)
556 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000557{
558 PyNumberMethods *m;
559
560 if(! o) return Py_ReturnNullError();
561 if((m=o->ob_type->tp_as_number) && m->nb_absolute)
562 return m->nb_absolute(o);
563
564 return Py_ReturnMethodError("__abs__");
565}
566
567PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000568PyNumber_Int(o)
569 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000570{
571 PyNumberMethods *m;
572
573 if(! o) return Py_ReturnNullError();
574 if((m=o->ob_type->tp_as_number) && m->nb_int)
575 return m->nb_int(o);
576
577 return Py_ReturnMethodError("__int__");
578}
579
580PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000581PyNumber_Long(o)
582 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000583{
584 PyNumberMethods *m;
585
586 if(! o) return Py_ReturnNullError();
587 if((m=o->ob_type->tp_as_number) && m->nb_long)
588 return m->nb_long(o);
589
590 return Py_ReturnMethodError("__long__");
591}
592
593PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000594PyNumber_Float(o)
595 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000596{
597 PyNumberMethods *m;
598
599 if(! o) return Py_ReturnNullError();
600 if((m=o->ob_type->tp_as_number) && m->nb_float)
601 return m->nb_float(o);
602
603 return Py_ReturnMethodError("__float__");
604}
605
606
607int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000608PySequence_Check(o)
609 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000610{
611 return o && o->ob_type->tp_as_sequence;
612}
613
614int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000615PySequence_Length(s)
616 PyObject *s;
Guido van Rossume15dee51995-07-18 14:12:02 +0000617{
618 PySequenceMethods *m;
619
620 if(! s) return Py_ReturnNullError(),-1;
621
622 if((m=s->ob_type->tp_as_sequence) && m->sq_length)
623 return m->sq_length(s);
624
625 Py_ReturnMethodError("__len__");
626 return -1;
627}
628
629PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000630PySequence_Concat(s, o)
631 PyObject *s;
632 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000633{
634 PySequenceMethods *m;
635
636 if(! s || ! o) return Py_ReturnNullError();
637
638 if((m=s->ob_type->tp_as_sequence) && m->sq_concat)
639 return m->sq_concat(s,o);
640
641 return Py_ReturnMethodError("__concat__");
642}
643
644PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000645PySequence_Repeat(o, count)
646 PyObject *o;
647 int count;
Guido van Rossume15dee51995-07-18 14:12:02 +0000648{
649 PySequenceMethods *m;
650
651 if(! o) return Py_ReturnNullError();
652
653 if((m=o->ob_type->tp_as_sequence) && m->sq_repeat)
654 return m->sq_repeat(o,count);
655
656 return Py_ReturnMethodError("__repeat__");
657}
658
659PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000660PySequence_GetItem(s, i)
661 PyObject *s;
662 int i;
Guido van Rossume15dee51995-07-18 14:12:02 +0000663{
664 PySequenceMethods *m;
665 int l;
666
667 if(! s) return Py_ReturnNullError();
668
Guido van Rossum08ef9d91996-11-09 22:32:05 +0000669 if(! ((m=s->ob_type->tp_as_sequence) && m->sq_item))
Guido van Rossume15dee51995-07-18 14:12:02 +0000670 return Py_ReturnMethodError("__getitem__");
671
Guido van Rossum08ef9d91996-11-09 22:32:05 +0000672 if(i < 0)
673 {
Guido van Rossum4669fb41997-04-02 05:31:09 +0000674 if(! m->sq_length || 0 > (l=m->sq_length(s))) return NULL;
Guido van Rossum08ef9d91996-11-09 22:32:05 +0000675 i += l;
676 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000677
678 return m->sq_item(s,i);
679}
680
681PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000682PySequence_GetSlice(s, i1, i2)
683 PyObject *s;
684 int i1;
685 int i2;
Guido van Rossume15dee51995-07-18 14:12:02 +0000686{
687 PySequenceMethods *m;
688 int l;
689
690 if(! s) return Py_ReturnNullError();
691
Guido van Rossum4669fb41997-04-02 05:31:09 +0000692 if(! ((m=s->ob_type->tp_as_sequence) && m->sq_slice))
Guido van Rossume15dee51995-07-18 14:12:02 +0000693 return Py_ReturnMethodError("__getslice__");
694
Guido van Rossum4669fb41997-04-02 05:31:09 +0000695 if(i1 < 0 || i2 < 0)
696 {
Guido van Rossume15dee51995-07-18 14:12:02 +0000697
Guido van Rossum4669fb41997-04-02 05:31:09 +0000698 if(! m->sq_length || 0 > (l=m->sq_length(s))) return NULL;
699
700 if(i1 < 0) i1 += l;
701 if(i2 < 0) i2 += l;
702 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000703
704 return m->sq_slice(s,i1,i2);
705}
706
707int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000708PySequence_SetItem(s, i, o)
709 PyObject *s;
710 int i;
711 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000712{
713 PySequenceMethods *m;
714 int l;
715 if(! s) return Py_ReturnNullError(),-1;
716
717 if(! ((m=s->ob_type->tp_as_sequence) && m->sq_length && m->sq_ass_item))
718 return Py_ReturnMethodError("__setitem__"),-1;
719
720 if(i < 0)
721 {
722 if(0 > (l=m->sq_length(s))) return -1;
723 i += l;
724 }
725
726 return m->sq_ass_item(s,i,o);
727}
728
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000729int
730PySequence_DelItem(s, i)
731 PyObject *s;
732 int i;
733{
734 PySequenceMethods *m;
735 int l;
736 if(! s) return Py_ReturnNullError(),-1;
737
738 if(! ((m=s->ob_type->tp_as_sequence) && m->sq_length && m->sq_ass_item))
739 return Py_ReturnMethodError("__delitem__"),-1;
740
741 if(i < 0)
742 {
743 if(0 > (l=m->sq_length(s))) return -1;
744 i += l;
745 }
746
747 return m->sq_ass_item(s,i,(PyObject*)NULL);
748}
749
Guido van Rossume15dee51995-07-18 14:12:02 +0000750int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000751PySequence_SetSlice(s, i1, i2, o)
752 PyObject *s;
753 int i1;
754 int i2;
755 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000756{
757 PySequenceMethods *m;
758 int l;
759
760 if(! s) return Py_ReturnNullError(),-1;
761
762 if(! ((m=s->ob_type->tp_as_sequence) && m->sq_length && m->sq_ass_slice))
763 return Py_ReturnMethodError("__setslice__"),-1;
764
765 if(0 > (l=m->sq_length(s))) return -1;
766
767 if(i1 < 0) i1 += l;
768 if(i2 < 0) i2 += l;
769
770 return m->sq_ass_slice(s,i1,i2,o);
771}
772
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000773int
774PySequence_DelSlice(s, i1, i2)
775 PyObject *s;
776 int i1;
777 int i2;
778{
779 PySequenceMethods *m;
780 int l;
781
782 if(! s) return Py_ReturnNullError(),-1;
783
784 if(! ((m=s->ob_type->tp_as_sequence) && m->sq_length && m->sq_ass_slice))
785 return Py_ReturnMethodError("__delslice__"),-1;
786
787 if(0 > (l=m->sq_length(s))) return -1;
788
789 if(i1 < 0) i1 += l;
790 if(i2 < 0) i2 += l;
791
792 return m->sq_ass_slice(s,i1,i2,(PyObject*)NULL);
793}
794
Guido van Rossume15dee51995-07-18 14:12:02 +0000795PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000796PySequence_Tuple(s)
797 PyObject *s;
Guido van Rossume15dee51995-07-18 14:12:02 +0000798{
799 int l, i;
800 PyObject *t, *item;
801
802 if(! s) return Py_ReturnNullError();
803
804 Py_TRY((l=PySequence_Length(s)) != -1);
805 Py_TRY(t=PyTuple_New(l));
806
807 for(i=0; i < l; i++)
808 {
Guido van Rossume61093c1997-05-14 18:43:29 +0000809 if(!(item=PySequence_GetItem(s,i)) ||
Guido van Rossum4669fb41997-04-02 05:31:09 +0000810 PyTuple_SetItem(t,i,item) == -1)
Guido van Rossume15dee51995-07-18 14:12:02 +0000811 {
812 Py_DECREF(t);
813 return NULL;
814 }
815 }
816 return t;
817}
818
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000819PyObject *
820PySequence_List(s)
821 PyObject *s;
822{
823 int l, i;
824 PyObject *t, *item;
Guido van Rossum4669fb41997-04-02 05:31:09 +0000825
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000826 if(! s) return Py_ReturnNullError();
Guido van Rossum4669fb41997-04-02 05:31:09 +0000827
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000828 Py_TRY((l=PySequence_Length(s)) != -1);
829 Py_TRY(t=PyList_New(l));
Guido van Rossum4669fb41997-04-02 05:31:09 +0000830
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000831 for(i=0; i < l; i++)
832 {
Guido van Rossume61093c1997-05-14 18:43:29 +0000833 if(!(item=PySequence_GetItem(s,i)) ||
Guido van Rossum4669fb41997-04-02 05:31:09 +0000834 PyList_SetItem(t,i,item) == -1)
835 {
836 Py_DECREF(t);
837 return NULL;
838 }
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000839 }
840 return t;
841}
842
Guido van Rossume15dee51995-07-18 14:12:02 +0000843int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000844PySequence_Count(s, o)
845 PyObject *s;
846 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000847{
848 int l, i, n=0, not_equal, err;
849 PyObject *item;
850
851 if(! s || ! o) return Py_ReturnNullError(), -1;
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000852 if((l=PySequence_Length(s)) == -1) return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000853
854 for(i=0; i < l; i++)
855 {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000856 if((item=PySequence_GetItem(s,i)) == NULL) return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000857 err=PyObject_Cmp(item,o,&not_equal) == -1;
858 Py_DECREF(item);
859 if(err) return -1;
860 n += ! not_equal;
861 }
862 return n;
863}
864
865int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000866PySequence_In(s, o)
867 PyObject *s;
868 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000869{
870 int l, i, not_equal, err;
871 PyObject *item;
872
873 if(! o || ! s) return Py_ReturnNullError(), -1;
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000874 if((l=PySequence_Length(s)) == -1) return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000875
876 for(i=0; i < l; i++)
877 {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000878 if((item=PySequence_GetItem(s,i)) == NULL) return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000879 err=PyObject_Cmp(item,o,&not_equal) == -1;
880 Py_DECREF(item);
881 if(err) return -1;
882 if(! not_equal) return 1;
883 }
884 return 0;
885}
886
887int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000888PySequence_Index(s, o)
889 PyObject *s;
890 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000891{
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000892 int l, i, not_equal, err;
Guido van Rossume15dee51995-07-18 14:12:02 +0000893 PyObject *item;
894
895 if(! s || ! o) return Py_ReturnNullError(), -1;
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000896 if((l=PySequence_Length(s)) == -1) return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000897
898 for(i=0; i < l; i++)
899 {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000900 if((item=PySequence_GetItem(s,i)) == NULL) return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000901 err=PyObject_Cmp(item,o,&not_equal) == -1;
902 Py_DECREF(item);
903 if(err) return -1;
Guido van Rossum8dbcdd01996-11-06 15:31:46 +0000904 if(! not_equal) return i;
Guido van Rossume15dee51995-07-18 14:12:02 +0000905 }
Barry Warsawf90edde1996-12-18 19:32:18 +0000906 PyErr_SetString(PyExc_ValueError, "list.index(x): x not in list");
Guido van Rossume15dee51995-07-18 14:12:02 +0000907 return -1;
908}
909
910int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000911PyMapping_Check(o)
912 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000913{
914 return o && o->ob_type->tp_as_mapping;
915}
916
917int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000918PyMapping_Length(s)
919 PyObject *s;
Guido van Rossume15dee51995-07-18 14:12:02 +0000920{
921 PyMappingMethods *m;
922
923 if(! s) return Py_ReturnNullError(),-1;
924
925 if((m=s->ob_type->tp_as_mapping) && m->mp_length)
926 return m->mp_length(s);
927
928 Py_ReturnMethodError("__len__");
929 return -1;
930}
931
932int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000933PyMapping_HasKeyString(o, key)
934 PyObject *o;
935 char *key;
Guido van Rossume15dee51995-07-18 14:12:02 +0000936{
937 PyObject *v;
938
939 v=PyMapping_GetItemString(o,key);
Guido van Rossum4669fb41997-04-02 05:31:09 +0000940 if(v) {
941 Py_DECREF(v);
942 return 1;
943 }
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000944 PyErr_Clear();
Guido van Rossume15dee51995-07-18 14:12:02 +0000945 return 0;
946}
947
948int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000949PyMapping_HasKey(o, key)
950 PyObject *o;
951 PyObject *key;
Guido van Rossume15dee51995-07-18 14:12:02 +0000952{
953 PyObject *v;
954
955 v=PyObject_GetItem(o,key);
Guido van Rossum4669fb41997-04-02 05:31:09 +0000956 if(v) {
957 Py_DECREF(v);
958 return 1;
959 }
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000960 PyErr_Clear();
Guido van Rossume15dee51995-07-18 14:12:02 +0000961 return 0;
962}
963
964PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000965PyObject_CallObject(o, a)
966 PyObject *o, *a;
Guido van Rossume15dee51995-07-18 14:12:02 +0000967{
968 PyObject *r;
969
970 if(a) return PyEval_CallObject(o,a);
971
972 if(! (a=PyTuple_New(0)))
973 return NULL;
974 r=PyEval_CallObject(o,a);
975 Py_DECREF(a);
976 return r;
977}
978
979PyObject *
980#ifdef HAVE_STDARG_PROTOTYPES
981/* VARARGS 2 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000982PyObject_CallFunction(PyObject *PyCallable_Check, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +0000983#else
984/* VARARGS */
985PyObject_CallFunction(va_alist) va_dcl
986#endif
987{
988 va_list va;
989 PyObject *args, *retval;
990#ifdef HAVE_STDARG_PROTOTYPES
991 va_start(va, format);
992#else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000993 PyObject *PyCallable_Check;
Guido van Rossume15dee51995-07-18 14:12:02 +0000994 char *format;
995 va_start(va);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000996 PyCallable_Check = va_arg(va, PyObject *);
Guido van Rossume15dee51995-07-18 14:12:02 +0000997 format = va_arg(va, char *);
998#endif
999
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001000 if( ! PyCallable_Check)
Guido van Rossume15dee51995-07-18 14:12:02 +00001001 {
1002 va_end(va);
1003 return Py_ReturnNullError();
1004 }
1005
1006 if(format)
1007 args = Py_VaBuildValue(format, va);
1008 else
1009 args = PyTuple_New(0);
1010
1011 va_end(va);
1012 if(! args) return NULL;
1013
1014 if(! PyTuple_Check(args))
1015 {
1016 PyObject *a;
1017
1018 Py_TRY(a=PyTuple_New(1));
1019 Py_TRY(PyTuple_SetItem(a,0,args) != -1);
1020 args=a;
1021 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001022 retval = PyObject_CallObject(PyCallable_Check,args);
Guido van Rossume15dee51995-07-18 14:12:02 +00001023 Py_DECREF(args);
1024 return retval;
1025}
1026
1027PyObject *
1028#ifdef HAVE_STDARG_PROTOTYPES
1029/* VARARGS 2 */
1030PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
1031#else
1032/* VARARGS */
1033PyObject_CallMethod(va_alist) va_dcl
1034#endif
1035{
1036 va_list va;
Guido van Rossuma9040ec1997-05-20 22:09:08 +00001037 PyObject *args, *func=0, *retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001038#ifdef HAVE_STDARG_PROTOTYPES
1039 va_start(va, format);
1040#else
1041 PyObject *o;
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001042 char *name;
Guido van Rossume15dee51995-07-18 14:12:02 +00001043 char *format;
1044 va_start(va);
1045 o = va_arg(va, PyObject *);
1046 name = va_arg(va, char *);
1047 format = va_arg(va, char *);
1048#endif
1049
1050 if( ! o || ! name)
1051 {
1052 va_end(va);
1053 return Py_ReturnNullError();
1054 }
1055
Guido van Rossuma9040ec1997-05-20 22:09:08 +00001056 func=PyObject_GetAttrString(o,name);
1057 if(! func)
Guido van Rossume15dee51995-07-18 14:12:02 +00001058 {
1059 va_end(va);
1060 PyErr_SetString(PyExc_AttributeError,name);
1061 return 0;
1062 }
1063
Guido van Rossuma9040ec1997-05-20 22:09:08 +00001064 if(! (PyCallable_Check(func)))
Guido van Rossume15dee51995-07-18 14:12:02 +00001065 {
1066 va_end(va);
1067 PyErr_SetString(PyExc_TypeError,"call of non-callable attribute");
1068 return 0;
1069 }
1070
Guido van Rossum336c6991996-09-30 22:00:50 +00001071 if(format && *format)
Guido van Rossume15dee51995-07-18 14:12:02 +00001072 args = Py_VaBuildValue(format, va);
1073 else
1074 args = PyTuple_New(0);
1075
1076 va_end(va);
1077
1078 if(! args) return NULL;
1079
1080 if(! PyTuple_Check(args))
1081 {
1082 PyObject *a;
1083
1084 Py_TRY(a=PyTuple_New(1));
1085 Py_TRY(PyTuple_SetItem(a,0,args) != -1);
1086 args=a;
1087 }
1088
Guido van Rossuma9040ec1997-05-20 22:09:08 +00001089 retval = PyObject_CallObject(func,args);
Guido van Rossume15dee51995-07-18 14:12:02 +00001090 Py_DECREF(args);
Guido van Rossuma9040ec1997-05-20 22:09:08 +00001091 Py_DECREF(func);
Guido van Rossume15dee51995-07-18 14:12:02 +00001092 return retval;
1093}
1094
1095PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001096PyMapping_GetItemString(o, key)
1097 PyObject *o;
1098 char *key;
Guido van Rossume15dee51995-07-18 14:12:02 +00001099{
1100 PyObject *okey, *r;
1101
1102 if( ! key) return Py_ReturnNullError();
1103 Py_TRY(okey=PyString_FromString(key));
1104 r = PyObject_GetItem(o,okey);
1105 Py_DECREF(okey);
1106 return r;
1107}
1108
1109int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001110PyMapping_SetItemString(o, key, value)
1111 PyObject *o;
1112 char *key;
1113 PyObject *value;
Guido van Rossume15dee51995-07-18 14:12:02 +00001114{
1115 PyObject *okey;
1116 int r;
1117
1118 if( ! key) return Py_ReturnNullError(),-1;
1119 if (!(okey=PyString_FromString(key))) return -1;
1120 r = PyObject_SetItem(o,okey,value);
1121 Py_DECREF(okey);
1122 return r;
1123}