annotate Modules/_elementtree.c @ 36035:4bfcd5dcd0bf legacy-trunk

added cElementTree tests
author Fredrik Lundh <fredrik@pythonware.com>
date Thu, 15 Dec 2005 18:41:22 +0000
parents 635e0d909645
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
36027
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1 /*
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2 * ElementTree
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3 * $Id: /work/modules/celementtree/cElementTree.c 1089 2005-12-14T21:22:30.257830Z Fredrik $
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
4 *
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
5 * elementtree accelerator
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
6 *
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
7 * History:
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
8 * 1999-06-20 fl created (as part of sgmlop)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
9 * 2001-05-29 fl effdom edition
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
10 * 2001-06-05 fl backported to unix; fixed bogus free in clear
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
11 * 2001-07-10 fl added findall helper
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
12 * 2003-02-27 fl elementtree edition (alpha)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
13 * 2004-06-03 fl updates for elementtree 1.2
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
14 * 2005-01-05 fl added universal name cache, Element/SubElement factories
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
15 * 2005-01-06 fl moved python helpers into C module; removed 1.5.2 support
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
16 * 2005-01-07 fl added 2.1 support; work around broken __copy__ in 2.3
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
17 * 2005-01-08 fl added makeelement method; fixed path support
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
18 * 2005-01-10 fl optimized memory usage
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
19 * 2005-01-11 fl first public release (cElementTree 0.8)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
20 * 2005-01-12 fl split element object into base and extras
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
21 * 2005-01-13 fl use tagged pointers for tail/text (cElementTree 0.9)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
22 * 2005-01-17 fl added treebuilder close method
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
23 * 2005-01-17 fl fixed crash in getchildren
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
24 * 2005-01-18 fl removed observer api, added iterparse (cElementTree 0.9.3)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
25 * 2005-01-23 fl revised iterparse api; added namespace event support (0.9.8)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
26 * 2005-01-26 fl added VERSION module property (cElementTree 1.0)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
27 * 2005-01-28 fl added remove method (1.0.1)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
28 * 2005-03-01 fl added iselement function; fixed makeelement aliasing (1.0.2)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
29 * 2005-03-13 fl export Comment and ProcessingInstruction/PI helpers
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
30 * 2005-03-26 fl added Comment and PI support to XMLParser
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
31 * 2005-03-27 fl event optimizations; complain about bogus events
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
32 * 2005-08-08 fl fixed read error handling in parse
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
33 * 2005-08-11 fl added runtime test for copy workaround (1.0.3)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
34 * 2005-12-13 fl added expat_capi support (for xml.etree)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
35 *
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
36 * Copyright (c) 1999-2005 by Secret Labs AB. All rights reserved.
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
37 * Copyright (c) 1999-2005 by Fredrik Lundh.
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
38 *
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
39 * info@pythonware.com
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
40 * http://www.pythonware.com
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
41 */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
42
36031
635e0d909645 added PSG licensing blurb
Fredrik Lundh <fredrik@pythonware.com>
parents: 36028
diff changeset
43 /* Licensed to PSF under a Contributor Agreement. */
635e0d909645 added PSG licensing blurb
Fredrik Lundh <fredrik@pythonware.com>
parents: 36028
diff changeset
44 /* See http://www.python.org/2.4/license for licensing details. */
635e0d909645 added PSG licensing blurb
Fredrik Lundh <fredrik@pythonware.com>
parents: 36028
diff changeset
45
36027
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
46 #include "Python.h"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
47
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
48 #define VERSION "1.0.4"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
49
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
50 /* -------------------------------------------------------------------- */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
51 /* configuration */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
52
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
53 /* Leave defined to include the expat-based XMLParser type */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
54 #define USE_EXPAT
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
55
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
56 /* Define to to all expat calls via pyexpat's embedded expat library */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
57 /* #define USE_PYEXPAT_CAPI */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
58
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
59 /* An element can hold this many children without extra memory
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
60 allocations. */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
61 #define STATIC_CHILDREN 4
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
62
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
63 /* For best performance, chose a value so that 80-90% of all nodes
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
64 have no more than the given number of children. Set this to zero
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
65 to minimize the size of the element structure itself (this only
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
66 helps if you have lots of leaf nodes with attributes). */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
67
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
68 /* Also note that pymalloc always allocates blocks in multiples of
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
69 eight bytes. For the current version of cElementTree, this means
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
70 that the number of children should be an even number, at least on
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
71 32-bit platforms. */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
72
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
73 /* -------------------------------------------------------------------- */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
74
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
75 #if 0
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
76 static int memory = 0;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
77 #define ALLOC(size, comment)\
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
78 do { memory += size; printf("%8d - %s\n", memory, comment); } while (0)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
79 #define RELEASE(size, comment)\
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
80 do { memory -= size; printf("%8d - %s\n", memory, comment); } while (0)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
81 #else
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
82 #define ALLOC(size, comment)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
83 #define RELEASE(size, comment)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
84 #endif
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
85
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
86 /* compiler tweaks */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
87 #if defined(_MSC_VER)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
88 #define LOCAL(type) static __inline type __fastcall
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
89 #else
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
90 #define LOCAL(type) static type
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
91 #endif
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
92
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
93 /* compatibility macros */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
94 #if (PY_VERSION_HEX < 0x02040000)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
95 #define PyDict_CheckExact PyDict_Check
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
96 #if (PY_VERSION_HEX < 0x02020000)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
97 #define PyList_CheckExact PyList_Check
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
98 #define PyString_CheckExact PyString_Check
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
99 #if (PY_VERSION_HEX >= 0x01060000)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
100 #define Py_USING_UNICODE /* always enabled for 2.0 and 2.1 */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
101 #endif
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
102 #endif
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
103 #endif
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
104
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
105 #if (PY_VERSION_HEX >= 0x02050000)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
106 #define PY_CONST const /* 2.5 adds const to some API:s */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
107 #else
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
108 #define PY_CONST
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
109 #endif
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
110
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
111 #if !defined(Py_RETURN_NONE)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
112 #define Py_RETURN_NONE return Py_INCREF(Py_None), Py_None
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
113 #endif
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
114
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
115 /* macros used to store 'join' flags in string object pointers. note
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
116 that all use of text and tail as object pointers must be wrapped in
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
117 JOIN_OBJ. see comments in the ElementObject definition for more
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
118 info. */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
119 #define JOIN_GET(p) ((Py_uintptr_t) (p) & 1)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
120 #define JOIN_SET(p, flag) ((void*) ((Py_uintptr_t) (JOIN_OBJ(p)) | (flag)))
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
121 #define JOIN_OBJ(p) ((PyObject*) ((Py_uintptr_t) (p) & ~1))
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
122
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
123 /* glue functions (see the init function for details) */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
124 static PyObject* elementtree_copyelement_obj;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
125 static PyObject* elementtree_deepcopy_obj;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
126 static PyObject* elementtree_getiterator_obj;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
127 static PyObject* elementpath_obj;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
128
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
129 /* helpers */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
130
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
131 LOCAL(PyObject*)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
132 deepcopy(PyObject* object, PyObject* memo)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
133 {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
134 /* do a deep copy of the given object */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
135
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
136 PyObject* args;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
137 PyObject* result;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
138
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
139 if (!elementtree_deepcopy_obj) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
140 PyErr_SetString(
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
141 PyExc_RuntimeError,
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
142 "deepcopy helper not found"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
143 );
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
144 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
145 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
146
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
147 args = PyTuple_New(2);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
148 Py_INCREF(object); PyTuple_SET_ITEM(args, 0, (PyObject*) object);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
149 Py_INCREF(memo); PyTuple_SET_ITEM(args, 1, (PyObject*) memo);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
150
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
151 result = PyObject_CallObject(elementtree_deepcopy_obj, args);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
152
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
153 Py_DECREF(args);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
154
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
155 return result;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
156 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
157
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
158 LOCAL(PyObject*)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
159 list_join(PyObject* list)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
160 {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
161 /* join list elements (destroying the list in the process) */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
162
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
163 PyObject* joiner;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
164 PyObject* function;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
165 PyObject* args;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
166 PyObject* result;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
167
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
168 switch (PyList_GET_SIZE(list)) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
169 case 0:
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
170 Py_DECREF(list);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
171 return PyString_FromString("");
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
172 case 1:
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
173 result = PyList_GET_ITEM(list, 0);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
174 Py_INCREF(result);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
175 Py_DECREF(list);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
176 return result;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
177 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
178
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
179 /* two or more elements: slice out a suitable separator from the
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
180 first member, and use that to join the entire list */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
181
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
182 joiner = PySequence_GetSlice(PyList_GET_ITEM(list, 0), 0, 0);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
183 if (!joiner)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
184 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
185
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
186 function = PyObject_GetAttrString(joiner, "join");
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
187 if (!function) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
188 Py_DECREF(joiner);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
189 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
190 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
191
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
192 args = PyTuple_New(1);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
193 PyTuple_SET_ITEM(args, 0, list);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
194
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
195 result = PyObject_CallObject(function, args);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
196
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
197 Py_DECREF(args); /* also removes list */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
198 Py_DECREF(function);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
199 Py_DECREF(joiner);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
200
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
201 return result;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
202 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
203
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
204 #if (PY_VERSION_HEX < 0x02020000)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
205 LOCAL(int)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
206 PyDict_Update(PyObject* dict, PyObject* other)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
207 {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
208 /* PyDict_Update emulation for 2.1 and earlier */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
209
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
210 PyObject* res;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
211
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
212 res = PyObject_CallMethod(dict, "update", "O", other);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
213 if (!res)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
214 return -1;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
215
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
216 Py_DECREF(res);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
217 return 0;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
218 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
219 #endif
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
220
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
221 /* -------------------------------------------------------------------- */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
222 /* the element type */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
223
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
224 typedef struct {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
225
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
226 /* attributes (a dictionary object), or None if no attributes */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
227 PyObject* attrib;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
228
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
229 /* child elements */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
230 int length; /* actual number of items */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
231 int allocated; /* allocated items */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
232
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
233 /* this either points to _children or to a malloced buffer */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
234 PyObject* *children;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
235
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
236 PyObject* _children[STATIC_CHILDREN];
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
237
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
238 } ElementObjectExtra;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
239
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
240 typedef struct {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
241 PyObject_HEAD
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
242
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
243 /* element tag (a string). */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
244 PyObject* tag;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
245
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
246 /* text before first child. note that this is a tagged pointer;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
247 use JOIN_OBJ to get the object pointer. the join flag is used
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
248 to distinguish lists created by the tree builder from lists
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
249 assigned to the attribute by application code; the former
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
250 should be joined before being returned to the user, the latter
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
251 should be left intact. */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
252 PyObject* text;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
253
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
254 /* text after this element, in parent. note that this is a tagged
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
255 pointer; use JOIN_OBJ to get the object pointer. */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
256 PyObject* tail;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
257
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
258 ElementObjectExtra* extra;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
259
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
260 } ElementObject;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
261
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
262 staticforward PyTypeObject Element_Type;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
263
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
264 #define Element_CheckExact(op) ((op)->ob_type == &Element_Type)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
265
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
266 /* -------------------------------------------------------------------- */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
267 /* element constructor and destructor */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
268
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
269 LOCAL(int)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
270 element_new_extra(ElementObject* self, PyObject* attrib)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
271 {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
272 self->extra = PyObject_Malloc(sizeof(ElementObjectExtra));
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
273 if (!self->extra)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
274 return -1;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
275
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
276 if (!attrib)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
277 attrib = Py_None;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
278
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
279 Py_INCREF(attrib);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
280 self->extra->attrib = attrib;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
281
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
282 self->extra->length = 0;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
283 self->extra->allocated = STATIC_CHILDREN;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
284 self->extra->children = self->extra->_children;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
285
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
286 return 0;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
287 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
288
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
289 LOCAL(void)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
290 element_dealloc_extra(ElementObject* self)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
291 {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
292 int i;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
293
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
294 Py_DECREF(self->extra->attrib);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
295
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
296 for (i = 0; i < self->extra->length; i++)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
297 Py_DECREF(self->extra->children[i]);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
298
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
299 if (self->extra->children != self->extra->_children)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
300 PyObject_Free(self->extra->children);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
301
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
302 PyObject_Free(self->extra);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
303 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
304
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
305 LOCAL(PyObject*)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
306 element_new(PyObject* tag, PyObject* attrib)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
307 {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
308 ElementObject* self;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
309
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
310 self = PyObject_New(ElementObject, &Element_Type);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
311 if (self == NULL)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
312 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
313
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
314 /* use None for empty dictionaries */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
315 if (PyDict_CheckExact(attrib) && !PyDict_Size(attrib))
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
316 attrib = Py_None;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
317
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
318 self->extra = NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
319
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
320 if (attrib != Py_None) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
321
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
322 if (element_new_extra(self, attrib) < 0)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
323 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
324
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
325 self->extra->length = 0;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
326 self->extra->allocated = STATIC_CHILDREN;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
327 self->extra->children = self->extra->_children;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
328
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
329 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
330
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
331 Py_INCREF(tag);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
332 self->tag = tag;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
333
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
334 Py_INCREF(Py_None);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
335 self->text = Py_None;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
336
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
337 Py_INCREF(Py_None);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
338 self->tail = Py_None;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
339
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
340 ALLOC(sizeof(ElementObject), "create element");
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
341
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
342 return (PyObject*) self;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
343 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
344
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
345 LOCAL(int)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
346 element_resize(ElementObject* self, int extra)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
347 {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
348 int size;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
349 PyObject* *children;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
350
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
351 /* make sure self->children can hold the given number of extra
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
352 elements. set an exception and return -1 if allocation failed */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
353
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
354 if (!self->extra)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
355 element_new_extra(self, NULL);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
356
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
357 size = self->extra->length + extra;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
358
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
359 if (size > self->extra->allocated) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
360 /* use Python 2.4's list growth strategy */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
361 size = (size >> 3) + (size < 9 ? 3 : 6) + size;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
362 if (self->extra->children != self->extra->_children) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
363 children = PyObject_Realloc(self->extra->children,
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
364 size * sizeof(PyObject*));
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
365 if (!children)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
366 goto nomemory;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
367 } else {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
368 children = PyObject_Malloc(size * sizeof(PyObject*));
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
369 if (!children)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
370 goto nomemory;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
371 /* copy existing children from static area to malloc buffer */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
372 memcpy(children, self->extra->children,
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
373 self->extra->length * sizeof(PyObject*));
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
374 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
375 self->extra->children = children;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
376 self->extra->allocated = size;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
377 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
378
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
379 return 0;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
380
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
381 nomemory:
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
382 PyErr_NoMemory();
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
383 return -1;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
384 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
385
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
386 LOCAL(int)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
387 element_add_subelement(ElementObject* self, PyObject* element)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
388 {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
389 /* add a child element to a parent */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
390
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
391 if (element_resize(self, 1) < 0)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
392 return -1;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
393
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
394 Py_INCREF(element);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
395 self->extra->children[self->extra->length] = element;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
396
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
397 self->extra->length++;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
398
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
399 return 0;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
400 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
401
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
402 LOCAL(PyObject*)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
403 element_get_attrib(ElementObject* self)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
404 {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
405 /* return borrowed reference to attrib dictionary */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
406 /* note: this function assumes that the extra section exists */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
407
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
408 PyObject* res = self->extra->attrib;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
409
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
410 if (res == Py_None) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
411 /* create missing dictionary */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
412 res = PyDict_New();
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
413 if (!res)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
414 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
415 self->extra->attrib = res;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
416 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
417
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
418 return res;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
419 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
420
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
421 LOCAL(PyObject*)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
422 element_get_text(ElementObject* self)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
423 {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
424 /* return borrowed reference to text attribute */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
425
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
426 PyObject* res = self->text;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
427
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
428 if (JOIN_GET(res)) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
429 res = JOIN_OBJ(res);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
430 if (PyList_CheckExact(res)) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
431 res = list_join(res);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
432 if (!res)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
433 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
434 self->text = res;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
435 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
436 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
437
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
438 return res;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
439 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
440
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
441 LOCAL(PyObject*)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
442 element_get_tail(ElementObject* self)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
443 {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
444 /* return borrowed reference to text attribute */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
445
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
446 PyObject* res = self->tail;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
447
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
448 if (JOIN_GET(res)) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
449 res = JOIN_OBJ(res);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
450 if (PyList_CheckExact(res)) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
451 res = list_join(res);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
452 if (!res)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
453 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
454 self->tail = res;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
455 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
456 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
457
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
458 return res;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
459 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
460
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
461 static PyObject*
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
462 element(PyObject* self, PyObject* args, PyObject* kw)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
463 {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
464 PyObject* elem;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
465
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
466 PyObject* tag;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
467 PyObject* attrib = NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
468 if (!PyArg_ParseTuple(args, "O|O!:Element", &tag,
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
469 &PyDict_Type, &attrib))
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
470 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
471
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
472 if (attrib || kw) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
473 attrib = (attrib) ? PyDict_Copy(attrib) : PyDict_New();
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
474 if (!attrib)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
475 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
476 if (kw)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
477 PyDict_Update(attrib, kw);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
478 } else {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
479 Py_INCREF(Py_None);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
480 attrib = Py_None;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
481 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
482
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
483 elem = element_new(tag, attrib);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
484
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
485 Py_DECREF(attrib);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
486
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
487 return elem;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
488 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
489
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
490 static PyObject*
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
491 subelement(PyObject* self, PyObject* args, PyObject* kw)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
492 {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
493 PyObject* elem;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
494
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
495 ElementObject* parent;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
496 PyObject* tag;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
497 PyObject* attrib = NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
498 if (!PyArg_ParseTuple(args, "O!O|O!:SubElement",
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
499 &Element_Type, &parent, &tag,
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
500 &PyDict_Type, &attrib))
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
501 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
502
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
503 if (attrib || kw) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
504 attrib = (attrib) ? PyDict_Copy(attrib) : PyDict_New();
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
505 if (!attrib)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
506 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
507 if (kw)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
508 PyDict_Update(attrib, kw);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
509 } else {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
510 Py_INCREF(Py_None);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
511 attrib = Py_None;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
512 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
513
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
514 elem = element_new(tag, attrib);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
515
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
516 Py_DECREF(attrib);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
517
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
518 if (element_add_subelement(parent, elem) < 0)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
519 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
520
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
521 return elem;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
522 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
523
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
524 static void
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
525 element_dealloc(ElementObject* self)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
526 {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
527 if (self->extra)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
528 element_dealloc_extra(self);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
529
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
530 /* discard attributes */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
531 Py_DECREF(self->tag);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
532 Py_DECREF(JOIN_OBJ(self->text));
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
533 Py_DECREF(JOIN_OBJ(self->tail));
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
534
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
535 RELEASE(sizeof(ElementObject), "destroy element");
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
536
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
537 PyObject_Del(self);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
538 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
539
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
540 /* -------------------------------------------------------------------- */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
541 /* methods (in alphabetical order) */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
542
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
543 static PyObject*
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
544 element_append(ElementObject* self, PyObject* args)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
545 {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
546 PyObject* element;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
547 if (!PyArg_ParseTuple(args, "O!:append", &Element_Type, &element))
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
548 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
549
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
550 if (element_add_subelement(self, element) < 0)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
551 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
552
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
553 Py_RETURN_NONE;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
554 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
555
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
556 static PyObject*
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
557 element_clear(ElementObject* self, PyObject* args)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
558 {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
559 if (!PyArg_ParseTuple(args, ":clear"))
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
560 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
561
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
562 if (self->extra) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
563 element_dealloc_extra(self);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
564 self->extra = NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
565 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
566
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
567 Py_INCREF(Py_None);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
568 Py_DECREF(JOIN_OBJ(self->text));
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
569 self->text = Py_None;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
570
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
571 Py_INCREF(Py_None);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
572 Py_DECREF(JOIN_OBJ(self->tail));
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
573 self->tail = Py_None;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
574
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
575 Py_RETURN_NONE;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
576 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
577
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
578 static PyObject*
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
579 element_copy(ElementObject* self, PyObject* args)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
580 {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
581 int i;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
582 ElementObject* element;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
583
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
584 if (!PyArg_ParseTuple(args, ":__copy__"))
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
585 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
586
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
587 element = (ElementObject*) element_new(
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
588 self->tag, (self->extra) ? self->extra->attrib : Py_None
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
589 );
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
590 if (!element)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
591 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
592
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
593 Py_DECREF(JOIN_OBJ(element->text));
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
594 element->text = self->text;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
595 Py_INCREF(JOIN_OBJ(element->text));
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
596
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
597 Py_DECREF(JOIN_OBJ(element->tail));
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
598 element->tail = self->tail;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
599 Py_INCREF(JOIN_OBJ(element->tail));
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
600
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
601 if (self->extra) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
602
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
603 if (element_resize(element, self->extra->length) < 0)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
604 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
605
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
606 for (i = 0; i < self->extra->length; i++) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
607 Py_INCREF(self->extra->children[i]);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
608 element->extra->children[i] = self->extra->children[i];
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
609 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
610
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
611 element->extra->length = self->extra->length;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
612
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
613 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
614
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
615 return (PyObject*) element;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
616 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
617
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
618 static PyObject*
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
619 element_deepcopy(ElementObject* self, PyObject* args)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
620 {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
621 int i;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
622 ElementObject* element;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
623 PyObject* tag;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
624 PyObject* attrib;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
625 PyObject* text;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
626 PyObject* tail;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
627 PyObject* id;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
628
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
629 PyObject* memo;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
630 if (!PyArg_ParseTuple(args, "O:__deepcopy__", &memo))
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
631 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
632
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
633 tag = deepcopy(self->tag, memo);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
634 if (!tag)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
635 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
636
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
637 if (self->extra) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
638 attrib = deepcopy(self->extra->attrib, memo);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
639 if (!attrib) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
640 Py_DECREF(tag);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
641 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
642 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
643 } else {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
644 Py_INCREF(Py_None);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
645 attrib = Py_None;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
646 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
647
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
648 element = (ElementObject*) element_new(tag, attrib);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
649
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
650 Py_DECREF(tag);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
651 Py_DECREF(attrib);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
652
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
653 if (!element)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
654 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
655
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
656 text = deepcopy(JOIN_OBJ(self->text), memo);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
657 if (!text)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
658 goto error;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
659 Py_DECREF(element->text);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
660 element->text = JOIN_SET(text, JOIN_GET(self->text));
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
661
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
662 tail = deepcopy(JOIN_OBJ(self->tail), memo);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
663 if (!tail)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
664 goto error;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
665 Py_DECREF(element->tail);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
666 element->tail = JOIN_SET(tail, JOIN_GET(self->tail));
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
667
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
668 if (self->extra) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
669
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
670 if (element_resize(element, self->extra->length) < 0)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
671 goto error;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
672
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
673 for (i = 0; i < self->extra->length; i++) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
674 PyObject* child = deepcopy(self->extra->children[i], memo);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
675 if (!child) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
676 element->extra->length = i;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
677 goto error;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
678 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
679 element->extra->children[i] = child;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
680 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
681
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
682 element->extra->length = self->extra->length;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
683
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
684 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
685
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
686 /* add object to memo dictionary (so deepcopy won't visit it again) */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
687 id = PyInt_FromLong((Py_uintptr_t) self);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
688
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
689 i = PyDict_SetItem(memo, id, (PyObject*) element);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
690
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
691 Py_DECREF(id);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
692
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
693 if (i < 0)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
694 goto error;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
695
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
696 return (PyObject*) element;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
697
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
698 error:
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
699 Py_DECREF(element);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
700 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
701 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
702
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
703 LOCAL(int)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
704 checkpath(PyObject* tag)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
705 {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
706 int i, check = 1;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
707
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
708 /* check if a tag contains an xpath character */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
709
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
710 #define PATHCHAR(ch) (ch == '/' || ch == '*' || ch == '[' || ch == '@')
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
711
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
712 #if defined(Py_USING_UNICODE)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
713 if (PyUnicode_Check(tag)) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
714 Py_UNICODE *p = PyUnicode_AS_UNICODE(tag);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
715 for (i = 0; i < PyUnicode_GET_SIZE(tag); i++) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
716 if (p[i] == '{')
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
717 check = 0;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
718 else if (p[i] == '}')
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
719 check = 1;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
720 else if (check && PATHCHAR(p[i]))
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
721 return 1;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
722 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
723 return 0;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
724 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
725 #endif
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
726 if (PyString_Check(tag)) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
727 char *p = PyString_AS_STRING(tag);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
728 for (i = 0; i < PyString_GET_SIZE(tag); i++) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
729 if (p[i] == '{')
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
730 check = 0;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
731 else if (p[i] == '}')
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
732 check = 1;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
733 else if (check && PATHCHAR(p[i]))
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
734 return 1;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
735 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
736 return 0;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
737 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
738
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
739 return 1; /* unknown type; might be path expression */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
740 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
741
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
742 static PyObject*
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
743 element_find(ElementObject* self, PyObject* args)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
744 {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
745 int i;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
746
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
747 PyObject* tag;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
748 if (!PyArg_ParseTuple(args, "O:find", &tag))
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
749 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
750
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
751 if (checkpath(tag))
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
752 return PyObject_CallMethod(
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
753 elementpath_obj, "find", "OO", self, tag
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
754 );
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
755
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
756 if (!self->extra)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
757 Py_RETURN_NONE;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
758
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
759 for (i = 0; i < self->extra->length; i++) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
760 PyObject* item = self->extra->children[i];
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
761 if (Element_CheckExact(item) &&
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
762 PyObject_Compare(((ElementObject*)item)->tag, tag) == 0) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
763 Py_INCREF(item);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
764 return item;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
765 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
766 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
767
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
768 Py_RETURN_NONE;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
769 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
770
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
771 static PyObject*
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
772 element_findtext(ElementObject* self, PyObject* args)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
773 {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
774 int i;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
775
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
776 PyObject* tag;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
777 PyObject* default_value = Py_None;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
778 if (!PyArg_ParseTuple(args, "O|O:findtext", &tag, &default_value))
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
779 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
780
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
781 if (checkpath(tag))
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
782 return PyObject_CallMethod(
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
783 elementpath_obj, "findtext", "OOO", self, tag, default_value
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
784 );
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
785
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
786 if (!self->extra) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
787 Py_INCREF(default_value);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
788 return default_value;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
789 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
790
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
791 for (i = 0; i < self->extra->length; i++) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
792 ElementObject* item = (ElementObject*) self->extra->children[i];
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
793 if (Element_CheckExact(item) && !PyObject_Compare(item->tag, tag)) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
794 PyObject* text = element_get_text(item);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
795 if (text == Py_None)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
796 return PyString_FromString("");
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
797 Py_INCREF(text);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
798 return text;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
799 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
800 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
801
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
802 Py_INCREF(default_value);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
803 return default_value;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
804 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
805
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
806 static PyObject*
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
807 element_findall(ElementObject* self, PyObject* args)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
808 {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
809 int i;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
810 PyObject* out;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
811
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
812 PyObject* tag;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
813 if (!PyArg_ParseTuple(args, "O:findall", &tag))
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
814 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
815
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
816 if (checkpath(tag))
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
817 return PyObject_CallMethod(
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
818 elementpath_obj, "findall", "OO", self, tag
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
819 );
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
820
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
821 out = PyList_New(0);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
822 if (!out)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
823 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
824
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
825 if (!self->extra)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
826 return out;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
827
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
828 for (i = 0; i < self->extra->length; i++) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
829 PyObject* item = self->extra->children[i];
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
830 if (Element_CheckExact(item) &&
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
831 PyObject_Compare(((ElementObject*)item)->tag, tag) == 0) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
832 if (PyList_Append(out, item) < 0) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
833 Py_DECREF(out);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
834 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
835 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
836 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
837 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
838
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
839 return out;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
840 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
841
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
842 static PyObject*
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
843 element_get(ElementObject* self, PyObject* args)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
844 {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
845 PyObject* value;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
846
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
847 PyObject* key;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
848 PyObject* default_value = Py_None;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
849 if (!PyArg_ParseTuple(args, "O|O:get", &key, &default_value))
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
850 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
851
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
852 if (!self->extra || self->extra->attrib == Py_None)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
853 value = default_value;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
854 else {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
855 value = PyDict_GetItem(self->extra->attrib, key);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
856 if (!value)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
857 value = default_value;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
858 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
859
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
860 Py_INCREF(value);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
861 return value;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
862 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
863
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
864 static PyObject*
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
865 element_getchildren(ElementObject* self, PyObject* args)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
866 {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
867 int i;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
868 PyObject* list;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
869
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
870 if (!PyArg_ParseTuple(args, ":getchildren"))
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
871 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
872
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
873 if (!self->extra)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
874 return PyList_New(0);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
875
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
876 list = PyList_New(self->extra->length);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
877 if (!list)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
878 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
879
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
880 for (i = 0; i < self->extra->length; i++) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
881 PyObject* item = self->extra->children[i];
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
882 Py_INCREF(item);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
883 PyList_SET_ITEM(list, i, item);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
884 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
885
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
886 return list;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
887 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
888
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
889 static PyObject*
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
890 element_getiterator(ElementObject* self, PyObject* args)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
891 {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
892 PyObject* result;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
893
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
894 PyObject* tag = Py_None;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
895 if (!PyArg_ParseTuple(args, "|O:getiterator", &tag))
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
896 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
897
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
898 if (!elementtree_getiterator_obj) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
899 PyErr_SetString(
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
900 PyExc_RuntimeError,
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
901 "getiterator helper not found"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
902 );
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
903 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
904 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
905
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
906 args = PyTuple_New(2);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
907 Py_INCREF(self); PyTuple_SET_ITEM(args, 0, (PyObject*) self);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
908 Py_INCREF(tag); PyTuple_SET_ITEM(args, 1, (PyObject*) tag);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
909
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
910 result = PyObject_CallObject(elementtree_getiterator_obj, args);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
911
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
912 Py_DECREF(args);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
913
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
914 return result;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
915 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
916
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
917 static PyObject*
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
918 element_getitem(ElementObject* self, int index)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
919 {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
920 if (!self->extra || index < 0 || index >= self->extra->length) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
921 PyErr_SetString(
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
922 PyExc_IndexError,
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
923 "child index out of range"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
924 );
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
925 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
926 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
927
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
928 Py_INCREF(self->extra->children[index]);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
929 return self->extra->children[index];
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
930 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
931
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
932 static PyObject*
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
933 element_getslice(ElementObject* self, int start, int end)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
934 {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
935 int i;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
936 PyObject* list;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
937
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
938 if (!self->extra)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
939 return PyList_New(0);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
940
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
941 /* standard clamping */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
942 if (start < 0)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
943 start = 0;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
944 if (end < 0)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
945 end = 0;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
946 if (end > self->extra->length)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
947 end = self->extra->length;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
948 if (start > end)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
949 start = end;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
950
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
951 list = PyList_New(end - start);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
952 if (!list)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
953 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
954
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
955 for (i = start; i < end; i++) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
956 PyObject* item = self->extra->children[i];
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
957 Py_INCREF(item);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
958 PyList_SET_ITEM(list, i - start, item);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
959 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
960
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
961 return list;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
962 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
963
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
964 static PyObject*
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
965 element_insert(ElementObject* self, PyObject* args)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
966 {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
967 int i;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
968
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
969 int index;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
970 PyObject* element;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
971 if (!PyArg_ParseTuple(args, "iO!:insert", &index,
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
972 &Element_Type, &element))
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
973 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
974
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
975 if (!self->extra)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
976 element_new_extra(self, NULL);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
977
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
978 if (index < 0)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
979 index = 0;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
980 if (index > self->extra->length)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
981 index = self->extra->length;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
982
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
983 if (element_resize(self, 1) < 0)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
984 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
985
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
986 for (i = self->extra->length; i > index; i--)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
987 self->extra->children[i] = self->extra->children[i-1];
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
988
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
989 Py_INCREF(element);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
990 self->extra->children[index] = element;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
991
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
992 self->extra->length++;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
993
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
994 Py_RETURN_NONE;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
995 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
996
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
997 static PyObject*
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
998 element_items(ElementObject* self, PyObject* args)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
999 {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1000 if (!PyArg_ParseTuple(args, ":items"))
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1001 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1002
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1003 if (!self->extra || self->extra->attrib == Py_None)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1004 return PyList_New(0);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1005
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1006 return PyDict_Items(self->extra->attrib);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1007 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1008
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1009 static PyObject*
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1010 element_keys(ElementObject* self, PyObject* args)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1011 {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1012 if (!PyArg_ParseTuple(args, ":keys"))
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1013 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1014
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1015 if (!self->extra || self->extra->attrib == Py_None)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1016 return PyList_New(0);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1017
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1018 return PyDict_Keys(self->extra->attrib);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1019 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1020
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1021 static int
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1022 element_length(ElementObject* self)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1023 {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1024 if (!self->extra)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1025 return 0;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1026
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1027 return self->extra->length;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1028 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1029
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1030 static PyObject*
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1031 element_makeelement(PyObject* self, PyObject* args, PyObject* kw)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1032 {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1033 PyObject* elem;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1034
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1035 PyObject* tag;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1036 PyObject* attrib;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1037 if (!PyArg_ParseTuple(args, "OO:makeelement", &tag, &attrib))
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1038 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1039
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1040 attrib = PyDict_Copy(attrib);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1041 if (!attrib)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1042 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1043
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1044 elem = element_new(tag, attrib);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1045
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1046 Py_DECREF(attrib);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1047
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1048 return elem;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1049 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1050
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1051 static PyObject*
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1052 element_reduce(ElementObject* self, PyObject* args)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1053 {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1054 if (!PyArg_ParseTuple(args, ":__reduce__"))
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1055 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1056
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1057 /* Hack alert: This method is used to work around a __copy__
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1058 problem on certain 2.3 and 2.4 versions. To save time and
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1059 simplify the code, we create the copy in here, and use a dummy
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1060 copyelement helper to trick the copy module into doing the
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1061 right thing. */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1062
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1063 if (!elementtree_copyelement_obj) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1064 PyErr_SetString(
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1065 PyExc_RuntimeError,
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1066 "copyelement helper not found"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1067 );
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1068 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1069 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1070
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1071 return Py_BuildValue(
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1072 "O(N)", elementtree_copyelement_obj, element_copy(self, args)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1073 );
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1074 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1075
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1076 static PyObject*
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1077 element_remove(ElementObject* self, PyObject* args)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1078 {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1079 int i;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1080
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1081 PyObject* element;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1082 if (!PyArg_ParseTuple(args, "O!:remove", &Element_Type, &element))
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1083 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1084
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1085 if (!self->extra) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1086 /* element has no children, so raise exception */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1087 PyErr_SetString(
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1088 PyExc_ValueError,
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1089 "list.remove(x): x not in list"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1090 );
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1091 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1092 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1093
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1094 for (i = 0; i < self->extra->length; i++) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1095 if (self->extra->children[i] == element)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1096 break;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1097 if (PyObject_Compare(self->extra->children[i], element) == 0)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1098 break;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1099 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1100
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1101 if (i == self->extra->length) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1102 /* element is not in children, so raise exception */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1103 PyErr_SetString(
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1104 PyExc_ValueError,
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1105 "list.remove(x): x not in list"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1106 );
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1107 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1108 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1109
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1110 Py_DECREF(self->extra->children[i]);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1111
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1112 self->extra->length--;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1113
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1114 for (; i < self->extra->length; i++)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1115 self->extra->children[i] = self->extra->children[i+1];
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1116
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1117 Py_RETURN_NONE;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1118 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1119
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1120 static PyObject*
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1121 element_repr(ElementObject* self)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1122 {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1123 PyObject* repr;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1124 char buffer[100];
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1125
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1126 repr = PyString_FromString("<Element ");
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1127
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1128 PyString_ConcatAndDel(&repr, PyObject_Repr(self->tag));
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1129
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1130 sprintf(buffer, " at %p>", self);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1131 PyString_ConcatAndDel(&repr, PyString_FromString(buffer));
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1132
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1133 return repr;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1134 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1135
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1136 static PyObject*
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1137 element_set(ElementObject* self, PyObject* args)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1138 {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1139 PyObject* attrib;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1140
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1141 PyObject* key;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1142 PyObject* value;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1143 if (!PyArg_ParseTuple(args, "OO:set", &key, &value))
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1144 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1145
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1146 if (!self->extra)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1147 element_new_extra(self, NULL);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1148
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1149 attrib = element_get_attrib(self);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1150 if (!attrib)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1151 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1152
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1153 if (PyDict_SetItem(attrib, key, value) < 0)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1154 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1155
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1156 Py_RETURN_NONE;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1157 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1158
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1159 static int
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1160 element_setslice(ElementObject* self, int start, int end, PyObject* item)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1161 {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1162 int i, new, old;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1163 PyObject* recycle = NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1164
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1165 if (!self->extra)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1166 element_new_extra(self, NULL);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1167
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1168 /* standard clamping */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1169 if (start < 0)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1170 start = 0;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1171 if (end < 0)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1172 end = 0;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1173 if (end > self->extra->length)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1174 end = self->extra->length;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1175 if (start > end)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1176 start = end;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1177
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1178 old = end - start;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1179
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1180 if (item == NULL)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1181 new = 0;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1182 else if (PyList_CheckExact(item)) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1183 new = PyList_GET_SIZE(item);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1184 } else {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1185 /* FIXME: support arbitrary sequences? */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1186 PyErr_Format(
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1187 PyExc_TypeError,
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1188 "expected list, not \"%.200s\"", item->ob_type->tp_name
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1189 );
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1190 return -1;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1191 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1192
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1193 if (old > 0) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1194 /* to avoid recursive calls to this method (via decref), move
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1195 old items to the recycle bin here, and get rid of them when
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1196 we're done modifying the element */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1197 recycle = PyList_New(old);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1198 for (i = 0; i < old; i++)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1199 PyList_SET_ITEM(recycle, i, self->extra->children[i + start]);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1200 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1201
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1202 if (new < old) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1203 /* delete slice */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1204 for (i = end; i < self->extra->length; i++)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1205 self->extra->children[i + new - old] = self->extra->children[i];
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1206 } else if (new > old) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1207 /* insert slice */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1208 if (element_resize(self, new - old) < 0)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1209 return -1;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1210 for (i = self->extra->length-1; i >= end; i--)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1211 self->extra->children[i + new - old] = self->extra->children[i];
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1212 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1213
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1214 /* replace the slice */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1215 for (i = 0; i < new; i++) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1216 PyObject* element = PyList_GET_ITEM(item, i);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1217 Py_INCREF(element);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1218 self->extra->children[i + start] = element;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1219 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1220
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1221 self->extra->length += new - old;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1222
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1223 /* discard the recycle bin, and everything in it */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1224 Py_XDECREF(recycle);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1225
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1226 return 0;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1227 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1228
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1229 static int
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1230 element_setitem(ElementObject* self, int index, PyObject* item)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1231 {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1232 int i;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1233 PyObject* old;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1234
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1235 if (!self->extra || index < 0 || index >= self->extra->length) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1236 PyErr_SetString(
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1237 PyExc_IndexError,
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1238 "child assignment index out of range");
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1239 return -1;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1240 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1241
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1242 old = self->extra->children[index];
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1243
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1244 if (item) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1245 Py_INCREF(item);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1246 self->extra->children[index] = item;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1247 } else {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1248 self->extra->length--;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1249 for (i = index; i < self->extra->length; i++)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1250 self->extra->children[i] = self->extra->children[i+1];
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1251 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1252
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1253 Py_DECREF(old);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1254
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1255 return 0;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1256 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1257
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1258 static PyMethodDef element_methods[] = {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1259
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1260 {"clear", (PyCFunction) element_clear, METH_VARARGS},
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1261
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1262 {"get", (PyCFunction) element_get, METH_VARARGS},
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1263 {"set", (PyCFunction) element_set, METH_VARARGS},
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1264
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1265 {"find", (PyCFunction) element_find, METH_VARARGS},
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1266 {"findtext", (PyCFunction) element_findtext, METH_VARARGS},
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1267 {"findall", (PyCFunction) element_findall, METH_VARARGS},
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1268
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1269 {"append", (PyCFunction) element_append, METH_VARARGS},
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1270 {"insert", (PyCFunction) element_insert, METH_VARARGS},
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1271 {"remove", (PyCFunction) element_remove, METH_VARARGS},
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1272
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1273 {"getiterator", (PyCFunction) element_getiterator, METH_VARARGS},
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1274 {"getchildren", (PyCFunction) element_getchildren, METH_VARARGS},
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1275
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1276 {"items", (PyCFunction) element_items, METH_VARARGS},
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1277 {"keys", (PyCFunction) element_keys, METH_VARARGS},
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1278
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1279 {"makeelement", (PyCFunction) element_makeelement, METH_VARARGS},
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1280
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1281 {"__copy__", (PyCFunction) element_copy, METH_VARARGS},
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1282 {"__deepcopy__", (PyCFunction) element_deepcopy, METH_VARARGS},
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1283
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1284 /* Some 2.3 and 2.4 versions do not handle the __copy__ method on
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1285 C objects correctly, so we have to fake it using a __reduce__-
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1286 based hack (see the element_reduce implementation above for
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1287 details). */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1288
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1289 /* The behaviour has been changed in 2.3.5 and 2.4.1, so we're
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1290 using a runtime test to figure out if we need to fake things
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1291 or now (see the init code below). The following entry is
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1292 enabled only if the hack is needed. */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1293
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1294 {"!__reduce__", (PyCFunction) element_reduce, METH_VARARGS},
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1295
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1296 {NULL, NULL}
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1297 };
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1298
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1299 static PyObject*
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1300 element_getattr(ElementObject* self, char* name)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1301 {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1302 PyObject* res;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1303
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1304 res = Py_FindMethod(element_methods, (PyObject*) self, name);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1305 if (res)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1306 return res;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1307
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1308 PyErr_Clear();
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1309
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1310 if (strcmp(name, "tag") == 0)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1311 res = self->tag;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1312 else if (strcmp(name, "text") == 0)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1313 res = element_get_text(self);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1314 else if (strcmp(name, "tail") == 0) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1315 res = element_get_tail(self);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1316 } else if (strcmp(name, "attrib") == 0) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1317 if (!self->extra)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1318 element_new_extra(self, NULL);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1319 res = element_get_attrib(self);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1320 } else {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1321 PyErr_SetString(PyExc_AttributeError, name);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1322 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1323 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1324
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1325 if (!res)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1326 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1327
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1328 Py_INCREF(res);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1329 return res;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1330 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1331
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1332 static int
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1333 element_setattr(ElementObject* self, const char* name, PyObject* value)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1334 {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1335 if (value == NULL) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1336 PyErr_SetString(
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1337 PyExc_AttributeError,
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1338 "can't delete element attributes"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1339 );
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1340 return -1;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1341 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1342
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1343 if (strcmp(name, "tag") == 0) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1344 Py_DECREF(self->tag);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1345 self->tag = value;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1346 Py_INCREF(self->tag);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1347 } else if (strcmp(name, "text") == 0) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1348 Py_DECREF(JOIN_OBJ(self->text));
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1349 self->text = value;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1350 Py_INCREF(self->text);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1351 } else if (strcmp(name, "tail") == 0) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1352 Py_DECREF(JOIN_OBJ(self->tail));
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1353 self->tail = value;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1354 Py_INCREF(self->tail);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1355 } else if (strcmp(name, "attrib") == 0) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1356 if (!self->extra)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1357 element_new_extra(self, NULL);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1358 Py_DECREF(self->extra->attrib);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1359 self->extra->attrib = value;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1360 Py_INCREF(self->extra->attrib);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1361 } else {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1362 PyErr_SetString(PyExc_AttributeError, name);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1363 return -1;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1364 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1365
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1366 return 0;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1367 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1368
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1369 static PySequenceMethods element_as_sequence = {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1370 (inquiry) element_length,
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1371 0, /* sq_concat */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1372 0, /* sq_repeat */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1373 (intargfunc) element_getitem,
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1374 (intintargfunc) element_getslice,
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1375 (intobjargproc) element_setitem,
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1376 (intintobjargproc) element_setslice,
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1377 };
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1378
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1379 statichere PyTypeObject Element_Type = {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1380 PyObject_HEAD_INIT(NULL)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1381 0, "Element", sizeof(ElementObject), 0,
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1382 /* methods */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1383 (destructor)element_dealloc, /* tp_dealloc */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1384 0, /* tp_print */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1385 (getattrfunc)element_getattr, /* tp_getattr */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1386 (setattrfunc)element_setattr, /* tp_setattr */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1387 0, /* tp_compare */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1388 (reprfunc)element_repr, /* tp_repr */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1389 0, /* tp_as_number */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1390 &element_as_sequence, /* tp_as_sequence */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1391 };
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1392
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1393 /* ==================================================================== */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1394 /* the tree builder type */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1395
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1396 typedef struct {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1397 PyObject_HEAD
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1398
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1399 PyObject* root; /* root node (first created node) */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1400
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1401 ElementObject* this; /* current node */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1402 ElementObject* last; /* most recently created node */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1403
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1404 PyObject* data; /* data collector (string or list), or NULL */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1405
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1406 PyObject* stack; /* element stack */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1407 int index; /* current stack size (0=empty) */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1408
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1409 /* element tracing */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1410 PyObject* events; /* list of events, or NULL if not collecting */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1411 PyObject* start_event_obj; /* event objects (NULL to ignore) */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1412 PyObject* end_event_obj;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1413 PyObject* start_ns_event_obj;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1414 PyObject* end_ns_event_obj;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1415
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1416 } TreeBuilderObject;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1417
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1418 staticforward PyTypeObject TreeBuilder_Type;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1419
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1420 #define TreeBuilder_CheckExact(op) ((op)->ob_type == &TreeBuilder_Type)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1421
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1422 /* -------------------------------------------------------------------- */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1423 /* constructor and destructor */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1424
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1425 LOCAL(PyObject*)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1426 treebuilder_new(void)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1427 {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1428 TreeBuilderObject* self;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1429
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1430 self = PyObject_New(TreeBuilderObject, &TreeBuilder_Type);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1431 if (self == NULL)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1432 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1433
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1434 self->root = NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1435
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1436 Py_INCREF(Py_None);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1437 self->this = (ElementObject*) Py_None;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1438
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1439 Py_INCREF(Py_None);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1440 self->last = (ElementObject*) Py_None;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1441
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1442 self->data = NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1443
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1444 self->stack = PyList_New(20);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1445 self->index = 0;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1446
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1447 self->events = NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1448 self->start_event_obj = self->end_event_obj = NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1449 self->start_ns_event_obj = self->end_ns_event_obj = NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1450
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1451 ALLOC(sizeof(TreeBuilderObject), "create treebuilder");
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1452
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1453 return (PyObject*) self;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1454 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1455
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1456 static PyObject*
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1457 treebuilder(PyObject* _self, PyObject* args)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1458 {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1459 if (!PyArg_ParseTuple(args, ":TreeBuilder"))
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1460 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1461
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1462 return treebuilder_new();
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1463 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1464
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1465 static void
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1466 treebuilder_dealloc(TreeBuilderObject* self)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1467 {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1468 Py_XDECREF(self->end_ns_event_obj);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1469 Py_XDECREF(self->start_ns_event_obj);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1470 Py_XDECREF(self->end_event_obj);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1471 Py_XDECREF(self->start_event_obj);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1472 Py_XDECREF(self->events);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1473 Py_DECREF(self->stack);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1474 Py_XDECREF(self->data);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1475 Py_DECREF(self->last);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1476 Py_DECREF(self->this);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1477 Py_XDECREF(self->root);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1478
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1479 RELEASE(sizeof(TreeBuilderObject), "destroy treebuilder");
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1480
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1481 PyObject_Del(self);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1482 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1483
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1484 /* -------------------------------------------------------------------- */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1485 /* handlers */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1486
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1487 LOCAL(PyObject*)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1488 treebuilder_handle_xml(TreeBuilderObject* self, PyObject* encoding,
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1489 PyObject* standalone)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1490 {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1491 Py_RETURN_NONE;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1492 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1493
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1494 LOCAL(PyObject*)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1495 treebuilder_handle_start(TreeBuilderObject* self, PyObject* tag,
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1496 PyObject* attrib)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1497 {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1498 PyObject* node;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1499 PyObject* this;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1500
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1501 if (self->data) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1502 if (self->this == self->last) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1503 self->last->text = JOIN_SET(
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1504 self->data, PyList_CheckExact(self->data)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1505 );
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1506 } else {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1507 self->last->tail = JOIN_SET(
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1508 self->data, PyList_CheckExact(self->data)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1509 );
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1510 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1511 self->data = NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1512 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1513
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1514 node = element_new(tag, attrib);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1515 if (!node)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1516 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1517
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1518 this = (PyObject*) self->this;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1519
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1520 if (this != Py_None) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1521 if (element_add_subelement((ElementObject*) this, node) < 0)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1522 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1523 } else {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1524 if (self->root) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1525 PyErr_SetString(
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1526 PyExc_SyntaxError,
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1527 "multiple elements on top level"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1528 );
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1529 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1530 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1531 Py_INCREF(node);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1532 self->root = node;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1533 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1534
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1535 if (self->index < PyList_GET_SIZE(self->stack)) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1536 if (PyList_SetItem(self->stack, self->index, this) < 0)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1537 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1538 Py_INCREF(this);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1539 } else {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1540 if (PyList_Append(self->stack, this) < 0)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1541 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1542 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1543 self->index++;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1544
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1545 Py_DECREF(this);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1546 Py_INCREF(node);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1547 self->this = (ElementObject*) node;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1548
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1549 Py_DECREF(self->last);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1550 Py_INCREF(node);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1551 self->last = (ElementObject*) node;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1552
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1553 if (self->start_event_obj) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1554 PyObject* res;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1555 PyObject* action = self->start_event_obj;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1556 res = PyTuple_New(2);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1557 if (res) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1558 Py_INCREF(action); PyTuple_SET_ITEM(res, 0, (PyObject*) action);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1559 Py_INCREF(node); PyTuple_SET_ITEM(res, 1, (PyObject*) node);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1560 PyList_Append(self->events, res);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1561 Py_DECREF(res);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1562 } else
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1563 PyErr_Clear(); /* FIXME: propagate error */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1564 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1565
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1566 return node;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1567 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1568
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1569 LOCAL(PyObject*)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1570 treebuilder_handle_data(TreeBuilderObject* self, PyObject* data)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1571 {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1572 if (!self->data) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1573 /* store the first item as is */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1574 Py_INCREF(data); self->data = data;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1575 } else {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1576 /* more than one item; use a list to collect items */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1577 if (PyString_CheckExact(self->data) && self->data->ob_refcnt == 1 &&
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1578 PyString_CheckExact(data) && PyString_GET_SIZE(data) == 1) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1579 /* expat often generates single character data sections; handle
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1580 the most common case by resizing the existing string... */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1581 int size = PyString_GET_SIZE(self->data);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1582 if (_PyString_Resize(&self->data, size + 1) < 0)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1583 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1584 PyString_AS_STRING(self->data)[size] = PyString_AS_STRING(data)[0];
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1585 } else if (PyList_CheckExact(self->data)) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1586 if (PyList_Append(self->data, data) < 0)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1587 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1588 } else {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1589 PyObject* list = PyList_New(2);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1590 if (!list)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1591 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1592 PyList_SET_ITEM(list, 0, self->data);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1593 Py_INCREF(data); PyList_SET_ITEM(list, 1, data);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1594 self->data = list;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1595 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1596 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1597
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1598 Py_RETURN_NONE;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1599 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1600
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1601 LOCAL(PyObject*)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1602 treebuilder_handle_end(TreeBuilderObject* self, PyObject* tag)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1603 {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1604 PyObject* item;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1605
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1606 if (self->data) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1607 if (self->this == self->last) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1608 self->last->text = JOIN_SET(
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1609 self->data, PyList_CheckExact(self->data)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1610 );
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1611 } else {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1612 self->last->tail = JOIN_SET(
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1613 self->data, PyList_CheckExact(self->data)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1614 );
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1615 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1616 self->data = NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1617 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1618
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1619 if (self->index == 0) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1620 PyErr_SetString(
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1621 PyExc_IndexError,
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1622 "pop from empty stack"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1623 );
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1624 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1625 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1626
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1627 self->index--;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1628
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1629 item = PyList_GET_ITEM(self->stack, self->index);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1630 Py_INCREF(item);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1631
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1632 Py_DECREF(self->last);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1633
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1634 self->last = (ElementObject*) self->this;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1635 self->this = (ElementObject*) item;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1636
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1637 if (self->end_event_obj) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1638 PyObject* res;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1639 PyObject* action = self->end_event_obj;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1640 PyObject* node = (PyObject*) self->last;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1641 res = PyTuple_New(2);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1642 if (res) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1643 Py_INCREF(action); PyTuple_SET_ITEM(res, 0, (PyObject*) action);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1644 Py_INCREF(node); PyTuple_SET_ITEM(res, 1, (PyObject*) node);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1645 PyList_Append(self->events, res);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1646 Py_DECREF(res);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1647 } else
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1648 PyErr_Clear(); /* FIXME: propagate error */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1649 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1650
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1651 Py_INCREF(self->last);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1652 return (PyObject*) self->last;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1653 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1654
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1655 LOCAL(void)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1656 treebuilder_handle_namespace(TreeBuilderObject* self, int start,
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1657 const char* prefix, const char *uri)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1658 {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1659 PyObject* res;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1660 PyObject* action;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1661 PyObject* parcel;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1662
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1663 if (!self->events)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1664 return;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1665
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1666 if (start) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1667 if (!self->start_ns_event_obj)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1668 return;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1669 action = self->start_ns_event_obj;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1670 /* FIXME: prefix and uri use utf-8 encoding! */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1671 parcel = Py_BuildValue("ss", (prefix) ? prefix : "", uri);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1672 if (!parcel)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1673 return;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1674 Py_INCREF(action);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1675 } else {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1676 if (!self->end_ns_event_obj)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1677 return;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1678 action = self->end_ns_event_obj;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1679 Py_INCREF(action);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1680 parcel = Py_None;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1681 Py_INCREF(parcel);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1682 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1683
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1684 res = PyTuple_New(2);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1685
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1686 if (res) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1687 PyTuple_SET_ITEM(res, 0, action);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1688 PyTuple_SET_ITEM(res, 1, parcel);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1689 PyList_Append(self->events, res);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1690 Py_DECREF(res);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1691 } else
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1692 PyErr_Clear(); /* FIXME: propagate error */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1693 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1694
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1695 /* -------------------------------------------------------------------- */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1696 /* methods (in alphabetical order) */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1697
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1698 static PyObject*
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1699 treebuilder_data(TreeBuilderObject* self, PyObject* args)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1700 {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1701 PyObject* data;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1702 if (!PyArg_ParseTuple(args, "O:data", &data))
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1703 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1704
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1705 return treebuilder_handle_data(self, data);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1706 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1707
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1708 static PyObject*
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1709 treebuilder_end(TreeBuilderObject* self, PyObject* args)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1710 {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1711 PyObject* tag;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1712 if (!PyArg_ParseTuple(args, "O:end", &tag))
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1713 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1714
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1715 return treebuilder_handle_end(self, tag);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1716 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1717
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1718 LOCAL(PyObject*)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1719 treebuilder_done(TreeBuilderObject* self)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1720 {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1721 PyObject* res;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1722
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1723 /* FIXME: check stack size? */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1724
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1725 if (self->root)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1726 res = self->root;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1727 else
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1728 res = Py_None;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1729
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1730 Py_INCREF(res);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1731 return res;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1732 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1733
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1734 static PyObject*
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1735 treebuilder_close(TreeBuilderObject* self, PyObject* args)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1736 {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1737 if (!PyArg_ParseTuple(args, ":close"))
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1738 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1739
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1740 return treebuilder_done(self);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1741 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1742
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1743 static PyObject*
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1744 treebuilder_start(TreeBuilderObject* self, PyObject* args)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1745 {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1746 PyObject* tag;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1747 PyObject* attrib = Py_None;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1748 if (!PyArg_ParseTuple(args, "O|O:start", &tag, &attrib))
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1749 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1750
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1751 return treebuilder_handle_start(self, tag, attrib);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1752 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1753
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1754 static PyObject*
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1755 treebuilder_xml(TreeBuilderObject* self, PyObject* args)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1756 {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1757 PyObject* encoding;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1758 PyObject* standalone;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1759 if (!PyArg_ParseTuple(args, "OO:xml", &encoding, &standalone))
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1760 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1761
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1762 return treebuilder_handle_xml(self, encoding, standalone);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1763 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1764
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1765 static PyMethodDef treebuilder_methods[] = {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1766 {"data", (PyCFunction) treebuilder_data, METH_VARARGS},
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1767 {"start", (PyCFunction) treebuilder_start, METH_VARARGS},
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1768 {"end", (PyCFunction) treebuilder_end, METH_VARARGS},
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1769 {"xml", (PyCFunction) treebuilder_xml, METH_VARARGS},
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1770 {"close", (PyCFunction) treebuilder_close, METH_VARARGS},
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1771 {NULL, NULL}
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1772 };
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1773
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1774 static PyObject*
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1775 treebuilder_getattr(TreeBuilderObject* self, char* name)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1776 {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1777 return Py_FindMethod(treebuilder_methods, (PyObject*) self, name);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1778 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1779
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1780 statichere PyTypeObject TreeBuilder_Type = {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1781 PyObject_HEAD_INIT(NULL)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1782 0, "TreeBuilder", sizeof(TreeBuilderObject), 0,
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1783 /* methods */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1784 (destructor)treebuilder_dealloc, /* tp_dealloc */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1785 0, /* tp_print */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1786 (getattrfunc)treebuilder_getattr, /* tp_getattr */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1787 };
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1788
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1789 /* ==================================================================== */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1790 /* the expat interface */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1791
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1792 #if defined(USE_EXPAT)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1793
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1794 #include "expat.h"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1795
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1796 #if defined(USE_PYEXPAT_CAPI)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1797 #include "pyexpat.h"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1798 static struct PyExpat_CAPI* expat_capi;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1799 #define EXPAT(func) (expat_capi->func)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1800 #else
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1801 #define EXPAT(func) (XML_##func)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1802 #endif
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1803
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1804 typedef struct {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1805 PyObject_HEAD
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1806
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1807 XML_Parser parser;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1808
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1809 PyObject* target;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1810 PyObject* entity;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1811
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1812 PyObject* names;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1813
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1814 PyObject* handle_xml;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1815 PyObject* handle_start;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1816 PyObject* handle_data;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1817 PyObject* handle_end;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1818
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1819 PyObject* handle_comment;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1820 PyObject* handle_pi;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1821
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1822 } XMLParserObject;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1823
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1824 staticforward PyTypeObject XMLParser_Type;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1825
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1826 /* helpers */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1827
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1828 #if defined(Py_USING_UNICODE)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1829 LOCAL(int)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1830 checkstring(const char* string, int size)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1831 {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1832 int i;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1833
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1834 /* check if an 8-bit string contains UTF-8 characters */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1835 for (i = 0; i < size; i++)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1836 if (string[i] & 0x80)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1837 return 1;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1838
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1839 return 0;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1840 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1841 #endif
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1842
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1843 LOCAL(PyObject*)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1844 makestring(const char* string, int size)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1845 {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1846 /* convert a UTF-8 string to either a 7-bit ascii string or a
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1847 Unicode string */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1848
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1849 #if defined(Py_USING_UNICODE)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1850 if (checkstring(string, size))
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1851 return PyUnicode_DecodeUTF8(string, size, "strict");
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1852 #endif
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1853
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1854 return PyString_FromStringAndSize(string, size);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1855 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1856
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1857 LOCAL(PyObject*)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1858 makeuniversal(XMLParserObject* self, const char* string)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1859 {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1860 /* convert a UTF-8 tag/attribute name from the expat parser
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1861 to a universal name string */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1862
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1863 int size = strlen(string);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1864 PyObject* key;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1865 PyObject* value;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1866
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1867 /* look the 'raw' name up in the names dictionary */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1868 key = PyString_FromStringAndSize(string, size);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1869 if (!key)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1870 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1871
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1872 value = PyDict_GetItem(self->names, key);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1873
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1874 if (value) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1875 Py_INCREF(value);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1876 } else {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1877 /* new name. convert to universal name, and decode as
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1878 necessary */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1879
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1880 PyObject* tag;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1881 char* p;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1882 int i;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1883
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1884 /* look for namespace separator */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1885 for (i = 0; i < size; i++)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1886 if (string[i] == '}')
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1887 break;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1888 if (i != size) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1889 /* convert to universal name */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1890 tag = PyString_FromStringAndSize(NULL, size+1);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1891 p = PyString_AS_STRING(tag);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1892 p[0] = '{';
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1893 memcpy(p+1, string, size);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1894 size++;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1895 } else {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1896 /* plain name; use key as tag */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1897 Py_INCREF(key);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1898 tag = key;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1899 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1900
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1901 /* decode universal name */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1902 #if defined(Py_USING_UNICODE)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1903 /* inline makestring, to avoid duplicating the source string if
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1904 it's not an utf-8 string */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1905 p = PyString_AS_STRING(tag);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1906 if (checkstring(p, size)) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1907 value = PyUnicode_DecodeUTF8(p, size, "strict");
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1908 Py_DECREF(tag);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1909 if (!value) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1910 Py_DECREF(key);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1911 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1912 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1913 } else
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1914 #endif
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1915 value = tag; /* use tag as is */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1916
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1917 /* add to names dictionary */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1918 if (PyDict_SetItem(self->names, key, value) < 0) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1919 Py_DECREF(key);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1920 Py_DECREF(value);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1921 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1922 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1923 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1924
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1925 Py_DECREF(key);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1926 return value;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1927 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1928
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1929 /* -------------------------------------------------------------------- */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1930 /* handlers */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1931
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1932 static void
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1933 expat_default_handler(XMLParserObject* self, const XML_Char* data_in,
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1934 int data_len)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1935 {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1936 PyObject* key;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1937 PyObject* value;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1938 PyObject* res;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1939
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1940 if (data_len < 2 || data_in[0] != '&')
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1941 return;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1942
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1943 key = makestring(data_in + 1, data_len - 2);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1944 if (!key)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1945 return;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1946
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1947 value = PyDict_GetItem(self->entity, key);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1948
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1949 if (value) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1950 if (TreeBuilder_CheckExact(self->target))
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1951 res = treebuilder_handle_data(
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1952 (TreeBuilderObject*) self->target, value
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1953 );
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1954 else if (self->handle_data)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1955 res = PyObject_CallFunction(self->handle_data, "O", value);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1956 else
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1957 res = NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1958 Py_DECREF(value);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1959 Py_XDECREF(res);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1960 } else {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1961 PyErr_Format(
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1962 PyExc_SyntaxError, "undefined entity &%s;: line %d, column %d",
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1963 PyString_AS_STRING(key),
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1964 EXPAT(GetErrorLineNumber)(self->parser),
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1965 EXPAT(GetErrorColumnNumber)(self->parser)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1966 );
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1967 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1968
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1969 Py_DECREF(key);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1970 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1971
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1972 static void
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1973 expat_start_handler(XMLParserObject* self, const XML_Char* tag_in,
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1974 const XML_Char **attrib_in)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1975 {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1976 PyObject* res;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1977 PyObject* tag;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1978 PyObject* attrib;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1979 int ok;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1980
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1981 /* tag name */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1982 tag = makeuniversal(self, tag_in);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1983 if (!tag)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1984 return; /* parser will look for errors */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1985
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1986 /* attributes */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1987 if (attrib_in[0]) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1988 attrib = PyDict_New();
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1989 if (!attrib)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1990 return;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1991 while (attrib_in[0] && attrib_in[1]) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1992 PyObject* key = makeuniversal(self, attrib_in[0]);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1993 PyObject* value = makestring(attrib_in[1], strlen(attrib_in[1]));
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1994 if (!key || !value) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1995 Py_XDECREF(value);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1996 Py_XDECREF(key);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1997 Py_DECREF(attrib);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1998 return;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1999 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2000 ok = PyDict_SetItem(attrib, key, value);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2001 Py_DECREF(value);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2002 Py_DECREF(key);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2003 if (ok < 0) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2004 Py_DECREF(attrib);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2005 return;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2006 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2007 attrib_in += 2;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2008 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2009 } else {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2010 Py_INCREF(Py_None);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2011 attrib = Py_None;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2012 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2013
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2014 if (TreeBuilder_CheckExact(self->target))
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2015 /* shortcut */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2016 res = treebuilder_handle_start((TreeBuilderObject*) self->target,
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2017 tag, attrib);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2018 else if (self->handle_start)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2019 res = PyObject_CallFunction(self->handle_start, "OO", tag, attrib);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2020 else
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2021 res = NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2022
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2023 Py_DECREF(tag);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2024 Py_DECREF(attrib);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2025
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2026 Py_XDECREF(res);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2027 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2028
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2029 static void
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2030 expat_data_handler(XMLParserObject* self, const XML_Char* data_in,
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2031 int data_len)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2032 {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2033 PyObject* data;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2034 PyObject* res;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2035
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2036 data = makestring(data_in, data_len);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2037
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2038 if (TreeBuilder_CheckExact(self->target))
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2039 /* shortcut */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2040 res = treebuilder_handle_data((TreeBuilderObject*) self->target, data);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2041 else if (self->handle_data)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2042 res = PyObject_CallFunction(self->handle_data, "O", data);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2043 else
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2044 res = NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2045
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2046 Py_DECREF(data);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2047
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2048 Py_XDECREF(res);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2049 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2050
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2051 static void
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2052 expat_end_handler(XMLParserObject* self, const XML_Char* tag_in)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2053 {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2054 PyObject* tag;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2055 PyObject* res = NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2056
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2057 if (TreeBuilder_CheckExact(self->target))
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2058 /* shortcut */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2059 /* the standard tree builder doesn't look at the end tag */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2060 res = treebuilder_handle_end(
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2061 (TreeBuilderObject*) self->target, Py_None
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2062 );
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2063 else if (self->handle_end) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2064 tag = makeuniversal(self, tag_in);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2065 if (tag) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2066 res = PyObject_CallFunction(self->handle_end, "O", tag);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2067 Py_DECREF(tag);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2068 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2069 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2070
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2071 Py_XDECREF(res);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2072 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2073
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2074 static void
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2075 expat_start_ns_handler(XMLParserObject* self, const XML_Char* prefix,
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2076 const XML_Char *uri)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2077 {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2078 treebuilder_handle_namespace(
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2079 (TreeBuilderObject*) self->target, 1, prefix, uri
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2080 );
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2081 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2082
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2083 static void
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2084 expat_end_ns_handler(XMLParserObject* self, const XML_Char* prefix_in)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2085 {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2086 treebuilder_handle_namespace(
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2087 (TreeBuilderObject*) self->target, 0, NULL, NULL
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2088 );
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2089 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2090
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2091 static void
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2092 expat_comment_handler(XMLParserObject* self, const XML_Char* comment_in)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2093 {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2094 PyObject* comment;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2095 PyObject* res;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2096
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2097 if (self->handle_comment) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2098 comment = makestring(comment_in, strlen(comment_in));
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2099 if (comment) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2100 res = PyObject_CallFunction(self->handle_comment, "O", comment);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2101 Py_XDECREF(res);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2102 Py_DECREF(comment);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2103 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2104 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2105 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2106
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2107 static void
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2108 expat_pi_handler(XMLParserObject* self, const XML_Char* target_in,
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2109 const XML_Char* data_in)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2110 {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2111 PyObject* target;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2112 PyObject* data;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2113 PyObject* res;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2114
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2115 if (self->handle_pi) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2116 target = makestring(target_in, strlen(target_in));
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2117 data = makestring(data_in, strlen(data_in));
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2118 if (target && data) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2119 res = PyObject_CallFunction(self->handle_pi, "OO", target, data);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2120 Py_XDECREF(res);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2121 Py_DECREF(data);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2122 Py_DECREF(target);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2123 } else {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2124 Py_XDECREF(data);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2125 Py_XDECREF(target);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2126 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2127 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2128 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2129
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2130 /* -------------------------------------------------------------------- */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2131 /* constructor and destructor */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2132
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2133 static PyObject*
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2134 xmlparser(PyObject* _self, PyObject* args, PyObject* kw)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2135 {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2136 XMLParserObject* self;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2137 /* FIXME: does this need to be static? */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2138 static XML_Memory_Handling_Suite memory_handler;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2139
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2140 PyObject* target = NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2141 char* encoding = NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2142 static PY_CONST char* kwlist[] = { "target", "encoding", NULL };
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2143 if (!PyArg_ParseTupleAndKeywords(args, kw, "|Oz:XMLParser", kwlist,
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2144 &target, &encoding))
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2145 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2146
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2147 #if defined(USE_PYEXPAT_CAPI)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2148 if (!expat_capi) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2149 PyErr_SetString(
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2150 PyExc_RuntimeError, "cannot load dispatch table from pyexpat"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2151 );
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2152 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2153 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2154 #endif
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2155
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2156 self = PyObject_New(XMLParserObject, &XMLParser_Type);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2157 if (self == NULL)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2158 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2159
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2160 self->entity = PyDict_New();
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2161 if (!self->entity) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2162 PyObject_Del(self);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2163 return NULL; /* FIXME: cleanup on error */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2164 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2165
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2166 self->names = PyDict_New();
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2167 if (!self->names) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2168 PyObject_Del(self);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2169 return NULL; /* FIXME: cleanup on error */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2170 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2171
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2172 memory_handler.malloc_fcn = PyObject_Malloc;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2173 memory_handler.realloc_fcn = PyObject_Realloc;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2174 memory_handler.free_fcn = PyObject_Free;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2175
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2176 self->parser = EXPAT(ParserCreate_MM)(encoding, &memory_handler, "}");
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2177 if (!self->parser) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2178 PyErr_NoMemory();
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2179 return NULL; /* FIXME: cleanup on error */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2180 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2181
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2182 /* setup target handlers */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2183 if (!target) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2184 target = treebuilder_new();
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2185 if (!target) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2186 PyObject_Del(self);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2187 return NULL; /* FIXME: cleanup on error */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2188 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2189 } else
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2190 Py_INCREF(target);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2191 self->target = target;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2192
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2193 self->handle_xml = PyObject_GetAttrString(target, "xml");
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2194 self->handle_start = PyObject_GetAttrString(target, "start");
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2195 self->handle_data = PyObject_GetAttrString(target, "data");
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2196 self->handle_end = PyObject_GetAttrString(target, "end");
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2197 self->handle_comment = PyObject_GetAttrString(target, "comment");
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2198 self->handle_pi = PyObject_GetAttrString(target, "pi");
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2199
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2200 PyErr_Clear();
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2201
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2202 /* configure parser */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2203 EXPAT(SetUserData)(self->parser, self);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2204 EXPAT(SetElementHandler)(
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2205 self->parser,
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2206 (XML_StartElementHandler) expat_start_handler,
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2207 (XML_EndElementHandler) expat_end_handler
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2208 );
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2209 EXPAT(SetDefaultHandlerExpand)(
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2210 self->parser,
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2211 (XML_DefaultHandler) expat_default_handler
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2212 );
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2213 EXPAT(SetCharacterDataHandler)(
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2214 self->parser,
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2215 (XML_CharacterDataHandler) expat_data_handler
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2216 );
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2217 if (self->handle_comment)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2218 EXPAT(SetCommentHandler)(
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2219 self->parser,
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2220 (XML_CommentHandler) expat_comment_handler
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2221 );
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2222 if (self->handle_pi)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2223 EXPAT(SetProcessingInstructionHandler)(
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2224 self->parser,
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2225 (XML_ProcessingInstructionHandler) expat_pi_handler
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2226 );
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2227
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2228 ALLOC(sizeof(XMLParserObject), "create expatparser");
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2229
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2230 return (PyObject*) self;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2231 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2232
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2233 static void
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2234 xmlparser_dealloc(XMLParserObject* self)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2235 {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2236 EXPAT(ParserFree)(self->parser);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2237
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2238 Py_XDECREF(self->handle_pi);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2239 Py_XDECREF(self->handle_comment);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2240 Py_XDECREF(self->handle_end);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2241 Py_XDECREF(self->handle_data);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2242 Py_XDECREF(self->handle_start);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2243 Py_XDECREF(self->handle_xml);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2244
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2245 Py_DECREF(self->target);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2246 Py_DECREF(self->entity);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2247 Py_DECREF(self->names);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2248
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2249 RELEASE(sizeof(XMLParserObject), "destroy expatparser");
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2250
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2251 PyObject_Del(self);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2252 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2253
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2254 /* -------------------------------------------------------------------- */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2255 /* methods (in alphabetical order) */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2256
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2257 LOCAL(PyObject*)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2258 expat_parse(XMLParserObject* self, char* data, int data_len, int final)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2259 {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2260 int ok;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2261
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2262 ok = EXPAT(Parse)(self->parser, data, data_len, final);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2263
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2264 if (PyErr_Occurred())
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2265 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2266
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2267 if (!ok) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2268 PyErr_Format(
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2269 PyExc_SyntaxError, "%s: line %d, column %d",
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2270 EXPAT(ErrorString)(EXPAT(GetErrorCode)(self->parser)),
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2271 EXPAT(GetErrorLineNumber)(self->parser),
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2272 EXPAT(GetErrorColumnNumber)(self->parser)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2273 );
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2274 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2275 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2276
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2277 Py_RETURN_NONE;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2278 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2279
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2280 static PyObject*
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2281 xmlparser_close(XMLParserObject* self, PyObject* args)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2282 {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2283 /* end feeding data to parser */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2284
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2285 PyObject* res;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2286 if (!PyArg_ParseTuple(args, ":close"))
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2287 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2288
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2289 res = expat_parse(self, "", 0, 1);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2290
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2291 if (res && TreeBuilder_CheckExact(self->target)) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2292 Py_DECREF(res);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2293 return treebuilder_done((TreeBuilderObject*) self->target);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2294 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2295
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2296 return res;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2297 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2298
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2299 static PyObject*
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2300 xmlparser_feed(XMLParserObject* self, PyObject* args)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2301 {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2302 /* feed data to parser */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2303
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2304 char* data;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2305 int data_len;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2306 if (!PyArg_ParseTuple(args, "s#:feed", &data, &data_len))
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2307 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2308
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2309 return expat_parse(self, data, data_len, 0);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2310 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2311
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2312 static PyObject*
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2313 xmlparser_parse(XMLParserObject* self, PyObject* args)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2314 {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2315 /* (internal) parse until end of input stream */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2316
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2317 PyObject* reader;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2318 PyObject* buffer;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2319 PyObject* res;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2320
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2321 PyObject* fileobj;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2322 if (!PyArg_ParseTuple(args, "O:_parse", &fileobj))
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2323 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2324
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2325 reader = PyObject_GetAttrString(fileobj, "read");
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2326 if (!reader)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2327 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2328
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2329 /* read from open file object */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2330 for (;;) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2331
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2332 buffer = PyObject_CallFunction(reader, "i", 64*1024);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2333
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2334 if (!buffer) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2335 /* read failed (e.g. due to KeyboardInterrupt) */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2336 Py_DECREF(reader);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2337 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2338 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2339
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2340 if (!PyString_CheckExact(buffer) || PyString_GET_SIZE(buffer) == 0) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2341 Py_DECREF(buffer);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2342 break;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2343 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2344
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2345 res = expat_parse(
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2346 self, PyString_AS_STRING(buffer), PyString_GET_SIZE(buffer), 0
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2347 );
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2348
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2349 Py_DECREF(buffer);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2350
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2351 if (!res) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2352 Py_DECREF(reader);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2353 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2354 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2355 Py_DECREF(res);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2356
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2357 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2358
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2359 Py_DECREF(reader);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2360
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2361 res = expat_parse(self, "", 0, 1);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2362
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2363 if (res && TreeBuilder_CheckExact(self->target)) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2364 Py_DECREF(res);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2365 return treebuilder_done((TreeBuilderObject*) self->target);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2366 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2367
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2368 return res;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2369 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2370
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2371 static PyObject*
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2372 xmlparser_setevents(XMLParserObject* self, PyObject* args)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2373 {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2374 /* activate element event reporting */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2375
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2376 int i;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2377 TreeBuilderObject* target;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2378
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2379 PyObject* events; /* event collector */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2380 PyObject* event_set = Py_None;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2381 if (!PyArg_ParseTuple(args, "O!|O:_setevents", &PyList_Type, &events,
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2382 &event_set))
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2383 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2384
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2385 if (!TreeBuilder_CheckExact(self->target)) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2386 PyErr_SetString(
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2387 PyExc_TypeError,
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2388 "event handling only supported for cElementTree.Treebuilder "
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2389 "targets"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2390 );
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2391 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2392 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2393
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2394 target = (TreeBuilderObject*) self->target;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2395
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2396 Py_INCREF(events);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2397 Py_XDECREF(target->events);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2398 target->events = events;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2399
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2400 /* clear out existing events */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2401 Py_XDECREF(target->start_event_obj); target->start_event_obj = NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2402 Py_XDECREF(target->end_event_obj); target->end_event_obj = NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2403 Py_XDECREF(target->start_ns_event_obj); target->start_ns_event_obj = NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2404 Py_XDECREF(target->end_ns_event_obj); target->end_ns_event_obj = NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2405
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2406 if (event_set == Py_None) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2407 /* default is "end" only */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2408 target->end_event_obj = PyString_FromString("end");
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2409 Py_RETURN_NONE;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2410 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2411
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2412 if (!PyTuple_Check(event_set)) /* FIXME: handle arbitrary sequences */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2413 goto error;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2414
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2415 for (i = 0; i < PyTuple_GET_SIZE(event_set); i++) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2416 PyObject* item = PyTuple_GET_ITEM(event_set, i);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2417 char* event;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2418 if (!PyString_Check(item))
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2419 goto error;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2420 event = PyString_AS_STRING(item);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2421 if (strcmp(event, "start") == 0) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2422 Py_INCREF(item);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2423 target->start_event_obj = item;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2424 } else if (strcmp(event, "end") == 0) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2425 Py_INCREF(item);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2426 Py_XDECREF(target->end_event_obj);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2427 target->end_event_obj = item;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2428 } else if (strcmp(event, "start-ns") == 0) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2429 Py_INCREF(item);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2430 Py_XDECREF(target->start_ns_event_obj);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2431 target->start_ns_event_obj = item;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2432 EXPAT(SetNamespaceDeclHandler)(
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2433 self->parser,
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2434 (XML_StartNamespaceDeclHandler) expat_start_ns_handler,
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2435 (XML_EndNamespaceDeclHandler) expat_end_ns_handler
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2436 );
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2437 } else if (strcmp(event, "end-ns") == 0) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2438 Py_INCREF(item);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2439 Py_XDECREF(target->end_ns_event_obj);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2440 target->end_ns_event_obj = item;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2441 EXPAT(SetNamespaceDeclHandler)(
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2442 self->parser,
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2443 (XML_StartNamespaceDeclHandler) expat_start_ns_handler,
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2444 (XML_EndNamespaceDeclHandler) expat_end_ns_handler
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2445 );
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2446 } else {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2447 PyErr_Format(
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2448 PyExc_ValueError,
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2449 "unknown event '%s'", event
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2450 );
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2451 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2452 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2453 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2454
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2455 Py_RETURN_NONE;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2456
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2457 error:
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2458 PyErr_SetString(
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2459 PyExc_TypeError,
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2460 "invalid event tuple"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2461 );
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2462 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2463 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2464
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2465 static PyMethodDef xmlparser_methods[] = {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2466 {"feed", (PyCFunction) xmlparser_feed, METH_VARARGS},
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2467 {"close", (PyCFunction) xmlparser_close, METH_VARARGS},
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2468 {"_parse", (PyCFunction) xmlparser_parse, METH_VARARGS},
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2469 {"_setevents", (PyCFunction) xmlparser_setevents, METH_VARARGS},
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2470 {NULL, NULL}
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2471 };
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2472
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2473 static PyObject*
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2474 xmlparser_getattr(XMLParserObject* self, char* name)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2475 {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2476 PyObject* res;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2477
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2478 res = Py_FindMethod(xmlparser_methods, (PyObject*) self, name);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2479 if (res)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2480 return res;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2481
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2482 PyErr_Clear();
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2483
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2484 if (strcmp(name, "entity") == 0)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2485 res = self->entity;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2486 else if (strcmp(name, "target") == 0)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2487 res = self->target;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2488 else if (strcmp(name, "version") == 0) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2489 char buffer[100];
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2490 sprintf(buffer, "Expat %d.%d.%d", XML_MAJOR_VERSION,
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2491 XML_MINOR_VERSION, XML_MICRO_VERSION);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2492 return PyString_FromString(buffer);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2493 } else {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2494 PyErr_SetString(PyExc_AttributeError, name);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2495 return NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2496 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2497
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2498 Py_INCREF(res);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2499 return res;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2500 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2501
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2502 statichere PyTypeObject XMLParser_Type = {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2503 PyObject_HEAD_INIT(NULL)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2504 0, "XMLParser", sizeof(XMLParserObject), 0,
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2505 /* methods */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2506 (destructor)xmlparser_dealloc, /* tp_dealloc */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2507 0, /* tp_print */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2508 (getattrfunc)xmlparser_getattr, /* tp_getattr */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2509 };
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2510
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2511 #endif
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2512
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2513 /* ==================================================================== */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2514 /* python module interface */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2515
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2516 static PyMethodDef _functions[] = {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2517 {"Element", (PyCFunction) element, METH_VARARGS|METH_KEYWORDS},
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2518 {"SubElement", (PyCFunction) subelement, METH_VARARGS|METH_KEYWORDS},
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2519 {"TreeBuilder", (PyCFunction) treebuilder, METH_VARARGS},
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2520 #if defined(USE_EXPAT)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2521 {"XMLParser", (PyCFunction) xmlparser, METH_VARARGS|METH_KEYWORDS},
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2522 {"XMLTreeBuilder", (PyCFunction) xmlparser, METH_VARARGS|METH_KEYWORDS},
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2523 #endif
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2524 {NULL, NULL}
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2525 };
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2526
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2527 DL_EXPORT(void)
36028
9301a7c0312a renamed to _elementtree (for Python 2.5)
Fredrik Lundh <fredrik@pythonware.com>
parents: 36027
diff changeset
2528 init_elementtree(void)
36027
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2529 {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2530 PyObject* m;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2531 PyObject* g;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2532 char* bootstrap;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2533 #if defined(USE_PYEXPAT_CAPI)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2534 struct PyExpat_CAPI* capi;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2535 #endif
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2536
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2537 /* Patch object type */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2538 Element_Type.ob_type = TreeBuilder_Type.ob_type = &PyType_Type;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2539 #if defined(USE_EXPAT)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2540 XMLParser_Type.ob_type = &PyType_Type;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2541 #endif
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2542
36028
9301a7c0312a renamed to _elementtree (for Python 2.5)
Fredrik Lundh <fredrik@pythonware.com>
parents: 36027
diff changeset
2543 m = Py_InitModule("_elementtree", _functions);
36027
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2544
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2545 /* python glue code */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2546
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2547 g = PyDict_New();
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2548
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2549 PyDict_SetItemString(g, "__builtins__", PyEval_GetBuiltins());
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2550
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2551 bootstrap = (
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2552
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2553 #if (PY_VERSION_HEX >= 0x02020000 && PY_VERSION_HEX < 0x02030000)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2554 "from __future__ import generators\n" /* enable yield under 2.2 */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2555 #endif
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2556
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2557 "from copy import copy, deepcopy\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2558
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2559 "try:\n"
36028
9301a7c0312a renamed to _elementtree (for Python 2.5)
Fredrik Lundh <fredrik@pythonware.com>
parents: 36027
diff changeset
2560 " from xml.etree import ElementTree\n"
36027
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2561 "except ImportError:\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2562 " import ElementTree\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2563 "ET = ElementTree\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2564 "del ElementTree\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2565
36028
9301a7c0312a renamed to _elementtree (for Python 2.5)
Fredrik Lundh <fredrik@pythonware.com>
parents: 36027
diff changeset
2566 "import _elementtree as cElementTree\n"
36027
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2567
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2568 "try:\n" /* check if copy works as is */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2569 " copy(cElementTree.Element('x'))\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2570 "except:\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2571 " def copyelement(elem):\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2572 " return elem\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2573
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2574 "def Comment(text=None):\n" /* public */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2575 " element = cElementTree.Element(ET.Comment)\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2576 " element.text = text\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2577 " return element\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2578 "cElementTree.Comment = Comment\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2579
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2580 "class ElementTree(ET.ElementTree):\n" /* public */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2581 " def parse(self, source, parser=None):\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2582 " if not hasattr(source, 'read'):\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2583 " source = open(source, 'rb')\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2584 " if parser is not None:\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2585 " while 1:\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2586 " data = source.read(65536)\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2587 " if not data:\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2588 " break\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2589 " parser.feed(data)\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2590 " self._root = parser.close()\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2591 " else:\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2592 " parser = cElementTree.XMLParser()\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2593 " self._root = parser._parse(source)\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2594 " return self._root\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2595 "cElementTree.ElementTree = ElementTree\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2596
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2597 "def getiterator(node, tag=None):\n" /* helper */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2598 " if tag == '*':\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2599 " tag = None\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2600 #if (PY_VERSION_HEX < 0x02020000)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2601 " nodes = []\n" /* 2.1 doesn't have yield */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2602 " if tag is None or node.tag == tag:\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2603 " nodes.append(node)\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2604 " for node in node:\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2605 " nodes.extend(getiterator(node, tag))\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2606 " return nodes\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2607 #else
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2608 " if tag is None or node.tag == tag:\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2609 " yield node\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2610 " for node in node:\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2611 " for node in getiterator(node, tag):\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2612 " yield node\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2613 #endif
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2614
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2615 "def parse(source, parser=None):\n" /* public */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2616 " tree = ElementTree()\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2617 " tree.parse(source, parser)\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2618 " return tree\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2619 "cElementTree.parse = parse\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2620
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2621 #if (PY_VERSION_HEX < 0x02020000)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2622 "if hasattr(ET, 'iterparse'):\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2623 " cElementTree.iterparse = ET.iterparse\n" /* delegate on 2.1 */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2624 #else
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2625 "class iterparse(object):\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2626 " root = None\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2627 " def __init__(self, file, events=None):\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2628 " if not hasattr(file, 'read'):\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2629 " file = open(file, 'rb')\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2630 " self._file = file\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2631 " self._events = events\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2632 " def __iter__(self):\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2633 " events = []\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2634 " b = cElementTree.TreeBuilder()\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2635 " p = cElementTree.XMLParser(b)\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2636 " p._setevents(events, self._events)\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2637 " while 1:\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2638 " data = self._file.read(16384)\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2639 " if not data:\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2640 " break\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2641 " p.feed(data)\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2642 " for event in events:\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2643 " yield event\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2644 " del events[:]\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2645 " root = p.close()\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2646 " for event in events:\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2647 " yield event\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2648 " self.root = root\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2649 "cElementTree.iterparse = iterparse\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2650 #endif
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2651
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2652 "def PI(target, text=None):\n" /* public */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2653 " element = cElementTree.Element(ET.ProcessingInstruction)\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2654 " element.text = target\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2655 " if text:\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2656 " element.text = element.text + ' ' + text\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2657 " return element\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2658
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2659 " elem = cElementTree.Element(ET.PI)\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2660 " elem.text = text\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2661 " return elem\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2662 "cElementTree.PI = cElementTree.ProcessingInstruction = PI\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2663
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2664 "def XML(text):\n" /* public */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2665 " parser = cElementTree.XMLParser()\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2666 " parser.feed(text)\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2667 " return parser.close()\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2668 "cElementTree.XML = cElementTree.fromstring = XML\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2669
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2670 "def XMLID(text):\n" /* public */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2671 " tree = XML(text)\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2672 " ids = {}\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2673 " for elem in tree.getiterator():\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2674 " id = elem.get('id')\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2675 " if id:\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2676 " ids[id] = elem\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2677 " return tree, ids\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2678 "cElementTree.XMLID = XMLID\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2679
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2680 "cElementTree.dump = ET.dump\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2681 "cElementTree.ElementPath = ElementPath = ET.ElementPath\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2682 "cElementTree.iselement = ET.iselement\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2683 "cElementTree.QName = ET.QName\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2684 "cElementTree.tostring = ET.tostring\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2685 "cElementTree.VERSION = '" VERSION "'\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2686 "cElementTree.__version__ = '" VERSION "'\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2687 "cElementTree.XMLParserError = SyntaxError\n"
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2688
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2689 );
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2690
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2691 PyRun_String(bootstrap, Py_file_input, g, NULL);
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2692
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2693 elementpath_obj = PyDict_GetItemString(g, "ElementPath");
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2694
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2695 elementtree_copyelement_obj = PyDict_GetItemString(g, "copyelement");
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2696 if (elementtree_copyelement_obj) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2697 /* reduce hack needed; enable reduce method */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2698 PyMethodDef* mp;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2699 for (mp = element_methods; mp->ml_name; mp++)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2700 if (mp->ml_meth == (PyCFunction) element_reduce) {
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2701 mp->ml_name = "__reduce__";
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2702 break;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2703 }
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2704 } else
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2705 PyErr_Clear();
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2706 elementtree_deepcopy_obj = PyDict_GetItemString(g, "deepcopy");
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2707 elementtree_getiterator_obj = PyDict_GetItemString(g, "getiterator");
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2708
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2709 #if defined(USE_PYEXPAT_CAPI)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2710 /* link against pyexpat, if possible */
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2711 capi = PyCObject_Import("pyexpat", "expat_CAPI");
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2712 if (capi &&
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2713 strcmp(capi->magic, PyExpat_CAPI_MAGIC) == 0 &&
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2714 capi->size <= sizeof(*expat_capi) &&
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2715 capi->MAJOR_VERSION == XML_MAJOR_VERSION &&
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2716 capi->MINOR_VERSION == XML_MINOR_VERSION &&
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2717 capi->MICRO_VERSION == XML_MICRO_VERSION)
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2718 expat_capi = capi;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2719 else
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2720 expat_capi = NULL;
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2721 #endif
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2722
cd8b5b31e02a copied cElementTree 1.0.4 to Modules
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2723 }