+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>.
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
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
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);
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);
}
break;
#ifndef NANO_TINY
case 'u':
- use_undo = TRUE;
+ SET(UNDOABLE);
break;
#endif
case 'v':
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;
#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,
#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))
} 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)
extern char *last_search;
extern char *last_replace;
-extern long flags;
+extern unsigned flags[4];
extern WINDOW *topwin;
extern WINDOW *edit;
extern WINDOW *bottomwin;
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
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,
int len = 0;
openfilestruct *fs = openfile;
- if (!use_undo)
+ if (!ISSET(UNDOABLE))
return;
#ifdef DEBUG