blob: b27d0c7298a5ab229563a355ab196d4490bfaeb6 [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
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
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 {
805 if(item=PySequence_GetItem(s,i))
806 {
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
823int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000824PySequence_Count(s, o)
825 PyObject *s;
826 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000827{
828 int l, i, n=0, not_equal, err;
829 PyObject *item;
830
831 if(! s || ! o) return Py_ReturnNullError(), -1;
832 Py_TRY((l=PySequence_Length(s)) != -1),-1;
833
834 for(i=0; i < l; i++)
835 {
836 Py_TRY(item=PySequence_GetItem(s,i)),-1;
837 err=PyObject_Cmp(item,o,&not_equal) == -1;
838 Py_DECREF(item);
839 if(err) return -1;
840 n += ! not_equal;
841 }
842 return n;
843}
844
845int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000846PySequence_In(s, o)
847 PyObject *s;
848 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000849{
850 int l, i, not_equal, err;
851 PyObject *item;
852
853 if(! o || ! s) return Py_ReturnNullError(), -1;
854 Py_TRY((l=PySequence_Length(s)) != -1),-1;
855
856 for(i=0; i < l; i++)
857 {
858 Py_TRY(item=PySequence_GetItem(s,i)),-1;
859 err=PyObject_Cmp(item,o,&not_equal) == -1;
860 Py_DECREF(item);
861 if(err) return -1;
862 if(! not_equal) return 1;
863 }
864 return 0;
865}
866
867int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000868PySequence_Index(s, o)
869 PyObject *s;
870 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000871{
872 int l, i, n=0, not_equal, err;
873 PyObject *item;
874
875 if(! s || ! o) return Py_ReturnNullError(), -1;
876 Py_TRY((l=PySequence_Length(s)) != -1),-1;
877
878 for(i=0; i < l; i++)
879 {
880 Py_TRY(item=PySequence_GetItem(s,i)),-1;
881 err=PyObject_Cmp(item,o,&not_equal) == -1;
882 Py_DECREF(item);
883 if(err) return -1;
Guido van Rossum8dbcdd01996-11-06 15:31:46 +0000884 if(! not_equal) return i;
Guido van Rossume15dee51995-07-18 14:12:02 +0000885 }
886 return -1;
887}
888
889int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000890PyMapping_Check(o)
891 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000892{
893 return o && o->ob_type->tp_as_mapping;
894}
895
896int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000897PyMapping_Length(s)
898 PyObject *s;
Guido van Rossume15dee51995-07-18 14:12:02 +0000899{
900 PyMappingMethods *m;
901
902 if(! s) return Py_ReturnNullError(),-1;
903
904 if((m=s->ob_type->tp_as_mapping) && m->mp_length)
905 return m->mp_length(s);
906
907 Py_ReturnMethodError("__len__");
908 return -1;
909}
910
911int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000912PyMapping_HasKeyString(o, key)
913 PyObject *o;
914 char *key;
Guido van Rossume15dee51995-07-18 14:12:02 +0000915{
916 PyObject *v;
917
918 v=PyMapping_GetItemString(o,key);
919 if(v) return 1;
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000920 PyErr_Clear();
Guido van Rossume15dee51995-07-18 14:12:02 +0000921 return 0;
922}
923
924int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000925PyMapping_HasKey(o, key)
926 PyObject *o;
927 PyObject *key;
Guido van Rossume15dee51995-07-18 14:12:02 +0000928{
929 PyObject *v;
930
931 v=PyObject_GetItem(o,key);
932 if(v) return 1;
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000933 PyErr_Clear();
Guido van Rossume15dee51995-07-18 14:12:02 +0000934 return 0;
935}
936
937PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000938PyObject_CallObject(o, a)
939 PyObject *o, *a;
Guido van Rossume15dee51995-07-18 14:12:02 +0000940{
941 PyObject *r;
942
943 if(a) return PyEval_CallObject(o,a);
944
945 if(! (a=PyTuple_New(0)))
946 return NULL;
947 r=PyEval_CallObject(o,a);
948 Py_DECREF(a);
949 return r;
950}
951
952PyObject *
953#ifdef HAVE_STDARG_PROTOTYPES
954/* VARARGS 2 */
955PyObject_CallFunction(PyObject *callable, char *format, ...)
956#else
957/* VARARGS */
958PyObject_CallFunction(va_alist) va_dcl
959#endif
960{
961 va_list va;
962 PyObject *args, *retval;
963#ifdef HAVE_STDARG_PROTOTYPES
964 va_start(va, format);
965#else
966 PyObject *callable;
967 char *format;
968 va_start(va);
969 callable = va_arg(va, PyObject *);
970 format = va_arg(va, char *);
971#endif
972
973 if( ! callable)
974 {
975 va_end(va);
976 return Py_ReturnNullError();
977 }
978
979 if(format)
980 args = Py_VaBuildValue(format, va);
981 else
982 args = PyTuple_New(0);
983
984 va_end(va);
985 if(! args) return NULL;
986
987 if(! PyTuple_Check(args))
988 {
989 PyObject *a;
990
991 Py_TRY(a=PyTuple_New(1));
992 Py_TRY(PyTuple_SetItem(a,0,args) != -1);
993 args=a;
994 }
995 retval = PyObject_CallObject(callable,args);
996 Py_DECREF(args);
997 return retval;
998}
999
1000PyObject *
1001#ifdef HAVE_STDARG_PROTOTYPES
1002/* VARARGS 2 */
1003PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
1004#else
1005/* VARARGS */
1006PyObject_CallMethod(va_alist) va_dcl
1007#endif
1008{
1009 va_list va;
1010 PyObject *args, *method=0, *retval;
1011#ifdef HAVE_STDARG_PROTOTYPES
1012 va_start(va, format);
1013#else
1014 PyObject *o;
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001015 char *name;
Guido van Rossume15dee51995-07-18 14:12:02 +00001016 char *format;
1017 va_start(va);
1018 o = va_arg(va, PyObject *);
1019 name = va_arg(va, char *);
1020 format = va_arg(va, char *);
1021#endif
1022
1023 if( ! o || ! name)
1024 {
1025 va_end(va);
1026 return Py_ReturnNullError();
1027 }
1028
1029 method=PyObject_GetAttrString(o,name);
1030 if(! method)
1031 {
1032 va_end(va);
1033 PyErr_SetString(PyExc_AttributeError,name);
1034 return 0;
1035 }
1036
1037 if(! (PyCallable_Check(method)))
1038 {
1039 va_end(va);
1040 PyErr_SetString(PyExc_TypeError,"call of non-callable attribute");
1041 return 0;
1042 }
1043
Guido van Rossum336c6991996-09-30 22:00:50 +00001044 if(format && *format)
Guido van Rossume15dee51995-07-18 14:12:02 +00001045 args = Py_VaBuildValue(format, va);
1046 else
1047 args = PyTuple_New(0);
1048
1049 va_end(va);
1050
1051 if(! args) return NULL;
1052
1053 if(! PyTuple_Check(args))
1054 {
1055 PyObject *a;
1056
1057 Py_TRY(a=PyTuple_New(1));
1058 Py_TRY(PyTuple_SetItem(a,0,args) != -1);
1059 args=a;
1060 }
1061
1062 retval = PyObject_CallObject(method,args);
1063 Py_DECREF(args);
1064 Py_DECREF(method);
1065 return retval;
1066}
1067
1068PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001069PyMapping_GetItemString(o, key)
1070 PyObject *o;
1071 char *key;
Guido van Rossume15dee51995-07-18 14:12:02 +00001072{
1073 PyObject *okey, *r;
1074
1075 if( ! key) return Py_ReturnNullError();
1076 Py_TRY(okey=PyString_FromString(key));
1077 r = PyObject_GetItem(o,okey);
1078 Py_DECREF(okey);
1079 return r;
1080}
1081
1082int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001083PyMapping_SetItemString(o, key, value)
1084 PyObject *o;
1085 char *key;
1086 PyObject *value;
Guido van Rossume15dee51995-07-18 14:12:02 +00001087{
1088 PyObject *okey;
1089 int r;
1090
1091 if( ! key) return Py_ReturnNullError(),-1;
1092 if (!(okey=PyString_FromString(key))) return -1;
1093 r = PyObject_SetItem(o,okey,value);
1094 Py_DECREF(okey);
1095 return r;
1096}