[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemacs-commit] qemacs extras.c
From: |
Charlie Gordon |
Subject: |
[Qemacs-commit] qemacs extras.c |
Date: |
Mon, 26 Dec 2016 10:01:58 -0500 (EST) |
CVSROOT: /sources/qemacs
Module name: qemacs
Changes by: Charlie Gordon <chqrlie> 16/12/26 10:01:58
Modified files:
. : extras.c
Log message:
sorting: add support for dictionary order
- improved stability, works for reverse-sort
- simplified reverse sort handling
- select dictionary order via C-u 2 A-x sort-buffer
CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/qemacs/extras.c?cvsroot=qemacs&r1=1.49&r2=1.50
Patches:
Index: extras.c
===================================================================
RCS file: /sources/qemacs/qemacs/extras.c,v
retrieving revision 1.49
retrieving revision 1.50
diff -u -b -r1.49 -r1.50
--- extras.c 26 Dec 2016 09:28:36 -0000 1.49
+++ extras.c 26 Dec 2016 15:01:58 -0000 1.50
@@ -1328,7 +1328,6 @@
#define SF_FOLD 2
#define SF_DICT 4
#define SF_NUMBER 8
- int dir;
};
struct chunk {
@@ -1339,22 +1338,37 @@
const struct chunk_ctx *cp = vp0;
const struct chunk *p1 = vp1;
const struct chunk *p2 = vp2;
- int pos1 = p1->start;
- int pos2 = p2->start;
- // XXX: should support SF_DICT and SF_NUMBER
+ int pos1, pos2;
+
+ if (cp->flags & SF_REVERSE) {
+ p1 = vp2;
+ p2 = vp1;
+ }
+
+ // XXX: should support SF_NUMBER
+ pos1 = p1->start;
+ pos2 = p2->start;
for (;;) {
- int c1, c2;
- c1 = (pos1 < p1->end) ? eb_nextc(cp->b, pos1, &pos1) : 0;
- c2 = (pos2 < p2->end) ? eb_nextc(cp->b, pos2, &pos2) : 0;
+ int c1 = 0, c2 = 0;
+ while (pos1 < p1->end) {
+ c1 = eb_nextc(cp->b, pos1, &pos1);
+ if (!(cp->flags & SF_DICT) || qe_isalpha(c1))
+ break;
+ }
+ while (pos2 < p2->end) {
+ c2 = eb_nextc(cp->b, pos2, &pos2);
+ if (!(cp->flags & SF_DICT) || qe_isalpha(c2))
+ break;
+ }
if (cp->flags & SF_FOLD) {
// XXX: should support unicode case folding
c1 = qe_toupper(c1);
c2 = qe_toupper(c2);
}
if (c1 < c2)
- return -cp->dir;
+ return -1;
if (c1 > c2)
- return +cp->dir;
+ return +1;
if (c1 == 0)
break;
}
@@ -1362,7 +1376,7 @@
return (p1->start > p2->start) - (p1->start < p2->start);
}
-static void do_sort_span(EditState *s, int p1, int p2, int flags) {
+static void do_sort_span(EditState *s, int p1, int p2, int flags, int argval) {
struct chunk_ctx ctx;
EditBuffer *b;
int i, offset, line1, line2, col1, col2, lines;
@@ -1376,10 +1390,11 @@
p2 = tmp;
}
ctx.b = s->b;
- ctx.flags = flags; // SF_FOLD ?
- ctx.dir = (flags & SF_REVERSE) ? -1 : +1;
+ if (argval != NO_ARG)
+ flags |= argval;
+ ctx.flags = flags;
eb_get_pos(s->b, &line1, &col1, p1); /* line1 is included */
- eb_get_pos(s->b, &line2, &col2, p2); /* line1 is excluded? */
+ eb_get_pos(s->b, &line2, &col2, p2); /* line2 is excluded */
lines = line2 - line1;
chunk_array = qe_malloc_array(struct chunk, lines);
if (!chunk_array) {
@@ -1409,12 +1424,12 @@
qe_free(&chunk_array);
}
-static void do_sort_region(EditState *s, int flags) {
- do_sort_span(s, s->b->mark, s->offset, flags);
+static void do_sort_region(EditState *s, int flags, int argval) {
+ do_sort_span(s, s->b->mark, s->offset, flags, argval);
}
-static void do_sort_buffer(EditState *s, int flags) {
- do_sort_span(s, 0, s->b->total_size, flags);
+static void do_sort_buffer(EditState *s, int flags, int argval) {
+ do_sort_span(s, 0, s->b->total_size, flags, argval);
}
static CmdDef extra_commands[] = {
@@ -1499,13 +1514,13 @@
"ui{EOL Type [0=Unix, 1=Dos, 2=Mac]: }")
CMD3( KEY_NONE, KEY_NONE,
- "sort-buffer", do_sort_buffer, ESi, 0, "*v")
+ "sort-buffer", do_sort_buffer, ESii, 0, "*vui")
CMD3( KEY_NONE, KEY_NONE,
- "sort-region", do_sort_region, ESi, 0, "*v")
+ "sort-region", do_sort_region, ESii, 0, "*vui")
CMD3( KEY_NONE, KEY_NONE,
- "reverse-sort-buffer", do_sort_buffer, ESi, SF_REVERSE, "*v")
+ "reverse-sort-buffer", do_sort_buffer, ESii, SF_REVERSE, "*vui")
CMD3( KEY_NONE, KEY_NONE,
- "reverse-sort-region", do_sort_region, ESi, SF_REVERSE, "*v")
+ "reverse-sort-region", do_sort_region, ESii, SF_REVERSE, "*vui")
CMD_DEF_END,
};