]> git.wh0rd.org Git - nano.git/commitdiff
2009-08-13 Chris Allegretta <chrisa@asty.org>
authorChris Allegretta <chrisa@asty.org>
Fri, 14 Aug 2009 03:18:29 +0000 (03:18 +0000)
committerChris Allegretta <chrisa@asty.org>
Fri, 14 Aug 2009 03:18:29 +0000 (03:18 +0000)
* New global flag implementation courtesy of Adam Wysocki <gophi@arcabit.pl>, allows
    previous undo flag to be implemented consistent with other flags.

git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@4400 35c25a1d-7b9e-4130-9fde-d3aeb78583b8

ChangeLog
src/global.c
src/nano.c
src/nano.h
src/proto.h
src/rcfile.c
src/text.c

index 857b98af896518d5a7f2dad7eff34142e2d92d06..397b7f1395579099c09021768a9fe450fdd0fab4 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,9 @@
+2009-08-13 Chris Allegretta <chrisa@asty.org>
+       * New global flag implementation courtesy of Adam Wysocki <gophi@arcabit.pl>, allows
+         previous undo flag to be implemented consistent with other flags.
+
 GNU nano 2.1.10 - 2009.07.28
+
 2009-07-27 Chris Allegretta <chrisa@asty.org>
        * text.c (undo_cut, redo_cut): Don't actually try and undo/redo an empty cut, i.e. the magicline. 
          Fixes crash on cutting last line discovered by Eitan Adler <eitanadlerlist@gmail.com>.
index 69a4ea788d5a94c6d5ba775ee99266c7ed0f4388..f6826d7f468fb6d20aa91dbee6f7ebed2d732c2d 100644 (file)
@@ -36,9 +36,6 @@ sigjmp_buf jump_buf;
 bool jump_buf_main = FALSE;
        /* Have we set jump_buf so that we return to main() after a
         * SIGWINCH? */
-bool use_undo = FALSE;
-       /* Are we actually using the undo code - disabled by default
-          as the undo code is too unstable */
 #endif
 
 #ifndef DISABLE_WRAPJUSTIFY
@@ -55,7 +52,7 @@ char *last_search = NULL;
 char *last_replace = NULL;
        /* The last replacement string we searched for. */
 
-long flags = 0;
+unsigned flags[4] = {0, 0, 0, 0};
        /* Our flag containing the states of all global options. */
 WINDOW *topwin;
        /* The top portion of the window, where we display the version
@@ -781,7 +778,7 @@ void shortcut_init(bool unjustify)
     add_to_funcs(DO_UNINDENT, MMAIN, N_("Unindent Text"),
        IFSCHELP(nano_unindent_msg), FALSE, NOVIEW);
 
-    if (use_undo) {
+    if (ISSET(UNDOABLE)) {
        add_to_funcs(DO_UNDO, MMAIN, N_("Undo"),
            IFSCHELP(nano_undo_msg), FALSE, NOVIEW);
 
@@ -1069,7 +1066,7 @@ void shortcut_init(bool unjustify)
     add_to_sclist(MMAIN, "M-6", DO_COPY_TEXT, 0, TRUE);
     add_to_sclist(MMAIN, "M-}", DO_INDENT_VOID, 0, TRUE);
     add_to_sclist(MMAIN, "M-{", DO_UNINDENT, 0, TRUE);
-    if (use_undo) {
+    if (ISSET(UNDOABLE)) {
        add_to_sclist(MMAIN, "M-U", DO_UNDO, 0, TRUE);
        add_to_sclist(MMAIN, "M-E", DO_REDO, 0, TRUE);
     }
index 8e7846c61eb15bb61842063faff14981da8793eb..7ef21b172362c29555c45cb5564aef5ed42d72d8 100644 (file)
@@ -2213,7 +2213,7 @@ int main(int argc, char **argv)
                break;
 #ifndef NANO_TINY
            case 'u':
-               use_undo = TRUE;
+               SET(UNDOABLE);
                break;
 #endif
            case 'v':
@@ -2277,7 +2277,10 @@ int main(int argc, char **argv)
        char *alt_speller_cpy = alt_speller;
 #endif
        ssize_t tabsize_cpy = tabsize;
-       long flags_cpy = flags;
+       unsigned flags_cpy[sizeof(flags) / sizeof(flags[0])];
+       size_t i;
+
+       memcpy(flags_cpy, flags, sizeof(flags_cpy));
 
 #ifndef DISABLE_OPERATINGDIR
        operating_dir = NULL;
@@ -2329,7 +2332,9 @@ int main(int argc, char **argv)
 #endif
        if (tabsize_cpy != -1)
            tabsize = tabsize_cpy;
-       flags |= flags_cpy;
+
+       for (i = 0; i < sizeof(flags) / sizeof(flags[0]); i++)
+           flags[i] |= flags_cpy[i];
     }
 #ifdef DISABLE_ROOTWRAPPING
     /* If we don't have any rcfiles, --disable-wrapping-as-root is used,
index 1eb2a1fc5b5fb0af3137d9339bf188f81d498644..9400fe058a6026a5de76c88a0f89445fcce9cf74 100644 (file)
 #endif
 
 /* Macros for flags. */
-#define SET(bit) flags |= bit
-#define UNSET(bit) flags &= ~bit
-#define ISSET(bit) ((flags & bit) != 0)
-#define TOGGLE(bit) flags ^= bit
+#define FLAGOFF(flag) ((flag) / (sizeof(unsigned) * 8))
+#define FLAGMASK(flag) (1 << ((flag) % (sizeof(unsigned) * 8)))
+#define FLAGS(flag) flags[FLAGOFF(flag)]
+#define SET(flag) FLAGS(flag) |= FLAGMASK(flag)
+#define UNSET(flag) FLAGS(flag) &= ~FLAGMASK(flag)
+#define ISSET(flag) ((FLAGS(flag) & FLAGMASK(flag)) != 0)
+#define TOGGLE(flag) FLAGS(flag) ^= FLAGMASK(flag)
 
 /* Macros for character allocation and more. */
 #define charalloc(howmuch) (char *)nmalloc((howmuch) * sizeof(char))
@@ -450,40 +453,44 @@ typedef struct subnfunc {
 } subnfunc;
 
 
-/* Bitwise flags so that we can save space (or, more correctly, not
- * waste it). */
-#define CASE_SENSITIVE                 (1<<0)
-#define CONST_UPDATE                   (1<<1)
-#define NO_HELP                                (1<<2)
-#define NOFOLLOW_SYMLINKS              (1<<3)
-#define SUSPEND                                (1<<4)
-#define NO_WRAP                                (1<<5)
-#define AUTOINDENT                     (1<<6)
-#define VIEW_MODE                      (1<<7)
-#define USE_MOUSE                      (1<<8)
-#define USE_REGEXP                     (1<<9)
-#define TEMP_FILE                      (1<<10)
-#define CUT_TO_END                     (1<<11)
-#define BACKWARDS_SEARCH               (1<<12)
-#define MULTIBUFFER                    (1<<13)
-#define SMOOTH_SCROLL                  (1<<14)
-#define REBIND_DELETE                  (1<<15)
-#define REBIND_KEYPAD                  (1<<16)
-#define NO_CONVERT                     (1<<17)
-#define BACKUP_FILE                    (1<<18)
-#define NO_COLOR_SYNTAX                        (1<<19)
-#define PRESERVE                       (1<<20)
-#define HISTORYLOG                     (1<<21)
-#define RESTRICTED                     (1<<22)
-#define SMART_HOME                     (1<<23)
-#define WHITESPACE_DISPLAY             (1<<24)
-#define MORE_SPACE                     (1<<25)
-#define TABS_TO_SPACES                 (1<<26)
-#define QUICK_BLANK                    (1<<27)
-#define WORD_BOUNDS                    (1<<28)
-#define NO_NEWLINES                    (1<<29)
-#define BOLD_TEXT                      (1<<30)
-#define QUIET                          (1<<31)
+/* Enumeration to be used in flags table. See FLAGBIT and FLAGOFF 
+ * definitions. */
+enum
+{
+    CASE_SENSITIVE,
+    CONST_UPDATE,
+    NO_HELP,
+    NOFOLLOW_SYMLINKS,
+    SUSPEND,
+    NO_WRAP,
+    AUTOINDENT,
+    VIEW_MODE,
+    USE_MOUSE,
+    USE_REGEXP,
+    TEMP_FILE,
+    CUT_TO_END,
+    BACKWARDS_SEARCH,
+    MULTIBUFFER,
+    SMOOTH_SCROLL,
+    REBIND_DELETE,
+    REBIND_KEYPAD,
+    NO_CONVERT,
+    BACKUP_FILE,
+    NO_COLOR_SYNTAX,
+    PRESERVE,
+    HISTORYLOG,
+    RESTRICTED,
+    SMART_HOME,
+    WHITESPACE_DISPLAY,
+    MORE_SPACE,
+    TABS_TO_SPACES,
+    QUICK_BLANK,
+    WORD_BOUNDS,
+    NO_NEWLINES,
+    BOLD_TEXT,
+    QUIET,
+    UNDOABLE,
+};
 
 /* Flags for which menus in which a given function should be present */
 #define MMAIN                          (1<<0)
index 700a5cebe3a50480dc7bf9e63fab7c06f7eab07b..3e83f1bacf89da32a5451a43a5ec900aabed54a7 100644 (file)
@@ -41,7 +41,7 @@ extern ssize_t wrap_at;
 extern char *last_search;
 extern char *last_replace;
 
-extern long flags;
+extern unsigned flags[4];
 extern WINDOW *topwin;
 extern WINDOW *edit;
 extern WINDOW *bottomwin;
index 565632fed15014c07ae233c0b0222d2816515cc0..60a9f3dddb2260dc26b2bbca19b28ca0ad982fc6 100644 (file)
@@ -909,15 +909,6 @@ void parse_rcfile(FILE *rcstream
        option = ptr;
        ptr = parse_next_word(ptr);
 
-#ifndef NANO_TINY
-       /* FIXME: Hack which should go away ASAP */
-       if (strcasecmp(option,  "undo") == 0) {
-           use_undo = TRUE;
-           shortcut_init(0);
-           continue;
-       }
-#endif
-
        for (i = 0; rcopts[i].name != NULL; i++) {
            if (strcasecmp(option, rcopts[i].name) == 0) {
 #ifdef DEBUG
index a225eaa1e3e34f6a090464a91caef42e28a2792f..a3683f4048c1c29a929e7f781aefa75a93db6637 100644 (file)
@@ -837,7 +837,7 @@ void add_undo(undo_type current_action)
     static undo *last_cutu = NULL; /* Last thing we cut to set up the undo for uncut */
     ssize_t wrap_loc;  /* For calculating split beginning */
 
-    if (!use_undo)
+    if (!ISSET(UNDOABLE))
        return;
 
     /* Ugh, if we were called while cutting not-to-end, non-marked and on the same lineno,
@@ -962,7 +962,7 @@ void update_undo(undo_type action)
     int len = 0;
     openfilestruct *fs = openfile;
 
-    if (!use_undo)
+    if (!ISSET(UNDOABLE))
        return;
 
 #ifdef DEBUG