[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemacs-commit] qemacs bufed.c latex-mode.c qe.h shell.c buffer...
From: |
Charlie Gordon |
Subject: |
[Qemacs-commit] qemacs bufed.c latex-mode.c qe.h shell.c buffer... |
Date: |
Wed, 26 Aug 2015 00:53:24 +0000 |
CVSROOT: /sources/qemacs
Module name: qemacs
Changes by: Charlie Gordon <chqrlie> 15/08/26 00:53:24
Modified files:
. : bufed.c latex-mode.c qe.h shell.c buffer.c qe.c
qeconfig.h
Log message:
buffers: misc improvements
- renamed kill_buffer_noconfirm(b) to qe_kill_buffer(b)
- pass extra argument to do_kill_buffer(b, force)
- add buffer name cache to quicken eb_find()
- always make buffer names unique with simpler naming scheme
- small improvement in new_yank_buffer()
CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/qemacs/bufed.c?cvsroot=qemacs&r1=1.37&r2=1.38
http://cvs.savannah.gnu.org/viewcvs/qemacs/latex-mode.c?cvsroot=qemacs&r1=1.53&r2=1.54
http://cvs.savannah.gnu.org/viewcvs/qemacs/qe.h?cvsroot=qemacs&r1=1.204&r2=1.205
http://cvs.savannah.gnu.org/viewcvs/qemacs/shell.c?cvsroot=qemacs&r1=1.98&r2=1.99
http://cvs.savannah.gnu.org/viewcvs/qemacs/buffer.c?cvsroot=qemacs&r1=1.91&r2=1.92
http://cvs.savannah.gnu.org/viewcvs/qemacs/qe.c?cvsroot=qemacs&r1=1.207&r2=1.208
http://cvs.savannah.gnu.org/viewcvs/qemacs/qeconfig.h?cvsroot=qemacs&r1=1.52&r2=1.53
Patches:
Index: bufed.c
===================================================================
RCS file: /sources/qemacs/qemacs/bufed.c,v
retrieving revision 1.37
retrieving revision 1.38
diff -u -b -r1.37 -r1.38
--- bufed.c 25 Aug 2015 16:19:43 -0000 1.37
+++ bufed.c 26 Aug 2015 00:53:23 -0000 1.38
@@ -211,7 +211,7 @@
/* XXX: avoid killing buffer list by mistake */
if (strcmp(s->b->name, item->str))
- do_kill_buffer(s, item->str);
+ do_kill_buffer(s, item->str, 0);
}
static void bufed_kill_buffer(EditState *s)
Index: latex-mode.c
===================================================================
RCS file: /sources/qemacs/qemacs/latex-mode.c,v
retrieving revision 1.53
retrieving revision 1.54
diff -u -b -r1.53 -r1.54
--- latex-mode.c 11 Aug 2015 17:45:30 -0000 1.53
+++ latex-mode.c 26 Aug 2015 00:53:23 -0000 1.54
@@ -267,8 +267,7 @@
EditBuffer *b = eb_find("*LaTeX output*");
if (b) {
/* XXX: e should not become invalid */
- b->modified = 0;
- do_kill_buffer(func->es, "*LaTeX output*");
+ qe_kill_buffer(b);
}
/* create new buffer */
Index: qe.h
===================================================================
RCS file: /sources/qemacs/qemacs/qe.h,v
retrieving revision 1.204
retrieving revision 1.205
diff -u -b -r1.204 -r1.205
--- qe.h 26 Aug 2015 00:24:15 -0000 1.204
+++ qe.h 26 Aug 2015 00:53:24 -0000 1.205
@@ -945,8 +945,8 @@
OWNED EditBuffer *next; /* next editbuffer in qe_state buffer list */
int st_mode; /* unix file mode */
- char name[MAX_BUFFERNAME_SIZE]; /* buffer name */
- char filename[MAX_FILENAME_SIZE]; /* file name */
+ const char name[MAX_BUFFERNAME_SIZE]; /* buffer name */
+ const char filename[MAX_FILENAME_SIZE]; /* file name */
/* Should keep a stat buffer to check for file type and
* asynchronous modifications
@@ -1011,7 +1011,7 @@
int eb_write_buffer(EditBuffer *b, int start, int end, const char *filename);
int eb_save_buffer(EditBuffer *b);
-void eb_set_buffer_name(EditBuffer *b, const char *name1);
+int eb_set_buffer_name(EditBuffer *b, const char *name1);
void eb_set_filename(EditBuffer *b, const char *filename);
int eb_add_callback(EditBuffer *b, EditBufferCallback cb, void *opaque, int
arg);
@@ -1393,6 +1393,11 @@
EditBuffer *first_buffer;
EditBufferDataType *first_buffer_data_type;
//EditBuffer *message_buffer;
+#ifndef CONFIG_TINY
+ EditBuffer **buffer_cache;
+ int buffer_cache_size;
+ int buffer_cache_len;
+#endif
EditBuffer *trace_buffer;
int trace_buffer_state;
#define EB_TRACE_TTY 1
@@ -1818,9 +1823,9 @@
const char *replace_str, int argval);
void do_search_string(EditState *s, const char *search_str, int dir);
void do_refresh_complete(EditState *s);
-void do_kill_buffer(EditState *s, const char *bufname1);
+void do_kill_buffer(EditState *s, const char *bufname, int force);
void switch_to_buffer(EditState *s, EditBuffer *b);
-void kill_buffer_noconfirm(EditBuffer *b);
+void qe_kill_buffer(EditBuffer *b);
/* text mode */
Index: shell.c
===================================================================
RCS file: /sources/qemacs/qemacs/shell.c,v
retrieving revision 1.98
retrieving revision 1.99
diff -u -b -r1.98 -r1.99
--- shell.c 25 Aug 2015 16:19:43 -0000 1.98
+++ shell.c 26 Aug 2015 00:53:24 -0000 1.99
@@ -1401,7 +1401,7 @@
int bf_flags = BF_SAVELOG;
if (shell_flags & SF_COLOR)
bf_flags |= BF_STYLE2;
- b = eb_new("", bf_flags);
+ b = eb_new(bufname, bf_flags);
if (!b)
return NULL;
}
@@ -1758,7 +1758,7 @@
/* if the buffer already exists, kill it */
b = eb_find("*shell command output*");
if (b) {
- kill_buffer_noconfirm(b);
+ qe_kill_buffer(b);
}
/* create new buffer */
@@ -1779,7 +1779,7 @@
/* if the buffer already exists, kill it */
b = eb_find("*compilation*");
if (b) {
- kill_buffer_noconfirm(b);
+ qe_kill_buffer(b);
}
if (!cmd || !*cmd)
Index: buffer.c
===================================================================
RCS file: /sources/qemacs/qemacs/buffer.c,v
retrieving revision 1.91
retrieving revision 1.92
diff -u -b -r1.91 -r1.92
--- buffer.c 26 Aug 2015 00:24:14 -0000 1.91
+++ buffer.c 26 Aug 2015 00:53:24 -0000 1.92
@@ -543,6 +543,7 @@
return *sp = NULL;
}
+#ifdef CONFIG_TINY
EditBuffer *eb_find(const char *name)
{
QEmacsState *qs = &qe_state;
@@ -556,6 +557,86 @@
}
return NULL;
}
+#define eb_cache_remove(b) 0
+#define eb_cache_insert(b) 0
+#else
+/* return index >= 0 if found, -1-insert_pos if not found */
+static int eb_cache_locate(EditBuffer **cache, int len, const char *name)
+{
+ int aa, bb, m, cmp;
+
+ for (aa = 0, bb = len; aa < bb;) {
+ m = (aa + bb) >> 1;
+ cmp = strcmp(name, cache[m]->name);
+ if (cmp < 0) {
+ bb = m;
+ } else
+ if (cmp > 0) {
+ aa = m + 1;
+ } else {
+ return m;
+ }
+ }
+ return -aa - 1;
+}
+
+static int eb_cache_remove(EditBuffer *b)
+{
+ QEmacsState *qs = &qe_state;
+ EditBuffer **cache = qs->buffer_cache;
+ int len = qs->buffer_cache_len;
+ int pos = eb_cache_locate(cache, len, b->name);
+
+ if (pos < 0)
+ return -1;
+
+ if (cache[pos] != b)
+ return -2;
+
+ memmove(cache + pos, cache + pos + 1, (len - pos - 1) * sizeof(*cache));
+ len -= 1;
+ qs->buffer_cache_len = len;
+ return 0;
+}
+
+static int eb_cache_insert(EditBuffer *b)
+{
+ QEmacsState *qs = &qe_state;
+ EditBuffer **cache = qs->buffer_cache;
+ int len = qs->buffer_cache_len;
+ int pos = eb_cache_locate(cache, len, b->name);
+
+ if (pos >= 0)
+ return (cache[pos] == b) ? -3 : -2;
+
+ if (len >= qs->buffer_cache_size) {
+ int size = max(32, len + (len >> 1) + (len >> 3));
+ cache = qe_realloc(&qs->buffer_cache, size * sizeof(*cache));
+ if (!cache)
+ return -1;
+ qs->buffer_cache_size = size;
+ }
+ pos = -pos - 1;
+ memmove(cache + pos + 1, cache + pos, (len - pos) * sizeof(*cache));
+ cache[pos] = b;
+ len += 1;
+ qs->buffer_cache_len = len;
+ return 0;
+}
+
+EditBuffer *eb_find(const char *name)
+{
+ QEmacsState *qs = &qe_state;
+ EditBuffer **cache = qs->buffer_cache;
+ int len = qs->buffer_cache_len;
+ int pos = eb_cache_locate(cache, len, name);
+
+ if (pos < 0)
+ return NULL;
+
+ return cache[pos];
+}
+#endif
/* flush the log */
void eb_free_log_buffer(EditBuffer *b)
@@ -566,22 +647,36 @@
b->nb_logs = 0;
}
-/* rename a buffer and add characters so that the name is unique */
-void eb_set_buffer_name(EditBuffer *b, const char *name1)
+/* rename a buffer: modify name to ensure uniqueness */
+/* eb_set_buffer_name() may fail only for a newly created buffer */
+int eb_set_buffer_name(EditBuffer *b, const char *name1)
{
char name[MAX_BUFFERNAME_SIZE];
int n, pos;
+ const char *prefix = "<";
+ const char *suffix = ">";
+ EditBuffer *b1;
pstrcpy(name, sizeof(name) - 10, name1);
- /* set the buffer name to NULL since it will be changed */
- b->name[0] = '\0';
pos = strlen(name);
- n = 1;
- while (eb_find(name) != NULL) {
- snprintf(name + pos, sizeof(name) - pos, "<%d>", n);
+ if (pos > 0 && name[pos - 1] == '*') {
+ pos--;
+ prefix = "-";
+ suffix = "*";
+ }
+ n = 0;
+ /* do not allow an empty name */
+ while ((b1 = eb_find(name)) != NULL || *name == '\0') {
+ if (b == b1)
+ return 0;
n++;
+ snprintf(name + pos, sizeof(name) - pos, "%s%d%s", prefix, n, suffix);
}
- pstrcpy(b->name, sizeof(b->name), name);
+ /* This is the only place where b->name is modified */
+ eb_cache_remove(b);
+ pstrcpy((char *)b->name, sizeof(b->name), name);
+ /* eb_cache_insert may fail only for a newly created buffer */
+ return eb_cache_insert(b);
}
EditBuffer *eb_new(const char *name, int flags)
@@ -594,8 +689,12 @@
if (!b)
return NULL;
- // should ensure name uniqueness ?
- pstrcpy(b->name, sizeof(b->name), name);
+ /* set the buffer name to a unique name */
+ if (eb_set_buffer_name(b, name)) {
+ qe_free(&b);
+ return NULL;
+ }
+
b->flags = flags & ~BF_STYLES;
/* set default data type */
@@ -694,6 +793,7 @@
qe_free(&cb);
}
+ eb_cache_remove(b);
eb_clear(b);
/* suppress from buffer list */
@@ -939,6 +1039,9 @@
switch (op) {
case LOGOP_WRITE:
case LOGOP_INSERT:
+ /* XXX: should make buf uint32_t[] */
+ /* XXX: should use a single loop to initialize buf */
+ /* XXX: should initialize buf just once */
while (size > 0) {
len = min(size, ssizeof(buf));
if (b->style_shift == 2) {
@@ -1923,7 +2026,7 @@
filename. Find a unique buffer name */
void eb_set_filename(EditBuffer *b, const char *filename)
{
- pstrcpy(b->filename, sizeof(b->filename), filename);
+ pstrcpy((char *)b->filename, sizeof(b->filename), filename);
eb_set_buffer_name(b, get_basename(filename));
}
Index: qe.c
===================================================================
RCS file: /sources/qemacs/qemacs/qe.c,v
retrieving revision 1.207
retrieving revision 1.208
diff -u -b -r1.207 -r1.208
--- qe.c 26 Aug 2015 00:24:14 -0000 1.207
+++ qe.c 26 Aug 2015 00:53:24 -0000 1.208
@@ -1680,22 +1680,23 @@
{
char bufname[32];
EditBuffer *b;
+ int cur = qs->yank_current;
- if (qs->yank_buffers[qs->yank_current]) {
- if (++qs->yank_current == NB_YANK_BUFFERS)
- qs->yank_current = 0;
- /* problem if buffer is displayed in window, should instead
- * just clear the buffer */
- eb_free(&qs->yank_buffers[qs->yank_current]);
+ if (qs->yank_buffers[cur]) {
+ cur = (cur + 1) % NB_YANK_BUFFERS;
+ qs->yank_current = cur;
+ /* Maybe should instead just clear the buffer and reset styles */
+ qe_kill_buffer(qs->yank_buffers[cur]);
+ qs->yank_buffers[cur] = NULL;
}
- snprintf(bufname, sizeof(bufname), "*kill-%d*", qs->yank_current + 1);
+ snprintf(bufname, sizeof(bufname), "*kill-%d*", cur + 1);
if (base) {
b = eb_new(bufname, base->flags & BF_STYLES);
eb_set_charset(b, base->charset, base->eol_type);
} else {
b = eb_new(bufname, 0);
}
- qs->yank_buffers[qs->yank_current] = b;
+ qs->yank_buffers[cur] = b;
return b;
}
@@ -5817,10 +5818,10 @@
qe_free(&reply);
if (!yes_replied)
return;
- kill_buffer_noconfirm(opaque);
+ qe_kill_buffer(opaque);
}
-void do_kill_buffer(EditState *s, const char *bufname)
+void do_kill_buffer(EditState *s, const char *bufname, int force)
{
char buf[1024];
EditBuffer *b;
@@ -5830,18 +5831,18 @@
put_status(s, "No buffer %s", bufname);
} else {
/* if modified and associated to a filename, then ask */
- if (b->modified && b->filename[0] != '\0') {
+ if (!force && b->modified && b->filename[0] != '\0') {
snprintf(buf, sizeof(buf),
"Buffer %s modified; kill anyway? (yes or no) ", bufname);
minibuffer_edit(NULL, buf, NULL, NULL,
kill_buffer_confirm_cb, b);
} else {
- kill_buffer_noconfirm(b);
+ qe_kill_buffer(b);
}
}
}
-void kill_buffer_noconfirm(EditBuffer *b)
+void qe_kill_buffer(EditBuffer *b)
{
QEmacsState *qs = &qe_state;
EditState *e;
@@ -6099,7 +6100,7 @@
}
/* Create new buffer with unique name from filename */
- b = eb_new("", BF_SAVELOG | bflags);
+ b = eb_new(get_basename(filename), BF_SAVELOG | bflags);
eb_set_filename(b, filename);
/* XXX: should actually initialize SAVED_DATA area in new buffer */
Index: qeconfig.h
===================================================================
RCS file: /sources/qemacs/qemacs/qeconfig.h,v
retrieving revision 1.52
retrieving revision 1.53
diff -u -b -r1.52 -r1.53
--- qeconfig.h 16 Aug 2015 17:40:41 -0000 1.52
+++ qeconfig.h 26 Aug 2015 00:53:24 -0000 1.53
@@ -153,8 +153,8 @@
CMD2( KEY_CTRLX('b'), KEY_NONE,
"switch-to-buffer", do_switch_to_buffer, ESs,
"s{Switch to buffer: }[buffer]|buffer|")
- CMD2( KEY_CTRLX('k'), KEY_NONE,
- "kill-buffer", do_kill_buffer, ESs,
+ CMD3( KEY_CTRLX('k'), KEY_NONE,
+ "kill-buffer", do_kill_buffer, ESsi, 0,
"s{Kill buffer: }[buffer]|buffer|")
CMD0( KEY_CTRLX(KEY_CTRL('q')), KEY_NONE,
"toggle-read-only", do_toggle_read_only)
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Qemacs-commit] qemacs bufed.c latex-mode.c qe.h shell.c buffer...,
Charlie Gordon <=