blob: a8823eb5a2308c7439c75770e6381507baffde1b [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 {
674 if(0 > (l=m->sq_length(s))) return NULL;
675 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
692 if(! ((m=s->ob_type->tp_as_sequence) && m->sq_length && m->sq_slice))
693 return Py_ReturnMethodError("__getslice__");
694
695 if(0 > (l=m->sq_length(s))) return NULL;
696
697 if(i1 < 0) i1 += l;
698 if(i2 < 0) i2 += l;
699
700 return m->sq_slice(s,i1,i2);
701}
702
703int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000704PySequence_SetItem(s, i, o)
705 PyObject *s;
706 int i;
707 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000708{
709 PySequenceMethods *m;
710 int l;
711 if(! s) return Py_ReturnNullError(),-1;
712
713 if(! ((m=s->ob_type->tp_as_sequence) && m->sq_length && m->sq_ass_item))
714 return Py_ReturnMethodError("__setitem__"),-1;
715
716 if(i < 0)
717 {
718 if(0 > (l=m->sq_length(s))) return -1;
719 i += l;
720 }
721
722 return m->sq_ass_item(s,i,o);
723}
724
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000725int
726PySequence_DelItem(s, i)
727 PyObject *s;
728 int i;
729{
730 PySequenceMethods *m;
731 int l;
732 if(! s) return Py_ReturnNullError(),-1;
733
734 if(! ((m=s->ob_type->tp_as_sequence) && m->sq_length && m->sq_ass_item))
735 return Py_ReturnMethodError("__delitem__"),-1;
736
737 if(i < 0)
738 {
739 if(0 > (l=m->sq_length(s))) return -1;
740 i += l;
741 }
742
743 return m->sq_ass_item(s,i,(PyObject*)NULL);
744}
745
Guido van Rossume15dee51995-07-18 14:12:02 +0000746int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000747PySequence_SetSlice(s, i1, i2, o)
748 PyObject *s;
749 int i1;
750 int i2;
751 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000752{
753 PySequenceMethods *m;
754 int l;
755
756 if(! s) return Py_ReturnNullError(),-1;
757
758 if(! ((m=s->ob_type->tp_as_sequence) && m->sq_length && m->sq_ass_slice))
759 return Py_ReturnMethodError("__setslice__"),-1;
760
761 if(0 > (l=m->sq_length(s))) return -1;
762
763 if(i1 < 0) i1 += l;
764 if(i2 < 0) i2 += l;
765
766 return m->sq_ass_slice(s,i1,i2,o);
767}
768
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000769int
770PySequence_DelSlice(s, i1, i2)
771 PyObject *s;
772 int i1;
773 int i2;
774{
775 PySequenceMethods *m;
776 int l;
777
778 if(! s) return Py_ReturnNullError(),-1;
779
780 if(! ((m=s->ob_type->tp_as_sequence) && m->sq_length && m->sq_ass_slice))
781 return Py_ReturnMethodError("__delslice__"),-1;
782
783 if(0 > (l=m->sq_length(s))) return -1;
784
785 if(i1 < 0) i1 += l;
786 if(i2 < 0) i2 += l;
787
788 return m->sq_ass_slice(s,i1,i2,(PyObject*)NULL);
789}
790
Guido van Rossume15dee51995-07-18 14:12:02 +0000791PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000792PySequence_Tuple(s)
793 PyObject *s;
Guido van Rossume15dee51995-07-18 14:12:02 +0000794{
795 int l, i;
796 PyObject *t, *item;
797
798 if(! s) return Py_ReturnNullError();
799
800 Py_TRY((l=PySequence_Length(s)) != -1);
801 Py_TRY(t=PyTuple_New(l));
802
803 for(i=0; i < l; i++)
804 {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000805 if((item=PySequence_GetItem(s,i)))
Guido van Rossume15dee51995-07-18 14:12:02 +0000806 {
807 if(PyTuple_SetItem(t,i,item) == -1)
808 {
809 Py_DECREF(item);
810 Py_DECREF(t);
811 return NULL;
812 }
813 }
814 else
815 {
816 Py_DECREF(t);
817 return NULL;
818 }
819 }
820 return t;
821}
822
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000823PyObject *
824PySequence_List(s)
825 PyObject *s;
826{
827 int l, i;
828 PyObject *t, *item;
829 if(! s) return Py_ReturnNullError();
830 Py_TRY((l=PySequence_Length(s)) != -1);
831 Py_TRY(t=PyList_New(l));
832 for(i=0; i < l; i++)
833 {
834 if((item=PySequence_GetItem(s,i)))
835 {
836 if(PyList_SetItem(t,i,item) == -1)
837 {
838 Py_DECREF(item);
839 Py_DECREF(t);
840 return NULL;
841 }
842 }
843 else
844 {
845 Py_DECREF(t);
846 return NULL;
847 }
848 }
849 return t;
850}
851
Guido van Rossume15dee51995-07-18 14:12:02 +0000852int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000853PySequence_Count(s, o)
854 PyObject *s;
855 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000856{
857 int l, i, n=0, not_equal, err;
858 PyObject *item;
859
860 if(! s || ! o) return Py_ReturnNullError(), -1;
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000861 if((l=PySequence_Length(s)) == -1) return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000862
863 for(i=0; i < l; i++)
864 {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000865 if((item=PySequence_GetItem(s,i)) == NULL) return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000866 err=PyObject_Cmp(item,o,&not_equal) == -1;
867 Py_DECREF(item);
868 if(err) return -1;
869 n += ! not_equal;
870 }
871 return n;
872}
873
874int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000875PySequence_In(s, o)
876 PyObject *s;
877 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000878{
879 int l, i, not_equal, err;
880 PyObject *item;
881
882 if(! o || ! s) return Py_ReturnNullError(), -1;
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000883 if((l=PySequence_Length(s)) == -1) return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000884
885 for(i=0; i < l; i++)
886 {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000887 if((item=PySequence_GetItem(s,i)) == NULL) return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000888 err=PyObject_Cmp(item,o,&not_equal) == -1;
889 Py_DECREF(item);
890 if(err) return -1;
891 if(! not_equal) return 1;
892 }
893 return 0;
894}
895
896int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000897PySequence_Index(s, o)
898 PyObject *s;
899 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000900{
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000901 int l, i, not_equal, err;
Guido van Rossume15dee51995-07-18 14:12:02 +0000902 PyObject *item;
903
904 if(! s || ! o) return Py_ReturnNullError(), -1;
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000905 if((l=PySequence_Length(s)) == -1) return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000906
907 for(i=0; i < l; i++)
908 {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000909 if((item=PySequence_GetItem(s,i)) == NULL) return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000910 err=PyObject_Cmp(item,o,&not_equal) == -1;
911 Py_DECREF(item);
912 if(err) return -1;
Guido van Rossum8dbcdd01996-11-06 15:31:46 +0000913 if(! not_equal) return i;
Guido van Rossume15dee51995-07-18 14:12:02 +0000914 }
915 return -1;
916}
917
918int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000919PyMapping_Check(o)
920 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000921{
922 return o && o->ob_type->tp_as_mapping;
923}
924
925int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000926PyMapping_Length(s)
927 PyObject *s;
Guido van Rossume15dee51995-07-18 14:12:02 +0000928{
929 PyMappingMethods *m;
930
931 if(! s) return Py_ReturnNullError(),-1;
932
933 if((m=s->ob_type->tp_as_mapping) && m->mp_length)
934 return m->mp_length(s);
935
936 Py_ReturnMethodError("__len__");
937 return -1;
938}
939
940int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000941PyMapping_HasKeyString(o, key)
942 PyObject *o;
943 char *key;
Guido van Rossume15dee51995-07-18 14:12:02 +0000944{
945 PyObject *v;
946
947 v=PyMapping_GetItemString(o,key);
948 if(v) return 1;
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000949 PyErr_Clear();
Guido van Rossume15dee51995-07-18 14:12:02 +0000950 return 0;
951}
952
953int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000954PyMapping_HasKey(o, key)
955 PyObject *o;
956 PyObject *key;
Guido van Rossume15dee51995-07-18 14:12:02 +0000957{
958 PyObject *v;
959
960 v=PyObject_GetItem(o,key);
961 if(v) return 1;
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000962 PyErr_Clear();
Guido van Rossume15dee51995-07-18 14:12:02 +0000963 return 0;
964}
965
966PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000967PyObject_CallObject(o, a)
968 PyObject *o, *a;
Guido van Rossume15dee51995-07-18 14:12:02 +0000969{
970 PyObject *r;
971
972 if(a) return PyEval_CallObject(o,a);
973
974 if(! (a=PyTuple_New(0)))
975 return NULL;
976 r=PyEval_CallObject(o,a);
977 Py_DECREF(a);
978 return r;
979}
980
981PyObject *
982#ifdef HAVE_STDARG_PROTOTYPES
983/* VARARGS 2 */
984PyObject_CallFunction(PyObject *callable, char *format, ...)
985#else
986/* VARARGS */
987PyObject_CallFunction(va_alist) va_dcl
988#endif
989{
990 va_list va;
991 PyObject *args, *retval;
992#ifdef HAVE_STDARG_PROTOTYPES
993 va_start(va, format);
994#else
995 PyObject *callable;
996 char *format;
997 va_start(va);
998 callable = va_arg(va, PyObject *);
999 format = va_arg(va, char *);
1000#endif
1001
1002 if( ! callable)
1003 {
1004 va_end(va);
1005 return Py_ReturnNullError();
1006 }
1007
1008 if(format)
1009 args = Py_VaBuildValue(format, va);
1010 else
1011 args = PyTuple_New(0);
1012
1013 va_end(va);
1014 if(! args) return NULL;
1015
1016 if(! PyTuple_Check(args))
1017 {
1018 PyObject *a;
1019
1020 Py_TRY(a=PyTuple_New(1));
1021 Py_TRY(PyTuple_SetItem(a,0,args) != -1);
1022 args=a;
1023 }
1024 retval = PyObject_CallObject(callable,args);
1025 Py_DECREF(args);
1026 return retval;
1027}
1028
1029PyObject *
1030#ifdef HAVE_STDARG_PROTOTYPES
1031/* VARARGS 2 */
1032PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
1033#else
1034/* VARARGS */
1035PyObject_CallMethod(va_alist) va_dcl
1036#endif
1037{
1038 va_list va;
1039 PyObject *args, *method=0, *retval;
1040#ifdef HAVE_STDARG_PROTOTYPES
1041 va_start(va, format);
1042#else
1043 PyObject *o;
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001044 char *name;
Guido van Rossume15dee51995-07-18 14:12:02 +00001045 char *format;
1046 va_start(va);
1047 o = va_arg(va, PyObject *);
1048 name = va_arg(va, char *);
1049 format = va_arg(va, char *);
1050#endif
1051
1052 if( ! o || ! name)
1053 {
1054 va_end(va);
1055 return Py_ReturnNullError();
1056 }
1057
1058 method=PyObject_GetAttrString(o,name);
1059 if(! method)
1060 {
1061 va_end(va);
1062 PyErr_SetString(PyExc_AttributeError,name);
1063 return 0;
1064 }
1065
1066 if(! (PyCallable_Check(method)))
1067 {
1068 va_end(va);
1069 PyErr_SetString(PyExc_TypeError,"call of non-callable attribute");
1070 return 0;
1071 }
1072
Guido van Rossum336c6991996-09-30 22:00:50 +00001073 if(format && *format)
Guido van Rossume15dee51995-07-18 14:12:02 +00001074 args = Py_VaBuildValue(format, va);
1075 else
1076 args = PyTuple_New(0);
1077
1078 va_end(va);
1079
1080 if(! args) return NULL;
1081
1082 if(! PyTuple_Check(args))
1083 {
1084 PyObject *a;
1085
1086 Py_TRY(a=PyTuple_New(1));
1087 Py_TRY(PyTuple_SetItem(a,0,args) != -1);
1088 args=a;
1089 }
1090
1091 retval = PyObject_CallObject(method,args);
1092 Py_DECREF(args);
1093 Py_DECREF(method);
1094 return retval;
1095}
1096
1097PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001098PyMapping_GetItemString(o, key)
1099 PyObject *o;
1100 char *key;
Guido van Rossume15dee51995-07-18 14:12:02 +00001101{
1102 PyObject *okey, *r;
1103
1104 if( ! key) return Py_ReturnNullError();
1105 Py_TRY(okey=PyString_FromString(key));
1106 r = PyObject_GetItem(o,okey);
1107 Py_DECREF(okey);
1108 return r;
1109}
1110
1111int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001112PyMapping_SetItemString(o, key, value)
1113 PyObject *o;
1114 char *key;
1115 PyObject *value;
Guido van Rossume15dee51995-07-18 14:12:02 +00001116{
1117 PyObject *okey;
1118 int r;
1119
1120 if( ! key) return Py_ReturnNullError(),-1;
1121 if (!(okey=PyString_FromString(key))) return -1;
1122 r = PyObject_SetItem(o,okey,value);
1123 Py_DECREF(okey);
1124 return r;
1125}