global.c 29 KB
Newer Older
Chris Allegretta's avatar
Chris Allegretta committed
1
/* $Id$ */
Chris Allegretta's avatar
Chris Allegretta committed
2
3
4
/**************************************************************************
 *   global.c                                                             *
 *                                                                        *
5
 *   Copyright (C) 1999-2003 Chris Allegretta                             *
Chris Allegretta's avatar
Chris Allegretta committed
6
7
 *   This program is free software; you can redistribute it and/or modify *
 *   it under the terms of the GNU General Public License as published by *
8
 *   the Free Software Foundation; either version 2, or (at your option)  *
Chris Allegretta's avatar
Chris Allegretta committed
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 *   any later version.                                                   *
 *                                                                        *
 *   This program is distributed in the hope that it will be useful,      *
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of       *
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the        *
 *   GNU General Public License for more details.                         *
 *                                                                        *
 *   You should have received a copy of the GNU General Public License    *
 *   along with this program; if not, write to the Free Software          *
 *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.            *
 *                                                                        *
 **************************************************************************/

#include "config.h"
23

24
#include <stdlib.h>
25
#include <assert.h>
26
#include <sys/stat.h>
Chris Allegretta's avatar
Chris Allegretta committed
27
#include "proto.h"
David Lawrence Ramsey's avatar
David Lawrence Ramsey committed
28
#include "nano.h"
Chris Allegretta's avatar
Chris Allegretta committed
29

Chris Allegretta's avatar
Chris Allegretta committed
30
/* Global variables */
31

Chris Allegretta's avatar
Chris Allegretta committed
32
33
34
35
36
/* wrap_at might be set in rcfile.c or nano.c */
int wrap_at = -CHARS_FROM_EOL;/* Right justified fill value, allows resize */
char *last_search = NULL;	/* Last string we searched for */
char *last_replace = NULL;	/* Last replacement string */
int search_last_line;		/* Is this the last search line? */
Chris Allegretta's avatar
Chris Allegretta committed
37
int search_offscreen;		/* Search lines not displayed */
Chris Allegretta's avatar
Chris Allegretta committed
38

39
int flags = 0;			/* Our new flag containing many options */
David Lawrence Ramsey's avatar
David Lawrence Ramsey committed
40
WINDOW *edit;			/* The file portion of the editor */
Chris Allegretta's avatar
Chris Allegretta committed
41
42
WINDOW *topwin;			/* Top line of screen */
WINDOW *bottomwin;		/* Bottom buffer */
Chris Allegretta's avatar
Chris Allegretta committed
43
char *filename = NULL;		/* Name of the file */
44
45
46
47
48

#ifndef NANO_SMALL
struct stat originalfilestat;	/* Stat for the file as we loaded it */
#endif

Chris Allegretta's avatar
Chris Allegretta committed
49
50
51
52
53
54
55
56
57
58
59
60
61
62
int editwinrows = 0;		/* How many rows long is the edit
				   window? */
filestruct *current;		/* Current buffer pointer */
int current_x = 0, current_y = 0;	/* Current position of X and Y in
					   the editor - relative to edit
					   window (0,0) */
filestruct *fileage = NULL;	/* Our file buffer */
filestruct *edittop = NULL;	/* Pointer to the top of the edit
				   buffer with respect to the
				   file struct */
filestruct *editbot = NULL;	/* Same for the bottom */
filestruct *filebot = NULL;	/* Last node in the file struct */
filestruct *cutbuffer = NULL;	/* A place to store cut text */

63
#ifdef ENABLE_MULTIBUFFER
64
openfilestruct *open_files = NULL;	/* The list of open files */
65
66
#endif

67
#ifndef DISABLE_JUSTIFY
Chris Allegretta's avatar
Chris Allegretta committed
68
69
char *quotestr = NULL;		/* Quote string.  The default value is
				   set in main(). */
Chris Allegretta's avatar
Chris Allegretta committed
70
#endif
71

72
73
int resetstatuspos;		/* Hack for resetting the status bar 
				   cursor position */
Chris Allegretta's avatar
Chris Allegretta committed
74
char *answer = NULL;		/* Answer str to many questions */
Chris Allegretta's avatar
Chris Allegretta committed
75
int totlines = 0;		/* Total number of lines in the file */
76
long totsize = 0;		/* Total number of bytes in the file */
77
int placewewant = 0;		/* The column we'd like the cursor
Chris Allegretta's avatar
Chris Allegretta committed
78
79
80
				   to jump to when we go to the
				   next or previous line */

Chris Allegretta's avatar
Chris Allegretta committed
81
82
int tabsize = -1;		/* Our internal tabsize variable.  The
				   default value 8 is set in main(). */
83

Chris Allegretta's avatar
Chris Allegretta committed
84
char *hblank = NULL;		/* A horizontal blank line */
Chris Allegretta's avatar
Chris Allegretta committed
85
#ifndef DISABLE_HELP
Chris Allegretta's avatar
Chris Allegretta committed
86
char *help_text;		/* The text in the help window */
Chris Allegretta's avatar
Chris Allegretta committed
87
#endif
Chris Allegretta's avatar
Chris Allegretta committed
88
89
90

/* More stuff for the marker select */

Chris Allegretta's avatar
Chris Allegretta committed
91
#ifndef NANO_SMALL
Chris Allegretta's avatar
Chris Allegretta committed
92
93
filestruct *mark_beginbuf;	/* the begin marker buffer */
int mark_beginx;		/* X value in the string to start */
Chris Allegretta's avatar
Chris Allegretta committed
94
#endif
Chris Allegretta's avatar
Chris Allegretta committed
95

96
#ifndef DISABLE_OPERATINGDIR
97
98
char *operating_dir = NULL;	/* Operating directory, which we can't */
char *full_operating_dir = NULL;/* go higher than */
99
100
#endif

101
#ifndef DISABLE_SPELLER
102
char *alt_speller = NULL;		/* Alternative spell command */
103
104
#endif

105
106
107
shortcut *main_list = NULL;
shortcut *whereis_list = NULL;
shortcut *replace_list = NULL;
108
shortcut *replace_list_2 = NULL; 	/* 2nd half of replace dialog */
109
110
111
shortcut *goto_list = NULL;
shortcut *writefile_list = NULL;
shortcut *insertfile_list = NULL;
Chris Allegretta's avatar
Chris Allegretta committed
112
#ifndef DISABLE_HELP
113
shortcut *help_list = NULL;
Chris Allegretta's avatar
Chris Allegretta committed
114
115
#endif
#ifndef DISABLE_SPELLER
116
shortcut *spell_list = NULL;
Chris Allegretta's avatar
Chris Allegretta committed
117
#endif
Chris Allegretta's avatar
Chris Allegretta committed
118
#ifndef NANO_SMALL
119
shortcut *extcmd_list = NULL;
Chris Allegretta's avatar
Chris Allegretta committed
120
#endif
121
#ifndef DISABLE_BROWSER
122
shortcut *browser_list = NULL;
123
shortcut *gotodir_list = NULL;
Chris Allegretta's avatar
Chris Allegretta committed
124
#endif
125

126
#ifdef ENABLE_COLOR
127
128
129
const colortype *colorstrings = NULL;
syntaxtype *syntaxes = NULL;
char *syntaxstr = NULL;
130
131
#endif

132
#if !defined(DISABLE_BROWSER) || !defined(DISABLE_HELP) || (!defined(DISABLE_MOUSE) && defined(NCURSES_MOUSE_VERSION))
Chris Allegretta's avatar
Chris Allegretta committed
133
const shortcut *currshortcut;	/* Current shortcut list we're using */
134
#endif
135

136
#ifndef NANO_SMALL
137
toggle *toggles = NULL;
138
#endif
Chris Allegretta's avatar
Chris Allegretta committed
139

140
141
142
143
144
#ifndef NANO_SMALL
historyheadtype search_history;
historyheadtype replace_history;
#endif

145
146
/* Regular expressions */

147
#ifdef HAVE_REGEX_H
148
149
150
regex_t search_regexp;		/* Global to store compiled search regexp */
regmatch_t regmatches[10];	/* Match positions for parenthetical
				   subexpressions, max of 10 */
Chris Allegretta's avatar
Chris Allegretta committed
151
#endif
152

153
154
155
156
157
int curses_ended = FALSE;	/* Indicates to statusbar() to simply
				 * write to stderr, since endwin() has
				 * ended curses mode. */


158
int length_of_list(const shortcut *s) 
159
160
{
    int i = 0;
161

162
    for (; s != NULL; s = s->next)
163
164
165
166
	i++;
    return i;
}

Chris Allegretta's avatar
Chris Allegretta committed
167
/* Initialize a struct *without* our lovely braces =( */
168
void sc_init_one(shortcut **shortcutage, int key, const char *desc,
169
#ifndef DISABLE_HELP
170
	const char *help,
171
#endif
David Lawrence Ramsey's avatar
David Lawrence Ramsey committed
172
	int alt, int misc1, int misc2, int view, int (*func) (void))
Chris Allegretta's avatar
Chris Allegretta committed
173
{
174
175
176
177
178
179
180
181
182
183
184
185
    shortcut *s;

    if (*shortcutage == NULL) {
	*shortcutage = nmalloc(sizeof(shortcut));
	s = *shortcutage;
    } else {
	for (s = *shortcutage; s->next != NULL; s = s->next)
	    ;
	s->next = nmalloc(sizeof(shortcut));
	s = s->next; 
    }

Chris Allegretta's avatar
Chris Allegretta committed
186
187
    s->val = key;
    s->desc = desc;
188
#ifndef DISABLE_HELP
Chris Allegretta's avatar
Chris Allegretta committed
189
    s->help = help;
190
#endif
Chris Allegretta's avatar
Chris Allegretta committed
191
192
193
194
195
    s->altval = alt;
    s->misc1 = misc1;
    s->misc2 = misc2;
    s->viewok = view;
    s->func = func;
196
    s->next = NULL;
Chris Allegretta's avatar
Chris Allegretta committed
197
198
}

199
#ifndef NANO_SMALL
200
201
/* Create one new toggle structure, at the end of the toggles
 * linked list. */
David Lawrence Ramsey's avatar
David Lawrence Ramsey committed
202
void toggle_init_one(int val, const char *desc, int flag)
203
{
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
    toggle *u;

    if (toggles == NULL) {
	toggles = nmalloc(sizeof(toggle));
	u = toggles;
    } else {
	for (u = toggles; u->next != NULL; u = u->next)
	    ;
	u->next = nmalloc(sizeof(toggle));
	u = u->next;
    }

    u->val = val;
    u->desc = desc;
    u->flag = flag;
    u->next = NULL;
220
221
}

David Lawrence Ramsey's avatar
David Lawrence Ramsey committed
222
void toggle_init(void)
223
224
{
    char *toggle_const_msg, *toggle_autoindent_msg, *toggle_suspend_msg,
225
	*toggle_nohelp_msg, *toggle_cuttoend_msg,
226
227
228
229
230
	*toggle_noconvert_msg, *toggle_dos_msg, *toggle_mac_msg,
	*toggle_backup_msg, *toggle_smooth_msg;
#if !defined(DISABLE_MOUSE) && defined(NCURSES_MOUSE_VERSION)
    char *toggle_mouse_msg;
#endif
Chris Allegretta's avatar
Chris Allegretta committed
231
232
233
#ifndef DISABLE_WRAPPING
    char *toggle_wrap_msg;
#endif
234
235
236
#ifdef ENABLE_MULTIBUFFER
    char *toggle_load_msg;
#endif
237
238
239
#ifdef ENABLE_COLOR
    char *toggle_syntax_msg;
#endif
240

241
    /* There is no need to reinitialize the toggles.  They can't
Chris Allegretta's avatar
Chris Allegretta committed
242
       change. */
243
244
245
    if (toggles != NULL)
	return;

246
    toggle_const_msg = _("Constant cursor position");
247
    toggle_autoindent_msg = _("Auto indent");
248
    toggle_suspend_msg = _("Suspend");
249
    toggle_nohelp_msg = _("Help mode");
250
#if !defined(DISABLE_MOUSE) && defined(NCURSES_MOUSE_VERSION)
251
    toggle_mouse_msg = _("Mouse support");
252
#endif
253
    toggle_cuttoend_msg = _("Cut to end");
254
255
256
    toggle_noconvert_msg = _("No conversion from DOS/Mac format");
    toggle_dos_msg = _("Writing file in DOS format");
    toggle_mac_msg = _("Writing file in Mac format");
257
    toggle_backup_msg = _("Backing up file");
258
    toggle_smooth_msg = _("Smooth scrolling");
259
260
261
#ifdef ENABLE_COLOR
    toggle_syntax_msg = _("Color syntax highlighting");
#endif
Chris Allegretta's avatar
Chris Allegretta committed
262
#ifndef DISABLE_WRAPPING
263
    toggle_wrap_msg = _("Auto wrap");
Chris Allegretta's avatar
Chris Allegretta committed
264
#endif
265
266
#ifdef ENABLE_MULTIBUFFER
    toggle_load_msg = _("Multiple file buffers");
267
268
#endif

269
270
271
272
    toggle_init_one(TOGGLE_CONST_KEY, toggle_const_msg, CONSTUPDATE);
    toggle_init_one(TOGGLE_AUTOINDENT_KEY, toggle_autoindent_msg, AUTOINDENT);
    toggle_init_one(TOGGLE_SUSPEND_KEY, toggle_suspend_msg, SUSPEND);
    toggle_init_one(TOGGLE_NOHELP_KEY, toggle_nohelp_msg, NO_HELP);
Chris Allegretta's avatar
Chris Allegretta committed
273
#ifndef DISABLE_WRAPPING
274
    toggle_init_one(TOGGLE_WRAP_KEY, toggle_wrap_msg, NO_WRAP);
Chris Allegretta's avatar
Chris Allegretta committed
275
#endif
276
#if !defined(DISABLE_MOUSE) && defined(NCURSES_MOUSE_VERSION)
277
    toggle_init_one(TOGGLE_MOUSE_KEY, toggle_mouse_msg, USE_MOUSE);
278
#endif
279
280
281
    toggle_init_one(TOGGLE_CUTTOEND_KEY, toggle_cuttoend_msg, CUT_TO_END);
#ifdef ENABLE_MULTIBUFFER
    toggle_init_one(TOGGLE_LOAD_KEY, toggle_load_msg, MULTIBUFFER);
282
#endif
283
284
285
    toggle_init_one(TOGGLE_NOCONVERT_KEY, toggle_noconvert_msg, NO_CONVERT);
    toggle_init_one(TOGGLE_DOS_KEY, toggle_dos_msg, DOS_FILE);
    toggle_init_one(TOGGLE_MAC_KEY, toggle_mac_msg, MAC_FILE);
286
    toggle_init_one(TOGGLE_BACKUP_KEY, toggle_backup_msg, BACKUP_FILE);
287
    toggle_init_one(TOGGLE_SMOOTH_KEY, toggle_smooth_msg, SMOOTHSCROLL);
288
289
290
#ifdef ENABLE_COLOR
    toggle_init_one(TOGGLE_SYNTAX_KEY, toggle_syntax_msg, COLOR_SYNTAX);
#endif
291
}
292
293
294
295
296
297
298
299
300
301
302
303
304

#ifdef DEBUG
/* Deallocate all of the toggles. */
void free_toggles(void)
{
    while (toggles != NULL) {
	toggle *pt = toggles;	/* Think "previous toggle" */

	toggles = toggles->next;
	free(pt);
    }
}
#endif
305
#endif /* !NANO_SMALL */
306
307

/* Deallocate the given shortcut. */
David Lawrence Ramsey's avatar
David Lawrence Ramsey committed
308
void free_shortcutage(shortcut **shortcutage)
309
310
{
    assert(shortcutage != NULL);
Chris Allegretta's avatar
Chris Allegretta committed
311
312
313
    while (*shortcutage != NULL) {
	shortcut *ps = *shortcutage;
	*shortcutage = (*shortcutage)->next;
314
315
	free(ps);
    }
316
317
}

318
void shortcut_init(int unjustify)
Chris Allegretta's avatar
Chris Allegretta committed
319
{
320
#ifndef DISABLE_HELP
321
    const char *nano_help_msg = "", *nano_writeout_msg = "", *nano_exit_msg =
322
323
324
325
326
	"", *nano_goto_msg = "", *nano_justify_msg =
	"", *nano_replace_msg = "", *nano_insert_msg =
	"", *nano_whereis_msg = "", *nano_prevpage_msg =
	"", *nano_nextpage_msg = "", *nano_cut_msg =
	"", *nano_uncut_msg = "", *nano_cursorpos_msg =
Chris Allegretta's avatar
Chris Allegretta committed
327
328
329
330
331
332
	"", *nano_spell_msg = "", *nano_up_msg = "", *nano_down_msg =
	"", *nano_forward_msg = "", *nano_back_msg = "", *nano_home_msg =
	"", *nano_end_msg = "", *nano_firstline_msg =
	"", *nano_lastline_msg = "", *nano_refresh_msg =
	"", *nano_mark_msg = "", *nano_delete_msg =
	"", *nano_backspace_msg = "", *nano_tab_msg =
333
	"", *nano_enter_msg = "", *nano_cancel_msg =
334
	"", *nano_unjustify_msg = "", *nano_append_msg =
335
336
337
338
	"", *nano_prepend_msg = "", *nano_tofiles_msg =
	"", *nano_gotodir_msg = "", *nano_case_msg =
	"", *nano_reverse_msg = "", *nano_execute_msg =
	"", *nano_dos_msg = "", *nano_mac_msg =
339
	"", *nano_backup_msg = "", *nano_editstr_msg = "";
Chris Allegretta's avatar
Chris Allegretta committed
340

Chris Allegretta's avatar
Chris Allegretta committed
341
#ifdef ENABLE_MULTIBUFFER
342
    const char *nano_openprev_msg = "", *nano_opennext_msg =
343
	"", *nano_multibuffer_msg = "";
Chris Allegretta's avatar
Chris Allegretta committed
344
#endif
345
#ifdef HAVE_REGEX_H
346
    const char *nano_regexp_msg = "", *nano_bracket_msg = "";
347
#endif
348

Chris Allegretta's avatar
Chris Allegretta committed
349
350
    nano_help_msg = _("Invoke the help menu");
    nano_writeout_msg = _("Write the current file to disk");
351
#ifdef ENABLE_MULTIBUFFER
352
353
    nano_exit_msg = _("Close currently loaded file/Exit from nano");
#else
Chris Allegretta's avatar
Chris Allegretta committed
354
    nano_exit_msg = _("Exit from nano");
355
#endif
356
    nano_goto_msg = _("Go to a specific line number");
Chris Allegretta's avatar
Chris Allegretta committed
357
    nano_justify_msg = _("Justify the current paragraph");
358
    nano_unjustify_msg = _("Unjustify after a justify");
Chris Allegretta's avatar
Chris Allegretta committed
359
360
361
362
363
364
365
    nano_replace_msg = _("Replace text within the editor");
    nano_insert_msg = _("Insert another file into the current one");
    nano_whereis_msg = _("Search for text within the editor");
    nano_prevpage_msg = _("Move to the previous screen");
    nano_nextpage_msg = _("Move to the next screen");
    nano_cut_msg = _("Cut the current line and store it in the cutbuffer");
    nano_uncut_msg = _("Uncut from the cutbuffer into the current line");
366
    nano_cursorpos_msg = _("Show the position of the cursor");
367
    nano_spell_msg = _("Invoke the spell checker, if available");
Chris Allegretta's avatar
Chris Allegretta committed
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
    nano_up_msg = _("Move up one line");
    nano_down_msg = _("Move down one line");
    nano_forward_msg = _("Move forward one character");
    nano_back_msg = _("Move back one character");
    nano_home_msg = _("Move to the beginning of the current line");
    nano_end_msg = _("Move to the end of the current line");
    nano_firstline_msg = _("Go to the first line of the file");
    nano_lastline_msg = _("Go to the last line of the file");
    nano_refresh_msg = _("Refresh (redraw) the current screen");
    nano_mark_msg = _("Mark text at the current cursor location");
    nano_delete_msg = _("Delete the character under the cursor");
    nano_backspace_msg =
	_("Delete the character to the left of the cursor");
    nano_tab_msg = _("Insert a tab character");
    nano_enter_msg = _("Insert a carriage return at the cursor position");
    nano_case_msg =
	_("Make the current search or replace case (in)sensitive");
Chris Allegretta's avatar
Chris Allegretta committed
385
    nano_tofiles_msg = _("Go to file browser");
386
    nano_execute_msg = _("Execute external command");
387
    nano_gotodir_msg = _("Go to directory");
Chris Allegretta's avatar
Chris Allegretta committed
388
    nano_cancel_msg = _("Cancel the current function");
389
    nano_append_msg = _("Append to the current file");
390
    nano_prepend_msg = _("Prepend to the current file");
391
    nano_reverse_msg = _("Search backwards");
392
393
    nano_dos_msg = _("Write file out in DOS format");
    nano_mac_msg = _("Write file out in Mac format");
394
    nano_backup_msg = _("Back up original file when saving");
395
    nano_editstr_msg = _("Edit the previous search/replace strings");
396
#ifdef HAVE_REGEX_H
397
    nano_regexp_msg = _("Use regular expressions");
398
    nano_bracket_msg = _("Find other bracket");
399
#endif
400
401
402
#ifdef ENABLE_MULTIBUFFER
    nano_openprev_msg = _("Open previously loaded file");
    nano_opennext_msg = _("Open next loaded file");
403
    nano_multibuffer_msg = _("Toggle insert into new buffer");
Chris Allegretta's avatar
Chris Allegretta committed
404
#endif
405
#endif /* !DISABLE_HELP */
Chris Allegretta's avatar
Chris Allegretta committed
406

407
    free_shortcutage(&main_list);
408

409
410
411
412
413
414
415
416
417
418
/* The following macro is to be used in calling sc_init_one.  The point is
 * that sc_init_one takes 9 arguments, unless DISABLE_HELP is defined,
 * when the fourth one should not be there. */
#ifdef DISABLE_HELP
#  define IFHELP(help, nextvar) nextvar
#else
#  define IFHELP(help, nextvar) help, nextvar
#endif

    sc_init_one(&main_list, NANO_HELP_KEY, _("Get Help"),
419
		IFHELP(nano_help_msg, 0), NANO_HELP_FKEY, 0, VIEW,
420
		do_help);
Chris Allegretta's avatar
Chris Allegretta committed
421

422
#ifdef ENABLE_MULTIBUFFER
423
    if (open_files != NULL && (open_files->prev != NULL || open_files->next != NULL))
424
	sc_init_one(&main_list, NANO_EXIT_KEY, _("Close"),
425
		IFHELP(nano_exit_msg, 0), NANO_EXIT_FKEY, 0, VIEW,
426
		do_exit);
427
428
    else
#endif
429

430
	sc_init_one(&main_list, NANO_EXIT_KEY, _("Exit"),
431
		IFHELP(nano_exit_msg, 0), NANO_EXIT_FKEY, 0, VIEW,
432
		do_exit);
Chris Allegretta's avatar
Chris Allegretta committed
433

434
    sc_init_one(&main_list, NANO_WRITEOUT_KEY, _("WriteOut"),
435
436
		    IFHELP(nano_writeout_msg, 0),
		    NANO_WRITEOUT_FKEY, 0, NOVIEW, do_writeout_void);
Chris Allegretta's avatar
Chris Allegretta committed
437

438
    sc_init_one(&main_list, NANO_JUSTIFY_KEY, _("Justify"),
439
		    IFHELP(nano_justify_msg, 0), NANO_JUSTIFY_FKEY, 0,
440
		    NOVIEW, do_justify);
441

442
443
#ifdef ENABLE_MULTIBUFFER
	/* this is so we can view multiple files */
444
     sc_init_one(&main_list, NANO_INSERTFILE_KEY, _("Read File"),
445
446
		IFHELP(nano_insert_msg, 0),
		NANO_INSERTFILE_FKEY, 0, VIEW, do_insertfile_void);
447
#else
448
     sc_init_one(&main_list, NANO_INSERTFILE_KEY, _("Read File"),
449
450
		IFHELP(nano_insert_msg, 0),
		NANO_INSERTFILE_FKEY, 0, NOVIEW, do_insertfile_void);
451
#endif
Chris Allegretta's avatar
Chris Allegretta committed
452

453
    sc_init_one(&main_list, NANO_WHEREIS_KEY, _("Where Is"),
454
455
		IFHELP(nano_whereis_msg, 0),
		NANO_WHEREIS_FKEY, 0, VIEW, do_search);
Chris Allegretta's avatar
Chris Allegretta committed
456

457
    sc_init_one(&main_list, NANO_PREVPAGE_KEY, _("Prev Page"),
458
459
		IFHELP(nano_prevpage_msg, 0),
		NANO_PREVPAGE_FKEY, KEY_PPAGE, VIEW, do_page_up);
Chris Allegretta's avatar
Chris Allegretta committed
460

461
    sc_init_one(&main_list, NANO_NEXTPAGE_KEY, _("Next Page"),
462
463
		IFHELP(nano_nextpage_msg, 0),
		NANO_NEXTPAGE_FKEY, KEY_NPAGE, VIEW, do_page_down);
Chris Allegretta's avatar
Chris Allegretta committed
464

465
    sc_init_one(&main_list, NANO_CUT_KEY, _("Cut Text"),
466
467
		IFHELP(nano_cut_msg, 0),
		NANO_CUT_FKEY, 0, NOVIEW, do_cut_text);
Chris Allegretta's avatar
Chris Allegretta committed
468

469
    if (unjustify)
470
	sc_init_one(&main_list, NANO_UNJUSTIFY_KEY, _("UnJustify"),
471
472
		IFHELP(nano_unjustify_msg, 0),
		0, 0, NOVIEW, do_uncut_text);
473
    else
474
	sc_init_one(&main_list, NANO_UNCUT_KEY, _("UnCut Txt"),
475
476
		IFHELP(nano_uncut_msg, 0),
		NANO_UNCUT_FKEY, 0, NOVIEW, do_uncut_text);
Chris Allegretta's avatar
Chris Allegretta committed
477

478
    sc_init_one(&main_list, NANO_CURSORPOS_KEY, _("Cur Pos"),
479
480
		IFHELP(nano_cursorpos_msg, 0),
		NANO_CURSORPOS_FKEY, 0, VIEW, do_cursorpos_void);
Chris Allegretta's avatar
Chris Allegretta committed
481

482
    sc_init_one(&main_list, NANO_SPELL_KEY, _("To Spell"),
483
484
		IFHELP(nano_spell_msg, 0),
		NANO_SPELL_FKEY, 0, NOVIEW, do_spell);
Chris Allegretta's avatar
Chris Allegretta committed
485

486
    sc_init_one(&main_list, NANO_UP_KEY, _("Up"),
487
488
		IFHELP(nano_up_msg, 0),
		KEY_UP, 0, VIEW, do_up);
Chris Allegretta's avatar
Chris Allegretta committed
489

490
    sc_init_one(&main_list, NANO_DOWN_KEY, _("Down"),
491
492
		IFHELP(nano_down_msg, 0),
		KEY_DOWN, 0, VIEW, do_down);
Chris Allegretta's avatar
Chris Allegretta committed
493

494
    sc_init_one(&main_list, NANO_FORWARD_KEY, _("Forward"),
495
496
		IFHELP(nano_forward_msg, 0),
		KEY_RIGHT, 0, VIEW, do_right);
Chris Allegretta's avatar
Chris Allegretta committed
497

498
    sc_init_one(&main_list, NANO_BACK_KEY, _("Back"),
499
500
		IFHELP(nano_back_msg, 0),
		KEY_LEFT, 0, VIEW, do_left);
Chris Allegretta's avatar
Chris Allegretta committed
501

502
    sc_init_one(&main_list, NANO_HOME_KEY, _("Home"),
503
504
		IFHELP(nano_home_msg, 0),
		KEY_HOME, 362, VIEW, do_home);
Chris Allegretta's avatar
Chris Allegretta committed
505

506
    sc_init_one(&main_list, NANO_END_KEY, _("End"),
507
508
		IFHELP(nano_end_msg, 0),
		KEY_END, 385, VIEW, do_end);
Chris Allegretta's avatar
Chris Allegretta committed
509

510
    sc_init_one(&main_list, NANO_REFRESH_KEY, _("Refresh"),
511
512
		IFHELP(nano_refresh_msg, 0),
		0, 0, VIEW, total_refresh);
Chris Allegretta's avatar
Chris Allegretta committed
513

514
    sc_init_one(&main_list, NANO_MARK_KEY, _("Mark Text"),
515
516
		IFHELP(nano_mark_msg, NANO_ALT_MARK_KEY),
		0, 0, NOVIEW, do_mark);
Chris Allegretta's avatar
Chris Allegretta committed
517

518
    sc_init_one(&main_list, NANO_DELETE_KEY, _("Delete"),
519
		IFHELP(nano_delete_msg, 0), KEY_DC,
Chris Allegretta's avatar
Chris Allegretta committed
520
521
		NANO_CONTROL_D, NOVIEW, do_delete);

522
    sc_init_one(&main_list, NANO_BACKSPACE_KEY, _("Backspace"),
523
		IFHELP(nano_backspace_msg, 0),
Chris Allegretta's avatar
Chris Allegretta committed
524
525
		KEY_BACKSPACE, 127, NOVIEW, do_backspace);

526
    sc_init_one(&main_list, NANO_TAB_KEY, _("Tab"),
527
		IFHELP(nano_tab_msg, 0), 0, 0, NOVIEW, do_tab);
Chris Allegretta's avatar
Chris Allegretta committed
528

529
    sc_init_one(&main_list, NANO_REPLACE_KEY, _("Replace"),
530
531
		    IFHELP(nano_replace_msg, NANO_ALT_REPLACE_KEY),
		    NANO_REPLACE_FKEY, 0, NOVIEW, do_replace);
Chris Allegretta's avatar
Chris Allegretta committed
532

533
    sc_init_one(&main_list, NANO_ENTER_KEY, _("Enter"),
534
		IFHELP(nano_enter_msg, 0),
Chris Allegretta's avatar
Chris Allegretta committed
535
		KEY_ENTER, NANO_CONTROL_M, NOVIEW, do_enter);
Chris Allegretta's avatar
Chris Allegretta committed
536

537
    sc_init_one(&main_list, NANO_GOTO_KEY, _("Go To Line"),
538
539
		    IFHELP(nano_goto_msg, NANO_ALT_GOTO_KEY),
		    NANO_GOTO_FKEY, 0, VIEW, do_gotoline_void);
540

541
542
543
#ifndef NANO_SMALL
    sc_init_one(&main_list, NANO_NEXTWORD_KEY, _("Next Word"),
		IFHELP(_("Move forward one word"), 0),
Chris Allegretta's avatar
Chris Allegretta committed
544
		0, 0, VIEW, do_next_word);
545
546
547

    sc_init_one(&main_list, -9, _("Prev Word"),
		IFHELP(_("Move backward one word"), NANO_PREVWORD_KEY), 0, 0,
Chris Allegretta's avatar
Chris Allegretta committed
548
		VIEW, do_prev_word);
549
#endif
550
#if !defined(NANO_SMALL) && defined(HAVE_REGEX_H)
551
    sc_init_one(&main_list, -9, _("Find Other Bracket"),
552
553
		    IFHELP(nano_bracket_msg, NANO_BRACKET_KEY),
		    0, 0, VIEW, do_find_bracket);
554
#endif
555
556
#ifdef ENABLE_MULTIBUFFER
    sc_init_one(&main_list, -9, _("Previous File"),
557
558
		    IFHELP(nano_openprev_msg, NANO_OPENPREV_KEY),
		    0, 0, VIEW, open_prevfile_void);
559
    sc_init_one(&main_list, -9, _("Next File"),
560
561
		    IFHELP(nano_opennext_msg, NANO_OPENNEXT_KEY),
		    0, 0, VIEW, open_nextfile_void);
562
#endif
563

564
    free_shortcutage(&whereis_list);
565

566
567
    sc_init_one(&whereis_list, NANO_HELP_KEY, _("Get Help"),
		IFHELP(nano_help_msg, 0), 0, 0, VIEW, do_help);
568

569
570
    sc_init_one(&whereis_list, NANO_CANCEL_KEY, _("Cancel"),
		IFHELP(nano_cancel_msg, 0), 0, 0, VIEW, 0);
571

572
    sc_init_one(&whereis_list, NANO_FIRSTLINE_KEY, _("First Line"),
573
574
		IFHELP(nano_firstline_msg, 0),
		0, 0, VIEW, do_first_line);
Chris Allegretta's avatar
Chris Allegretta committed
575

576
    sc_init_one(&whereis_list, NANO_LASTLINE_KEY, _("Last Line"),
577
		IFHELP(nano_lastline_msg, 0), 0, 0, VIEW, do_last_line);
Chris Allegretta's avatar
Chris Allegretta committed
578

579
    sc_init_one(&whereis_list, NANO_OTHERSEARCH_KEY, _("Replace"),
580
		IFHELP(nano_replace_msg, 0), 0, 0, VIEW, do_replace);
Chris Allegretta's avatar
Chris Allegretta committed
581

Chris Allegretta's avatar
Chris Allegretta committed
582
    sc_init_one(&whereis_list, NANO_FROMSEARCHTOGOTO_KEY, _("Go To Line"),
583
		IFHELP(nano_goto_msg, 0), 0, 0, VIEW, do_gotoline_void);
584

585
#ifndef NANO_SMALL
586
    sc_init_one(&whereis_list, TOGGLE_CASE_KEY, _("Case Sens"),
587
		IFHELP(nano_case_msg, 0), 0, 0, VIEW, 0);
588

589
    sc_init_one(&whereis_list, TOGGLE_BACKWARDS_KEY, _("Direction"),
590
		IFHELP(nano_reverse_msg, 0), 0, 0, VIEW, 0);
Chris Allegretta's avatar
Chris Allegretta committed
591

592
#ifdef HAVE_REGEX_H
593
594
    sc_init_one(&whereis_list, TOGGLE_REGEXP_KEY, _("Regexp"),
		IFHELP(nano_regexp_msg, 0), 0, 0, VIEW, 0);
595
#endif
596
597
598

#ifndef NANO_SMALL
    sc_init_one(&whereis_list, KEY_UP, _("History"),
Chris Allegretta's avatar
Chris Allegretta committed
599
		IFHELP(nano_editstr_msg, 0), NANO_UP_KEY, 0, VIEW, 0);
600
601
#endif

602
#endif /* !NANO_SMALL */
603

604
    free_shortcutage(&replace_list);
605

606
607
    sc_init_one(&replace_list, NANO_HELP_KEY, _("Get Help"),
		IFHELP(nano_help_msg, 0), 0, 0, VIEW, do_help);
608

609
610
    sc_init_one(&replace_list, NANO_CANCEL_KEY, _("Cancel"),
		IFHELP(nano_cancel_msg, 0), 0, 0, VIEW, 0);
Chris Allegretta's avatar
Chris Allegretta committed
611

612
    sc_init_one(&replace_list, NANO_FIRSTLINE_KEY, _("First Line"),
613
		IFHELP(nano_firstline_msg, 0), 0, 0, VIEW, do_first_line);
Chris Allegretta's avatar
Chris Allegretta committed
614

615
    sc_init_one(&replace_list, NANO_LASTLINE_KEY, _("Last Line"),
616
		IFHELP(nano_lastline_msg, 0), 0, 0, VIEW, do_last_line);
Chris Allegretta's avatar
Chris Allegretta committed
617

618
    sc_init_one(&replace_list, NANO_OTHERSEARCH_KEY, _("No Replace"),
619
		IFHELP(nano_whereis_msg, 0), 0, 0, VIEW, do_search);
Chris Allegretta's avatar
Chris Allegretta committed
620

621
    sc_init_one(&replace_list, NANO_FROMSEARCHTOGOTO_KEY, _("Go To Line"), 
622
		IFHELP(nano_goto_msg, 0), 0, 0, VIEW, do_gotoline_void);
623

624
#ifndef NANO_SMALL
625
    sc_init_one(&replace_list, TOGGLE_CASE_KEY, _("Case Sens"),
626
		IFHELP(nano_case_msg, 0), 0, 0, VIEW, 0);
627

628
    sc_init_one(&replace_list, TOGGLE_BACKWARDS_KEY, _("Direction"),
629
		IFHELP(nano_reverse_msg, 0), 0, 0, VIEW, 0);
630

631
#ifdef HAVE_REGEX_H
632
633
    sc_init_one(&replace_list, TOGGLE_REGEXP_KEY, _("Regexp"),
		IFHELP(nano_regexp_msg, 0), 0, 0, VIEW, 0);
634
#endif
635
636

    sc_init_one(&replace_list, KEY_UP, _("History"),
Chris Allegretta's avatar
Chris Allegretta committed
637
		IFHELP(nano_editstr_msg, 0), NANO_UP_KEY, 0, VIEW, 0);
638
#endif /* !NANO_SMALL */
639

640
    free_shortcutage(&replace_list_2);
641

642
643
    sc_init_one(&replace_list_2, NANO_HELP_KEY, _("Get Help"),
		IFHELP(nano_help_msg, 0), 0, 0, VIEW, do_help);
644

645
646
    sc_init_one(&replace_list_2, NANO_CANCEL_KEY, _("Cancel"),
		IFHELP(nano_cancel_msg, 0), 0, 0, VIEW, 0);
647

648
    sc_init_one(&replace_list_2, NANO_FIRSTLINE_KEY, _("First Line"),
649
		IFHELP(nano_firstline_msg, 0), 0, 0, VIEW, do_first_line);
650

651
    sc_init_one(&replace_list_2, NANO_LASTLINE_KEY, _("Last Line"),
652
		IFHELP(nano_lastline_msg, 0), 0, 0, VIEW, do_last_line);
653

654
655
#ifndef NANO_SMALL
    sc_init_one(&replace_list_2, KEY_UP, _("History"),
Chris Allegretta's avatar
Chris Allegretta committed
656
		IFHELP(nano_editstr_msg, 0), NANO_UP_KEY, 0, VIEW, 0);
657
658
#endif

659
    free_shortcutage(&goto_list);
Chris Allegretta's avatar
Chris Allegretta committed
660

661
662
    sc_init_one(&goto_list, NANO_HELP_KEY, _("Get Help"),
		IFHELP(nano_help_msg, 0), 0, 0, VIEW, do_help);
663

664
    sc_init_one(&goto_list, NANO_CANCEL_KEY, _("Cancel"),
665
		IFHELP(nano_cancel_msg, 0), 0, 0, VIEW, 0);
Chris Allegretta's avatar
Chris Allegretta committed
666

667
    sc_init_one(&goto_list, NANO_FIRSTLINE_KEY, _("First Line"),
Chris Allegretta's avatar
Chris Allegretta committed
668
		IFHELP(nano_firstline_msg, 0), 0, 0, VIEW, do_first_line);
Chris Allegretta's avatar
Chris Allegretta committed
669

670
    sc_init_one(&goto_list, NANO_LASTLINE_KEY, _("Last Line"),
Chris Allegretta's avatar
Chris Allegretta committed
671
		IFHELP(nano_lastline_msg, 0), 0, 0, VIEW, do_last_line);
Chris Allegretta's avatar
Chris Allegretta committed
672

Chris Allegretta's avatar
Chris Allegretta committed
673
#ifndef DISABLE_HELP
674
    free_shortcutage(&help_list);
Chris Allegretta's avatar
Chris Allegretta committed
675

676
    sc_init_one(&help_list, NANO_PREVPAGE_KEY, _("Prev Page"),
677
678
		IFHELP(nano_prevpage_msg, 0), NANO_PREVPAGE_FKEY,
		KEY_PPAGE, VIEW, do_page_up);
Chris Allegretta's avatar
Chris Allegretta committed
679

680
    sc_init_one(&help_list, NANO_NEXTPAGE_KEY, _("Next Page"),
681
682
		IFHELP(nano_nextpage_msg, 0),
		NANO_NEXTPAGE_FKEY, KEY_NPAGE, VIEW, do_page_down);
Chris Allegretta's avatar
Chris Allegretta committed
683

684
    sc_init_one(&help_list, NANO_EXIT_KEY, _("Exit"),
685
686
		IFHELP(nano_exit_msg, 0), NANO_EXIT_FKEY, 0, VIEW,
		do_exit);
Chris Allegretta's avatar
Chris Allegretta committed
687
#endif
Chris Allegretta's avatar
Chris Allegretta committed
688

689
    free_shortcutage(&writefile_list);
Chris Allegretta's avatar
Chris Allegretta committed
690

691
692
    sc_init_one(&writefile_list, NANO_HELP_KEY, _("Get Help"),
		IFHELP(nano_help_msg, 0), 0, 0, VIEW, do_help);
693

694
#ifndef DISABLE_BROWSER
695
    sc_init_one(&writefile_list, NANO_TOFILES_KEY, _("To Files"),
696
		IFHELP(nano_tofiles_msg, 0), 0, 0, NOVIEW, 0);
Chris Allegretta's avatar
Chris Allegretta committed
697
#endif
Chris Allegretta's avatar
Chris Allegretta committed
698

699
#ifndef NANO_SMALL
700
701
    sc_init_one(&writefile_list, TOGGLE_DOS_KEY, _("DOS Format"),
		IFHELP(nano_dos_msg, 0), 0, 0, NOVIEW, 0);
702

703
704
    sc_init_one(&writefile_list, TOGGLE_MAC_KEY, _("Mac Format"),
		IFHELP(nano_mac_msg, 0), 0, 0, NOVIEW, 0);
705
706
#endif

707
708
    sc_init_one(&writefile_list, NANO_APPEND_KEY, _("Append"),
		IFHELP(nano_append_msg, 0), 0, 0, NOVIEW, 0);
709

710
711
    sc_init_one(&writefile_list, NANO_PREPEND_KEY, _("Prepend"),
		IFHELP(nano_prepend_msg, 0), 0, 0, NOVIEW, 0);
712

713
714
715
716
717
#ifndef NANO_SMALL
    sc_init_one(&writefile_list, TOGGLE_BACKUP_KEY, _("Backup File"),
		IFHELP(nano_backup_msg, 0), 0, 0, NOVIEW, 0);
#endif

718
719
    sc_init_one(&writefile_list, NANO_CANCEL_KEY, _("Cancel"),
		IFHELP(nano_cancel_msg, 0), 0, 0, VIEW, 0);
720

721
    free_shortcutage(&insertfile_list);
722

723
724
    sc_init_one(&insertfile_list, NANO_HELP_KEY, _("Get Help"),
		IFHELP(nano_help_msg, 0), 0, 0, VIEW, do_help);
725

726
    sc_init_one(&insertfile_list, NANO_CANCEL_KEY, _("Cancel"),
727
		IFHELP(nano_cancel_msg, 0), 0, 0, VIEW, 0);
Chris Allegretta's avatar
Chris Allegretta committed
728

729
#ifndef DISABLE_BROWSER
730
    sc_init_one(&insertfile_list, NANO_TOFILES_KEY, _("To Files"),
731
		IFHELP(nano_tofiles_msg, 0), 0, 0, NOVIEW, 0);
732
#endif
733
734
#ifndef NANO_SMALL
    sc_init_one(&insertfile_list, NANO_EXTCMD_KEY, _("Execute Command"),
735
		IFHELP(nano_execute_msg, 0), 0, 0, NOVIEW, 0);
736
#ifdef ENABLE_MULTIBUFFER
737
    sc_init_one(&insertfile_list, TOGGLE_LOAD_KEY, _("New Buffer"),
738
		IFHELP(nano_multibuffer_msg, 0), 0, 0, NOVIEW, 0);
739
#endif
740
#endif
741

Chris Allegretta's avatar
Chris Allegretta committed
742
#ifndef DISABLE_SPELLER
743
    free_shortcutage(&spell_list);
Chris Allegretta's avatar
Chris Allegretta committed
744

745
746
    sc_init_one(&spell_list, NANO_HELP_KEY, _("Get Help"),
		IFHELP(nano_help_msg, 0), 0, 0, VIEW, do_help);
747

748
    sc_init_one(&spell_list, NANO_CANCEL_KEY, _("Cancel"),
749
		IFHELP(nano_cancel_msg, 0), 0, 0, VIEW, 0);
Chris Allegretta's avatar
Chris Allegretta committed
750
#endif
Chris Allegretta's avatar
Chris Allegretta committed
751

752
#ifndef NANO_SMALL
753
    free_shortcutage(&extcmd_list);
Chris Allegretta's avatar
Chris Allegretta committed
754

755
756
    sc_init_one(&extcmd_list, NANO_HELP_KEY, _("Get Help"),
		IFHELP(nano_help_msg, 0), 0, 0, VIEW, do_help);
757
758

    sc_init_one(&extcmd_list, NANO_CANCEL_KEY, _("Cancel"),
759
		IFHELP(nano_cancel_msg, 0), 0, 0, VIEW, 0);
760
#endif
761

762
#ifndef DISABLE_BROWSER
763
    free_shortcutage(&browser_list);
764

765
766
    sc_init_one(&browser_list, NANO_HELP_KEY, _("Get Help"),
		IFHELP(nano_help_msg, 0), 0, 0, VIEW, do_help);
767

768
769
    sc_init_one(&browser_list, NANO_CANCEL_KEY, _("Cancel"),
		IFHELP(nano_cancel_msg, 0), NANO_EXIT_FKEY, 0, VIEW, 0);
770

771
    sc_init_one(&browser_list, NANO_PREVPAGE_KEY, _("Prev Page"),
772
773
		IFHELP(nano_prevpage_msg, 0), NANO_PREVPAGE_FKEY,
		KEY_PPAGE, VIEW, 0);
Chris Allegretta's avatar
Chris Allegretta committed
774

775
    sc_init_one(&browser_list, NANO_NEXTPAGE_KEY, _("Next Page"),
776
777
		IFHELP(nano_nextpage_msg, 0), NANO_NEXTPAGE_FKEY,
		KEY_NPAGE, VIEW, 0);
Chris Allegretta's avatar
Chris Allegretta committed
778

779
    sc_init_one(&browser_list, NANO_GOTO_KEY, _("Go To Dir"),
780
781
		IFHELP(nano_gotodir_msg, NANO_ALT_GOTO_KEY),
		NANO_GOTO_FKEY, 0, VIEW, 0);
Rocco Corsi's avatar
   
Rocco Corsi committed
782

783
    free_shortcutage(&gotodir_list);
784

785
786
    sc_init_one(&gotodir_list, NANO_HELP_KEY, _("Get Help"),
		IFHELP(nano_help_msg, 0), 0, 0, VIEW, do_help);
Chris Allegretta's avatar
Chris Allegretta committed
787

788
    sc_init_one(&gotodir_list, NANO_CANCEL_KEY, _("Cancel"),
789
		IFHELP(nano_cancel_msg, 0), 0, 0, VIEW, 0);
Chris Allegretta's avatar
Chris Allegretta committed
790
791
#endif

792
#if !defined(DISABLE_BROWSER) || !defined(DISABLE_HELP) || (!defined(DISABLE_MOUSE) && defined(NCURSES_MOUSE_VERSION))
793
794
    currshortcut = main_list;
#endif
795
#ifndef NANO_SMALL
796
    toggle_init();
797
#endif
798
}
799

800
801
802
/* This function is called just before calling exit().  Practically, the
 * only effect is to cause a segmentation fault if the various data
 * structures got bolloxed earlier.  Thus, we don't bother having this
Chris Allegretta's avatar
Chris Allegretta committed
803
 * function unless debugging is turned on. */
804
#ifdef DEBUG
805
/* added by SPK for memory cleanup, gracefully return our malloc()s */
Chris Allegretta's avatar
Chris Allegretta committed
806
void thanks_for_all_the_fish(void)
807
{
Chris Allegretta's avatar
Chris Allegretta committed
808
809
810
811
#ifndef DISABLE_JUSTIFY
    if (quotestr != NULL)
	free(quotestr);
#endif
Chris Allegretta's avatar
Chris Allegretta committed
812
#ifndef DISABLE_OPERATINGDIR
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
    if (operating_dir != NULL)
	free(operating_dir);
    if (full_operating_dir != NULL)
	free(full_operating_dir);
#endif
    if (last_search != NULL)
	free(last_search);
    if (last_replace != NULL)
	free(last_replace);
    if (hblank != NULL)
	free(hblank);
#ifndef DISABLE_SPELLER
    if (alt_speller != NULL)
	free(alt_speller);
#endif
828
#ifndef DISABLE_HELP
829
830
    if (help_text != NULL)
	free(help_text);
831
#endif
832
833
834
835
836
    if (filename != NULL)
	free(filename);
    if (answer != NULL)
	free(answer);
    if (cutbuffer != NULL)
Chris Allegretta's avatar
Chris Allegretta committed
837
	free_filestruct(cutbuffer);
838
839
840
841
842

    free_shortcutage(&main_list);
    free_shortcutage(&whereis_list);
    free_shortcutage(&replace_list);
    free_shortcutage(&replace_list_2);
Chris Allegretta's avatar
Chris Allegretta committed
843
    free_shortcutage(&goto_list);
844
845
    free_shortcutage(&writefile_list);
    free_shortcutage(&insertfile_list);
Chris Allegretta's avatar
Chris Allegretta committed
846
#ifndef DISABLE_HELP
Chris Allegretta's avatar
Chris Allegretta committed
847
    free_shortcutage(&help_list);
Chris Allegretta's avatar
Chris Allegretta committed
848
849
#endif
#ifndef DISABLE_SPELLER
850
    free_shortcutage(&spell_list);
Chris Allegretta's avatar
Chris Allegretta committed
851
#endif
Chris Allegretta's avatar
Chris Allegretta committed
852
853
854
#ifndef NANO_SMALL
    free_shortcutage(&extcmd_list);
#endif
855
856
#ifndef DISABLE_BROWSER
    free_shortcutage(&browser_list);
Chris Allegretta's avatar
Chris Allegretta committed
857
    free_shortcutage(&gotodir_list);
858
859
860
861
862
863
864
#endif

#ifndef NANO_SMALL
    free_toggles();
#endif

#ifdef ENABLE_MULTIBUFFER
865
    if (open_files != NULL) {
866
	/* We free the memory associated with each open file. */
867
868
	while (open_files->prev != NULL)
	    open_files = open_files->prev;
Chris Allegretta's avatar
Chris Allegretta committed
869
	free_openfilestruct(open_files);
870
    }
871
#else
872
    free_filestruct(fileage);
873
#endif
Chris Allegretta's avatar
Chris Allegretta committed
874
875
876
877
878
879
880
881
882
883
884

#ifdef ENABLE_COLOR
    free(syntaxstr);
    while (syntaxes != NULL) {
	syntaxtype *bill = syntaxes;

	free(syntaxes->desc);
	while (syntaxes->extensions != NULL) {
	    exttype *bob = syntaxes->extensions;

	    syntaxes->extensions = bob->next;
Chris Allegretta's avatar
Chris Allegretta committed
885
	    regfree(&bob->val);
Chris Allegretta's avatar
Chris Allegretta committed
886
887
888
889
890
891
	    free(bob);
	}
	while (syntaxes->color != NULL) {
	    colortype *bob = syntaxes->color;

	    syntaxes->color = bob->next;
Chris Allegretta's avatar
Chris Allegretta committed
892
893
	    regfree(&bob->start);
	    if (bob->end != NULL)
894
895
		regfree(bob->end);
	    free(bob->end);
Chris Allegretta's avatar
Chris Allegretta committed
896
897
898
899
900
901
	    free(bob);
	}
	syntaxes = syntaxes->next;
	free(bill);
    }
#endif /* ENABLE_COLOR */
902
903
904
905
906
#ifndef NANO_SMALL
    /* free history lists */
    free_history(&search_history);
    free_history(&replace_history);
#endif
907
}
908
#endif /* DEBUG */