qemacs-commit
[Top][All Lists]
Advanced

[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)



reply via email to

[Prev in Thread] Current Thread [Next in Thread]