Mercurial > public > mercurial-scm > hg-stable
comparison mercurial/diffhelpers.c @ 11363:f50103035c38
diffhelpers.c: Added support for py3k.
This patch adds support for py3k in diffhelpers.c. This is accomplished by
including a header file responsible for abstracting the API differences between
python 2 and python 3.
author | Renato Cunha <renatoc@gmail.com> |
---|---|
date | Tue, 15 Jun 2010 19:49:56 -0300 |
parents | 08a0f04b56bd |
children | 613b8bd2284e |
comparison
equal
deleted
inserted
replaced
11362:f42ef9493fa9 | 11363:f50103035c38 |
---|---|
9 | 9 |
10 #include <Python.h> | 10 #include <Python.h> |
11 #include <stdlib.h> | 11 #include <stdlib.h> |
12 #include <string.h> | 12 #include <string.h> |
13 | 13 |
14 #include "util.h" | |
15 | |
14 static char diffhelpers_doc[] = "Efficient diff parsing"; | 16 static char diffhelpers_doc[] = "Efficient diff parsing"; |
15 static PyObject *diffhelpers_Error; | 17 static PyObject *diffhelpers_Error; |
16 | 18 |
17 | 19 |
18 /* fixup the last lines of a and b when the patch has no newline at eof */ | 20 /* fixup the last lines of a and b when the patch has no newline at eof */ |
19 static void _fix_newline(PyObject *hunk, PyObject *a, PyObject *b) | 21 static void _fix_newline(PyObject *hunk, PyObject *a, PyObject *b) |
20 { | 22 { |
21 int hunksz = PyList_Size(hunk); | 23 int hunksz = PyList_Size(hunk); |
22 PyObject *s = PyList_GET_ITEM(hunk, hunksz-1); | 24 PyObject *s = PyList_GET_ITEM(hunk, hunksz-1); |
23 char *l = PyString_AS_STRING(s); | 25 char *l = PyBytes_AsString(s); |
24 int alen = PyList_Size(a); | 26 int alen = PyList_Size(a); |
25 int blen = PyList_Size(b); | 27 int blen = PyList_Size(b); |
26 char c = l[0]; | 28 char c = l[0]; |
27 PyObject *hline; | 29 PyObject *hline; |
28 int sz = PyString_GET_SIZE(s); | 30 int sz = PyBytes_GET_SIZE(s); |
29 | 31 |
30 if (sz > 1 && l[sz-2] == '\r') | 32 if (sz > 1 && l[sz-2] == '\r') |
31 /* tolerate CRLF in last line */ | 33 /* tolerate CRLF in last line */ |
32 sz -= 1; | 34 sz -= 1; |
33 hline = PyString_FromStringAndSize(l, sz-1); | 35 |
36 hline = PyBytes_FromStringAndSize(l, sz-1); | |
34 | 37 |
35 if (c == ' ' || c == '+') { | 38 if (c == ' ' || c == '+') { |
36 PyObject *rline = PyString_FromStringAndSize(l + 1, sz - 2); | 39 PyObject *rline = PyBytes_FromStringAndSize(l + 1, sz - 2); |
37 PyList_SetItem(b, blen-1, rline); | 40 PyList_SetItem(b, blen-1, rline); |
38 } | 41 } |
39 if (c == ' ' || c == '-') { | 42 if (c == ' ' || c == '-') { |
40 Py_INCREF(hline); | 43 Py_INCREF(hline); |
41 PyList_SetItem(a, alen-1, hline); | 44 PyList_SetItem(a, alen-1, hline); |
80 num = todoa > todob ? todoa : todob; | 83 num = todoa > todob ? todoa : todob; |
81 if (num == 0) | 84 if (num == 0) |
82 break; | 85 break; |
83 for (i = 0; i < num; i++) { | 86 for (i = 0; i < num; i++) { |
84 x = PyFile_GetLine(fp, 0); | 87 x = PyFile_GetLine(fp, 0); |
85 s = PyString_AS_STRING(x); | 88 s = PyBytes_AsString(x); |
86 c = *s; | 89 c = *s; |
87 if (strcmp(s, "\\ No newline at end of file\n") == 0) { | 90 if (strcmp(s, "\\ No newline at end of file\n") == 0) { |
88 _fix_newline(hunk, a, b); | 91 _fix_newline(hunk, a, b); |
89 continue; | 92 continue; |
90 } | 93 } |
91 if (c == '\n') { | 94 if (c == '\n') { |
92 /* Some patches may be missing the control char | 95 /* Some patches may be missing the control char |
93 * on empty lines. Supply a leading space. */ | 96 * on empty lines. Supply a leading space. */ |
94 Py_DECREF(x); | 97 Py_DECREF(x); |
95 x = PyString_FromString(" \n"); | 98 x = PyBytes_FromString(" \n"); |
96 } | 99 } |
97 PyList_Append(hunk, x); | 100 PyList_Append(hunk, x); |
98 if (c == '+') { | 101 if (c == '+') { |
99 l = PyString_FromString(s + 1); | 102 l = PyBytes_FromString(s + 1); |
100 PyList_Append(b, l); | 103 PyList_Append(b, l); |
101 Py_DECREF(l); | 104 Py_DECREF(l); |
102 } else if (c == '-') { | 105 } else if (c == '-') { |
103 PyList_Append(a, x); | 106 PyList_Append(a, x); |
104 } else { | 107 } else { |
105 l = PyString_FromString(s + 1); | 108 l = PyBytes_FromString(s + 1); |
106 PyList_Append(b, l); | 109 PyList_Append(b, l); |
107 Py_DECREF(l); | 110 Py_DECREF(l); |
108 PyList_Append(a, x); | 111 PyList_Append(a, x); |
109 } | 112 } |
110 Py_DECREF(x); | 113 Py_DECREF(x); |
134 blen = PyList_Size(b); | 137 blen = PyList_Size(b); |
135 if (alen > blen - bstart) { | 138 if (alen > blen - bstart) { |
136 return Py_BuildValue("l", -1); | 139 return Py_BuildValue("l", -1); |
137 } | 140 } |
138 for (i = 0; i < alen; i++) { | 141 for (i = 0; i < alen; i++) { |
139 sa = PyString_AS_STRING(PyList_GET_ITEM(a, i)); | 142 sa = PyBytes_AsString(PyList_GET_ITEM(a, i)); |
140 sb = PyString_AS_STRING(PyList_GET_ITEM(b, i + bstart)); | 143 sb = PyBytes_AsString(PyList_GET_ITEM(b, i + bstart)); |
141 if (strcmp(sa + 1, sb) != 0) | 144 if (strcmp(sa + 1, sb) != 0) |
142 return Py_BuildValue("l", -1); | 145 return Py_BuildValue("l", -1); |
143 } | 146 } |
144 return Py_BuildValue("l", 0); | 147 return Py_BuildValue("l", 0); |
145 } | 148 } |
149 {"fix_newline", fix_newline, METH_VARARGS, "fixup newline counters\n"}, | 152 {"fix_newline", fix_newline, METH_VARARGS, "fixup newline counters\n"}, |
150 {"testhunk", testhunk, METH_VARARGS, "test lines in a hunk\n"}, | 153 {"testhunk", testhunk, METH_VARARGS, "test lines in a hunk\n"}, |
151 {NULL, NULL} | 154 {NULL, NULL} |
152 }; | 155 }; |
153 | 156 |
157 #ifdef IS_PY3K | |
158 static struct PyModuleDef diffhelpers_module = { | |
159 PyModuleDef_HEAD_INIT, | |
160 "diffhelpers", | |
161 diffhelpers_doc, | |
162 -1, | |
163 methods | |
164 }; | |
165 | |
166 PyMODINIT_FUNC PyInit_diffhelpers(void) | |
167 { | |
168 PyObject *m; | |
169 | |
170 m = PyModule_Create(&diffhelpers_module); | |
171 if (m == NULL) | |
172 return NULL; | |
173 | |
174 diffhelpers_Error = PyErr_NewException("diffhelpers.diffhelpersError", | |
175 NULL, NULL); | |
176 Py_INCREF(diffhelpers_Error); | |
177 PyModule_AddObject(m, "diffhelpersError", diffhelpers_Error); | |
178 | |
179 return m; | |
180 } | |
181 #else | |
154 PyMODINIT_FUNC | 182 PyMODINIT_FUNC |
155 initdiffhelpers(void) | 183 initdiffhelpers(void) |
156 { | 184 { |
157 Py_InitModule3("diffhelpers", methods, diffhelpers_doc); | 185 Py_InitModule3("diffhelpers", methods, diffhelpers_doc); |
158 diffhelpers_Error = PyErr_NewException("diffhelpers.diffhelpersError", | 186 diffhelpers_Error = PyErr_NewException("diffhelpers.diffhelpersError", |
159 NULL, NULL); | 187 NULL, NULL); |
160 } | 188 } |
189 #endif | |
161 | 190 |