annotate genshi/_speedups.c @ 724:919809e55d16 experimental-match-fastpaths

update to trunk to track r847, fixing python 2.4 compatibility issues in speedup (and fixing copyrights, apparently :))
author aflett
date Mon, 21 Apr 2008 19:36:53 +0000
parents d143dd73789b
children ea46fb523485
rev   line source
541
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
1 /*
724
919809e55d16 update to trunk to track r847, fixing python 2.4 compatibility issues in speedup (and fixing copyrights, apparently :))
aflett
parents: 718
diff changeset
2 * Copyright (C) 2006-2008 Edgewall Software
541
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
3 * All rights reserved.
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
4 *
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
5 * This software is licensed as described in the file COPYING, which
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
6 * you should have received as part of this distribution. The terms
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
7 * are also available at http://genshi.edgewall.org/wiki/License.
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
8 *
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
9 * This software consists of voluntary contributions made by many
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
10 * individuals. For the exact contribution history, see the revision
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
11 * history and logs, available at http://genshi.edgewall.org/log/.
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
12 */
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
13
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
14 #include <Python.h>
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
15 #include <structmember.h>
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
16
724
919809e55d16 update to trunk to track r847, fixing python 2.4 compatibility issues in speedup (and fixing copyrights, apparently :))
aflett
parents: 718
diff changeset
17 #if PY_VERSION_HEX < 0x02050000 && !defined(PY_SSIZE_T_MIN)
919809e55d16 update to trunk to track r847, fixing python 2.4 compatibility issues in speedup (and fixing copyrights, apparently :))
aflett
parents: 718
diff changeset
18 typedef int Py_ssize_t;
919809e55d16 update to trunk to track r847, fixing python 2.4 compatibility issues in speedup (and fixing copyrights, apparently :))
aflett
parents: 718
diff changeset
19 #define PY_SSIZE_T_MAX INT_MAX
919809e55d16 update to trunk to track r847, fixing python 2.4 compatibility issues in speedup (and fixing copyrights, apparently :))
aflett
parents: 718
diff changeset
20 #define PY_SSIZE_T_MIN INT_MIN
919809e55d16 update to trunk to track r847, fixing python 2.4 compatibility issues in speedup (and fixing copyrights, apparently :))
aflett
parents: 718
diff changeset
21 #endif
919809e55d16 update to trunk to track r847, fixing python 2.4 compatibility issues in speedup (and fixing copyrights, apparently :))
aflett
parents: 718
diff changeset
22
541
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
23 static PyObject *amp1, *amp2, *lt1, *lt2, *gt1, *gt2, *qt1, *qt2;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
24 static PyObject *stripentities, *striptags;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
25
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
26 static void
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
27 init_constants(void)
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
28 {
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
29 PyObject *util = PyImport_ImportModule("genshi.util");
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
30 stripentities = PyObject_GetAttrString(util, "stripentities");
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
31 striptags = PyObject_GetAttrString(util, "striptags");
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
32 Py_DECREF(util);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
33
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
34 amp1 = PyUnicode_DecodeASCII("&", 1, NULL);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
35 amp2 = PyUnicode_DecodeASCII("&amp;", 5, NULL);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
36 lt1 = PyUnicode_DecodeASCII("<", 1, NULL);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
37 lt2 = PyUnicode_DecodeASCII("&lt;", 4, NULL);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
38 gt1 = PyUnicode_DecodeASCII(">", 1, NULL);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
39 gt2 = PyUnicode_DecodeASCII("&gt;", 4, NULL);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
40 qt1 = PyUnicode_DecodeASCII("\"", 1, NULL);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
41 qt2 = PyUnicode_DecodeASCII("&#34;", 5, NULL);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
42 }
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
43
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
44 /* Markup class */
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
45
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
46 PyAPI_DATA(PyTypeObject) MarkupType;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
47
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
48 PyDoc_STRVAR(Markup__doc__,
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
49 "Marks a string as being safe for inclusion in HTML/XML output without\n\
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
50 needing to be escaped.");
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
51
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
52 static PyObject *
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
53 escape(PyObject *text, int quotes)
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
54 {
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
55 PyObject *args, *ret;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
56 PyUnicodeObject *in, *out;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
57 Py_UNICODE *inp, *outp;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
58 int len, inn, outn;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
59
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
60 if (PyObject_TypeCheck(text, &MarkupType)) {
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
61 Py_INCREF(text);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
62 return text;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
63 }
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
64 in = (PyUnicodeObject *) PyObject_Unicode(text);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
65 if (in == NULL) {
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
66 return NULL;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
67 }
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
68 /* First we need to figure out how long the escaped string will be */
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
69 len = inn = 0;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
70 inp = in->str;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
71 while (*(inp) || in->length > inp - in->str) {
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
72 switch (*inp++) {
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
73 case '&': len += 5; inn++; break;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
74 case '"': len += quotes ? 5 : 1; inn += quotes ? 1 : 0; break;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
75 case '<':
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
76 case '>': len += 4; inn++; break;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
77 default: len++;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
78 }
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
79 }
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
80
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
81 /* Do we need to escape anything at all? */
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
82 if (!inn) {
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
83 args = PyTuple_New(1);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
84 if (args == NULL) {
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
85 Py_DECREF((PyObject *) in);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
86 return NULL;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
87 }
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
88 PyTuple_SET_ITEM(args, 0, (PyObject *) in);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
89 ret = MarkupType.tp_new(&MarkupType, args, NULL);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
90 Py_DECREF(args);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
91 return ret;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
92 }
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
93
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
94 out = (PyUnicodeObject*) PyUnicode_FromUnicode(NULL, len);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
95 if (out == NULL) {
665
3ee92ec99ad9 Applied patch to fix a memory leak in the C implementation of the `Markup.escape()` function. Thanks to Christian Boos for reporting and figuring out the problem. Closes #166.
cmlenz
parents: 547
diff changeset
96 Py_DECREF((PyObject *) in);
541
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
97 return NULL;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
98 }
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
99
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
100 outn = 0;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
101 inp = in->str;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
102 outp = out->str;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
103 while (*(inp) || in->length > inp - in->str) {
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
104 if (outn == inn) {
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
105 /* copy rest of string if we have already replaced everything */
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
106 Py_UNICODE_COPY(outp, inp, in->length - (inp - in->str));
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
107 break;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
108 }
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
109 switch (*inp) {
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
110 case '&':
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
111 Py_UNICODE_COPY(outp, ((PyUnicodeObject *) amp2)->str, 5);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
112 outp += 5;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
113 outn++;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
114 break;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
115 case '"':
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
116 if (quotes) {
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
117 Py_UNICODE_COPY(outp, ((PyUnicodeObject *) qt2)->str, 5);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
118 outp += 5;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
119 outn++;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
120 } else {
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
121 *outp++ = *inp;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
122 }
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
123 break;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
124 case '<':
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
125 Py_UNICODE_COPY(outp, ((PyUnicodeObject *) lt2)->str, 4);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
126 outp += 4;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
127 outn++;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
128 break;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
129 case '>':
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
130 Py_UNICODE_COPY(outp, ((PyUnicodeObject *) gt2)->str, 4);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
131 outp += 4;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
132 outn++;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
133 break;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
134 default:
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
135 *outp++ = *inp;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
136 }
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
137 inp++;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
138 }
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
139
665
3ee92ec99ad9 Applied patch to fix a memory leak in the C implementation of the `Markup.escape()` function. Thanks to Christian Boos for reporting and figuring out the problem. Closes #166.
cmlenz
parents: 547
diff changeset
140 Py_DECREF((PyObject *) in);
3ee92ec99ad9 Applied patch to fix a memory leak in the C implementation of the `Markup.escape()` function. Thanks to Christian Boos for reporting and figuring out the problem. Closes #166.
cmlenz
parents: 547
diff changeset
141
541
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
142 args = PyTuple_New(1);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
143 if (args == NULL) {
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
144 Py_DECREF((PyObject *) out);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
145 return NULL;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
146 }
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
147 PyTuple_SET_ITEM(args, 0, (PyObject *) out);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
148 ret = MarkupType.tp_new(&MarkupType, args, NULL);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
149 Py_DECREF(args);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
150 return ret;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
151 }
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
152
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
153 PyDoc_STRVAR(escape__doc__,
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
154 "Create a Markup instance from a string and escape special characters\n\
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
155 it may contain (<, >, & and \").\n\
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
156 \n\
547
93b2a5792cfc Port docstrings to C version of `Markup` class.
cmlenz
parents: 541
diff changeset
157 >>> escape('\"1 < 2\"')\n\
93b2a5792cfc Port docstrings to C version of `Markup` class.
cmlenz
parents: 541
diff changeset
158 <Markup u'&#34;1 &lt; 2&#34;'>\n\
93b2a5792cfc Port docstrings to C version of `Markup` class.
cmlenz
parents: 541
diff changeset
159 \n\
541
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
160 If the `quotes` parameter is set to `False`, the \" character is left\n\
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
161 as is. Escaping quotes is generally only required for strings that are\n\
547
93b2a5792cfc Port docstrings to C version of `Markup` class.
cmlenz
parents: 541
diff changeset
162 to be used in attribute values.\n\
93b2a5792cfc Port docstrings to C version of `Markup` class.
cmlenz
parents: 541
diff changeset
163 \n\
93b2a5792cfc Port docstrings to C version of `Markup` class.
cmlenz
parents: 541
diff changeset
164 >>> escape('\"1 < 2\"', quotes=False)\n\
93b2a5792cfc Port docstrings to C version of `Markup` class.
cmlenz
parents: 541
diff changeset
165 <Markup u'\"1 &lt; 2\"'>\n\
93b2a5792cfc Port docstrings to C version of `Markup` class.
cmlenz
parents: 541
diff changeset
166 \n\
93b2a5792cfc Port docstrings to C version of `Markup` class.
cmlenz
parents: 541
diff changeset
167 :param text: the text to escape\n\
93b2a5792cfc Port docstrings to C version of `Markup` class.
cmlenz
parents: 541
diff changeset
168 :param quotes: if ``True``, double quote characters are escaped in\n\
93b2a5792cfc Port docstrings to C version of `Markup` class.
cmlenz
parents: 541
diff changeset
169 addition to the other special characters\n\
93b2a5792cfc Port docstrings to C version of `Markup` class.
cmlenz
parents: 541
diff changeset
170 :return: the escaped `Markup` string\n\
93b2a5792cfc Port docstrings to C version of `Markup` class.
cmlenz
parents: 541
diff changeset
171 :rtype: `Markup`\n\
93b2a5792cfc Port docstrings to C version of `Markup` class.
cmlenz
parents: 541
diff changeset
172 ");
541
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
173
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
174 static PyObject *
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
175 Markup_escape(PyTypeObject* type, PyObject *args, PyObject *kwds)
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
176 {
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
177 static char *kwlist[] = {"text", "quotes", 0};
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
178 PyObject *text = NULL;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
179 char quotes = 1;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
180
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
181 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|b", kwlist, &text, &quotes)) {
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
182 return NULL;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
183 }
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
184 if (PyObject_Not(text)) {
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
185 return type->tp_new(type, args, NULL);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
186 }
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
187 if (PyObject_TypeCheck(text, type)) {
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
188 Py_INCREF(text);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
189 return text;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
190 }
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
191 return escape(text, quotes);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
192 }
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
193
547
93b2a5792cfc Port docstrings to C version of `Markup` class.
cmlenz
parents: 541
diff changeset
194 PyDoc_STRVAR(join__doc__,
93b2a5792cfc Port docstrings to C version of `Markup` class.
cmlenz
parents: 541
diff changeset
195 "Return a `Markup` object which is the concatenation of the strings\n\
93b2a5792cfc Port docstrings to C version of `Markup` class.
cmlenz
parents: 541
diff changeset
196 in the given sequence, where this `Markup` object is the separator\n\
93b2a5792cfc Port docstrings to C version of `Markup` class.
cmlenz
parents: 541
diff changeset
197 between the joined elements.\n\
93b2a5792cfc Port docstrings to C version of `Markup` class.
cmlenz
parents: 541
diff changeset
198 \n\
93b2a5792cfc Port docstrings to C version of `Markup` class.
cmlenz
parents: 541
diff changeset
199 Any element in the sequence that is not a `Markup` instance is\n\
93b2a5792cfc Port docstrings to C version of `Markup` class.
cmlenz
parents: 541
diff changeset
200 automatically escaped.\n\
93b2a5792cfc Port docstrings to C version of `Markup` class.
cmlenz
parents: 541
diff changeset
201 \n\
93b2a5792cfc Port docstrings to C version of `Markup` class.
cmlenz
parents: 541
diff changeset
202 :param seq: the sequence of strings to join\n\
93b2a5792cfc Port docstrings to C version of `Markup` class.
cmlenz
parents: 541
diff changeset
203 :param escape_quotes: whether double quote characters in the elements\n\
93b2a5792cfc Port docstrings to C version of `Markup` class.
cmlenz
parents: 541
diff changeset
204 should be escaped\n\
93b2a5792cfc Port docstrings to C version of `Markup` class.
cmlenz
parents: 541
diff changeset
205 :return: the joined `Markup` object\n\
93b2a5792cfc Port docstrings to C version of `Markup` class.
cmlenz
parents: 541
diff changeset
206 :rtype: `Markup`\n\
93b2a5792cfc Port docstrings to C version of `Markup` class.
cmlenz
parents: 541
diff changeset
207 :see: `escape`\n\
93b2a5792cfc Port docstrings to C version of `Markup` class.
cmlenz
parents: 541
diff changeset
208 ");
93b2a5792cfc Port docstrings to C version of `Markup` class.
cmlenz
parents: 541
diff changeset
209
541
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
210 static PyObject *
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
211 Markup_join(PyObject *self, PyObject *args, PyObject *kwds)
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
212 {
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
213 static char *kwlist[] = {"seq", "escape_quotes", 0};
665
3ee92ec99ad9 Applied patch to fix a memory leak in the C implementation of the `Markup.escape()` function. Thanks to Christian Boos for reporting and figuring out the problem. Closes #166.
cmlenz
parents: 547
diff changeset
214 PyObject *seq = NULL, *seq2, *tmp, *tmp2;
541
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
215 char quotes = 1;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
216 int n, i;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
217
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
218 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|b", kwlist, &seq, &quotes)) {
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
219 return NULL;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
220 }
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
221 if (!PySequence_Check(seq)) {
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
222 return NULL;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
223 }
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
224 n = PySequence_Size(seq);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
225 if (n < 0) {
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
226 return NULL;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
227 }
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
228 seq2 = PyTuple_New(n);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
229 if (seq2 == NULL) {
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
230 return NULL;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
231 }
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
232 for (i = 0; i < n; i++) {
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
233 tmp = PySequence_GetItem(seq, i);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
234 if (tmp == NULL) {
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
235 Py_DECREF(seq2);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
236 return NULL;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
237 }
665
3ee92ec99ad9 Applied patch to fix a memory leak in the C implementation of the `Markup.escape()` function. Thanks to Christian Boos for reporting and figuring out the problem. Closes #166.
cmlenz
parents: 547
diff changeset
238 tmp2 = escape(tmp, quotes);
3ee92ec99ad9 Applied patch to fix a memory leak in the C implementation of the `Markup.escape()` function. Thanks to Christian Boos for reporting and figuring out the problem. Closes #166.
cmlenz
parents: 547
diff changeset
239 if (tmp2 == NULL) {
541
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
240 Py_DECREF(seq2);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
241 return NULL;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
242 }
665
3ee92ec99ad9 Applied patch to fix a memory leak in the C implementation of the `Markup.escape()` function. Thanks to Christian Boos for reporting and figuring out the problem. Closes #166.
cmlenz
parents: 547
diff changeset
243 PyTuple_SET_ITEM(seq2, i, tmp2);
3ee92ec99ad9 Applied patch to fix a memory leak in the C implementation of the `Markup.escape()` function. Thanks to Christian Boos for reporting and figuring out the problem. Closes #166.
cmlenz
parents: 547
diff changeset
244 Py_DECREF(tmp);
541
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
245 }
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
246 tmp = PyUnicode_Join(self, seq2);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
247 Py_DECREF(seq2);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
248 if (tmp == NULL)
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
249 return NULL;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
250 args = PyTuple_New(1);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
251 if (args == NULL) {
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
252 Py_DECREF(tmp);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
253 return NULL;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
254 }
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
255 PyTuple_SET_ITEM(args, 0, tmp);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
256 tmp = MarkupType.tp_new(&MarkupType, args, NULL);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
257 Py_DECREF(args);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
258 return tmp;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
259 }
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
260
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
261 static PyObject *
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
262 Markup_add(PyObject *self, PyObject *other)
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
263 {
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
264 PyObject *tmp, *tmp2, *args, *ret;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
265 if (PyObject_TypeCheck(self, &MarkupType)) {
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
266 tmp = escape(other, 1);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
267 if (tmp == NULL)
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
268 return NULL;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
269 tmp2 = PyUnicode_Concat(self, tmp);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
270 } else { // __radd__
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
271 tmp = escape(self, 1);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
272 if (tmp == NULL)
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
273 return NULL;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
274 tmp2 = PyUnicode_Concat(tmp, other);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
275 }
665
3ee92ec99ad9 Applied patch to fix a memory leak in the C implementation of the `Markup.escape()` function. Thanks to Christian Boos for reporting and figuring out the problem. Closes #166.
cmlenz
parents: 547
diff changeset
276 Py_DECREF(tmp);
3ee92ec99ad9 Applied patch to fix a memory leak in the C implementation of the `Markup.escape()` function. Thanks to Christian Boos for reporting and figuring out the problem. Closes #166.
cmlenz
parents: 547
diff changeset
277 if (tmp2 == NULL)
541
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
278 return NULL;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
279 args = PyTuple_New(1);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
280 if (args == NULL) {
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
281 Py_DECREF(tmp2);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
282 return NULL;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
283 }
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
284 PyTuple_SET_ITEM(args, 0, tmp2);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
285 ret = MarkupType.tp_new(&MarkupType, args, NULL);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
286 Py_DECREF(args);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
287 return ret;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
288 }
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
289
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
290 static PyObject *
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
291 Markup_mod(PyObject *self, PyObject *args)
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
292 {
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
293 PyObject *tmp, *tmp2, *ret, *args2;
718
d143dd73789b update to trunk through r833
aflett
parents: 681
diff changeset
294 int i, nargs = 0;
d143dd73789b update to trunk through r833
aflett
parents: 681
diff changeset
295 PyObject *kwds = NULL;
541
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
296
718
d143dd73789b update to trunk through r833
aflett
parents: 681
diff changeset
297 if (PyDict_Check(args)) {
d143dd73789b update to trunk through r833
aflett
parents: 681
diff changeset
298 kwds = args;
d143dd73789b update to trunk through r833
aflett
parents: 681
diff changeset
299 }
d143dd73789b update to trunk through r833
aflett
parents: 681
diff changeset
300 if (kwds && PyDict_Size(kwds)) {
d143dd73789b update to trunk through r833
aflett
parents: 681
diff changeset
301 PyObject *kwcopy, *key, *value;
724
919809e55d16 update to trunk to track r847, fixing python 2.4 compatibility issues in speedup (and fixing copyrights, apparently :))
aflett
parents: 718
diff changeset
302 #if PY_VERSION_HEX >= 0x02050000
718
d143dd73789b update to trunk through r833
aflett
parents: 681
diff changeset
303 Py_ssize_t pos = 0;
724
919809e55d16 update to trunk to track r847, fixing python 2.4 compatibility issues in speedup (and fixing copyrights, apparently :))
aflett
parents: 718
diff changeset
304 #else
919809e55d16 update to trunk to track r847, fixing python 2.4 compatibility issues in speedup (and fixing copyrights, apparently :))
aflett
parents: 718
diff changeset
305 int pos = 0;
919809e55d16 update to trunk to track r847, fixing python 2.4 compatibility issues in speedup (and fixing copyrights, apparently :))
aflett
parents: 718
diff changeset
306 #endif
718
d143dd73789b update to trunk through r833
aflett
parents: 681
diff changeset
307
d143dd73789b update to trunk through r833
aflett
parents: 681
diff changeset
308 kwcopy = PyDict_Copy( kwds );
d143dd73789b update to trunk through r833
aflett
parents: 681
diff changeset
309 if (kwcopy == NULL) {
d143dd73789b update to trunk through r833
aflett
parents: 681
diff changeset
310 return NULL;
d143dd73789b update to trunk through r833
aflett
parents: 681
diff changeset
311 }
d143dd73789b update to trunk through r833
aflett
parents: 681
diff changeset
312 while (PyDict_Next(kwcopy, &pos, &key, &value)) {
d143dd73789b update to trunk through r833
aflett
parents: 681
diff changeset
313 tmp = escape(value, 1);
d143dd73789b update to trunk through r833
aflett
parents: 681
diff changeset
314 if (tmp == NULL) {
d143dd73789b update to trunk through r833
aflett
parents: 681
diff changeset
315 Py_DECREF(kwcopy);
d143dd73789b update to trunk through r833
aflett
parents: 681
diff changeset
316 return NULL;
d143dd73789b update to trunk through r833
aflett
parents: 681
diff changeset
317 }
d143dd73789b update to trunk through r833
aflett
parents: 681
diff changeset
318 if (PyDict_SetItem(kwcopy, key, tmp) < 0) {
d143dd73789b update to trunk through r833
aflett
parents: 681
diff changeset
319 Py_DECREF(tmp);
d143dd73789b update to trunk through r833
aflett
parents: 681
diff changeset
320 Py_DECREF(kwcopy);
d143dd73789b update to trunk through r833
aflett
parents: 681
diff changeset
321 return NULL;
d143dd73789b update to trunk through r833
aflett
parents: 681
diff changeset
322 }
d143dd73789b update to trunk through r833
aflett
parents: 681
diff changeset
323 }
d143dd73789b update to trunk through r833
aflett
parents: 681
diff changeset
324 tmp = PyUnicode_Format(self, kwcopy);
d143dd73789b update to trunk through r833
aflett
parents: 681
diff changeset
325 Py_DECREF(kwcopy);
d143dd73789b update to trunk through r833
aflett
parents: 681
diff changeset
326 if (tmp == NULL) {
d143dd73789b update to trunk through r833
aflett
parents: 681
diff changeset
327 return NULL;
d143dd73789b update to trunk through r833
aflett
parents: 681
diff changeset
328 }
d143dd73789b update to trunk through r833
aflett
parents: 681
diff changeset
329 } else if (PyTuple_Check(args)) {
541
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
330 nargs = PyTuple_GET_SIZE(args);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
331 args2 = PyTuple_New(nargs);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
332 if (args2 == NULL) {
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
333 return NULL;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
334 }
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
335 for (i = 0; i < nargs; i++) {
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
336 tmp = escape(PyTuple_GET_ITEM(args, i), 1);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
337 if (tmp == NULL) {
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
338 Py_DECREF(args2);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
339 return NULL;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
340 }
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
341 PyTuple_SET_ITEM(args2, i, tmp);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
342 }
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
343 tmp = PyUnicode_Format(self, args2);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
344 Py_DECREF(args2);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
345 if (tmp == NULL) {
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
346 return NULL;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
347 }
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
348 } else {
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
349 tmp2 = escape(args, 1);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
350 if (tmp2 == NULL) {
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
351 return NULL;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
352 }
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
353 tmp = PyUnicode_Format(self, tmp2);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
354 Py_DECREF(tmp2);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
355 if (tmp == NULL) {
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
356 return NULL;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
357 }
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
358 }
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
359 args = PyTuple_New(1);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
360 if (args == NULL) {
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
361 Py_DECREF(tmp);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
362 return NULL;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
363 }
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
364 PyTuple_SET_ITEM(args, 0, tmp);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
365 ret = PyUnicode_Type.tp_new(&MarkupType, args, NULL);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
366 Py_DECREF(args);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
367 return ret;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
368 }
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
369
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
370 static PyObject *
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
371 Markup_mul(PyObject *self, PyObject *num)
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
372 {
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
373 PyObject *unicode, *result, *args;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
374
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
375 if (PyObject_TypeCheck(self, &MarkupType)) {
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
376 unicode = PyObject_Unicode(self);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
377 if (unicode == NULL) return NULL;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
378 result = PyNumber_Multiply(unicode, num);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
379 } else { // __rmul__
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
380 unicode = PyObject_Unicode(num);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
381 if (unicode == NULL) return NULL;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
382 result = PyNumber_Multiply(unicode, self);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
383 }
665
3ee92ec99ad9 Applied patch to fix a memory leak in the C implementation of the `Markup.escape()` function. Thanks to Christian Boos for reporting and figuring out the problem. Closes #166.
cmlenz
parents: 547
diff changeset
384 Py_DECREF(unicode);
541
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
385
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
386 if (result == NULL) return NULL;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
387 args = PyTuple_New(1);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
388 if (args == NULL) {
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
389 Py_DECREF(result);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
390 return NULL;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
391 }
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
392 PyTuple_SET_ITEM(args, 0, result);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
393 result = PyUnicode_Type.tp_new(&MarkupType, args, NULL);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
394 Py_DECREF(args);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
395
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
396 return result;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
397 }
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
398
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
399 static PyObject *
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
400 Markup_repr(PyObject *self)
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
401 {
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
402 PyObject *format, *result, *args;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
403
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
404 format = PyString_FromString("<Markup %r>");
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
405 if (format == NULL) return NULL;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
406 result = PyObject_Unicode(self);
665
3ee92ec99ad9 Applied patch to fix a memory leak in the C implementation of the `Markup.escape()` function. Thanks to Christian Boos for reporting and figuring out the problem. Closes #166.
cmlenz
parents: 547
diff changeset
407 if (result == NULL) {
3ee92ec99ad9 Applied patch to fix a memory leak in the C implementation of the `Markup.escape()` function. Thanks to Christian Boos for reporting and figuring out the problem. Closes #166.
cmlenz
parents: 547
diff changeset
408 Py_DECREF(format);
3ee92ec99ad9 Applied patch to fix a memory leak in the C implementation of the `Markup.escape()` function. Thanks to Christian Boos for reporting and figuring out the problem. Closes #166.
cmlenz
parents: 547
diff changeset
409 return NULL;
3ee92ec99ad9 Applied patch to fix a memory leak in the C implementation of the `Markup.escape()` function. Thanks to Christian Boos for reporting and figuring out the problem. Closes #166.
cmlenz
parents: 547
diff changeset
410 }
541
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
411 args = PyTuple_New(1);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
412 if (args == NULL) {
665
3ee92ec99ad9 Applied patch to fix a memory leak in the C implementation of the `Markup.escape()` function. Thanks to Christian Boos for reporting and figuring out the problem. Closes #166.
cmlenz
parents: 547
diff changeset
413 Py_DECREF(format);
541
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
414 Py_DECREF(result);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
415 return NULL;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
416 }
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
417 PyTuple_SET_ITEM(args, 0, result);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
418 result = PyString_Format(format, args);
681
3e7cd32c9411 Fix another memory leak in the C speedups code. Thanks to Erik Bray for finding this one and providing a patch. Closes #166 (again).
cmlenz
parents: 665
diff changeset
419 Py_DECREF(format);
541
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
420 Py_DECREF(args);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
421 return result;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
422 }
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
423
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
424 PyDoc_STRVAR(unescape__doc__,
547
93b2a5792cfc Port docstrings to C version of `Markup` class.
cmlenz
parents: 541
diff changeset
425 "Reverse-escapes &, <, >, and \" and returns a `unicode` object.\n\
93b2a5792cfc Port docstrings to C version of `Markup` class.
cmlenz
parents: 541
diff changeset
426 \n\
93b2a5792cfc Port docstrings to C version of `Markup` class.
cmlenz
parents: 541
diff changeset
427 >>> Markup('1 &lt; 2').unescape()\n\
93b2a5792cfc Port docstrings to C version of `Markup` class.
cmlenz
parents: 541
diff changeset
428 u'1 < 2'\n\
93b2a5792cfc Port docstrings to C version of `Markup` class.
cmlenz
parents: 541
diff changeset
429 \n\
93b2a5792cfc Port docstrings to C version of `Markup` class.
cmlenz
parents: 541
diff changeset
430 :return: the unescaped string\n\
93b2a5792cfc Port docstrings to C version of `Markup` class.
cmlenz
parents: 541
diff changeset
431 :rtype: `unicode`\n\
93b2a5792cfc Port docstrings to C version of `Markup` class.
cmlenz
parents: 541
diff changeset
432 :see: `genshi.core.unescape`\n\
93b2a5792cfc Port docstrings to C version of `Markup` class.
cmlenz
parents: 541
diff changeset
433 ");
541
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
434
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
435 static PyObject *
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
436 Markup_unescape(PyObject* self)
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
437 {
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
438 PyObject *tmp, *tmp2;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
439
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
440 tmp = PyUnicode_Replace(self, qt2, qt1, -1);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
441 if (tmp == NULL) return NULL;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
442 tmp2 = PyUnicode_Replace(tmp, gt2, gt1, -1);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
443 Py_DECREF(tmp);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
444 if (tmp2 == NULL) return NULL;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
445 tmp = PyUnicode_Replace(tmp2, lt2, lt1, -1);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
446 Py_DECREF(tmp2);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
447 if (tmp == NULL) return NULL;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
448 tmp2 = PyUnicode_Replace(tmp, amp2, amp1, -1);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
449 Py_DECREF(tmp);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
450 return tmp2;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
451 }
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
452
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
453 PyDoc_STRVAR(stripentities__doc__,
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
454 "Return a copy of the text with any character or numeric entities\n\
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
455 replaced by the equivalent UTF-8 characters.\n\
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
456 \n\
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
457 If the `keepxmlentities` parameter is provided and evaluates to `True`,\n\
547
93b2a5792cfc Port docstrings to C version of `Markup` class.
cmlenz
parents: 541
diff changeset
458 the core XML entities (``&amp;``, ``&apos;``, ``&gt;``, ``&lt;`` and\n\
93b2a5792cfc Port docstrings to C version of `Markup` class.
cmlenz
parents: 541
diff changeset
459 ``&quot;``) are not stripped.\n\
93b2a5792cfc Port docstrings to C version of `Markup` class.
cmlenz
parents: 541
diff changeset
460 \n\
93b2a5792cfc Port docstrings to C version of `Markup` class.
cmlenz
parents: 541
diff changeset
461 :return: a `Markup` instance with entities removed\n\
93b2a5792cfc Port docstrings to C version of `Markup` class.
cmlenz
parents: 541
diff changeset
462 :rtype: `Markup`\n\
93b2a5792cfc Port docstrings to C version of `Markup` class.
cmlenz
parents: 541
diff changeset
463 :see: `genshi.util.stripentities`\n\
93b2a5792cfc Port docstrings to C version of `Markup` class.
cmlenz
parents: 541
diff changeset
464 ");
541
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
465
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
466 static PyObject *
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
467 Markup_stripentities(PyObject* self, PyObject *args, PyObject *kwds)
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
468 {
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
469 static char *kwlist[] = {"keepxmlentities", 0};
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
470 PyObject *result, *args2;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
471 char keepxml = 0;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
472
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
473 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|b", kwlist, &keepxml)) {
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
474 return NULL;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
475 }
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
476
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
477 if (stripentities == NULL) return NULL;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
478 result = PyObject_CallFunction(stripentities, "Ob", self, keepxml);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
479 if (result == NULL) return NULL;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
480 args2 = PyTuple_New(1);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
481 if (args2 == NULL) {
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
482 Py_DECREF(result);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
483 return NULL;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
484 }
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
485 PyTuple_SET_ITEM(args2, 0, result);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
486 result = MarkupType.tp_new(&MarkupType, args2, NULL);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
487 Py_DECREF(args2);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
488 return result;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
489 }
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
490
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
491 PyDoc_STRVAR(striptags__doc__,
547
93b2a5792cfc Port docstrings to C version of `Markup` class.
cmlenz
parents: 541
diff changeset
492 """Return a copy of the text with all XML/HTML tags removed.\n\
93b2a5792cfc Port docstrings to C version of `Markup` class.
cmlenz
parents: 541
diff changeset
493 \n\
93b2a5792cfc Port docstrings to C version of `Markup` class.
cmlenz
parents: 541
diff changeset
494 :return: a `Markup` instance with all tags removed\n\
93b2a5792cfc Port docstrings to C version of `Markup` class.
cmlenz
parents: 541
diff changeset
495 :rtype: `Markup`\n\
93b2a5792cfc Port docstrings to C version of `Markup` class.
cmlenz
parents: 541
diff changeset
496 :see: `genshi.util.striptags`\n\
93b2a5792cfc Port docstrings to C version of `Markup` class.
cmlenz
parents: 541
diff changeset
497 ");
541
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
498
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
499 static PyObject *
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
500 Markup_striptags(PyObject* self)
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
501 {
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
502 PyObject *result, *args;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
503
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
504 if (striptags == NULL) return NULL;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
505 result = PyObject_CallFunction(striptags, "O", self);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
506 if (result == NULL) return NULL;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
507 args = PyTuple_New(1);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
508 if (args == NULL) {
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
509 Py_DECREF(result);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
510 return NULL;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
511 }
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
512 PyTuple_SET_ITEM(args, 0, result);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
513 result = MarkupType.tp_new(&MarkupType, args, NULL);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
514 Py_DECREF(args);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
515 return result;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
516 }
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
517
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
518 typedef struct {
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
519 PyUnicodeObject HEAD;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
520 } MarkupObject;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
521
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
522 static PyMethodDef Markup_methods[] = {
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
523 {"escape", (PyCFunction) Markup_escape,
547
93b2a5792cfc Port docstrings to C version of `Markup` class.
cmlenz
parents: 541
diff changeset
524 METH_VARARGS|METH_CLASS|METH_KEYWORDS, escape__doc__},
93b2a5792cfc Port docstrings to C version of `Markup` class.
cmlenz
parents: 541
diff changeset
525 {"join", (PyCFunction)Markup_join, METH_VARARGS|METH_KEYWORDS, join__doc__},
541
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
526 {"unescape", (PyCFunction)Markup_unescape, METH_NOARGS, unescape__doc__},
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
527 {"stripentities", (PyCFunction) Markup_stripentities,
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
528 METH_VARARGS|METH_KEYWORDS, stripentities__doc__},
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
529 {"striptags", (PyCFunction) Markup_striptags, METH_NOARGS,
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
530 striptags__doc__},
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
531 {NULL} /* Sentinel */
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
532 };
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
533
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
534 static PyNumberMethods Markup_as_number = {
547
93b2a5792cfc Port docstrings to C version of `Markup` class.
cmlenz
parents: 541
diff changeset
535 Markup_add, /*nb_add*/
93b2a5792cfc Port docstrings to C version of `Markup` class.
cmlenz
parents: 541
diff changeset
536 0, /*nb_subtract*/
93b2a5792cfc Port docstrings to C version of `Markup` class.
cmlenz
parents: 541
diff changeset
537 Markup_mul, /*nb_multiply*/
93b2a5792cfc Port docstrings to C version of `Markup` class.
cmlenz
parents: 541
diff changeset
538 0, /*nb_divide*/
93b2a5792cfc Port docstrings to C version of `Markup` class.
cmlenz
parents: 541
diff changeset
539 Markup_mod, /*nb_remainder*/
541
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
540 };
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
541
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
542 PyTypeObject MarkupType = {
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
543 PyObject_HEAD_INIT(NULL)
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
544 0,
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
545 "genshi._speedups.Markup",
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
546 sizeof(MarkupObject),
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
547 0,
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
548 0, /*tp_dealloc*/
724
919809e55d16 update to trunk to track r847, fixing python 2.4 compatibility issues in speedup (and fixing copyrights, apparently :))
aflett
parents: 718
diff changeset
549 0, /*tp_print*/
541
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
550 0, /*tp_getattr*/
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
551 0, /*tp_setattr*/
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
552 0, /*tp_compare*/
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
553 Markup_repr, /*tp_repr*/
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
554 &Markup_as_number, /*tp_as_number*/
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
555 0, /*tp_as_sequence*/
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
556 0, /*tp_as_mapping*/
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
557 0, /*tp_hash */
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
558
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
559 0, /*tp_call*/
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
560 0, /*tp_str*/
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
561 0, /*tp_getattro*/
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
562 0, /*tp_setattro*/
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
563 0, /*tp_as_buffer*/
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
564
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
565 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_CHECKTYPES, /*tp_flags*/
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
566 Markup__doc__,/*tp_doc*/
724
919809e55d16 update to trunk to track r847, fixing python 2.4 compatibility issues in speedup (and fixing copyrights, apparently :))
aflett
parents: 718
diff changeset
567
541
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
568 0, /*tp_traverse*/
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
569 0, /*tp_clear*/
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
570
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
571 0, /*tp_richcompare*/
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
572 0, /*tp_weaklistoffset*/
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
573
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
574 0, /*tp_iter*/
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
575 0, /*tp_iternext*/
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
576
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
577 /* Attribute descriptor and subclassing stuff */
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
578
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
579 Markup_methods,/*tp_methods*/
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
580 0, /*tp_members*/
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
581 0, /*tp_getset*/
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
582 0, /*tp_base*/
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
583 0, /*tp_dict*/
724
919809e55d16 update to trunk to track r847, fixing python 2.4 compatibility issues in speedup (and fixing copyrights, apparently :))
aflett
parents: 718
diff changeset
584
541
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
585 0, /*tp_descr_get*/
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
586 0, /*tp_descr_set*/
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
587 0, /*tp_dictoffset*/
724
919809e55d16 update to trunk to track r847, fixing python 2.4 compatibility issues in speedup (and fixing copyrights, apparently :))
aflett
parents: 718
diff changeset
588
541
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
589 0, /*tp_init*/
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
590 0, /*tp_alloc will be set to PyType_GenericAlloc in module init*/
718
d143dd73789b update to trunk through r833
aflett
parents: 681
diff changeset
591 0, /*tp_new*/
541
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
592 0, /*tp_free Low-level free-memory routine */
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
593 0, /*tp_is_gc For PyObject_IS_GC */
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
594 0, /*tp_bases*/
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
595 0, /*tp_mro method resolution order */
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
596 0, /*tp_cache*/
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
597 0, /*tp_subclasses*/
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
598 0 /*tp_weaklist*/
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
599 };
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
600
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
601 PyMODINIT_FUNC
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
602 init_speedups(void)
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
603 {
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
604 PyObject *module;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
605
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
606 /* Workaround for quirk in Visual Studio, see
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
607 <http://www.python.it/faq/faq-3.html#3.24> */
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
608 MarkupType.tp_base = &PyUnicode_Type;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
609
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
610 if (PyType_Ready(&MarkupType) < 0)
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
611 return;
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
612
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
613 init_constants();
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
614
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
615 module = Py_InitModule("_speedups", NULL);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
616 Py_INCREF(&MarkupType);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
617 PyModule_AddObject(module, "Markup", (PyObject *) &MarkupType);
773d8c470e82 Merged cspeedups branch into trunk.
cmlenz
parents:
diff changeset
618 }
Copyright (C) 2012-2017 Edgewall Software