Show More
@@ -425,11 +425,55 b' nomem:' | |||||
425 | return result ? result : PyErr_NoMemory(); |
|
425 | return result ? result : PyErr_NoMemory(); | |
426 | } |
|
426 | } | |
427 |
|
427 | |||
|
428 | /* | |||
|
429 | * If allws != 0, remove all whitespace (' ', \t and \r). Otherwise, | |||
|
430 | * reduce whitespace sequences to a single space and trim remaining whitespace | |||
|
431 | * from end of lines. | |||
|
432 | */ | |||
|
433 | static PyObject *fixws(PyObject *self, PyObject *args) | |||
|
434 | { | |||
|
435 | PyObject *s, *result = NULL; | |||
|
436 | char allws, c; | |||
|
437 | const char *r; | |||
|
438 | int i, rlen, wlen = 0; | |||
|
439 | char *w; | |||
|
440 | ||||
|
441 | if (!PyArg_ParseTuple(args, "Sb:fixws", &s, &allws)) | |||
|
442 | return NULL; | |||
|
443 | r = PyBytes_AsString(s); | |||
|
444 | rlen = PyBytes_Size(s); | |||
|
445 | ||||
|
446 | w = (char *)malloc(rlen); | |||
|
447 | if (!w) | |||
|
448 | goto nomem; | |||
|
449 | ||||
|
450 | for (i = 0; i != rlen; i++) { | |||
|
451 | c = r[i]; | |||
|
452 | if (c == ' ' || c == '\t' || c == '\r') { | |||
|
453 | if (!allws && (wlen == 0 || w[wlen - 1] != ' ')) | |||
|
454 | w[wlen++] = ' '; | |||
|
455 | } else if (c == '\n' && !allws | |||
|
456 | && wlen > 0 && w[wlen - 1] == ' ') { | |||
|
457 | w[wlen - 1] = '\n'; | |||
|
458 | } else { | |||
|
459 | w[wlen++] = c; | |||
|
460 | } | |||
|
461 | } | |||
|
462 | ||||
|
463 | result = PyBytes_FromStringAndSize(w, wlen); | |||
|
464 | ||||
|
465 | nomem: | |||
|
466 | free(w); | |||
|
467 | return result ? result : PyErr_NoMemory(); | |||
|
468 | } | |||
|
469 | ||||
|
470 | ||||
428 | static char mdiff_doc[] = "Efficient binary diff."; |
|
471 | static char mdiff_doc[] = "Efficient binary diff."; | |
429 |
|
472 | |||
430 | static PyMethodDef methods[] = { |
|
473 | static PyMethodDef methods[] = { | |
431 | {"bdiff", bdiff, METH_VARARGS, "calculate a binary diff\n"}, |
|
474 | {"bdiff", bdiff, METH_VARARGS, "calculate a binary diff\n"}, | |
432 | {"blocks", blocks, METH_VARARGS, "find a list of matching lines\n"}, |
|
475 | {"blocks", blocks, METH_VARARGS, "find a list of matching lines\n"}, | |
|
476 | {"fixws", fixws, METH_VARARGS, "normalize diff whitespaces\n"}, | |||
433 | {NULL, NULL} |
|
477 | {NULL, NULL} | |
434 | }; |
|
478 | }; | |
435 |
|
479 |
@@ -67,10 +67,9 b' defaultopts = diffopts()' | |||||
67 |
|
67 | |||
68 | def wsclean(opts, text, blank=True): |
|
68 | def wsclean(opts, text, blank=True): | |
69 | if opts.ignorews: |
|
69 | if opts.ignorews: | |
70 | text = re.sub('[ \t\r]+', '', text) |
|
70 | text = bdiff.fixws(text, 1) | |
71 | elif opts.ignorewsamount: |
|
71 | elif opts.ignorewsamount: | |
72 | text = re.sub('[ \t\r]+', ' ', text) |
|
72 | text = bdiff.fixws(text, 0) | |
73 | text = text.replace(' \n', '\n') |
|
|||
74 | if blank and opts.ignoreblanklines: |
|
73 | if blank and opts.ignoreblanklines: | |
75 | text = re.sub('\n+', '\n', text).strip('\n') |
|
74 | text = re.sub('\n+', '\n', text).strip('\n') | |
76 | return text |
|
75 | return text |
@@ -5,7 +5,7 b'' | |||||
5 | # This software may be used and distributed according to the terms of the |
|
5 | # This software may be used and distributed according to the terms of the | |
6 | # GNU General Public License version 2 or any later version. |
|
6 | # GNU General Public License version 2 or any later version. | |
7 |
|
7 | |||
8 | import struct, difflib |
|
8 | import struct, difflib, re | |
9 |
|
9 | |||
10 | def splitnewlines(text): |
|
10 | def splitnewlines(text): | |
11 | '''like str.splitlines, but only split on newlines.''' |
|
11 | '''like str.splitlines, but only split on newlines.''' | |
@@ -78,3 +78,10 b' def blocks(a, b):' | |||||
78 | d = _normalizeblocks(an, bn, d) |
|
78 | d = _normalizeblocks(an, bn, d) | |
79 | return [(i, i + n, j, j + n) for (i, j, n) in d] |
|
79 | return [(i, i + n, j, j + n) for (i, j, n) in d] | |
80 |
|
80 | |||
|
81 | def fixws(text, allws): | |||
|
82 | if allws: | |||
|
83 | text = re.sub('[ \t\r]+', '', text) | |||
|
84 | else: | |||
|
85 | text = re.sub('[ \t\r]+', ' ', text) | |||
|
86 | text = text.replace(' \n', '\n') | |||
|
87 | return text |
@@ -50,3 +50,17 b' showdiff("x\\n\\nx\\n\\nx\\n\\nx\\n\\nz\\n", "x\\n' | |||||
50 | showdiff("x\n\nx\n\nx\n\nx\n\nz\n", "x\n\nx\n\ny\n\nx\n\ny\n\nx\n\nz\n") |
|
50 | showdiff("x\n\nx\n\nx\n\nx\n\nz\n", "x\n\nx\n\ny\n\nx\n\ny\n\nx\n\nz\n") | |
51 |
|
51 | |||
52 | print "done" |
|
52 | print "done" | |
|
53 | ||||
|
54 | def testfixws(a, b, allws): | |||
|
55 | c = bdiff.fixws(a, allws) | |||
|
56 | if c != b: | |||
|
57 | print "*** fixws", repr(a), repr(b), allws | |||
|
58 | print "got:" | |||
|
59 | print repr(c) | |||
|
60 | ||||
|
61 | testfixws(" \ta\r b\t\n", "ab\n", 1) | |||
|
62 | testfixws(" \ta\r b\t\n", " a b\n", 0) | |||
|
63 | testfixws("", "", 1) | |||
|
64 | testfixws("", "", 0) | |||
|
65 | ||||
|
66 | print "done" |
General Comments 0
You need to be logged in to leave comments.
Login now