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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
f797f798edfb Wording in comment
Franz Glasner <fzglas.hg@dom66.de>
parents: 611
diff changeset
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
3d5ef056134c Comment
Franz Glasner <fzglas.hg@dom66.de>
parents: 555
diff changeset
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
Franz Glasner <fzglas.hg@dom66.de>
parents: 564
diff changeset
182 }
Franz Glasner <fzglas.hg@dom66.de>
parents: 564
diff changeset
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
Franz Glasner <fzglas.hg@dom66.de>
parents: 564
diff changeset
185 }
Franz Glasner <fzglas.hg@dom66.de>
parents: 564
diff changeset
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
Franz Glasner <fzglas.hg@dom66.de>
parents: 564
diff changeset
188 }
Franz Glasner <fzglas.hg@dom66.de>
parents: 564
diff changeset
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
Franz Glasner <fzglas.hg@dom66.de>
parents: 564
diff changeset
191 }
Franz Glasner <fzglas.hg@dom66.de>
parents: 564
diff changeset
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
f75c5b13a1d7 FIX: Memory-leak
Franz Glasner <fzglas.hg@dom66.de>
parents: 561
diff changeset
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
e3a23e9242a0 NULL instead of 0
Franz Glasner <fzglas.hg@dom66.de>
parents: 622
diff changeset
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
f75c5b13a1d7 FIX: Memory-leak
Franz Glasner <fzglas.hg@dom66.de>
parents: 561
diff changeset
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
776dc94b4ef7 Comment
Franz Glasner <fzglas.hg@dom66.de>
parents: 603
diff changeset
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 }