blob: bb197a5796970d765b6bf5e66ad959d6f43f9db5 [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
49PyObject *
50Py_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
161 PyErr_SetString(PyExc_TypeError,"expeced integer index");
162 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
179 PyErr_SetString(PyExc_TypeError,"expeced integer index");
180 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) {
205 PyObject *x;
206 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) {
228 PyObject *x;
229 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) {
249 PyObject *x;
250 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) {
270 PyObject *x;
271 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) {
291 PyObject *x;
292 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
669 if(! ((m=s->ob_type->tp_as_sequence) && m->sq_length && m->sq_item))
670 return Py_ReturnMethodError("__getitem__");
671
672 if(0 > (l=m->sq_length(s))) return NULL;
673
674 if(i < 0) i += l;
675
676 return m->sq_item(s,i);
677}
678
679PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000680PySequence_GetSlice(s, i1, i2)
681 PyObject *s;
682 int i1;
683 int i2;
Guido van Rossume15dee51995-07-18 14:12:02 +0000684{
685 PySequenceMethods *m;
686 int l;
687
688 if(! s) return Py_ReturnNullError();
689
690 if(! ((m=s->ob_type->tp_as_sequence) && m->sq_length && m->sq_slice))
691 return Py_ReturnMethodError("__getslice__");
692
693 if(0 > (l=m->sq_length(s))) return NULL;
694
695 if(i1 < 0) i1 += l;
696 if(i2 < 0) i2 += l;
697
698 return m->sq_slice(s,i1,i2);
699}
700
701int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000702PySequence_SetItem(s, i, o)
703 PyObject *s;
704 int i;
705 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000706{
707 PySequenceMethods *m;
708 int l;
709 if(! s) return Py_ReturnNullError(),-1;
710
711 if(! ((m=s->ob_type->tp_as_sequence) && m->sq_length && m->sq_ass_item))
712 return Py_ReturnMethodError("__setitem__"),-1;
713
714 if(i < 0)
715 {
716 if(0 > (l=m->sq_length(s))) return -1;
717 i += l;
718 }
719
720 return m->sq_ass_item(s,i,o);
721}
722
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000723int
724PySequence_DelItem(s, i)
725 PyObject *s;
726 int i;
727{
728 PySequenceMethods *m;
729 int l;
730 if(! s) return Py_ReturnNullError(),-1;
731
732 if(! ((m=s->ob_type->tp_as_sequence) && m->sq_length && m->sq_ass_item))
733 return Py_ReturnMethodError("__delitem__"),-1;
734
735 if(i < 0)
736 {
737 if(0 > (l=m->sq_length(s))) return -1;
738 i += l;
739 }
740
741 return m->sq_ass_item(s,i,(PyObject*)NULL);
742}
743
Guido van Rossume15dee51995-07-18 14:12:02 +0000744int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000745PySequence_SetSlice(s, i1, i2, o)
746 PyObject *s;
747 int i1;
748 int i2;
749 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000750{
751 PySequenceMethods *m;
752 int l;
753
754 if(! s) return Py_ReturnNullError(),-1;
755
756 if(! ((m=s->ob_type->tp_as_sequence) && m->sq_length && m->sq_ass_slice))
757 return Py_ReturnMethodError("__setslice__"),-1;
758
759 if(0 > (l=m->sq_length(s))) return -1;
760
761 if(i1 < 0) i1 += l;
762 if(i2 < 0) i2 += l;
763
764 return m->sq_ass_slice(s,i1,i2,o);
765}
766
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000767int
768PySequence_DelSlice(s, i1, i2)
769 PyObject *s;
770 int i1;
771 int i2;
772{
773 PySequenceMethods *m;
774 int l;
775
776 if(! s) return Py_ReturnNullError(),-1;
777
778 if(! ((m=s->ob_type->tp_as_sequence) && m->sq_length && m->sq_ass_slice))
779 return Py_ReturnMethodError("__delslice__"),-1;
780
781 if(0 > (l=m->sq_length(s))) return -1;
782
783 if(i1 < 0) i1 += l;
784 if(i2 < 0) i2 += l;
785
786 return m->sq_ass_slice(s,i1,i2,(PyObject*)NULL);
787}
788
Guido van Rossume15dee51995-07-18 14:12:02 +0000789PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000790PySequence_Tuple(s)
791 PyObject *s;
Guido van Rossume15dee51995-07-18 14:12:02 +0000792{
793 int l, i;
794 PyObject *t, *item;
795
796 if(! s) return Py_ReturnNullError();
797
798 Py_TRY((l=PySequence_Length(s)) != -1);
799 Py_TRY(t=PyTuple_New(l));
800
801 for(i=0; i < l; i++)
802 {
803 if(item=PySequence_GetItem(s,i))
804 {
805 if(PyTuple_SetItem(t,i,item) == -1)
806 {
807 Py_DECREF(item);
808 Py_DECREF(t);
809 return NULL;
810 }
811 }
812 else
813 {
814 Py_DECREF(t);
815 return NULL;
816 }
817 }
818 return t;
819}
820
821int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000822PySequence_Count(s, o)
823 PyObject *s;
824 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000825{
826 int l, i, n=0, not_equal, err;
827 PyObject *item;
828
829 if(! s || ! o) return Py_ReturnNullError(), -1;
830 Py_TRY((l=PySequence_Length(s)) != -1),-1;
831
832 for(i=0; i < l; i++)
833 {
834 Py_TRY(item=PySequence_GetItem(s,i)),-1;
835 err=PyObject_Cmp(item,o,&not_equal) == -1;
836 Py_DECREF(item);
837 if(err) return -1;
838 n += ! not_equal;
839 }
840 return n;
841}
842
843int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000844PySequence_In(s, o)
845 PyObject *s;
846 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000847{
848 int l, i, not_equal, err;
849 PyObject *item;
850
851 if(! o || ! s) return Py_ReturnNullError(), -1;
852 Py_TRY((l=PySequence_Length(s)) != -1),-1;
853
854 for(i=0; i < l; i++)
855 {
856 Py_TRY(item=PySequence_GetItem(s,i)),-1;
857 err=PyObject_Cmp(item,o,&not_equal) == -1;
858 Py_DECREF(item);
859 if(err) return -1;
860 if(! not_equal) return 1;
861 }
862 return 0;
863}
864
865int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000866PySequence_Index(s, o)
867 PyObject *s;
868 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000869{
870 int l, i, n=0, not_equal, err;
871 PyObject *item;
872
873 if(! s || ! o) return Py_ReturnNullError(), -1;
874 Py_TRY((l=PySequence_Length(s)) != -1),-1;
875
876 for(i=0; i < l; i++)
877 {
878 Py_TRY(item=PySequence_GetItem(s,i)),-1;
879 err=PyObject_Cmp(item,o,&not_equal) == -1;
880 Py_DECREF(item);
881 if(err) return -1;
Guido van Rossum8dbcdd01996-11-06 15:31:46 +0000882 if(! not_equal) return i;
Guido van Rossume15dee51995-07-18 14:12:02 +0000883 }
884 return -1;
885}
886
887int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000888PyMapping_Check(o)
889 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000890{
891 return o && o->ob_type->tp_as_mapping;
892}
893
894int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000895PyMapping_Length(s)
896 PyObject *s;
Guido van Rossume15dee51995-07-18 14:12:02 +0000897{
898 PyMappingMethods *m;
899
900 if(! s) return Py_ReturnNullError(),-1;
901
902 if((m=s->ob_type->tp_as_mapping) && m->mp_length)
903 return m->mp_length(s);
904
905 Py_ReturnMethodError("__len__");
906 return -1;
907}
908
909int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000910PyMapping_HasKeyString(o, key)
911 PyObject *o;
912 char *key;
Guido van Rossume15dee51995-07-18 14:12:02 +0000913{
914 PyObject *v;
915
916 v=PyMapping_GetItemString(o,key);
917 if(v) return 1;
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000918 PyErr_Clear();
Guido van Rossume15dee51995-07-18 14:12:02 +0000919 return 0;
920}
921
922int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000923PyMapping_HasKey(o, key)
924 PyObject *o;
925 PyObject *key;
Guido van Rossume15dee51995-07-18 14:12:02 +0000926{
927 PyObject *v;
928
929 v=PyObject_GetItem(o,key);
930 if(v) return 1;
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000931 PyErr_Clear();
Guido van Rossume15dee51995-07-18 14:12:02 +0000932 return 0;
933}
934
935PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000936PyObject_CallObject(o, a)
937 PyObject *o, *a;
Guido van Rossume15dee51995-07-18 14:12:02 +0000938{
939 PyObject *r;
940
941 if(a) return PyEval_CallObject(o,a);
942
943 if(! (a=PyTuple_New(0)))
944 return NULL;
945 r=PyEval_CallObject(o,a);
946 Py_DECREF(a);
947 return r;
948}
949
950PyObject *
951#ifdef HAVE_STDARG_PROTOTYPES
952/* VARARGS 2 */
953PyObject_CallFunction(PyObject *callable, char *format, ...)
954#else
955/* VARARGS */
956PyObject_CallFunction(va_alist) va_dcl
957#endif
958{
959 va_list va;
960 PyObject *args, *retval;
961#ifdef HAVE_STDARG_PROTOTYPES
962 va_start(va, format);
963#else
964 PyObject *callable;
965 char *format;
966 va_start(va);
967 callable = va_arg(va, PyObject *);
968 format = va_arg(va, char *);
969#endif
970
971 if( ! callable)
972 {
973 va_end(va);
974 return Py_ReturnNullError();
975 }
976
977 if(format)
978 args = Py_VaBuildValue(format, va);
979 else
980 args = PyTuple_New(0);
981
982 va_end(va);
983 if(! args) return NULL;
984
985 if(! PyTuple_Check(args))
986 {
987 PyObject *a;
988
989 Py_TRY(a=PyTuple_New(1));
990 Py_TRY(PyTuple_SetItem(a,0,args) != -1);
991 args=a;
992 }
993 retval = PyObject_CallObject(callable,args);
994 Py_DECREF(args);
995 return retval;
996}
997
998PyObject *
999#ifdef HAVE_STDARG_PROTOTYPES
1000/* VARARGS 2 */
1001PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
1002#else
1003/* VARARGS */
1004PyObject_CallMethod(va_alist) va_dcl
1005#endif
1006{
1007 va_list va;
1008 PyObject *args, *method=0, *retval;
1009#ifdef HAVE_STDARG_PROTOTYPES
1010 va_start(va, format);
1011#else
1012 PyObject *o;
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001013 char *name;
Guido van Rossume15dee51995-07-18 14:12:02 +00001014 char *format;
1015 va_start(va);
1016 o = va_arg(va, PyObject *);
1017 name = va_arg(va, char *);
1018 format = va_arg(va, char *);
1019#endif
1020
1021 if( ! o || ! name)
1022 {
1023 va_end(va);
1024 return Py_ReturnNullError();
1025 }
1026
1027 method=PyObject_GetAttrString(o,name);
1028 if(! method)
1029 {
1030 va_end(va);
1031 PyErr_SetString(PyExc_AttributeError,name);
1032 return 0;
1033 }
1034
1035 if(! (PyCallable_Check(method)))
1036 {
1037 va_end(va);
1038 PyErr_SetString(PyExc_TypeError,"call of non-callable attribute");
1039 return 0;
1040 }
1041
Guido van Rossum336c6991996-09-30 22:00:50 +00001042 if(format && *format)
Guido van Rossume15dee51995-07-18 14:12:02 +00001043 args = Py_VaBuildValue(format, va);
1044 else
1045 args = PyTuple_New(0);
1046
1047 va_end(va);
1048
1049 if(! args) return NULL;
1050
1051 if(! PyTuple_Check(args))
1052 {
1053 PyObject *a;
1054
1055 Py_TRY(a=PyTuple_New(1));
1056 Py_TRY(PyTuple_SetItem(a,0,args) != -1);
1057 args=a;
1058 }
1059
1060 retval = PyObject_CallObject(method,args);
1061 Py_DECREF(args);
1062 Py_DECREF(method);
1063 return retval;
1064}
1065
1066PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001067PyMapping_GetItemString(o, key)
1068 PyObject *o;
1069 char *key;
Guido van Rossume15dee51995-07-18 14:12:02 +00001070{
1071 PyObject *okey, *r;
1072
1073 if( ! key) return Py_ReturnNullError();
1074 Py_TRY(okey=PyString_FromString(key));
1075 r = PyObject_GetItem(o,okey);
1076 Py_DECREF(okey);
1077 return r;
1078}
1079
1080int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001081PyMapping_SetItemString(o, key, value)
1082 PyObject *o;
1083 char *key;
1084 PyObject *value;
Guido van Rossume15dee51995-07-18 14:12:02 +00001085{
1086 PyObject *okey;
1087 int r;
1088
1089 if( ! key) return Py_ReturnNullError(),-1;
1090 if (!(okey=PyString_FromString(key))) return -1;
1091 r = PyObject_SetItem(o,okey,value);
1092 Py_DECREF(okey);
1093 return r;
1094}