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