Mercurial > hgrepos > Python > libs > ConfigMix
annotate configmix/_speedups.c @ 654:0d6673d06c2c
Add support for using "tomllib" (in Python's stdlib since 3.11) and "tomli" TOML packages.
They are preferred if they are found to be installed.
But note that the declared dependency for the "toml" extra nevertheless
is the "toml" package. Because it is available for all supported Python
versions.
So use Python 3.11+ or install "tomli" manually if you want to use the
alternate packages.
| author | Franz Glasner <fzglas.hg@dom66.de> |
|---|---|
| date | Thu, 19 May 2022 22:10:59 +0200 |
| parents | 999cfca55d25 |
| children | 2b1c7a68f913 |
| rev | line source |
|---|---|
|
542
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1 /* -*- coding: utf-8 -*- */ |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
2 /* |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
3 * Speedups for configmix. |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
4 * |
|
593
f454889e41fa
Adjust copyright year (the end) to 2022
Franz Glasner <fzglas.hg@dom66.de>
parents:
566
diff
changeset
|
5 * :Copyright: (c) 2021-2022, Franz Glasner. All rights reserved. |
|
542
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
6 * :License: BSD-3-Clause. See LICENSE.txt for details. |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
7 */ |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
8 |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
9 #define PY_SSIZE_T_CLEAN |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
10 #include "Python.h" |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
11 |
|
559
bb160a1e67d7
A simple helper include file with some conveniente functions.
Franz Glasner <fzglas.hg@dom66.de>
parents:
558
diff
changeset
|
12 #include "_py_helper.h" |
|
bb160a1e67d7
A simple helper include file with some conveniente functions.
Franz Glasner <fzglas.hg@dom66.de>
parents:
558
diff
changeset
|
13 |
|
542
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
14 |
|
609
9ad860d6ddc9
Change the external visible (and ELF-interposable) variable "_id" to "_configmix_speedups_id".
Franz Glasner <fzglas.hg@dom66.de>
parents:
605
diff
changeset
|
15 const char _configmix_speedups_id[] = "@(#)configmix._speedups $Header$"; |
|
542
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
16 static const char release[] = "|VCSRevision|"; |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
17 static const char date[] = "|VCSJustDate|"; |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
18 |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
19 |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
20 /* |
| 612 | 21 * Module state holds some pre-created objects |
|
542
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
22 */ |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
23 struct speedups_state { |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
24 PyObject *DOT; |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
25 PyObject *QUOTE; |
|
543
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
26 PyObject *NS_SEPARATOR; |
|
552
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
27 PyObject *FILTER_SEPARATOR; |
|
554
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
28 PyObject *EMPTY_FILTER; |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
29 PyObject *NONE_FILTER; |
|
542
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
30 PyObject *EMPTY_STR; |
|
550
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
549
diff
changeset
|
31 PyObject *QUOTE_MAP; |
|
554
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
32 PyObject *MISSING; |
|
603
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
33 PyObject *MARKER; |
|
554
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
34 PyObject *STARTTOK; |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
35 PyObject *ENDTOK; |
|
603
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
36 PyObject *REF_NAMESPACE; |
|
637
4499e9b4855d
The ``{{::DEL::}}`` is not subject to interpolation any more.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
630
diff
changeset
|
37 PyObject *DEL_VALUE; |
|
542
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
38 }; |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
39 |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
40 |
|
614
7e480a32d9d5
Prototype declaration with paremeter names
Franz Glasner <fzglas.hg@dom66.de>
parents:
612
diff
changeset
|
41 static PyObject * _fast_getvar_s(PyObject *config, PyObject *varname, PyObject *default_, struct speedups_state *sstate, int *cacheable); |
|
603
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
42 |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
43 |
|
542
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
44 static |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
45 int |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
46 _hex2ucs4(PyObject *s, Py_ssize_t end, Py_UCS4 *result) |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
47 { |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
48 Py_ssize_t i; |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
49 Py_UCS4 c; |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
50 Py_UCS4 r = 0; |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
51 |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
52 for (i=1; i < end; i++) { |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
53 r *= 16; |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
54 c = PyUnicode_ReadChar(s, i); |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
55 if ((c >= 48) && (c <= 57)) { /* 0 - 9 */ |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
56 r += (c - 48); |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
57 } |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
58 else { |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
59 if ((c >= 97) && (c <= 102)) { /* a - f */ |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
60 r += (c - 87); |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
61 } |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
62 else { |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
63 if ((c >= 65) && (c <= 70)) { /* A - F */ |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
64 r += (c - 55); |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
65 } |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
66 else { |
|
630
33264c660fca
Exception formatting: more into into some exception error messages
Franz Glasner <fzglas.hg@dom66.de>
parents:
627
diff
changeset
|
67 PyErr_Format(PyExc_ValueError, "invalid base-16 literal: %c", (int)c); |
|
542
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
68 return -1; |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
69 } |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
70 } |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
71 } |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
72 } |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
73 *result = r; |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
74 return 0; /* success */ |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
75 } |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
76 |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
77 |
|
545
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
78 #if defined(Py_LIMITED_API) |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
79 |
|
549
84657447ab39
FIX: Properly raise a UnicodeEncodeError from C
Franz Glasner <fzglas.hg@dom66.de>
parents:
547
diff
changeset
|
80 static |
|
84657447ab39
FIX: Properly raise a UnicodeEncodeError from C
Franz Glasner <fzglas.hg@dom66.de>
parents:
547
diff
changeset
|
81 void |
|
84657447ab39
FIX: Properly raise a UnicodeEncodeError from C
Franz Glasner <fzglas.hg@dom66.de>
parents:
547
diff
changeset
|
82 _raise_utf8_encode_error(PyObject *s, |
|
84657447ab39
FIX: Properly raise a UnicodeEncodeError from C
Franz Glasner <fzglas.hg@dom66.de>
parents:
547
diff
changeset
|
83 Py_ssize_t start, Py_ssize_t end, |
|
84657447ab39
FIX: Properly raise a UnicodeEncodeError from C
Franz Glasner <fzglas.hg@dom66.de>
parents:
547
diff
changeset
|
84 const char *reason) |
|
84657447ab39
FIX: Properly raise a UnicodeEncodeError from C
Franz Glasner <fzglas.hg@dom66.de>
parents:
547
diff
changeset
|
85 { |
|
84657447ab39
FIX: Properly raise a UnicodeEncodeError from C
Franz Glasner <fzglas.hg@dom66.de>
parents:
547
diff
changeset
|
86 /* |
|
84657447ab39
FIX: Properly raise a UnicodeEncodeError from C
Franz Glasner <fzglas.hg@dom66.de>
parents:
547
diff
changeset
|
87 * See also: https://docs.python.org/3/c-api/exceptions.html#unicode-exception-objects |
|
84657447ab39
FIX: Properly raise a UnicodeEncodeError from C
Franz Glasner <fzglas.hg@dom66.de>
parents:
547
diff
changeset
|
88 */ |
|
84657447ab39
FIX: Properly raise a UnicodeEncodeError from C
Franz Glasner <fzglas.hg@dom66.de>
parents:
547
diff
changeset
|
89 PyObject *errobj = PyObject_CallFunction( |
|
84657447ab39
FIX: Properly raise a UnicodeEncodeError from C
Franz Glasner <fzglas.hg@dom66.de>
parents:
547
diff
changeset
|
90 PyExc_UnicodeEncodeError, |
|
84657447ab39
FIX: Properly raise a UnicodeEncodeError from C
Franz Glasner <fzglas.hg@dom66.de>
parents:
547
diff
changeset
|
91 "sOnns", |
|
84657447ab39
FIX: Properly raise a UnicodeEncodeError from C
Franz Glasner <fzglas.hg@dom66.de>
parents:
547
diff
changeset
|
92 "utf-8", |
|
84657447ab39
FIX: Properly raise a UnicodeEncodeError from C
Franz Glasner <fzglas.hg@dom66.de>
parents:
547
diff
changeset
|
93 s, |
|
84657447ab39
FIX: Properly raise a UnicodeEncodeError from C
Franz Glasner <fzglas.hg@dom66.de>
parents:
547
diff
changeset
|
94 start, |
|
84657447ab39
FIX: Properly raise a UnicodeEncodeError from C
Franz Glasner <fzglas.hg@dom66.de>
parents:
547
diff
changeset
|
95 end, |
|
84657447ab39
FIX: Properly raise a UnicodeEncodeError from C
Franz Glasner <fzglas.hg@dom66.de>
parents:
547
diff
changeset
|
96 reason); |
|
84657447ab39
FIX: Properly raise a UnicodeEncodeError from C
Franz Glasner <fzglas.hg@dom66.de>
parents:
547
diff
changeset
|
97 |
|
84657447ab39
FIX: Properly raise a UnicodeEncodeError from C
Franz Glasner <fzglas.hg@dom66.de>
parents:
547
diff
changeset
|
98 if (errobj == NULL) { |
|
84657447ab39
FIX: Properly raise a UnicodeEncodeError from C
Franz Glasner <fzglas.hg@dom66.de>
parents:
547
diff
changeset
|
99 /* cannot do anything here */ |
|
84657447ab39
FIX: Properly raise a UnicodeEncodeError from C
Franz Glasner <fzglas.hg@dom66.de>
parents:
547
diff
changeset
|
100 return; |
|
84657447ab39
FIX: Properly raise a UnicodeEncodeError from C
Franz Glasner <fzglas.hg@dom66.de>
parents:
547
diff
changeset
|
101 } |
|
84657447ab39
FIX: Properly raise a UnicodeEncodeError from C
Franz Glasner <fzglas.hg@dom66.de>
parents:
547
diff
changeset
|
102 /* Make PyExc_UnicodeEncodeError owned because PyErr_Restore steals */ |
|
84657447ab39
FIX: Properly raise a UnicodeEncodeError from C
Franz Glasner <fzglas.hg@dom66.de>
parents:
547
diff
changeset
|
103 //Py_INCREF(PyExc_UnicodeEncodeError); |
|
84657447ab39
FIX: Properly raise a UnicodeEncodeError from C
Franz Glasner <fzglas.hg@dom66.de>
parents:
547
diff
changeset
|
104 //PyErr_Restore(PyExc_UnicodeEncodeError, errobj, NULL); |
|
84657447ab39
FIX: Properly raise a UnicodeEncodeError from C
Franz Glasner <fzglas.hg@dom66.de>
parents:
547
diff
changeset
|
105 |
|
84657447ab39
FIX: Properly raise a UnicodeEncodeError from C
Franz Glasner <fzglas.hg@dom66.de>
parents:
547
diff
changeset
|
106 PyErr_SetObject(PyExc_UnicodeEncodeError, errobj); |
|
84657447ab39
FIX: Properly raise a UnicodeEncodeError from C
Franz Glasner <fzglas.hg@dom66.de>
parents:
547
diff
changeset
|
107 Py_DECREF(errobj); |
|
84657447ab39
FIX: Properly raise a UnicodeEncodeError from C
Franz Glasner <fzglas.hg@dom66.de>
parents:
547
diff
changeset
|
108 } |
|
84657447ab39
FIX: Properly raise a UnicodeEncodeError from C
Franz Glasner <fzglas.hg@dom66.de>
parents:
547
diff
changeset
|
109 |
|
84657447ab39
FIX: Properly raise a UnicodeEncodeError from C
Franz Glasner <fzglas.hg@dom66.de>
parents:
547
diff
changeset
|
110 |
|
545
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
111 /* |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
112 * Copyright 2001-2004 Unicode, Inc. |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
113 * |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
114 * Disclaimer |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
115 * |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
116 * This source code is provided as is by Unicode, Inc. No claims are |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
117 * made as to fitness for any particular purpose. No warranties of any |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
118 * kind are expressed or implied. The recipient agrees to determine |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
119 * applicability of information provided. If this file has been |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
120 * purchased on magnetic or optical media from Unicode, Inc., the |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
121 * sole remedy for any claim will be exchange of defective media |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
122 * within 90 days of receipt. |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
123 * |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
124 * Limitations on Rights to Redistribute This Code |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
125 * |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
126 * Unicode, Inc. hereby grants the right to freely use the information |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
127 * supplied in this file in the creation of products supporting the |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
128 * Unicode Standard, and to make copies of this file in any form |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
129 * for internal or external distribution as long as this notice |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
130 * remains attached. |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
131 */ |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
132 |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
133 #define UNI_MAX_LEGAL_UTF32 (Py_UCS4)0x0010FFFF |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
134 #define UNI_SUR_HIGH_START (Py_UCS4)0xD800 |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
135 #define UNI_SUR_HIGH_END (Py_UCS4)0xDBFF |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
136 #define UNI_SUR_LOW_START (Py_UCS4)0xDC00 |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
137 #define UNI_SUR_LOW_END (Py_UCS4)0xDFFF |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
138 |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
139 |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
140 /* |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
141 * Once the bits are split out into bytes of UTF-8, this is a mask OR-ed |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
142 * into the first byte, depending on how many bytes follow. There are |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
143 * as many entries in this table as there are UTF-8 sequence types. |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
144 * (I.e., one byte sequence, two byte... etc.). Remember that sequencs |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
145 * for *legal* UTF-8 will be 4 or fewer bytes total. |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
146 */ |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
147 static const unsigned char firstByteMark[7] = { 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC }; |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
148 |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
149 |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
150 static |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
151 Py_ssize_t |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
152 _convert_ucs4_to_utf8( |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
153 Py_UCS4 ch, |
|
564
44e18fbf7741
Refactor: signature of _convert_ucs4_to_utf8(): change order of args
Franz Glasner <fzglas.hg@dom66.de>
parents:
562
diff
changeset
|
154 unsigned char *targetStart, unsigned char *targetEnd, |
|
44e18fbf7741
Refactor: signature of _convert_ucs4_to_utf8(): change order of args
Franz Glasner <fzglas.hg@dom66.de>
parents:
562
diff
changeset
|
155 int strict, |
|
549
84657447ab39
FIX: Properly raise a UnicodeEncodeError from C
Franz Glasner <fzglas.hg@dom66.de>
parents:
547
diff
changeset
|
156 PyObject *ch_obj, /* for error messages: the string where ch comes from */ |
|
564
44e18fbf7741
Refactor: signature of _convert_ucs4_to_utf8(): change order of args
Franz Glasner <fzglas.hg@dom66.de>
parents:
562
diff
changeset
|
157 Py_ssize_t ch_obj_end /* effective length of ch_obj (error reporting) */ |
|
44e18fbf7741
Refactor: signature of _convert_ucs4_to_utf8(): change order of args
Franz Glasner <fzglas.hg@dom66.de>
parents:
562
diff
changeset
|
158 ) |
|
545
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
159 { |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
160 const Py_UCS4 byteMask = 0xBF; |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
161 const Py_UCS4 byteMark = 0x80; |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
162 |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
163 Py_ssize_t bytesToWrite = 0; |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
164 unsigned char *target = targetStart; |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
165 |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
166 if (strict) { |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
167 /* UTF-16 surrogate values are illegal */ |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
168 if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) { |
|
549
84657447ab39
FIX: Properly raise a UnicodeEncodeError from C
Franz Glasner <fzglas.hg@dom66.de>
parents:
547
diff
changeset
|
169 _raise_utf8_encode_error( |
|
84657447ab39
FIX: Properly raise a UnicodeEncodeError from C
Franz Glasner <fzglas.hg@dom66.de>
parents:
547
diff
changeset
|
170 ch_obj, |
|
84657447ab39
FIX: Properly raise a UnicodeEncodeError from C
Franz Glasner <fzglas.hg@dom66.de>
parents:
547
diff
changeset
|
171 1, ch_obj_end, |
|
84657447ab39
FIX: Properly raise a UnicodeEncodeError from C
Franz Glasner <fzglas.hg@dom66.de>
parents:
547
diff
changeset
|
172 "surrogate values are illegal in UCS4"); |
|
545
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
173 return -1; |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
174 } |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
175 } |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
176 /* |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
177 * Figure out how many bytes the result will require. Turn any |
| 556 | 178 * illegally large UTF32 things (> Plane 17) into errors (exceptions). |
|
545
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
179 */ |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
180 if (ch < (Py_UCS4)0x80) { |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
181 bytesToWrite = 1; |
| 565 | 182 } |
| 183 else if (ch < (Py_UCS4)0x800) { | |
|
545
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
184 bytesToWrite = 2; |
| 565 | 185 } |
| 186 else if (ch < (Py_UCS4)0x10000) { | |
|
545
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
187 bytesToWrite = 3; |
| 565 | 188 } |
| 189 else if (ch <= UNI_MAX_LEGAL_UTF32) { | |
|
545
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
190 bytesToWrite = 4; |
| 565 | 191 } |
| 192 else { | |
|
549
84657447ab39
FIX: Properly raise a UnicodeEncodeError from C
Franz Glasner <fzglas.hg@dom66.de>
parents:
547
diff
changeset
|
193 _raise_utf8_encode_error( |
|
84657447ab39
FIX: Properly raise a UnicodeEncodeError from C
Franz Glasner <fzglas.hg@dom66.de>
parents:
547
diff
changeset
|
194 ch_obj, |
|
84657447ab39
FIX: Properly raise a UnicodeEncodeError from C
Franz Glasner <fzglas.hg@dom66.de>
parents:
547
diff
changeset
|
195 1, ch_obj_end, |
|
84657447ab39
FIX: Properly raise a UnicodeEncodeError from C
Franz Glasner <fzglas.hg@dom66.de>
parents:
547
diff
changeset
|
196 "max Unicode codepoint value exceeded"); |
|
545
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
197 return -1; |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
198 } |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
199 |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
200 target += bytesToWrite; |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
201 if (target > targetEnd) { |
|
549
84657447ab39
FIX: Properly raise a UnicodeEncodeError from C
Franz Glasner <fzglas.hg@dom66.de>
parents:
547
diff
changeset
|
202 _raise_utf8_encode_error( |
|
84657447ab39
FIX: Properly raise a UnicodeEncodeError from C
Franz Glasner <fzglas.hg@dom66.de>
parents:
547
diff
changeset
|
203 ch_obj, |
|
84657447ab39
FIX: Properly raise a UnicodeEncodeError from C
Franz Glasner <fzglas.hg@dom66.de>
parents:
547
diff
changeset
|
204 1, ch_obj_end, |
|
84657447ab39
FIX: Properly raise a UnicodeEncodeError from C
Franz Glasner <fzglas.hg@dom66.de>
parents:
547
diff
changeset
|
205 "temporary target buffer exhausted"); |
|
545
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
206 return -1; |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
207 } |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
208 switch (bytesToWrite) { /* note: everything falls through. */ |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
209 case 4: *--target = (unsigned char)((ch | byteMark) & byteMask); ch >>= 6; |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
210 case 3: *--target = (unsigned char)((ch | byteMark) & byteMask); ch >>= 6; |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
211 case 2: *--target = (unsigned char)((ch | byteMark) & byteMask); ch >>= 6; |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
212 case 1: *--target = (unsigned char) (ch | firstByteMark[bytesToWrite]); |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
213 } |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
214 return bytesToWrite; |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
215 } |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
216 |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
217 |
|
549
84657447ab39
FIX: Properly raise a UnicodeEncodeError from C
Franz Glasner <fzglas.hg@dom66.de>
parents:
547
diff
changeset
|
218 /* |
|
84657447ab39
FIX: Properly raise a UnicodeEncodeError from C
Franz Glasner <fzglas.hg@dom66.de>
parents:
547
diff
changeset
|
219 * End of Copyright 2001-2004 Unicode, Inc. |
|
84657447ab39
FIX: Properly raise a UnicodeEncodeError from C
Franz Glasner <fzglas.hg@dom66.de>
parents:
547
diff
changeset
|
220 */ |
|
84657447ab39
FIX: Properly raise a UnicodeEncodeError from C
Franz Glasner <fzglas.hg@dom66.de>
parents:
547
diff
changeset
|
221 |
|
84657447ab39
FIX: Properly raise a UnicodeEncodeError from C
Franz Glasner <fzglas.hg@dom66.de>
parents:
547
diff
changeset
|
222 |
|
545
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
223 static |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
224 PyObject * |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
225 _hex2string(PyObject *s, Py_ssize_t end) |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
226 { |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
227 Py_UCS4 c; |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
228 unsigned char buf[6]; |
|
555
b7434a34a1f4
- FIX: Memory-leak with the "filters" local variable
Franz Glasner <fzglas.hg@dom66.de>
parents:
554
diff
changeset
|
229 Py_ssize_t bytes_written; |
|
545
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
230 PyObject *u; |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
231 |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
232 if (_hex2ucs4(s, end, &c) != 0) |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
233 return NULL; |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
234 |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
235 /* Replace the combination PyUniode_New/PyUnicode_WriteChar */ |
|
564
44e18fbf7741
Refactor: signature of _convert_ucs4_to_utf8(): change order of args
Franz Glasner <fzglas.hg@dom66.de>
parents:
562
diff
changeset
|
236 bytes_written = _convert_ucs4_to_utf8(c, buf, &(buf[6]), 1, s, end+1); |
|
555
b7434a34a1f4
- FIX: Memory-leak with the "filters" local variable
Franz Glasner <fzglas.hg@dom66.de>
parents:
554
diff
changeset
|
237 if (bytes_written < 0) { |
|
545
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
238 return NULL; |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
239 } |
|
555
b7434a34a1f4
- FIX: Memory-leak with the "filters" local variable
Franz Glasner <fzglas.hg@dom66.de>
parents:
554
diff
changeset
|
240 u = PyUnicode_FromStringAndSize((const char *)buf, bytes_written); |
|
545
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
241 if (u == NULL) { |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
242 return NULL; |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
243 } |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
244 return u; |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
245 } |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
246 |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
247 #else |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
248 |
|
542
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
249 static |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
250 PyObject * |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
251 _hex2string(PyObject *s, Py_ssize_t end) |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
252 { |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
253 Py_UCS4 c; |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
254 PyObject *u = NULL; |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
255 |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
256 if (_hex2ucs4(s, end, &c) != 0) |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
257 return NULL; |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
258 u = PyUnicode_New(1, c); /* ARGH: not in the stable API */ |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
259 if (u == NULL) |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
260 return NULL; |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
261 if (PyUnicode_WriteChar(u, 0, c) != 0) { |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
262 Py_DECREF(u); |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
263 return NULL; |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
264 } |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
265 return u; |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
266 } |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
267 |
|
545
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
268 #endif /* Py_LIMITED_API */ |
|
6501fe0e116c
Build the speedup C-extension against the stable API.
Franz Glasner <fzglas.hg@dom66.de>
parents:
544
diff
changeset
|
269 |
|
542
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
270 |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
271 static |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
272 PyObject * |
|
552
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
273 _fast_unquote(PyObject *s, Py_ssize_t s_len, PyObject *self, struct speedups_state *sstate) |
|
542
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
274 { |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
275 Py_ssize_t find; |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
276 Py_ssize_t parts_len; |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
277 PyObject *res; |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
278 PyObject *res_parts = NULL; |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
279 PyObject *parts = NULL; |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
280 PyObject *o; |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
281 PyObject *pb; |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
282 Py_ssize_t pb_len; |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
283 Py_ssize_t i; |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
284 Py_UCS4 c; |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
285 |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
286 if (s_len < 0) { |
|
543
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
287 s_len = PyUnicode_GetLength(s); |
|
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
288 if (s_len < 0) { |
|
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
289 return NULL; |
|
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
290 } |
|
542
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
291 } |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
292 if (s_len == 0) { |
|
559
bb160a1e67d7
A simple helper include file with some conveniente functions.
Franz Glasner <fzglas.hg@dom66.de>
parents:
558
diff
changeset
|
293 return Py_NewRef(s); |
|
542
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
294 } |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
295 find = PyUnicode_FindChar(s, '%', 0, s_len, 1); |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
296 if (find == -2) { |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
297 return NULL; |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
298 } |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
299 if (find == -1) { |
|
559
bb160a1e67d7
A simple helper include file with some conveniente functions.
Franz Glasner <fzglas.hg@dom66.de>
parents:
558
diff
changeset
|
300 return Py_NewRef(s); |
|
542
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
301 } |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
302 |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
303 if (sstate == NULL) { |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
304 sstate = PyModule_GetState(self); |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
305 if (sstate == NULL) { |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
306 PyErr_SetString(PyExc_RuntimeError, "no module state available"); |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
307 return NULL; |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
308 } |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
309 } |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
310 parts = PyUnicode_Split(s, sstate->QUOTE, -1); |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
311 if (parts == NULL) { |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
312 goto error; |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
313 } |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
314 parts_len = PyList_Size(parts); |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
315 if (parts_len < 0) { |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
316 goto error; |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
317 } |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
318 res_parts = PyTuple_New((parts_len-1)*2 + 1); |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
319 if (res_parts == NULL) { |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
320 goto error; |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
321 } |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
322 |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
323 o = PyList_GetItem(parts, 0); /* borrowed */ |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
324 if (o == NULL) { |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
325 goto error; |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
326 } |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
327 /* |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
328 * The first item may be also the empty string if `s' starts with |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
329 * a quoted character. |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
330 */ |
|
559
bb160a1e67d7
A simple helper include file with some conveniente functions.
Franz Glasner <fzglas.hg@dom66.de>
parents:
558
diff
changeset
|
331 PyTuple_SetItem(res_parts, 0, Py_NewRef(o)); |
|
542
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
332 |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
333 for (i=1; i<parts_len; i++) { |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
334 pb = PyList_GetItem(parts, i); /* borrowed */ |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
335 pb_len = PyUnicode_GetLength(pb); |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
336 if (pb_len < 1) { |
|
630
33264c660fca
Exception formatting: more into into some exception error messages
Franz Glasner <fzglas.hg@dom66.de>
parents:
627
diff
changeset
|
337 PyErr_Format(PyExc_ValueError, "quote syntax: length too small: %U", pb); |
|
542
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
338 goto error; |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
339 } |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
340 c = PyUnicode_ReadChar(pb, 0); |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
341 switch (c) { |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
342 case 0x55: /* U */ |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
343 if (pb_len < 9) { |
|
630
33264c660fca
Exception formatting: more into into some exception error messages
Franz Glasner <fzglas.hg@dom66.de>
parents:
627
diff
changeset
|
344 PyErr_Format(PyExc_ValueError, "quote syntax: length too small: %U", pb); |
|
542
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
345 goto error; |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
346 } |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
347 o = _hex2string(pb, 9); |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
348 if (o == NULL) { |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
349 goto error; |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
350 } |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
351 PyTuple_SetItem(res_parts, (i-1)*2 + 1, o); /* steals */ |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
352 o = PyUnicode_Substring(pb, 9, pb_len); |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
353 if (o == NULL) { |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
354 goto error; |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
355 } |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
356 PyTuple_SetItem(res_parts, i*2, o); /* steals */ |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
357 break; |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
358 case 0x75: /* u */ |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
359 if (pb_len < 5) { |
|
630
33264c660fca
Exception formatting: more into into some exception error messages
Franz Glasner <fzglas.hg@dom66.de>
parents:
627
diff
changeset
|
360 PyErr_Format(PyExc_ValueError, "quote syntax: length too small: %U", pb); |
|
542
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
361 goto error; |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
362 } |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
363 o = _hex2string(pb, 5); |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
364 if (o == NULL) { |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
365 goto error; |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
366 } |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
367 PyTuple_SetItem(res_parts, (i-1)*2 + 1, o); /* steals */ |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
368 o = PyUnicode_Substring(pb, 5, pb_len); |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
369 if (o == NULL) { |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
370 goto error; |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
371 } |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
372 PyTuple_SetItem(res_parts, i*2, o); /* steals */ |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
373 break; |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
374 case 0x78: /* x */ |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
375 if (pb_len < 3) { |
|
630
33264c660fca
Exception formatting: more into into some exception error messages
Franz Glasner <fzglas.hg@dom66.de>
parents:
627
diff
changeset
|
376 PyErr_Format(PyExc_ValueError, "quote syntax: length too small: %U", pb); |
|
542
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
377 goto error; |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
378 } |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
379 o = _hex2string(pb, 3); |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
380 if (o == NULL) { |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
381 goto error; |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
382 } |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
383 PyTuple_SetItem(res_parts, (i-1)*2 + 1, o); /* steals */ |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
384 o = PyUnicode_Substring(pb, 3, pb_len); |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
385 if (o == NULL) { |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
386 goto error; |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
387 } |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
388 PyTuple_SetItem(res_parts, i*2, o); /* steals */ |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
389 break; |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
390 |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
391 default: |
|
630
33264c660fca
Exception formatting: more into into some exception error messages
Franz Glasner <fzglas.hg@dom66.de>
parents:
627
diff
changeset
|
392 PyErr_Format(PyExc_ValueError, "quote syntax: length too small: %U", pb); |
|
542
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
393 goto error; |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
394 } |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
395 } |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
396 |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
397 res = PyUnicode_Join(sstate->EMPTY_STR, res_parts); |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
398 if (res == NULL) { |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
399 goto error; |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
400 } |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
401 Py_DECREF(parts); |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
402 Py_DECREF(res_parts); |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
403 return res; |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
404 |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
405 error: |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
406 Py_XDECREF(res_parts); |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
407 Py_XDECREF(parts); |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
408 return NULL; |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
409 } |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
410 |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
411 |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
412 static |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
413 PyObject * |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
414 fast_unquote(PyObject *self, PyObject *s) |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
415 { |
|
552
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
416 return _fast_unquote(s, -1, self, NULL); |
|
542
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
417 } |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
418 |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
419 |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
420 static |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
421 PyObject * |
|
550
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
549
diff
changeset
|
422 fast_quote(PyObject *self, PyObject *s) |
|
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
549
diff
changeset
|
423 { |
|
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
549
diff
changeset
|
424 Py_ssize_t s_len; |
|
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
549
diff
changeset
|
425 Py_ssize_t i; |
|
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
549
diff
changeset
|
426 Py_UCS4 c; |
|
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
549
diff
changeset
|
427 int need_quoting; |
|
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
549
diff
changeset
|
428 struct speedups_state *sstate; |
|
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
549
diff
changeset
|
429 |
|
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
549
diff
changeset
|
430 s_len = PyUnicode_GetLength(s); |
|
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
549
diff
changeset
|
431 if (s_len < 0) { |
|
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
549
diff
changeset
|
432 return NULL; |
|
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
549
diff
changeset
|
433 } |
|
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
549
diff
changeset
|
434 if (s_len == 0) { |
|
559
bb160a1e67d7
A simple helper include file with some conveniente functions.
Franz Glasner <fzglas.hg@dom66.de>
parents:
558
diff
changeset
|
435 return Py_NewRef(s); |
|
550
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
549
diff
changeset
|
436 } |
|
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
549
diff
changeset
|
437 need_quoting = 0; |
|
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
549
diff
changeset
|
438 for (i=0; i<s_len; i++) { |
|
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
549
diff
changeset
|
439 c = PyUnicode_ReadChar(s, i); /* type already checked */ |
|
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
549
diff
changeset
|
440 switch (c) { |
|
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
549
diff
changeset
|
441 case 0x25: |
|
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
549
diff
changeset
|
442 case 0x2e: |
|
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
549
diff
changeset
|
443 case 0x3a: |
|
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
549
diff
changeset
|
444 case 0x23: |
|
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
549
diff
changeset
|
445 case 0x7c: |
|
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
549
diff
changeset
|
446 case 0x22: |
|
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
549
diff
changeset
|
447 case 0x27: |
|
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
549
diff
changeset
|
448 case 0x7b: |
|
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
549
diff
changeset
|
449 case 0x7d: |
|
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
549
diff
changeset
|
450 case 0x5b: |
|
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
549
diff
changeset
|
451 case 0x5d: |
|
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
549
diff
changeset
|
452 need_quoting = 1; |
|
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
549
diff
changeset
|
453 i = s_len; /* break the for-loop */ |
|
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
549
diff
changeset
|
454 break; |
|
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
549
diff
changeset
|
455 default: |
|
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
549
diff
changeset
|
456 /* VOID */ |
|
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
549
diff
changeset
|
457 ; |
|
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
549
diff
changeset
|
458 } |
|
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
549
diff
changeset
|
459 } |
|
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
549
diff
changeset
|
460 if (!need_quoting) { |
|
559
bb160a1e67d7
A simple helper include file with some conveniente functions.
Franz Glasner <fzglas.hg@dom66.de>
parents:
558
diff
changeset
|
461 return Py_NewRef(s); |
|
550
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
549
diff
changeset
|
462 } |
|
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
549
diff
changeset
|
463 sstate = PyModule_GetState(self); |
|
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
549
diff
changeset
|
464 if (sstate == NULL) { |
|
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
549
diff
changeset
|
465 PyErr_SetString(PyExc_RuntimeError, "no module state available"); |
|
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
549
diff
changeset
|
466 return NULL; |
|
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
549
diff
changeset
|
467 } |
|
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
549
diff
changeset
|
468 return PyUnicode_Translate(s, sstate->QUOTE_MAP, "strict"); |
|
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
549
diff
changeset
|
469 } |
|
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
549
diff
changeset
|
470 |
|
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
549
diff
changeset
|
471 |
|
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
549
diff
changeset
|
472 static |
|
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
549
diff
changeset
|
473 PyObject * |
|
602
a2fff0d93d83
Split up fast_pathstr2path into internal implementation and a simple wrapper
Franz Glasner <fzglas.hg@dom66.de>
parents:
601
diff
changeset
|
474 _fast_pathstr2path(PyObject *varname, PyObject *self, struct speedups_state *sstate) |
|
542
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
475 { |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
476 Py_ssize_t varname_len; |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
477 PyObject *parts = NULL; |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
478 Py_ssize_t parts_len; |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
479 PyObject *res = NULL; |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
480 Py_ssize_t i; |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
481 PyObject *o; |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
482 PyObject *u; |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
483 |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
484 varname_len = PyUnicode_GetLength(varname); |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
485 if (varname_len < 0) { |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
486 return NULL; |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
487 } |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
488 if (varname_len == 0) { |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
489 return PyTuple_New(0); |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
490 } |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
491 |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
492 if (sstate == NULL) { |
|
602
a2fff0d93d83
Split up fast_pathstr2path into internal implementation and a simple wrapper
Franz Glasner <fzglas.hg@dom66.de>
parents:
601
diff
changeset
|
493 sstate = PyModule_GetState(self); |
|
a2fff0d93d83
Split up fast_pathstr2path into internal implementation and a simple wrapper
Franz Glasner <fzglas.hg@dom66.de>
parents:
601
diff
changeset
|
494 if (sstate == NULL) { |
|
a2fff0d93d83
Split up fast_pathstr2path into internal implementation and a simple wrapper
Franz Glasner <fzglas.hg@dom66.de>
parents:
601
diff
changeset
|
495 PyErr_SetString(PyExc_RuntimeError, "no module state available"); |
|
a2fff0d93d83
Split up fast_pathstr2path into internal implementation and a simple wrapper
Franz Glasner <fzglas.hg@dom66.de>
parents:
601
diff
changeset
|
496 return NULL; |
|
a2fff0d93d83
Split up fast_pathstr2path into internal implementation and a simple wrapper
Franz Glasner <fzglas.hg@dom66.de>
parents:
601
diff
changeset
|
497 } |
|
542
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
498 } |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
499 parts = PyUnicode_Split(varname, sstate->DOT, -1); |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
500 if (parts == NULL) { |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
501 goto error; |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
502 } |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
503 parts_len = PyList_Size(parts); |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
504 if (parts_len < 0) { |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
505 goto error; |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
506 } |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
507 res = PyTuple_New(parts_len); |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
508 if (res == NULL) { |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
509 goto error; |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
510 } |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
511 for (i=0; i < parts_len; i++) { |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
512 o = PyList_GetItem(parts, i); /* borrowed */ |
|
552
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
513 u = _fast_unquote(o, -1, NULL, sstate); |
|
542
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
514 if (u == NULL) { |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
515 goto error; |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
516 } |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
517 PyTuple_SetItem(res, i, u); /* steals */ |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
518 } |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
519 |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
520 Py_DECREF(parts); |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
521 return res; |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
522 |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
523 error: |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
524 Py_XDECREF(parts); |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
525 Py_XDECREF(res); |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
526 return NULL; |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
527 } |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
528 |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
529 |
|
543
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
530 static |
|
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
531 PyObject * |
|
602
a2fff0d93d83
Split up fast_pathstr2path into internal implementation and a simple wrapper
Franz Glasner <fzglas.hg@dom66.de>
parents:
601
diff
changeset
|
532 fast_pathstr2path(PyObject *self, PyObject *varname) |
|
a2fff0d93d83
Split up fast_pathstr2path into internal implementation and a simple wrapper
Franz Glasner <fzglas.hg@dom66.de>
parents:
601
diff
changeset
|
533 { |
|
a2fff0d93d83
Split up fast_pathstr2path into internal implementation and a simple wrapper
Franz Glasner <fzglas.hg@dom66.de>
parents:
601
diff
changeset
|
534 return _fast_pathstr2path(varname, self, NULL); |
|
a2fff0d93d83
Split up fast_pathstr2path into internal implementation and a simple wrapper
Franz Glasner <fzglas.hg@dom66.de>
parents:
601
diff
changeset
|
535 } |
|
a2fff0d93d83
Split up fast_pathstr2path into internal implementation and a simple wrapper
Franz Glasner <fzglas.hg@dom66.de>
parents:
601
diff
changeset
|
536 |
|
a2fff0d93d83
Split up fast_pathstr2path into internal implementation and a simple wrapper
Franz Glasner <fzglas.hg@dom66.de>
parents:
601
diff
changeset
|
537 |
|
a2fff0d93d83
Split up fast_pathstr2path into internal implementation and a simple wrapper
Franz Glasner <fzglas.hg@dom66.de>
parents:
601
diff
changeset
|
538 static |
|
a2fff0d93d83
Split up fast_pathstr2path into internal implementation and a simple wrapper
Franz Glasner <fzglas.hg@dom66.de>
parents:
601
diff
changeset
|
539 PyObject * |
|
552
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
540 _fast_split_filters(PyObject *varname, PyObject *self, struct speedups_state *sstate) |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
541 { |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
542 Py_ssize_t varname_len; |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
543 Py_ssize_t sep; |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
544 PyObject *res = NULL; |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
545 PyObject *filters = NULL; |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
546 PyObject *name = NULL; |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
547 PyObject *tmp; |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
548 |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
549 varname_len = PyUnicode_GetLength(varname); |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
550 if (varname_len < 0) { |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
551 return NULL; |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
552 } |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
553 if (varname_len == 0) { |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
554 sep = -1; |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
555 } |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
556 else { |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
557 sep = PyUnicode_FindChar(varname, '|', 0, varname_len, 1); |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
558 if (sep == -2) { |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
559 return NULL; |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
560 } |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
561 } |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
562 if (sep == -1) { |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
563 res = PyTuple_New(2); |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
564 if (res == NULL) { |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
565 goto error; |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
566 } |
|
559
bb160a1e67d7
A simple helper include file with some conveniente functions.
Franz Glasner <fzglas.hg@dom66.de>
parents:
558
diff
changeset
|
567 PyTuple_SetItem(res, 0, Py_NewRef(varname)); /* steals */ |
|
552
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
568 filters = PyList_New(0); |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
569 if (filters == NULL) { |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
570 goto error; |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
571 } |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
572 PyTuple_SetItem(res, 1, filters); /* steals */ |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
573 return res; |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
574 } |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
575 name = PyUnicode_Substring(varname, 0, sep); |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
576 if (name == NULL) { |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
577 goto error; |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
578 } |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
579 |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
580 filters = PyUnicode_Substring(varname, sep+1, varname_len); |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
581 if (filters == NULL) { |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
582 goto error; |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
583 } |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
584 tmp = PyObject_CallMethod(filters, "strip", NULL); |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
585 if (tmp == NULL) { |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
586 goto error; |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
587 } |
|
560
81238ea2dbe3
Implement and use more helper functions.
Franz Glasner <fzglas.hg@dom66.de>
parents:
559
diff
changeset
|
588 py_transfer_owned(&filters, &tmp); |
|
552
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
589 |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
590 if (PyObject_Not(filters)) { |
|
559
bb160a1e67d7
A simple helper include file with some conveniente functions.
Franz Glasner <fzglas.hg@dom66.de>
parents:
558
diff
changeset
|
591 py_clear_ref(&filters); |
|
552
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
592 |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
593 res = PyTuple_New(2); |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
594 if (res == NULL) { |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
595 goto error; |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
596 } |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
597 PyTuple_SetItem(res, 0, name); /* steals */ |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
598 name = NULL; /* no ownership any more */ |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
599 filters = PyList_New(0); |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
600 if (filters == NULL) { |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
601 goto error; |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
602 } |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
603 PyTuple_SetItem(res, 1, filters); /* steals */ |
|
560
81238ea2dbe3
Implement and use more helper functions.
Franz Glasner <fzglas.hg@dom66.de>
parents:
559
diff
changeset
|
604 filters = NULL; |
|
552
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
605 return res; |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
606 } |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
607 |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
608 if (sstate == NULL) { |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
609 sstate = PyModule_GetState(self); |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
610 if (sstate == NULL) { |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
611 PyErr_SetString(PyExc_RuntimeError, "no module state available"); |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
612 goto error; |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
613 } |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
614 } |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
615 |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
616 tmp = PyUnicode_Split(filters, sstate->FILTER_SEPARATOR, -1); |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
617 if (tmp == NULL) { |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
618 goto error; |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
619 } |
|
560
81238ea2dbe3
Implement and use more helper functions.
Franz Glasner <fzglas.hg@dom66.de>
parents:
559
diff
changeset
|
620 py_transfer_owned(&filters, &tmp); |
|
552
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
621 |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
622 res = PyTuple_New(2); |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
623 if (res == NULL) { |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
624 goto error; |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
625 } |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
626 PyTuple_SetItem(res, 0, name); /* steals -- ownership changed */ |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
627 PyTuple_SetItem(res, 1, filters); /* steals -- ownership changed */ |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
628 return res; |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
629 |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
630 error: |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
631 Py_XDECREF(res); |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
632 Py_XDECREF(filters); |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
633 Py_XDECREF(name); |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
634 return NULL; |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
635 } |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
636 |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
637 |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
638 static |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
639 PyObject * |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
640 fast_split_filters(PyObject *self, PyObject *varname) |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
641 { |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
642 return _fast_split_filters(varname, self, NULL); |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
643 } |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
644 |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
645 |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
646 static |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
647 PyObject * |
|
611
db5a20f18030
Provide an internal version of fast_split_ns() to use an already module state available
Franz Glasner <fzglas.hg@dom66.de>
parents:
610
diff
changeset
|
648 _fast_split_ns(PyObject *varname, PyObject *self, struct speedups_state *sstate) |
|
543
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
649 { |
|
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
650 PyObject *res = NULL; |
|
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
651 Py_ssize_t ns_idx; |
|
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
652 Py_ssize_t varname_len; |
|
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
653 PyObject *o1; |
|
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
654 PyObject *o2; |
|
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
655 |
|
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
656 varname_len = PyUnicode_GetLength(varname); |
|
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
657 if (varname_len < 0) { |
|
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
658 return NULL; |
|
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
659 } |
|
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
660 ns_idx = PyUnicode_FindChar(varname, ':', 0, varname_len, 1); |
|
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
661 if (ns_idx == -2) { |
|
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
662 return NULL; |
|
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
663 } |
|
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
664 if (ns_idx == -1) { |
|
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
665 res = PyTuple_New(2); |
|
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
666 if (res == NULL) { |
|
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
667 return NULL; |
|
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
668 } |
|
559
bb160a1e67d7
A simple helper include file with some conveniente functions.
Franz Glasner <fzglas.hg@dom66.de>
parents:
558
diff
changeset
|
669 PyTuple_SetItem(res, 0, Py_NewRef(Py_None)); /* steals */ |
|
bb160a1e67d7
A simple helper include file with some conveniente functions.
Franz Glasner <fzglas.hg@dom66.de>
parents:
558
diff
changeset
|
670 PyTuple_SetItem(res, 1, Py_NewRef(varname)); /* steals */ |
|
543
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
671 return res; |
|
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
672 } |
|
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
673 |
|
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
674 res = PyTuple_New(2); |
|
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
675 if (res == NULL) { |
|
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
676 return NULL; |
|
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
677 } |
|
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
678 o1 = PyUnicode_Substring(varname, 0, ns_idx); |
|
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
679 if (o1 == NULL) { |
|
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
680 Py_DECREF(res); |
|
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
681 return NULL; |
|
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
682 } |
|
611
db5a20f18030
Provide an internal version of fast_split_ns() to use an already module state available
Franz Glasner <fzglas.hg@dom66.de>
parents:
610
diff
changeset
|
683 o2 = _fast_unquote(o1, ns_idx, self, sstate); |
|
543
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
684 if (o2 == NULL) { |
|
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
685 Py_DECREF(o1); |
|
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
686 Py_DECREF(res); |
|
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
687 return NULL; |
|
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
688 } |
|
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
689 Py_DECREF(o1); |
|
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
690 PyTuple_SetItem(res, 0, o2); /* steals */ |
|
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
691 o1 = PyUnicode_Substring(varname, ns_idx+1, varname_len); |
|
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
692 if (o1 == NULL) { |
|
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
693 Py_DECREF(res); |
|
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
694 return NULL; |
|
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
695 } |
|
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
696 PyTuple_SetItem(res, 1, o1); /* steals */ |
|
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
697 return res; |
|
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
698 } |
|
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
699 |
|
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
700 |
|
554
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
701 static |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
702 PyObject * |
|
611
db5a20f18030
Provide an internal version of fast_split_ns() to use an already module state available
Franz Glasner <fzglas.hg@dom66.de>
parents:
610
diff
changeset
|
703 fast_split_ns(PyObject *self, PyObject *varname) |
|
db5a20f18030
Provide an internal version of fast_split_ns() to use an already module state available
Franz Glasner <fzglas.hg@dom66.de>
parents:
610
diff
changeset
|
704 { |
|
db5a20f18030
Provide an internal version of fast_split_ns() to use an already module state available
Franz Glasner <fzglas.hg@dom66.de>
parents:
610
diff
changeset
|
705 return _fast_split_ns(varname, self, NULL); |
|
db5a20f18030
Provide an internal version of fast_split_ns() to use an already module state available
Franz Glasner <fzglas.hg@dom66.de>
parents:
610
diff
changeset
|
706 } |
|
db5a20f18030
Provide an internal version of fast_split_ns() to use an already module state available
Franz Glasner <fzglas.hg@dom66.de>
parents:
610
diff
changeset
|
707 |
|
db5a20f18030
Provide an internal version of fast_split_ns() to use an already module state available
Franz Glasner <fzglas.hg@dom66.de>
parents:
610
diff
changeset
|
708 |
|
db5a20f18030
Provide an internal version of fast_split_ns() to use an already module state available
Franz Glasner <fzglas.hg@dom66.de>
parents:
610
diff
changeset
|
709 static |
|
db5a20f18030
Provide an internal version of fast_split_ns() to use an already module state available
Franz Glasner <fzglas.hg@dom66.de>
parents:
610
diff
changeset
|
710 PyObject * |
|
558
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
711 fast_interpolate_variables_old(PyObject *self, PyObject *args) |
|
554
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
712 { |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
713 PyObject *config; |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
714 PyObject *s; |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
715 PyObject *cache; |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
716 |
|
637
4499e9b4855d
The ``{{::DEL::}}`` is not subject to interpolation any more.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
630
diff
changeset
|
717 int cmp; |
|
554
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
718 Py_ssize_t s_len; |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
719 Py_ssize_t idx; |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
720 Py_ssize_t i, j; |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
721 PyObject *parts = NULL; |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
722 Py_ssize_t parts_len; |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
723 PyObject *res_parts = NULL; |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
724 PyObject *res = NULL; |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
725 PyObject *tmp; |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
726 PyObject *pb; |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
727 Py_ssize_t pb_len; |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
728 PyObject *varname = NULL; |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
729 PyObject *varvalue = NULL; |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
730 PyObject *filters = NULL; |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
731 int cacheable; |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
732 int use_cache = 1; |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
733 int first_part_is_empty; |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
734 PyObject *err_type; |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
735 PyObject *err_value; |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
736 PyObject *err_tb; |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
737 struct speedups_state *sstate; |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
738 |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
739 if (!PyArg_UnpackTuple(args, "s", 3, 3, &config, &s, &cache)) { |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
740 return NULL; |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
741 } |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
742 s_len = PyUnicode_GetLength(s); /* also an implicit type check */ |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
743 if (s_len < 0) { |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
744 return NULL; |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
745 } |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
746 if (s_len < 4) { |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
747 PyErr_Clear(); |
|
559
bb160a1e67d7
A simple helper include file with some conveniente functions.
Franz Glasner <fzglas.hg@dom66.de>
parents:
558
diff
changeset
|
748 return Py_NewRef(s); |
|
554
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
749 } |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
750 sstate = PyModule_GetState(self); |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
751 if (sstate == NULL) { |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
752 PyErr_SetString(PyExc_RuntimeError, "no module state available"); |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
753 return NULL; |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
754 } |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
755 |
|
637
4499e9b4855d
The ``{{::DEL::}}`` is not subject to interpolation any more.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
630
diff
changeset
|
756 cmp = PyUnicode_Compare(s, sstate->DEL_VALUE); |
|
4499e9b4855d
The ``{{::DEL::}}`` is not subject to interpolation any more.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
630
diff
changeset
|
757 if ((cmp < 0) && PyErr_Occurred()) { |
|
4499e9b4855d
The ``{{::DEL::}}`` is not subject to interpolation any more.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
630
diff
changeset
|
758 return NULL; |
|
4499e9b4855d
The ``{{::DEL::}}`` is not subject to interpolation any more.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
630
diff
changeset
|
759 } |
|
4499e9b4855d
The ``{{::DEL::}}`` is not subject to interpolation any more.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
630
diff
changeset
|
760 if (cmp == 0) { |
|
4499e9b4855d
The ``{{::DEL::}}`` is not subject to interpolation any more.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
630
diff
changeset
|
761 return Py_NewRef(s); |
|
4499e9b4855d
The ``{{::DEL::}}`` is not subject to interpolation any more.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
630
diff
changeset
|
762 } |
|
4499e9b4855d
The ``{{::DEL::}}`` is not subject to interpolation any more.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
630
diff
changeset
|
763 |
|
554
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
764 idx = PyUnicode_Find(s, sstate->STARTTOK, 0, s_len, 1); |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
765 if (idx < 0) { |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
766 PyErr_Clear(); |
|
559
bb160a1e67d7
A simple helper include file with some conveniente functions.
Franz Glasner <fzglas.hg@dom66.de>
parents:
558
diff
changeset
|
767 return Py_NewRef(s); |
|
554
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
768 } |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
769 |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
770 res = PyDict_GetItem(cache, s); /* borrowed */ |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
771 if (res != NULL) { |
|
618
8dc514bd3d5e
Use py_object_is when comparing to MISSING
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
614
diff
changeset
|
772 if (py_object_is(res, sstate->MISSING)) { |
|
554
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
773 return PyErr_Format( |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
774 PyExc_KeyError, |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
775 "Cannot interpolate variables in string %R (cached)", |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
776 s); |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
777 } |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
778 else { |
|
559
bb160a1e67d7
A simple helper include file with some conveniente functions.
Franz Glasner <fzglas.hg@dom66.de>
parents:
558
diff
changeset
|
779 return Py_NewRef(res); |
|
554
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
780 } |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
781 } |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
782 |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
783 parts = PyUnicode_Split(s, sstate->STARTTOK, -1); |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
784 if (parts == NULL) { |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
785 goto error; |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
786 } |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
787 parts_len = PyList_Size(parts); |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
788 if (parts_len < 0) { |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
789 goto error; |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
790 } |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
791 res_parts = PyList_New(1); |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
792 if (res_parts == NULL) { |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
793 goto error; |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
794 } |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
795 |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
796 tmp = PyList_GetItem(parts, 0); /* borrowed */ |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
797 if (tmp == NULL) { |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
798 goto error; |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
799 } |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
800 /* |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
801 * The first item may be also the empty string if `s' starts with |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
802 * an interpolation token. |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
803 */ |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
804 first_part_is_empty = PyObject_Not(tmp); |
|
559
bb160a1e67d7
A simple helper include file with some conveniente functions.
Franz Glasner <fzglas.hg@dom66.de>
parents:
558
diff
changeset
|
805 /* steals -- cannot fail here -- NOTE: tmp is currently borrowed */ |
|
bb160a1e67d7
A simple helper include file with some conveniente functions.
Franz Glasner <fzglas.hg@dom66.de>
parents:
558
diff
changeset
|
806 PyList_SetItem(res_parts, 0, Py_NewRef(tmp)); |
|
554
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
807 tmp = NULL; |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
808 |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
809 for (i=1; i<parts_len; i++) { |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
810 pb = PyList_GetItem(parts, i); /* borrowed */ |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
811 pb_len = PyUnicode_GetLength(pb); |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
812 if (pb_len < 0) { |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
813 goto error; |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
814 } |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
815 idx = PyUnicode_Find(pb, sstate->ENDTOK, 0, pb_len, 1); |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
816 if (idx < 0) { |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
817 /* |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
818 * Behave similar to the pure-Python version: copy the complete |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
819 * rest as-is. Also include the start tokens! |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
820 */ |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
821 if (PyList_Append(res_parts, sstate->STARTTOK) < 0) { |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
822 goto error; |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
823 } |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
824 if (PyList_Append(res_parts, pb) < 0) { |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
825 goto error; |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
826 } |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
827 for (j=i+1; j<parts_len; j++) { |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
828 if (PyList_Append(res_parts, sstate->STARTTOK) < 0) { |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
829 goto error; |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
830 } |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
831 pb = PyList_GetItem(parts, j); /* borrowed */ |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
832 if (PyList_Append(res_parts, pb) < 0) { |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
833 goto error; |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
834 } |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
835 } |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
836 break; /* the for-loop */ |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
837 } |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
838 |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
839 varname = PyUnicode_Substring(pb, 0, idx); |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
840 if (varname == NULL) { |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
841 goto error; |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
842 } |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
843 |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
844 tmp = _fast_split_filters(varname, NULL, sstate); |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
845 if (tmp == NULL) { |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
846 goto error; |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
847 } |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
848 if (PyTuple_Size(tmp) != 2) { |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
849 PyErr_SetString(PyExc_TypeError, "tuple of size 2 expected"); |
|
559
bb160a1e67d7
A simple helper include file with some conveniente functions.
Franz Glasner <fzglas.hg@dom66.de>
parents:
558
diff
changeset
|
850 py_clear_ref(&tmp); |
|
554
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
851 goto error; |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
852 } |
| 562 | 853 py_clear_ref(&varname); |
|
554
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
854 /* Unpack the result tuple */ |
|
560
81238ea2dbe3
Implement and use more helper functions.
Franz Glasner <fzglas.hg@dom66.de>
parents:
559
diff
changeset
|
855 /* borrowed -- cannot fail -- need ownership */ |
|
81238ea2dbe3
Implement and use more helper functions.
Franz Glasner <fzglas.hg@dom66.de>
parents:
559
diff
changeset
|
856 varname = Py_NewRef(PyTuple_GetItem(tmp, 0)); |
|
81238ea2dbe3
Implement and use more helper functions.
Franz Glasner <fzglas.hg@dom66.de>
parents:
559
diff
changeset
|
857 /* borrowed -- cannot fail -- want ownership */ |
|
559
bb160a1e67d7
A simple helper include file with some conveniente functions.
Franz Glasner <fzglas.hg@dom66.de>
parents:
558
diff
changeset
|
858 filters = Py_NewRef(PyTuple_GetItem(tmp, 1)); |
|
bb160a1e67d7
A simple helper include file with some conveniente functions.
Franz Glasner <fzglas.hg@dom66.de>
parents:
558
diff
changeset
|
859 py_clear_ref(&tmp); |
|
554
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
860 |
|
611
db5a20f18030
Provide an internal version of fast_split_ns() to use an already module state available
Franz Glasner <fzglas.hg@dom66.de>
parents:
610
diff
changeset
|
861 varvalue = _fast_getvar_s(config, varname, NULL, sstate, &cacheable); |
|
603
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
862 if (varvalue == NULL) { |
|
554
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
863 if (PyErr_ExceptionMatches(PyExc_KeyError)) { |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
864 cacheable = 1; |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
865 if (PySequence_Contains(filters, sstate->NONE_FILTER) == 1) { |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
866 PyErr_Clear(); |
|
559
bb160a1e67d7
A simple helper include file with some conveniente functions.
Franz Glasner <fzglas.hg@dom66.de>
parents:
558
diff
changeset
|
867 varvalue = Py_NewRef(Py_None); |
|
554
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
868 } |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
869 else { |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
870 if (PySequence_Contains(filters, sstate->EMPTY_FILTER) == 1) { |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
871 PyErr_Clear(); |
|
559
bb160a1e67d7
A simple helper include file with some conveniente functions.
Franz Glasner <fzglas.hg@dom66.de>
parents:
558
diff
changeset
|
872 varvalue = Py_NewRef(sstate->EMPTY_STR); |
|
554
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
873 } |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
874 else { |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
875 PyErr_Fetch(&err_type, &err_value, &err_tb); |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
876 /* this does NOT steal */ |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
877 PyDict_SetItem(cache, s, sstate->MISSING); |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
878 PyErr_Restore(err_type, err_value, err_tb); |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
879 goto error; |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
880 } |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
881 } |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
882 } |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
883 else { |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
884 /* other exception/error than KeyError */ |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
885 goto error; |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
886 } |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
887 } |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
888 |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
889 if (!cacheable) { |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
890 use_cache = 0; |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
891 } |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
892 |
|
559
bb160a1e67d7
A simple helper include file with some conveniente functions.
Franz Glasner <fzglas.hg@dom66.de>
parents:
558
diff
changeset
|
893 py_clear_ref(&varname); |
|
554
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
894 |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
895 tmp = PyObject_CallMethod( |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
896 config, "_apply_filters", "OO", filters, varvalue); |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
897 if (tmp == NULL) { |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
898 goto error; |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
899 } |
|
559
bb160a1e67d7
A simple helper include file with some conveniente functions.
Franz Glasner <fzglas.hg@dom66.de>
parents:
558
diff
changeset
|
900 py_clear_ref(&varvalue); |
|
554
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
901 |
|
559
bb160a1e67d7
A simple helper include file with some conveniente functions.
Franz Glasner <fzglas.hg@dom66.de>
parents:
558
diff
changeset
|
902 py_clear_ref(&filters); |
|
555
b7434a34a1f4
- FIX: Memory-leak with the "filters" local variable
Franz Glasner <fzglas.hg@dom66.de>
parents:
554
diff
changeset
|
903 |
|
554
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
904 /* |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
905 * Dont apply and type conversions to the variable value if |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
906 * the whole `s` is just one expansion |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
907 */ |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
908 if (first_part_is_empty && (i == 1) && (pb_len == s_len - 2) && (idx == pb_len - 2)) { |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
909 res = varvalue; varvalue = NULL; |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
910 goto success; /* break out early */ |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
911 } |
|
559
bb160a1e67d7
A simple helper include file with some conveniente functions.
Franz Glasner <fzglas.hg@dom66.de>
parents:
558
diff
changeset
|
912 if (py_object_isnot(varvalue, Py_None)) { |
|
554
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
913 tmp = PyObject_Str(varvalue); |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
914 if (tmp == NULL) { |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
915 goto error; |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
916 } |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
917 if (PyList_Append(res_parts, tmp) < 0) { |
|
559
bb160a1e67d7
A simple helper include file with some conveniente functions.
Franz Glasner <fzglas.hg@dom66.de>
parents:
558
diff
changeset
|
918 py_clear_ref(&tmp); |
|
554
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
919 goto error; |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
920 } |
|
559
bb160a1e67d7
A simple helper include file with some conveniente functions.
Franz Glasner <fzglas.hg@dom66.de>
parents:
558
diff
changeset
|
921 py_clear_ref(&tmp); |
|
554
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
922 } |
|
559
bb160a1e67d7
A simple helper include file with some conveniente functions.
Franz Glasner <fzglas.hg@dom66.de>
parents:
558
diff
changeset
|
923 py_clear_ref(&varvalue); |
|
554
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
924 /* append the rest of the string */ |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
925 tmp = PyUnicode_Substring(pb, idx+2, pb_len); |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
926 if (tmp == NULL) { |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
927 goto error; |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
928 } |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
929 if (PyList_Append(res_parts, tmp) < 0) { |
|
559
bb160a1e67d7
A simple helper include file with some conveniente functions.
Franz Glasner <fzglas.hg@dom66.de>
parents:
558
diff
changeset
|
930 py_clear_ref(&tmp); |
|
554
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
931 goto error; |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
932 } |
|
559
bb160a1e67d7
A simple helper include file with some conveniente functions.
Franz Glasner <fzglas.hg@dom66.de>
parents:
558
diff
changeset
|
933 py_clear_ref(&tmp); |
|
554
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
934 } |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
935 |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
936 res = PyUnicode_Join(sstate->EMPTY_STR, res_parts); |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
937 if (res == NULL) { |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
938 goto error; |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
939 } |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
940 |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
941 success: |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
942 Py_DECREF(parts); |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
943 Py_DECREF(res_parts); |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
944 |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
945 if (use_cache) { |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
946 PyDict_SetItem(cache, s, res); |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
947 PyErr_Clear(); /* clear any possible cache-related error */ |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
948 } |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
949 return res; |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
950 |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
951 error: |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
952 Py_XDECREF(varname); |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
953 Py_XDECREF(varvalue); |
|
559
bb160a1e67d7
A simple helper include file with some conveniente functions.
Franz Glasner <fzglas.hg@dom66.de>
parents:
558
diff
changeset
|
954 Py_XDECREF(filters); |
|
554
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
955 Py_XDECREF(parts); |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
956 Py_XDECREF(res_parts); |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
957 Py_XDECREF(res); |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
958 return NULL; |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
959 } |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
960 |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
961 |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
962 static |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
963 PyObject * |
|
558
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
964 fast_interpolate_variables(PyObject *self, PyObject *args) |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
965 { |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
966 PyObject *config; |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
967 PyObject *s; |
|
566
dc2e2384c8c7
fast_interpolate_variables(): allow omission of the cache variable.
Franz Glasner <fzglas.hg@dom66.de>
parents:
565
diff
changeset
|
968 PyObject *cache = NULL; |
|
558
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
969 |
|
637
4499e9b4855d
The ``{{::DEL::}}`` is not subject to interpolation any more.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
630
diff
changeset
|
970 int cmp; |
|
558
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
971 Py_ssize_t s_len; |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
972 Py_ssize_t start, rest, end; |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
973 PyObject *tmp; |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
974 PyObject *result = NULL; |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
975 PyObject *varname = NULL; |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
976 PyObject *varvalue = NULL; |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
977 PyObject *filters = NULL; |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
978 PyObject *err_type; |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
979 PyObject *err_value; |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
980 PyObject *err_tb; |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
981 int use_cache, cacheable; |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
982 struct speedups_state *sstate; |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
983 |
|
566
dc2e2384c8c7
fast_interpolate_variables(): allow omission of the cache variable.
Franz Glasner <fzglas.hg@dom66.de>
parents:
565
diff
changeset
|
984 if (!PyArg_UnpackTuple(args, "s", 2, 3, &config, &s, &cache)) { |
|
558
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
985 return NULL; |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
986 } |
|
566
dc2e2384c8c7
fast_interpolate_variables(): allow omission of the cache variable.
Franz Glasner <fzglas.hg@dom66.de>
parents:
565
diff
changeset
|
987 /* Disable caching if the cache param is given as None */ |
|
dc2e2384c8c7
fast_interpolate_variables(): allow omission of the cache variable.
Franz Glasner <fzglas.hg@dom66.de>
parents:
565
diff
changeset
|
988 if ((cache != NULL) && py_object_is(cache, Py_None)) { |
|
dc2e2384c8c7
fast_interpolate_variables(): allow omission of the cache variable.
Franz Glasner <fzglas.hg@dom66.de>
parents:
565
diff
changeset
|
989 cache = NULL; |
|
dc2e2384c8c7
fast_interpolate_variables(): allow omission of the cache variable.
Franz Glasner <fzglas.hg@dom66.de>
parents:
565
diff
changeset
|
990 } |
|
558
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
991 s_len = PyUnicode_GetLength(s); /* also an implicit type check */ |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
992 if (s_len < 0) { |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
993 return NULL; |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
994 } |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
995 if (s_len < 4) { |
|
559
bb160a1e67d7
A simple helper include file with some conveniente functions.
Franz Glasner <fzglas.hg@dom66.de>
parents:
558
diff
changeset
|
996 return Py_NewRef(s); |
|
558
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
997 } |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
998 |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
999 sstate = PyModule_GetState(self); |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1000 if (sstate == NULL) { |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1001 PyErr_SetString(PyExc_RuntimeError, "no module state available"); |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1002 return NULL; |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1003 } |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1004 |
|
637
4499e9b4855d
The ``{{::DEL::}}`` is not subject to interpolation any more.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
630
diff
changeset
|
1005 cmp = PyUnicode_Compare(s, sstate->DEL_VALUE); |
|
4499e9b4855d
The ``{{::DEL::}}`` is not subject to interpolation any more.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
630
diff
changeset
|
1006 if ((cmp < 0) && PyErr_Occurred()) { |
|
4499e9b4855d
The ``{{::DEL::}}`` is not subject to interpolation any more.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
630
diff
changeset
|
1007 return NULL; |
|
4499e9b4855d
The ``{{::DEL::}}`` is not subject to interpolation any more.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
630
diff
changeset
|
1008 } |
|
4499e9b4855d
The ``{{::DEL::}}`` is not subject to interpolation any more.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
630
diff
changeset
|
1009 if (cmp == 0) { |
|
4499e9b4855d
The ``{{::DEL::}}`` is not subject to interpolation any more.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
630
diff
changeset
|
1010 return Py_NewRef(s); |
|
4499e9b4855d
The ``{{::DEL::}}`` is not subject to interpolation any more.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
630
diff
changeset
|
1011 } |
|
4499e9b4855d
The ``{{::DEL::}}`` is not subject to interpolation any more.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
630
diff
changeset
|
1012 |
|
558
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1013 start = PyUnicode_Find(s, sstate->STARTTOK, 0, s_len, 1); |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1014 if (start == -2) { |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1015 return NULL; |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1016 } |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1017 if (start == -1) { |
|
559
bb160a1e67d7
A simple helper include file with some conveniente functions.
Franz Glasner <fzglas.hg@dom66.de>
parents:
558
diff
changeset
|
1018 return Py_NewRef(s); |
|
558
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1019 } |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1020 |
|
566
dc2e2384c8c7
fast_interpolate_variables(): allow omission of the cache variable.
Franz Glasner <fzglas.hg@dom66.de>
parents:
565
diff
changeset
|
1021 if (cache != NULL) { |
|
dc2e2384c8c7
fast_interpolate_variables(): allow omission of the cache variable.
Franz Glasner <fzglas.hg@dom66.de>
parents:
565
diff
changeset
|
1022 result = PyDict_GetItem(cache, s); /* borrowed */ |
|
dc2e2384c8c7
fast_interpolate_variables(): allow omission of the cache variable.
Franz Glasner <fzglas.hg@dom66.de>
parents:
565
diff
changeset
|
1023 if (result != NULL) { |
|
618
8dc514bd3d5e
Use py_object_is when comparing to MISSING
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
614
diff
changeset
|
1024 if (py_object_is(result, sstate->MISSING)) { |
|
566
dc2e2384c8c7
fast_interpolate_variables(): allow omission of the cache variable.
Franz Glasner <fzglas.hg@dom66.de>
parents:
565
diff
changeset
|
1025 return PyErr_Format( |
|
dc2e2384c8c7
fast_interpolate_variables(): allow omission of the cache variable.
Franz Glasner <fzglas.hg@dom66.de>
parents:
565
diff
changeset
|
1026 PyExc_KeyError, |
|
dc2e2384c8c7
fast_interpolate_variables(): allow omission of the cache variable.
Franz Glasner <fzglas.hg@dom66.de>
parents:
565
diff
changeset
|
1027 "Cannot interpolate variables in string %R (cached)", |
|
dc2e2384c8c7
fast_interpolate_variables(): allow omission of the cache variable.
Franz Glasner <fzglas.hg@dom66.de>
parents:
565
diff
changeset
|
1028 s); |
|
dc2e2384c8c7
fast_interpolate_variables(): allow omission of the cache variable.
Franz Glasner <fzglas.hg@dom66.de>
parents:
565
diff
changeset
|
1029 } |
|
dc2e2384c8c7
fast_interpolate_variables(): allow omission of the cache variable.
Franz Glasner <fzglas.hg@dom66.de>
parents:
565
diff
changeset
|
1030 else { |
|
dc2e2384c8c7
fast_interpolate_variables(): allow omission of the cache variable.
Franz Glasner <fzglas.hg@dom66.de>
parents:
565
diff
changeset
|
1031 return Py_NewRef(result); |
|
dc2e2384c8c7
fast_interpolate_variables(): allow omission of the cache variable.
Franz Glasner <fzglas.hg@dom66.de>
parents:
565
diff
changeset
|
1032 } |
|
558
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1033 } |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1034 } |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1035 |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1036 result = PyList_New(0); |
| 627 | 1037 if (result == NULL) { |
|
558
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1038 return NULL; |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1039 } |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1040 |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1041 rest = 0; |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1042 use_cache = 1; |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1043 |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1044 while (start != -1) { |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1045 if (rest < start) { |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1046 tmp = PyUnicode_Substring(s, rest, start); |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1047 if (tmp == NULL) { |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1048 goto error; |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1049 } |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1050 if (PyList_Append(result, tmp) < 0) { |
|
559
bb160a1e67d7
A simple helper include file with some conveniente functions.
Franz Glasner <fzglas.hg@dom66.de>
parents:
558
diff
changeset
|
1051 py_clear_ref(&tmp); |
|
558
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1052 goto error; |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1053 } |
|
560
81238ea2dbe3
Implement and use more helper functions.
Franz Glasner <fzglas.hg@dom66.de>
parents:
559
diff
changeset
|
1054 py_clear_ref(&tmp); |
|
558
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1055 } |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1056 end = PyUnicode_Find(s, sstate->ENDTOK, start+2, s_len, 1); |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1057 if (end == -2) { |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1058 goto error; |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1059 } |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1060 if (end == -1) { |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1061 rest = start; |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1062 break; |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1063 } |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1064 |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1065 varname = PyUnicode_Substring(s, start+2, end); /* 2 == len(STARTTOK) */ |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1066 if (varname == NULL) { |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1067 goto error; |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1068 } |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1069 |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1070 tmp = _fast_split_filters(varname, NULL, sstate); |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1071 if (tmp == NULL) { |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1072 goto error; |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1073 } |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1074 if (PyTuple_Size(tmp) != 2) { |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1075 PyErr_SetString(PyExc_TypeError, "tuple of size 2 expected"); |
|
559
bb160a1e67d7
A simple helper include file with some conveniente functions.
Franz Glasner <fzglas.hg@dom66.de>
parents:
558
diff
changeset
|
1076 py_clear_ref(&tmp); |
|
558
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1077 goto error; |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1078 } |
| 562 | 1079 py_clear_ref(&varname); |
|
558
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1080 /* Unpack the result tuple */ |
|
560
81238ea2dbe3
Implement and use more helper functions.
Franz Glasner <fzglas.hg@dom66.de>
parents:
559
diff
changeset
|
1081 /* borrowed -- cannot fail -- need ownership */ |
|
81238ea2dbe3
Implement and use more helper functions.
Franz Glasner <fzglas.hg@dom66.de>
parents:
559
diff
changeset
|
1082 varname = Py_NewRef(PyTuple_GetItem(tmp, 0)); |
|
81238ea2dbe3
Implement and use more helper functions.
Franz Glasner <fzglas.hg@dom66.de>
parents:
559
diff
changeset
|
1083 /* borrowed -- cannot fail -- need ownership */ |
|
559
bb160a1e67d7
A simple helper include file with some conveniente functions.
Franz Glasner <fzglas.hg@dom66.de>
parents:
558
diff
changeset
|
1084 filters = Py_NewRef(PyTuple_GetItem(tmp, 1)); |
|
bb160a1e67d7
A simple helper include file with some conveniente functions.
Franz Glasner <fzglas.hg@dom66.de>
parents:
558
diff
changeset
|
1085 py_clear_ref(&tmp); |
|
558
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1086 |
|
611
db5a20f18030
Provide an internal version of fast_split_ns() to use an already module state available
Franz Glasner <fzglas.hg@dom66.de>
parents:
610
diff
changeset
|
1087 varvalue = _fast_getvar_s(config, varname, NULL, sstate, &cacheable); |
|
603
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1088 |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1089 if (varvalue == NULL) { |
|
558
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1090 if (PyErr_ExceptionMatches(PyExc_KeyError)) { |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1091 cacheable = 1; |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1092 if (PySequence_Contains(filters, sstate->NONE_FILTER) == 1) { |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1093 PyErr_Clear(); |
|
559
bb160a1e67d7
A simple helper include file with some conveniente functions.
Franz Glasner <fzglas.hg@dom66.de>
parents:
558
diff
changeset
|
1094 varvalue = Py_NewRef(Py_None); |
|
558
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1095 } |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1096 else { |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1097 if (PySequence_Contains(filters, sstate->EMPTY_FILTER) == 1) { |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1098 PyErr_Clear(); |
|
559
bb160a1e67d7
A simple helper include file with some conveniente functions.
Franz Glasner <fzglas.hg@dom66.de>
parents:
558
diff
changeset
|
1099 varvalue = Py_NewRef(sstate->EMPTY_STR); |
|
558
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1100 } |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1101 else { |
|
566
dc2e2384c8c7
fast_interpolate_variables(): allow omission of the cache variable.
Franz Glasner <fzglas.hg@dom66.de>
parents:
565
diff
changeset
|
1102 if (cache != NULL) { |
|
dc2e2384c8c7
fast_interpolate_variables(): allow omission of the cache variable.
Franz Glasner <fzglas.hg@dom66.de>
parents:
565
diff
changeset
|
1103 PyErr_Fetch(&err_type, &err_value, &err_tb); |
|
dc2e2384c8c7
fast_interpolate_variables(): allow omission of the cache variable.
Franz Glasner <fzglas.hg@dom66.de>
parents:
565
diff
changeset
|
1104 /* this does NOT steal */ |
|
dc2e2384c8c7
fast_interpolate_variables(): allow omission of the cache variable.
Franz Glasner <fzglas.hg@dom66.de>
parents:
565
diff
changeset
|
1105 PyDict_SetItem(cache, s, sstate->MISSING); |
|
dc2e2384c8c7
fast_interpolate_variables(): allow omission of the cache variable.
Franz Glasner <fzglas.hg@dom66.de>
parents:
565
diff
changeset
|
1106 PyErr_Restore(err_type, err_value, err_tb); |
|
dc2e2384c8c7
fast_interpolate_variables(): allow omission of the cache variable.
Franz Glasner <fzglas.hg@dom66.de>
parents:
565
diff
changeset
|
1107 } |
|
558
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1108 goto error; |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1109 } |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1110 } |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1111 } |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1112 else { |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1113 /* other exception/error than KeyError */ |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1114 goto error; |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1115 } |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1116 } |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1117 |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1118 if (!cacheable) { |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1119 use_cache = 0; |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1120 } |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1121 |
|
559
bb160a1e67d7
A simple helper include file with some conveniente functions.
Franz Glasner <fzglas.hg@dom66.de>
parents:
558
diff
changeset
|
1122 py_clear_ref(&varname); |
|
558
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1123 |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1124 tmp = PyObject_CallMethod( |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1125 config, "_apply_filters", "OO", filters, varvalue); |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1126 if (tmp == NULL) { |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1127 goto error; |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1128 } |
|
560
81238ea2dbe3
Implement and use more helper functions.
Franz Glasner <fzglas.hg@dom66.de>
parents:
559
diff
changeset
|
1129 py_transfer_owned(&varvalue, &tmp); |
|
558
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1130 |
|
559
bb160a1e67d7
A simple helper include file with some conveniente functions.
Franz Glasner <fzglas.hg@dom66.de>
parents:
558
diff
changeset
|
1131 py_clear_ref(&filters); |
|
558
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1132 |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1133 rest = end + 2; /* 2 == len(ENDTOK) */ |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1134 |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1135 /* |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1136 * Dont apply and type conversions to the variable value if |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1137 * the whole `s` is just one expansion |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1138 */ |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1139 if ((start == 0) && (rest == s_len)) { |
|
560
81238ea2dbe3
Implement and use more helper functions.
Franz Glasner <fzglas.hg@dom66.de>
parents:
559
diff
changeset
|
1140 py_transfer_owned(&result, &varvalue); |
|
558
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1141 goto success; /* break out early */ |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1142 } |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1143 |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1144 /* Handle None like the empty string */ |
|
559
bb160a1e67d7
A simple helper include file with some conveniente functions.
Franz Glasner <fzglas.hg@dom66.de>
parents:
558
diff
changeset
|
1145 if (py_object_isnot(varvalue, Py_None)) { |
|
558
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1146 tmp = PyObject_Str(varvalue); |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1147 if (tmp == NULL) { |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1148 goto error; |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1149 } |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1150 if (PyList_Append(result, tmp) < 0) { |
|
559
bb160a1e67d7
A simple helper include file with some conveniente functions.
Franz Glasner <fzglas.hg@dom66.de>
parents:
558
diff
changeset
|
1151 py_clear_ref(&tmp); |
|
558
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1152 goto error; |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1153 } |
|
559
bb160a1e67d7
A simple helper include file with some conveniente functions.
Franz Glasner <fzglas.hg@dom66.de>
parents:
558
diff
changeset
|
1154 py_clear_ref(&tmp); |
|
558
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1155 } |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1156 |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1157 /* don't re-evaluate because `self.getvar_s()` expands already */ |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1158 start = PyUnicode_Find(s, sstate->STARTTOK, rest, s_len, 1); |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1159 if (start == -2) { |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1160 goto error; |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1161 } |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1162 } |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1163 |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1164 if (rest < s_len) { |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1165 tmp = PyUnicode_Substring(s, rest, s_len); |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1166 if (tmp == NULL) { |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1167 goto error; |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1168 } |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1169 if (PyList_Append(result, tmp) < 0) { |
|
559
bb160a1e67d7
A simple helper include file with some conveniente functions.
Franz Glasner <fzglas.hg@dom66.de>
parents:
558
diff
changeset
|
1170 py_clear_ref(&tmp); |
|
558
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1171 goto error; |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1172 } |
|
560
81238ea2dbe3
Implement and use more helper functions.
Franz Glasner <fzglas.hg@dom66.de>
parents:
559
diff
changeset
|
1173 py_clear_ref(&tmp); |
|
558
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1174 } |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1175 |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1176 tmp = PyUnicode_Join(sstate->EMPTY_STR, result); |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1177 if (tmp == NULL) { |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1178 goto error; |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1179 } |
|
560
81238ea2dbe3
Implement and use more helper functions.
Franz Glasner <fzglas.hg@dom66.de>
parents:
559
diff
changeset
|
1180 py_transfer_owned(&result, &tmp); |
|
558
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1181 |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1182 success: |
|
566
dc2e2384c8c7
fast_interpolate_variables(): allow omission of the cache variable.
Franz Glasner <fzglas.hg@dom66.de>
parents:
565
diff
changeset
|
1183 if (use_cache && (cache != NULL)) { |
|
558
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1184 if (PyDict_SetItem(cache, s, result) < 0) { |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1185 PyErr_Clear(); /* clear any cache-related error */ |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1186 } |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1187 } |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1188 return result; |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1189 |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1190 error: |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1191 Py_XDECREF(varname); |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1192 Py_XDECREF(varvalue); |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1193 Py_XDECREF(filters); |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1194 Py_XDECREF(result); |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1195 return NULL; |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1196 } |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1197 |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1198 |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1199 static |
|
7a3c311991d7
An alternate C-implementation of fast_interpolate_variables() that uses the algorithm of the pure-Python implementation
Franz Glasner <fzglas.hg@dom66.de>
parents:
557
diff
changeset
|
1200 PyObject * |
|
603
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1201 _fast_getvarl(PyObject *config, PyObject *path, PyObject *namespace, PyObject *default_, struct speedups_state *sstate) |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1202 { |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1203 PyObject *varvalue; |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1204 PyObject *lookupfn = NULL; |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1205 |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1206 if ((namespace == NULL) || PyObject_Not(namespace)) { |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1207 lookupfn = PyObject_GetAttrString(config, "_lookupvar"); |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1208 if (lookupfn == NULL) { |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1209 goto error; |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1210 } |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1211 } |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1212 else { |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1213 int ns_equals_ref = PyUnicode_Compare(namespace, sstate->REF_NAMESPACE); |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1214 if ((ns_equals_ref < 0) && PyErr_Occurred()) { |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1215 return NULL; |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1216 } |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1217 if (ns_equals_ref == 0) { |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1218 lookupfn = PyObject_GetAttrString(config, "_lookupref"); |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1219 if (lookupfn == NULL) { |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1220 goto error; |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1221 } |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1222 } |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1223 else { |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1224 /* lookup_varns */ |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1225 /* this is borrowed */ |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1226 PyObject *cfg_vars_mod = PyImport_AddModule("configmix.variables"); |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1227 if (cfg_vars_mod == NULL) { |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1228 goto error; |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1229 } |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1230 lookupfn = PyObject_CallMethod(cfg_vars_mod, "lookup_varns", "O", namespace); |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1231 if (lookupfn == NULL) { |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1232 goto handle_possible_keyerror; |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1233 } |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1234 } |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1235 } |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1236 varvalue = PyObject_CallObject(lookupfn, path); |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1237 if (varvalue == NULL) { |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1238 goto handle_possible_keyerror; |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1239 } |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1240 Py_DECREF(lookupfn); |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1241 return varvalue; |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1242 |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1243 handle_possible_keyerror: |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1244 if (PyErr_ExceptionMatches(PyExc_KeyError)) { |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1245 if ((default_ == NULL) || py_object_is(default_, sstate->MARKER)) { |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1246 PyErr_Format(PyExc_KeyError, "Variable %R not found", path); |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1247 /* fall through */ |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1248 } |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1249 else { |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1250 PyErr_Clear(); |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1251 Py_XDECREF(lookupfn); |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1252 return Py_NewRef(default_); |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1253 } |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1254 } |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1255 /* fall through */ |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1256 error: |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1257 Py_XDECREF(lookupfn); |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1258 return NULL; |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1259 } |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1260 |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1261 |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1262 static |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1263 PyObject * |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1264 fast_getvarl(PyObject *self, PyObject *args, PyObject *kwds) |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1265 { |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1266 static char *kwlist[] = {"config", "path", "namespace", "default", NULL}; |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1267 PyObject *path; |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1268 PyObject *config; |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1269 PyObject *namespace = NULL; |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1270 PyObject *default_ = NULL; |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1271 |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1272 struct speedups_state *sstate; |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1273 |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1274 if (!PyArg_ParseTupleAndKeywords(args, kwds, "OO!|$OO", kwlist, &config, &PyTuple_Type, &path, &namespace, &default_)) { |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1275 |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1276 return NULL; |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1277 } |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1278 sstate = PyModule_GetState(self); |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1279 if (sstate == NULL) { |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1280 PyErr_SetString(PyExc_RuntimeError, "no module state available"); |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1281 return NULL; |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1282 } |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1283 return _fast_getvarl(config, path, namespace, default_, sstate); |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1284 } |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1285 |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1286 |
|
610
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1287 static |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1288 PyObject * |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1289 fast_getvarl_s(PyObject *self, PyObject *args, PyObject *kwds) |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1290 { |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1291 static char *kwlist[] = {"config", "path", "namespace", "default", NULL}; |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1292 |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1293 PyObject *config; |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1294 PyObject *path; |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1295 PyObject *namespace = NULL; |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1296 PyObject *default_ = NULL; |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1297 |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1298 PyObject *res = NULL; |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1299 PyObject *tmp; |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1300 |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1301 struct speedups_state *sstate; |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1302 |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1303 if (!PyArg_ParseTupleAndKeywords(args, kwds, "OO!|$OO", kwlist, &config, &PyTuple_Type, &path, &namespace, &default_)) { |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1304 |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1305 return NULL; |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1306 } |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1307 sstate = PyModule_GetState(self); |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1308 if (sstate == NULL) { |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1309 PyErr_SetString(PyExc_RuntimeError, "no module state available"); |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1310 return NULL; |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1311 } |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1312 |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1313 tmp = _fast_getvarl(config, path, namespace, NULL, sstate); |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1314 if (tmp == NULL) { |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1315 goto handle_possible_keyerror; |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1316 } |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1317 res = PyObject_CallMethod(config, "substitute_variables_in_obj", "O", tmp); |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1318 if (res == NULL) { |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1319 py_clear_ref(&tmp); |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1320 goto handle_possible_keyerror; |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1321 } |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1322 py_clear_ref(&tmp); |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1323 return res; |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1324 |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1325 handle_possible_keyerror: |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1326 if (PyErr_ExceptionMatches(PyExc_KeyError)) { |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1327 if ((default_ == NULL) || py_object_is(default_, sstate->MARKER)) { |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1328 /* fall through */ |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1329 } |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1330 else { |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1331 PyErr_Clear(); |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1332 return Py_NewRef(default_); |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1333 } |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1334 } |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1335 /* fall through */ |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1336 |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1337 error: |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1338 return NULL; |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1339 } |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1340 |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1341 |
|
603
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1342 /** |
| 605 | 1343 * Combination of py_getvar_s and _py_getvar_s_with_cache_info |
|
603
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1344 */ |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1345 static |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1346 PyObject * |
|
611
db5a20f18030
Provide an internal version of fast_split_ns() to use an already module state available
Franz Glasner <fzglas.hg@dom66.de>
parents:
610
diff
changeset
|
1347 _fast_getvar_s(PyObject *config, PyObject *varname, PyObject *default_, struct speedups_state *sstate, int *cacheable) |
|
603
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1348 { |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1349 PyObject *varname_b; /* always borrowed */ |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1350 PyObject *namespace_b; /* always borrowed */ |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1351 PyObject *splitted = NULL; |
|
610
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1352 PyObject *res; |
|
603
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1353 PyObject *tmp1; |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1354 PyObject *tmp2; |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1355 |
|
611
db5a20f18030
Provide an internal version of fast_split_ns() to use an already module state available
Franz Glasner <fzglas.hg@dom66.de>
parents:
610
diff
changeset
|
1356 splitted = _fast_split_ns(varname, NULL, sstate); |
|
603
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1357 if (splitted == NULL) { |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1358 goto error; |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1359 } |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1360 namespace_b = PyTuple_GetItem(splitted, 0); /* borrowed */ |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1361 varname_b = PyTuple_GetItem(splitted, 1); /* borrowed */ |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1362 |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1363 if (PyObject_Not(namespace_b)) { |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1364 tmp1 = _fast_pathstr2path(varname_b, NULL, sstate); |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1365 if (tmp1 == NULL) { |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1366 goto error; |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1367 } |
|
622
8d2d5d54ff3c
FIX: Handle KeyErrors in fast_getvar_s() properly within its function frame
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
618
diff
changeset
|
1368 tmp2 = _fast_getvarl(config, tmp1, NULL, NULL, sstate); |
|
603
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1369 if (tmp2 == NULL) { |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1370 py_clear_ref(&tmp1); |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1371 goto handle_possible_keyerror; |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1372 } |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1373 py_clear_ref(&tmp1); |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1374 res = PyObject_CallMethod(config, "substitute_variables_in_obj", "O", tmp2); |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1375 if (res == NULL) { |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1376 py_clear_ref(&tmp2); |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1377 goto handle_possible_keyerror; |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1378 } |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1379 py_clear_ref(&tmp2); |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1380 /* no namespace -> cacheable */ |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1381 *cacheable = 1; |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1382 } |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1383 else { |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1384 tmp1 = PyTuple_New(1); |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1385 if (tmp1 == NULL) { |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1386 goto error; |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1387 } |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1388 PyTuple_SetItem(tmp1, 0, Py_NewRef(varname_b)); |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1389 tmp2 = _fast_getvarl(config, tmp1, namespace_b, NULL, sstate); |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1390 if (tmp2 == NULL) { |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1391 py_clear_ref(&tmp1); |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1392 goto handle_possible_keyerror; |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1393 } |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1394 py_clear_ref(&tmp1); |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1395 res = PyObject_CallMethod(config, "substitute_variables_in_obj", "O", tmp2); |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1396 if (res == NULL) { |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1397 py_clear_ref(&tmp2); |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1398 goto handle_possible_keyerror; |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1399 } |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1400 py_clear_ref(&tmp2); |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1401 /* results from namespaced lookups are currently not cacheable */ |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1402 *cacheable = 0; |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1403 } |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1404 |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1405 /* free splitted last because of using borrowed refs from it */ |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1406 Py_DECREF(splitted); |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1407 return res; |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1408 |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1409 handle_possible_keyerror: |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1410 if (PyErr_ExceptionMatches(PyExc_KeyError)) { |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1411 if ((default_ == NULL) || py_object_is(default_, sstate->MARKER)) { |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1412 /* fall through */ |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1413 } |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1414 else { |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1415 PyErr_Clear(); |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1416 Py_XDECREF(splitted); |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1417 return Py_NewRef(default_); |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1418 } |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1419 } |
|
610
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1420 /* fall through */ |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1421 |
|
603
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1422 error: |
|
610
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1423 Py_XDECREF(splitted); |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1424 return NULL; |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1425 } |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1426 |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1427 |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1428 static |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1429 PyObject * |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1430 fast_getvar(PyObject *self, PyObject *args) |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1431 { |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1432 PyObject *config; |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1433 PyObject *varname; |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1434 PyObject *default_; |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1435 |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1436 PyObject *varname_b; /* always borrowed */ |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1437 PyObject *namespace_b; /* always borrowed */ |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1438 PyObject *splitted = NULL; |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1439 PyObject *res; |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1440 PyObject *tmp1; |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1441 struct speedups_state *sstate; |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1442 |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1443 if (!PyArg_UnpackTuple(args, "config", 3, 3, &config, &varname, &default_)) { |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1444 return NULL; |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1445 } |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1446 |
|
611
db5a20f18030
Provide an internal version of fast_split_ns() to use an already module state available
Franz Glasner <fzglas.hg@dom66.de>
parents:
610
diff
changeset
|
1447 sstate = PyModule_GetState(self); |
|
db5a20f18030
Provide an internal version of fast_split_ns() to use an already module state available
Franz Glasner <fzglas.hg@dom66.de>
parents:
610
diff
changeset
|
1448 if (sstate == NULL) { |
|
db5a20f18030
Provide an internal version of fast_split_ns() to use an already module state available
Franz Glasner <fzglas.hg@dom66.de>
parents:
610
diff
changeset
|
1449 PyErr_SetString(PyExc_RuntimeError, "no module state available"); |
|
db5a20f18030
Provide an internal version of fast_split_ns() to use an already module state available
Franz Glasner <fzglas.hg@dom66.de>
parents:
610
diff
changeset
|
1450 return NULL; |
|
db5a20f18030
Provide an internal version of fast_split_ns() to use an already module state available
Franz Glasner <fzglas.hg@dom66.de>
parents:
610
diff
changeset
|
1451 } |
|
db5a20f18030
Provide an internal version of fast_split_ns() to use an already module state available
Franz Glasner <fzglas.hg@dom66.de>
parents:
610
diff
changeset
|
1452 |
|
db5a20f18030
Provide an internal version of fast_split_ns() to use an already module state available
Franz Glasner <fzglas.hg@dom66.de>
parents:
610
diff
changeset
|
1453 splitted = _fast_split_ns(varname, NULL, sstate); |
|
610
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1454 if (splitted == NULL) { |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1455 goto error; |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1456 } |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1457 namespace_b = PyTuple_GetItem(splitted, 0); /* borrowed */ |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1458 varname_b = PyTuple_GetItem(splitted, 1); /* borrowed */ |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1459 |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1460 if (PyObject_Not(namespace_b)) { |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1461 tmp1 = _fast_pathstr2path(varname_b, NULL, sstate); |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1462 if (tmp1 == NULL) { |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1463 goto error; |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1464 } |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1465 res = _fast_getvarl(config, tmp1, NULL, default_, sstate); |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1466 if (res == NULL) { |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1467 py_clear_ref(&tmp1); |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1468 goto error; |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1469 } |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1470 py_clear_ref(&tmp1); |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1471 } |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1472 else { |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1473 tmp1 = PyTuple_New(1); |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1474 if (tmp1 == NULL) { |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1475 goto error; |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1476 } |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1477 PyTuple_SetItem(tmp1, 0, Py_NewRef(varname_b)); |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1478 res = _fast_getvarl(config, tmp1, namespace_b, default_, sstate); |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1479 if (res == NULL) {tmp1 = _fast_pathstr2path(varname_b, NULL, sstate); |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1480 if (tmp1 == NULL) { |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1481 goto error; |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1482 } |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1483 py_clear_ref(&tmp1); |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1484 goto error; |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1485 } |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1486 py_clear_ref(&tmp1); |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1487 } |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1488 Py_DECREF(splitted); |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1489 return res; |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1490 |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1491 error: |
|
603
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1492 Py_XDECREF(splitted); |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1493 return NULL; |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1494 } |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1495 |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1496 |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1497 static |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1498 PyObject * |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1499 fast_getvar_s(PyObject *self, PyObject *args) |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1500 { |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1501 PyObject *config; |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1502 PyObject *varname; |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1503 PyObject *default_; |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1504 int cacheable; |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1505 struct speedups_state *sstate; |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1506 |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1507 if (!PyArg_UnpackTuple(args, "config", 3, 3, &config, &varname, &default_)) { |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1508 return NULL; |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1509 } |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1510 |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1511 sstate = PyModule_GetState(self); |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1512 if (sstate == NULL) { |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1513 PyErr_SetString(PyExc_RuntimeError, "no module state available"); |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1514 return NULL; |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1515 } |
|
611
db5a20f18030
Provide an internal version of fast_split_ns() to use an already module state available
Franz Glasner <fzglas.hg@dom66.de>
parents:
610
diff
changeset
|
1516 return _fast_getvar_s(config, varname, default_, sstate, &cacheable); |
|
603
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1517 } |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1518 |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1519 |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1520 static |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1521 PyObject * |
|
554
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1522 sync_MISSING(PyObject *self, PyObject *missing) |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1523 { |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1524 struct speedups_state *sstate; |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1525 |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1526 sstate = PyModule_GetState(self); |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1527 if (sstate == NULL) { |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1528 PyErr_SetString(PyExc_RuntimeError, "no module state available"); |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1529 return NULL; |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1530 } |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1531 if (sstate->MISSING != NULL) { |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1532 PyErr_SetString(PyExc_RuntimeError, "_MISSING already set"); |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1533 return NULL; |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1534 } |
|
559
bb160a1e67d7
A simple helper include file with some conveniente functions.
Franz Glasner <fzglas.hg@dom66.de>
parents:
558
diff
changeset
|
1535 sstate->MISSING = Py_NewRef(missing); |
|
554
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1536 Py_RETURN_NONE; |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1537 } |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1538 |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1539 |
|
603
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1540 static |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1541 PyObject * |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1542 sync_MARKER(PyObject *self, PyObject *marker) |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1543 { |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1544 struct speedups_state *sstate; |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1545 |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1546 sstate = PyModule_GetState(self); |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1547 if (sstate == NULL) { |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1548 PyErr_SetString(PyExc_RuntimeError, "no module state available"); |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1549 return NULL; |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1550 } |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1551 if (sstate->MARKER != NULL) { |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1552 PyErr_SetString(PyExc_RuntimeError, "_MARKER already set"); |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1553 return NULL; |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1554 } |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1555 sstate->MARKER = Py_NewRef(marker); |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1556 Py_RETURN_NONE; |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1557 } |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1558 |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1559 |
|
542
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1560 static struct PyMethodDef speedups_methods[] = { |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1561 {"fast_unquote", fast_unquote, METH_O, PyDoc_STR("C-implementation of configmix.unquote")}, |
|
550
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
549
diff
changeset
|
1562 {"fast_quote", fast_quote, METH_O, PyDoc_STR("C-implementation of configmix.quote")}, |
|
542
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1563 {"fast_pathstr2path", fast_pathstr2path, METH_O, PyDoc_STR("C-implementation of configmix.pathstr2path")}, |
|
552
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
1564 {"_fast_split_filters", fast_split_filters, METH_O, PyDoc_STR("C-implementation of configmix.config._split_filters")}, |
|
543
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
1565 {"_fast_split_ns", fast_split_ns, METH_O, PyDoc_STR("C-implementation of configmix.config._split_ns")}, |
|
554
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1566 {"_fast_interpolate_variables", fast_interpolate_variables, METH_VARARGS, PyDoc_STR("C-implementation of configmix.config.Configuration.interpolate_variables")}, |
|
603
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1567 {"_fast_getvarl", (PyCFunction)fast_getvarl, METH_VARARGS | METH_KEYWORDS, PyDoc_STR("C-Implementation of configmix.config.Configuration.getvarl")}, |
|
610
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1568 {"_fast_getvarl_s", (PyCFunction)fast_getvarl_s, METH_VARARGS | METH_KEYWORDS, PyDoc_STR("C-Implementation of configmix.config.Configuration.getvarl_s")}, |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1569 {"_fast_getvar", fast_getvar, METH_VARARGS, PyDoc_STR("C-Implementation of configmix.config.Configuration.getvar")}, |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
609
diff
changeset
|
1570 {"_fast_getvar_s", fast_getvar_s, METH_VARARGS, PyDoc_STR("C-Implementation of configmix.config.Configuration.getvar_s")}, |
|
554
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1571 {"_sync_MISSING", sync_MISSING, METH_O, PyDoc_STR("Internal function to easily sync the _MISSING object with configmix.config")}, |
|
603
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1572 {"_sync_MARKER", sync_MARKER, METH_O, PyDoc_STR("Internal function to easily sync the _MARKER object with configmix.config")}, |
|
542
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1573 {NULL, NULL, 0, NULL} |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1574 }; |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1575 |
|
547
1cbe8b0f2b78
Put the value of Py_LIMITED_API into the module dict when the C-extension is compiled against the stable API
Franz Glasner <fzglas.hg@dom66.de>
parents:
545
diff
changeset
|
1576 #define STRINGIFY(s) #s |
|
1cbe8b0f2b78
Put the value of Py_LIMITED_API into the module dict when the C-extension is compiled against the stable API
Franz Glasner <fzglas.hg@dom66.de>
parents:
545
diff
changeset
|
1577 #define XSTRINGIFY(s) STRINGIFY(s) |
|
1cbe8b0f2b78
Put the value of Py_LIMITED_API into the module dict when the C-extension is compiled against the stable API
Franz Glasner <fzglas.hg@dom66.de>
parents:
545
diff
changeset
|
1578 |
|
542
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1579 |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1580 static |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1581 int |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1582 speedups_exec(PyObject *module) |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1583 { |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1584 struct speedups_state *sstate = PyModule_GetState(module); |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1585 |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1586 if (sstate == NULL) { |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1587 PyErr_SetString(PyExc_ImportError, "no module state available yet"); |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1588 return -1; |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1589 } |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1590 |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1591 PyModule_AddStringConstant(module, "__release__", release); |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1592 PyModule_AddStringConstant(module, "__date__", date); |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1593 PyModule_AddStringConstant(module, "__author__", "Franz Glasner"); |
|
547
1cbe8b0f2b78
Put the value of Py_LIMITED_API into the module dict when the C-extension is compiled against the stable API
Franz Glasner <fzglas.hg@dom66.de>
parents:
545
diff
changeset
|
1594 #if defined(Py_LIMITED_API) |
|
1cbe8b0f2b78
Put the value of Py_LIMITED_API into the module dict when the C-extension is compiled against the stable API
Franz Glasner <fzglas.hg@dom66.de>
parents:
545
diff
changeset
|
1595 PyModule_AddStringConstant(module, "Py_LIMITED_API", XSTRINGIFY(Py_LIMITED_API)); |
|
1cbe8b0f2b78
Put the value of Py_LIMITED_API into the module dict when the C-extension is compiled against the stable API
Franz Glasner <fzglas.hg@dom66.de>
parents:
545
diff
changeset
|
1596 #endif |
|
542
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1597 |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1598 sstate->DOT = PyUnicode_FromStringAndSize(".", 1); |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1599 if (sstate->DOT == NULL) { |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1600 return -1; |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1601 } |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1602 PyUnicode_InternInPlace(&(sstate->DOT)); |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1603 |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1604 sstate->QUOTE = PyUnicode_FromStringAndSize("%", 1); |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1605 if (sstate->QUOTE == NULL) { |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1606 return -1; |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1607 } |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1608 PyUnicode_InternInPlace(&(sstate->QUOTE)); |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1609 |
|
543
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
1610 sstate->NS_SEPARATOR = PyUnicode_FromStringAndSize(":", 1); |
|
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
1611 if (sstate->NS_SEPARATOR == NULL) { |
|
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
1612 return -1; |
|
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
1613 } |
|
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
1614 PyUnicode_InternInPlace(&(sstate->NS_SEPARATOR)); |
|
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
1615 |
|
552
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
1616 sstate->FILTER_SEPARATOR = PyUnicode_FromStringAndSize("|", 1); |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
1617 if (sstate->FILTER_SEPARATOR == NULL) { |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
1618 return -1; |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
1619 } |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
1620 PyUnicode_InternInPlace(&(sstate->FILTER_SEPARATOR)); |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
1621 |
|
554
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1622 sstate->EMPTY_FILTER = PyUnicode_FromStringAndSize("Empty", 5); |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1623 if (sstate->EMPTY_FILTER == NULL) { |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1624 return -1; |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1625 } |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1626 PyUnicode_InternInPlace(&(sstate->EMPTY_FILTER)); |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1627 |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1628 sstate->NONE_FILTER = PyUnicode_FromStringAndSize("None", 4); |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1629 if (sstate->NONE_FILTER == NULL) { |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1630 return -1; |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1631 } |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1632 PyUnicode_InternInPlace(&(sstate->NONE_FILTER)); |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1633 |
|
542
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1634 sstate->EMPTY_STR = PyUnicode_FromStringAndSize("", 0); |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1635 if (sstate->EMPTY_STR == NULL) { |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1636 return -1; |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1637 } |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1638 PyUnicode_InternInPlace(&(sstate->EMPTY_STR)); |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1639 |
|
550
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
549
diff
changeset
|
1640 sstate->QUOTE_MAP = Py_BuildValue( |
|
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
549
diff
changeset
|
1641 "{IsIsIsIsIsIsIsIsIsIsIs}", |
|
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
549
diff
changeset
|
1642 0x25, "%x25", /* QUOTE: % */ |
|
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
549
diff
changeset
|
1643 0x2e, "%x2e", /* DOT: . */ |
|
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
549
diff
changeset
|
1644 0x3a, "%x3a", /* NS_SEPARATOR: : */ |
|
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
549
diff
changeset
|
1645 0x23, "%x23", /* COMMENT/anchor: # */ |
|
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
549
diff
changeset
|
1646 0x7c, "%x7c", /* FILTER_SEPARATOR: | */ |
|
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
549
diff
changeset
|
1647 0x22, "%x22", |
|
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
549
diff
changeset
|
1648 0x27, "%x27", |
|
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
549
diff
changeset
|
1649 0x7b, "%x7b", |
|
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
549
diff
changeset
|
1650 0x7d, "%x7d", |
|
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
549
diff
changeset
|
1651 0x5b, "%x5b", |
|
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
549
diff
changeset
|
1652 0x5d, "%x5d"); |
|
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
549
diff
changeset
|
1653 if (sstate->QUOTE_MAP == NULL) { |
|
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
549
diff
changeset
|
1654 return -1; |
|
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
549
diff
changeset
|
1655 } |
|
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
549
diff
changeset
|
1656 |
|
554
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1657 sstate->STARTTOK = PyUnicode_FromStringAndSize("{{", 2); |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1658 if (sstate->STARTTOK == NULL) { |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1659 return -1; |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1660 } |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1661 PyUnicode_InternInPlace(&(sstate->STARTTOK)); |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1662 |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1663 sstate->ENDTOK = PyUnicode_FromStringAndSize("}}", 2); |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1664 if (sstate->ENDTOK == NULL) { |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1665 return -1; |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1666 } |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1667 PyUnicode_InternInPlace(&(sstate->ENDTOK)); |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1668 |
|
603
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1669 sstate->REF_NAMESPACE = PyUnicode_FromStringAndSize("ref", 3); |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1670 if (sstate->REF_NAMESPACE == NULL) { |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1671 return -1; |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1672 } |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1673 PyUnicode_InternInPlace(&(sstate->REF_NAMESPACE)); |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1674 |
|
639
999cfca55d25
FIX: {{::DEL::}} has 11 chars instead of 3
Franz Glasner <fzglas.hg@dom66.de>
parents:
637
diff
changeset
|
1675 sstate->DEL_VALUE = PyUnicode_FromStringAndSize("{{::DEL::}}", 11); |
|
637
4499e9b4855d
The ``{{::DEL::}}`` is not subject to interpolation any more.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
630
diff
changeset
|
1676 if (sstate->DEL_VALUE == NULL) { |
|
4499e9b4855d
The ``{{::DEL::}}`` is not subject to interpolation any more.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
630
diff
changeset
|
1677 return -1; |
|
4499e9b4855d
The ``{{::DEL::}}`` is not subject to interpolation any more.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
630
diff
changeset
|
1678 } |
|
4499e9b4855d
The ``{{::DEL::}}`` is not subject to interpolation any more.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
630
diff
changeset
|
1679 PyUnicode_InternInPlace(&(sstate->DEL_VALUE)); |
|
4499e9b4855d
The ``{{::DEL::}}`` is not subject to interpolation any more.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
630
diff
changeset
|
1680 |
|
542
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1681 return 0; |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1682 } |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1683 |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1684 |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1685 static |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1686 int |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1687 speeeupds_traverse(PyObject *module, visitproc visit, void *arg) |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1688 { |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1689 struct speedups_state *sstate = PyModule_GetState(module); |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1690 |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1691 if (sstate != NULL) { |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1692 Py_VISIT(sstate->DOT); |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1693 Py_VISIT(sstate->QUOTE); |
|
543
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
1694 Py_VISIT(sstate->NS_SEPARATOR); |
|
552
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
1695 Py_VISIT(sstate->FILTER_SEPARATOR); |
|
554
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1696 Py_VISIT(sstate->EMPTY_FILTER); |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1697 Py_VISIT(sstate->NONE_FILTER); |
|
542
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1698 Py_VISIT(sstate->EMPTY_STR); |
|
550
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
549
diff
changeset
|
1699 Py_VISIT(sstate->QUOTE_MAP); |
|
554
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1700 Py_VISIT(sstate->MISSING); |
|
603
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1701 Py_VISIT(sstate->MARKER); |
|
554
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1702 Py_VISIT(sstate->STARTTOK); |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1703 Py_VISIT(sstate->ENDTOK); |
|
603
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1704 Py_VISIT(sstate->REF_NAMESPACE); |
|
637
4499e9b4855d
The ``{{::DEL::}}`` is not subject to interpolation any more.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
630
diff
changeset
|
1705 Py_VISIT(sstate->DEL_VALUE); |
|
542
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1706 } |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1707 return 0; |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1708 } |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1709 |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1710 |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1711 static |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1712 int |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1713 speedups_clear(PyObject *module) |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1714 { |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1715 struct speedups_state *sstate = PyModule_GetState(module); |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1716 |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1717 if (sstate != NULL) { |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1718 Py_CLEAR(sstate->DOT); |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1719 Py_CLEAR(sstate->QUOTE); |
|
543
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
1720 Py_CLEAR(sstate->NS_SEPARATOR); |
|
552
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
1721 Py_CLEAR(sstate->FILTER_SEPARATOR); |
|
554
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1722 Py_CLEAR(sstate->EMPTY_FILTER); |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1723 Py_CLEAR(sstate->NONE_FILTER); |
|
542
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1724 Py_CLEAR(sstate->EMPTY_STR); |
|
550
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
549
diff
changeset
|
1725 Py_CLEAR(sstate->QUOTE_MAP); |
|
554
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1726 Py_CLEAR(sstate->MISSING); |
|
603
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1727 Py_CLEAR(sstate->MARKER); |
|
554
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1728 Py_CLEAR(sstate->STARTTOK); |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1729 Py_CLEAR(sstate->ENDTOK); |
|
603
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
602
diff
changeset
|
1730 Py_CLEAR(sstate->REF_NAMESPACE); |
|
637
4499e9b4855d
The ``{{::DEL::}}`` is not subject to interpolation any more.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
630
diff
changeset
|
1731 Py_CLEAR(sstate->DEL_VALUE); |
|
542
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1732 } |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1733 return 0; |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1734 } |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1735 |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1736 |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1737 static struct PyModuleDef_Slot speedups_slots[] = { |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1738 {Py_mod_exec, speedups_exec}, |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1739 {0, NULL} |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1740 }; |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1741 |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1742 |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1743 static struct PyModuleDef speedups_def = { |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1744 PyModuleDef_HEAD_INIT, /* m_base */ |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1745 "_speedups", /* m_name (relative) */ |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1746 PyDoc_STR("Speedups for configmix"), /* m_doc */ |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1747 sizeof(struct speedups_state), /* m_size */ |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1748 speedups_methods, /* m_methods */ |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1749 speedups_slots, /* m_slots */ |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1750 speeeupds_traverse, /* m_traverse */ |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1751 speedups_clear, /* m_clear */ |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1752 NULL /* m_free */ |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1753 }; |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1754 |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1755 |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1756 PyMODINIT_FUNC |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1757 PyInit__speedups(void) |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1758 { |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1759 /* |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1760 * Use multi-phase extension module initialization (PEP 489). |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1761 * This is Python 3.5+. |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1762 */ |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1763 return PyModuleDef_Init(&speedups_def); |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1764 } |
