global.c 28.3 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-2002 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 <assert.h>
25
#include <sys/stat.h>
Chris Allegretta's avatar
Chris Allegretta committed
26
#include "proto.h"
David Lawrence Ramsey's avatar
David Lawrence Ramsey committed
27
#include "nano.h"
Chris Allegretta's avatar
Chris Allegretta committed
28

29
#ifdef ENABLE_NLS
Chris Allegretta's avatar
Chris Allegretta committed
30
31
32
33
34
35
36
37
38
#include <libintl.h>
#define _(string) gettext(string)
#else
#define _(string) (string)
#endif

/*
 * Global variables
 */
39

Chris Allegretta's avatar
Chris Allegretta committed
40
41
42
43
44
45
/* 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? */

46
int flags = 0;			/* Our new flag containing many options */
David Lawrence Ramsey's avatar
David Lawrence Ramsey committed
47
WINDOW *edit;			/* The file portion of the editor */
Chris Allegretta's avatar
Chris Allegretta committed
48
49
WINDOW *topwin;			/* Top line of screen */
WINDOW *bottomwin;		/* Bottom buffer */
Chris Allegretta's avatar
Chris Allegretta committed
50
char *filename = NULL;		/* Name of the file */
51
52
53
54
55

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

Chris Allegretta's avatar
Chris Allegretta committed
56
57
58
59
60
61
62
63
64
65
66
67
68
69
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 */

70
#ifdef ENABLE_MULTIBUFFER
71
openfilestruct *open_files = NULL;	/* The list of open files */
72
73
#endif

74
#ifndef DISABLE_JUSTIFY
Chris Allegretta's avatar
Chris Allegretta committed
75
76
77
#ifdef HAVE_REGEX_H
char *quotestr = "^([ \t]*[|>:}#])+";
#else
78
79
char *quotestr = "> ";		/* Quote string */
#endif
Chris Allegretta's avatar
Chris Allegretta committed
80
#endif
81

Chris Allegretta's avatar
Chris Allegretta committed
82
char *answer = NULL;		/* Answer str to many questions */
Chris Allegretta's avatar
Chris Allegretta committed
83
int totlines = 0;		/* Total number of lines in the file */
84
long totsize = 0;		/* Total number of bytes in the file */
85
int placewewant = 0;		/* The column we'd like the cursor
Chris Allegretta's avatar
Chris Allegretta committed
86
87
88
				   to jump to when we go to the
				   next or previous line */

89
90
int tabsize = 8;		/* Our internal tabsize variable */

Chris Allegretta's avatar
Chris Allegretta committed
91
char *hblank;			/* A horizontal blank line */
Chris Allegretta's avatar
Chris Allegretta committed
92
#ifndef DISABLE_HELP
Chris Allegretta's avatar
Chris Allegretta committed
93
char *help_text;		/* The text in the help window */
Chris Allegretta's avatar
Chris Allegretta committed
94
#endif
Chris Allegretta's avatar
Chris Allegretta committed
95
96
97
98
99
100

/* More stuff for the marker select */

filestruct *mark_beginbuf;	/* the begin marker buffer */
int mark_beginx;		/* X value in the string to start */

101
#ifndef DISABLE_OPERATINGDIR
102
103
char *operating_dir = NULL;	/* Operating directory, which we can't */
char *full_operating_dir = NULL;/* go higher than */
104
105
#endif

106
#ifndef DISABLE_SPELLER
107
char *alt_speller = NULL;		/* Alternative spell command */
108
109
#endif

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

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

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

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

141
142
/* Regular expressions */

143
#ifdef HAVE_REGEX_H
144
145
146
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
147
#endif
148
#ifdef ENABLE_COLOR
Chris Allegretta's avatar
Chris Allegretta committed
149
150
regex_t color_regexp;          /* Global to store compiled search regexp */
regmatch_t colormatches[1];    /* Match positions for parenthetical */
151

Chris Allegretta's avatar
Chris Allegretta committed
152
153
regex_t syntaxfile_regexp;     /* Global to store compiled search regexp */
regmatch_t synfilematches[1];  /* Match positions for parenthetical */
154
155
#endif /* ENABLE_COLOR */

156

157
int length_of_list(const shortcut *s) 
158
159
{
    int i = 0;
160
    for (; s != NULL; s = s->next)
161
162
163
164
	i++;
    return i;
}

Chris Allegretta's avatar
Chris Allegretta committed
165
/* Initialize a struct *without* our lovely braces =( */
David Lawrence Ramsey's avatar
David Lawrence Ramsey committed
166
void sc_init_one(shortcut **shortcutage, int key, const char *desc,
167
#ifndef DISABLE_HELP
David Lawrence Ramsey's avatar
David Lawrence Ramsey committed
168
	const char *help,
169
#endif
David Lawrence Ramsey's avatar
David Lawrence Ramsey committed
170
	int alt, int misc1, int misc2, int view, int (*func) (void))
Chris Allegretta's avatar
Chris Allegretta committed
171
{
172
173
174
175
176
177
178
179
180
181
182
183
    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
184
185
    s->val = key;
    s->desc = desc;
186
#ifndef DISABLE_HELP
Chris Allegretta's avatar
Chris Allegretta committed
187
    s->help = help;
188
#endif
Chris Allegretta's avatar
Chris Allegretta committed
189
190
191
192
193
    s->altval = alt;
    s->misc1 = misc1;
    s->misc2 = misc2;
    s->viewok = view;
    s->func = func;
194
    s->next = NULL;
Chris Allegretta's avatar
Chris Allegretta committed
195
196
}

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

220
#ifdef DEBUG
Chris Allegretta's avatar
Chris Allegretta committed
221
/* Deallocate all of the toggles. */
David Lawrence Ramsey's avatar
David Lawrence Ramsey committed
222
void free_toggles(void)
223
224
{
    while (toggles != NULL) {
Chris Allegretta's avatar
Chris Allegretta committed
225
226
	toggle *pt = toggles;	/* Think "previous toggle" */

227
228
229
230
	toggles = toggles->next;
	free(pt);
    }
}
231
#endif
232

David Lawrence Ramsey's avatar
David Lawrence Ramsey committed
233
void toggle_init(void)
234
235
236
{
    char *toggle_const_msg, *toggle_autoindent_msg, *toggle_suspend_msg,
	*toggle_nohelp_msg, *toggle_picomode_msg, *toggle_mouse_msg,
Chris Allegretta's avatar
Chris Allegretta committed
237
238
239
240
241
	*toggle_cuttoend_msg, *toggle_noconvert_msg, *toggle_dos_msg,
	*toggle_mac_msg, *toggle_backup_msg, *toggle_smooth_msg;
#ifndef DISABLE_WRAPPING
    char *toggle_wrap_msg;
#endif
242
243
244
#ifdef ENABLE_MULTIBUFFER
    char *toggle_load_msg;
#endif
245

246
247
248
249
250
251
252
    /* There is no need to reinitialize the toggles.  They can't
       change.  In fact, reinitializing them causes a segfault in
       nano.c:do_toggle() when it is called with the Pico-mode
       toggle. */
    if (toggles != NULL)
	return;

253
    toggle_const_msg = _("Constant cursor position");
254
    toggle_autoindent_msg = _("Auto indent");
255
    toggle_suspend_msg = _("Suspend");
256
    toggle_nohelp_msg = _("Help mode");
257
    toggle_picomode_msg = _("Pico mode");
258
259
    toggle_mouse_msg = _("Mouse support");
    toggle_cuttoend_msg = _("Cut to end");
260
261
262
    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");
263
    toggle_backup_msg = _("Backing up file");
264
    toggle_smooth_msg = _("Smooth scrolling");
Chris Allegretta's avatar
Chris Allegretta committed
265
#ifndef DISABLE_WRAPPING
266
    toggle_wrap_msg = _("Auto wrap");
Chris Allegretta's avatar
Chris Allegretta committed
267
#endif
268
269
#ifdef ENABLE_MULTIBUFFER
    toggle_load_msg = _("Multiple file buffers");
270
271
#endif

272
273
274
275
276
    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);
    toggle_init_one(TOGGLE_PICOMODE_KEY, toggle_picomode_msg, PICO_MODE);
Chris Allegretta's avatar
Chris Allegretta committed
277
#ifndef DISABLE_WRAPPING
278
    toggle_init_one(TOGGLE_WRAP_KEY, toggle_wrap_msg, NO_WRAP);
Chris Allegretta's avatar
Chris Allegretta committed
279
#endif
280
281
282
283
    toggle_init_one(TOGGLE_MOUSE_KEY, toggle_mouse_msg, USE_MOUSE);
    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);
284
#endif
285
286
287
    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);
288
    toggle_init_one(TOGGLE_BACKUP_KEY, toggle_backup_msg, BACKUP_FILE);
289
    toggle_init_one(TOGGLE_SMOOTH_KEY, toggle_smooth_msg, SMOOTHSCROLL);
290
}
291
#endif /* !NANO_SMALL */
292
293

/* Deallocate the given shortcut. */
David Lawrence Ramsey's avatar
David Lawrence Ramsey committed
294
void free_shortcutage(shortcut **shortcutage)
295
296
{
    assert(shortcutage != NULL);
Chris Allegretta's avatar
Chris Allegretta committed
297
298
299
    while (*shortcutage != NULL) {
	shortcut *ps = *shortcutage;
	*shortcutage = (*shortcutage)->next;
300
301
	free(ps);
    }
302
303
}

304
void shortcut_init(int unjustify)
Chris Allegretta's avatar
Chris Allegretta committed
305
{
306
#ifndef DISABLE_HELP
307
308
309
310
311
312
    char *nano_help_msg = "", *nano_writeout_msg = "", *nano_exit_msg =
	"", *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
313
314
315
316
317
318
	"", *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 =
319
	"", *nano_enter_msg = "", *nano_cancel_msg =
320
	"", *nano_unjustify_msg = "", *nano_append_msg =
321
322
323
324
325
	"", *nano_prepend_msg = "", *nano_tofiles_msg =
	"", *nano_gotodir_msg = "", *nano_case_msg =
	"", *nano_reverse_msg = "", *nano_execute_msg =
	"", *nano_dos_msg = "", *nano_mac_msg =
	"", *nano_backup_msg = "";
Chris Allegretta's avatar
Chris Allegretta committed
326

Chris Allegretta's avatar
Chris Allegretta committed
327
328
329
#ifdef ENABLE_MULTIBUFFER
    char *nano_openprev_msg = "", *nano_opennext_msg = "";
#endif
330
331
332
#ifdef HAVE_REGEX_H
    char *nano_regexp_msg = "", *nano_bracket_msg = "";
#endif
333

Chris Allegretta's avatar
Chris Allegretta committed
334
335
    nano_help_msg = _("Invoke the help menu");
    nano_writeout_msg = _("Write the current file to disk");
336
#ifdef ENABLE_MULTIBUFFER
337
338
    nano_exit_msg = _("Close currently loaded file/Exit from nano");
#else
Chris Allegretta's avatar
Chris Allegretta committed
339
    nano_exit_msg = _("Exit from nano");
340
#endif
341
    nano_goto_msg = _("Go to a specific line number");
Chris Allegretta's avatar
Chris Allegretta committed
342
    nano_justify_msg = _("Justify the current paragraph");
343
    nano_unjustify_msg = _("Unjustify after a justify");
Chris Allegretta's avatar
Chris Allegretta committed
344
345
346
347
348
349
350
    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");
351
    nano_cursorpos_msg = _("Show the position of the cursor");
352
    nano_spell_msg = _("Invoke the spell checker, if available");
Chris Allegretta's avatar
Chris Allegretta committed
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
    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
370
    nano_tofiles_msg = _("Go to file browser");
371
    nano_execute_msg = _("Execute external command");
372
    nano_gotodir_msg = _("Go to directory");
Chris Allegretta's avatar
Chris Allegretta committed
373
    nano_cancel_msg = _("Cancel the current function");
374
    nano_append_msg = _("Append to the current file");
375
    nano_prepend_msg = _("Prepend to the current file");
376
    nano_reverse_msg = _("Search backwards");
377
378
    nano_dos_msg = _("Write file out in DOS format");
    nano_mac_msg = _("Write file out in Mac format");
379
    nano_backup_msg = _("Back up original file when saving");
380
#ifdef HAVE_REGEX_H
381
    nano_regexp_msg = _("Use regular expressions");
382
    nano_bracket_msg = _("Find other bracket");
383
#endif
384
385
386
#ifdef ENABLE_MULTIBUFFER
    nano_openprev_msg = _("Open previously loaded file");
    nano_opennext_msg = _("Open next loaded file");
Chris Allegretta's avatar
Chris Allegretta committed
387
#endif
388
#endif /* !DISABLE_HELP */
Chris Allegretta's avatar
Chris Allegretta committed
389

390
    free_shortcutage(&main_list);
391

392
393
394
395
396
397
398
399
400
401
/* 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"),
402
		IFHELP(nano_help_msg, 0), NANO_HELP_FKEY, 0, VIEW,
403
		do_help);
Chris Allegretta's avatar
Chris Allegretta committed
404

405
#ifdef ENABLE_MULTIBUFFER
406
    if (open_files != NULL && (open_files->prev || open_files->next))
407
	sc_init_one(&main_list, NANO_EXIT_KEY, _("Close"),
408
		IFHELP(nano_exit_msg, 0), NANO_EXIT_FKEY, 0, VIEW,
409
		do_exit);
410
411
    else
#endif
412

413
	sc_init_one(&main_list, NANO_EXIT_KEY, _("Exit"),
414
		IFHELP(nano_exit_msg, 0), NANO_EXIT_FKEY, 0, VIEW,
415
		do_exit);
Chris Allegretta's avatar
Chris Allegretta committed
416

417
    sc_init_one(&main_list, NANO_WRITEOUT_KEY, _("WriteOut"),
418
419
		    IFHELP(nano_writeout_msg, 0),
		    NANO_WRITEOUT_FKEY, 0, NOVIEW, do_writeout_void);
Chris Allegretta's avatar
Chris Allegretta committed
420

421
    if (ISSET(PICO_MODE))
422
	sc_init_one(&main_list, NANO_JUSTIFY_KEY, _("Justify"),
423
		    IFHELP(nano_justify_msg, 0), NANO_JUSTIFY_FKEY, 0,
424
		    NOVIEW, do_justify);
Chris Allegretta's avatar
Chris Allegretta committed
425
    else
426
427
428

#ifdef ENABLE_MULTIBUFFER
	/* this is so we can view multiple files */
429
	sc_init_one(&main_list, NANO_INSERTFILE_KEY, _("Read File"),
430
431
		IFHELP(nano_insert_msg, 0),
		NANO_INSERTFILE_FKEY, 0, VIEW, do_insertfile_void);
432
#else
433
	sc_init_one(&main_list, NANO_INSERTFILE_KEY, _("Read File"),
434
435
		IFHELP(nano_insert_msg, 0),
		NANO_INSERTFILE_FKEY, 0, NOVIEW, do_insertfile_void);
436
#endif
437
438

    if (ISSET(PICO_MODE))
439
440
#ifdef ENABLE_MULTIBUFFER
	/* this is so we can view multiple files */
441
	sc_init_one(&main_list, NANO_INSERTFILE_KEY, _("Read File"),
442
443
		IFHELP(nano_insert_msg, 0),
		NANO_INSERTFILE_FKEY, 0, VIEW, do_insertfile_void);
444
#else
445
	sc_init_one(&main_list, NANO_INSERTFILE_KEY, _("Read File"),
446
447
		IFHELP(nano_insert_msg, 0),
		NANO_INSERTFILE_FKEY, 0, NOVIEW, do_insertfile_void);
448
#endif
449
    else
450
	sc_init_one(&main_list, NANO_REPLACE_KEY, _("Replace"),
451
452
		    IFHELP(nano_replace_msg, NANO_ALT_REPLACE_KEY),
		    NANO_REPLACE_FKEY, 0, NOVIEW, do_replace);
Chris Allegretta's avatar
Chris Allegretta committed
453

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

530
    if (ISSET(PICO_MODE))
531
	sc_init_one(&main_list, NANO_REPLACE_KEY, _("Replace"),
532
533
		    IFHELP(nano_replace_msg, NANO_ALT_REPLACE_KEY),
		    NANO_REPLACE_FKEY, 0, NOVIEW, do_replace);
Chris Allegretta's avatar
Chris Allegretta committed
534
    else
535
	sc_init_one(&main_list, NANO_JUSTIFY_KEY, _("Justify"),
536
537
		    IFHELP(nano_justify_msg, 0),
		    NANO_JUSTIFY_FKEY, 0, NOVIEW, do_justify);
Chris Allegretta's avatar
Chris Allegretta committed
538

539
    sc_init_one(&main_list, NANO_ENTER_KEY, _("Enter"),
540
		IFHELP(nano_enter_msg, 0),
Chris Allegretta's avatar
Chris Allegretta committed
541
		KEY_ENTER, NANO_CONTROL_M, NOVIEW, do_enter);
Chris Allegretta's avatar
Chris Allegretta committed
542

543
    sc_init_one(&main_list, NANO_GOTO_KEY, _("Go To Line"),
544
545
		    IFHELP(nano_goto_msg, NANO_ALT_GOTO_KEY),
		    NANO_GOTO_FKEY, 0, VIEW, do_gotoline_void);
546

547
548
549
#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
550
		0, 0, VIEW, do_next_word);
551
552
553

    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
554
		VIEW, do_prev_word);
555
#endif
556
#if !defined(NANO_SMALL) && defined(HAVE_REGEX_H)
557
    sc_init_one(&main_list, -9, _("Find Other Bracket"),
558
559
		    IFHELP(nano_bracket_msg, NANO_BRACKET_KEY),
		    0, 0, VIEW, do_find_bracket);
560
#endif
561
562
#ifdef ENABLE_MULTIBUFFER
    sc_init_one(&main_list, -9, _("Previous File"),
563
564
		    IFHELP(nano_openprev_msg, NANO_OPENPREV_KEY),
		    0, 0, VIEW, open_prevfile_void);
565
    sc_init_one(&main_list, -9, _("Next File"),
566
567
		    IFHELP(nano_opennext_msg, NANO_OPENNEXT_KEY),
		    0, 0, VIEW, open_nextfile_void);
568
#endif
569

570
    free_shortcutage(&whereis_list);
571

572
573
    sc_init_one(&whereis_list, NANO_HELP_KEY, _("Get Help"),
		IFHELP(nano_help_msg, 0), 0, 0, VIEW, do_help);
574

575
576
    sc_init_one(&whereis_list, NANO_CANCEL_KEY, _("Cancel"),
		IFHELP(nano_cancel_msg, 0), 0, 0, VIEW, 0);
577

578
    sc_init_one(&whereis_list, NANO_FIRSTLINE_KEY, _("First Line"),
579
580
		IFHELP(nano_firstline_msg, 0),
		0, 0, VIEW, do_first_line);
Chris Allegretta's avatar
Chris Allegretta committed
581

582
    sc_init_one(&whereis_list, NANO_LASTLINE_KEY, _("Last Line"),
583
		IFHELP(nano_lastline_msg, 0), 0, 0, VIEW, do_last_line);
Chris Allegretta's avatar
Chris Allegretta committed
584

585
    sc_init_one(&whereis_list, NANO_OTHERSEARCH_KEY, _("Replace"),
586
		IFHELP(nano_replace_msg, 0), 0, 0, VIEW, do_replace);
Chris Allegretta's avatar
Chris Allegretta committed
587

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

591
#ifndef NANO_SMALL
592
    sc_init_one(&whereis_list, TOGGLE_CASE_KEY, _("Case Sens"),
593
		IFHELP(nano_case_msg, 0), 0, 0, VIEW, 0);
594

595
    sc_init_one(&whereis_list, TOGGLE_BACKWARDS_KEY, _("Direction"),
596
		IFHELP(nano_reverse_msg, 0), 0, 0, VIEW, 0);
Chris Allegretta's avatar
Chris Allegretta committed
597

598
#ifdef HAVE_REGEX_H
599
600
    sc_init_one(&whereis_list, TOGGLE_REGEXP_KEY, _("Regexp"),
		IFHELP(nano_regexp_msg, 0), 0, 0, VIEW, 0);
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
#endif /* !NANO_SMALL */
636

637
    free_shortcutage(&replace_list_2);
638

639
640
    sc_init_one(&replace_list_2, NANO_HELP_KEY, _("Get Help"),
		IFHELP(nano_help_msg, 0), 0, 0, VIEW, do_help);
641

642
643
    sc_init_one(&replace_list_2, NANO_CANCEL_KEY, _("Cancel"),
		IFHELP(nano_cancel_msg, 0), 0, 0, VIEW, 0);
644

645
    sc_init_one(&replace_list_2, NANO_FIRSTLINE_KEY, _("First Line"),
646
		IFHELP(nano_firstline_msg, 0), 0, 0, VIEW, do_first_line);
647

648
    sc_init_one(&replace_list_2, NANO_LASTLINE_KEY, _("Last Line"),
649
		IFHELP(nano_lastline_msg, 0), 0, 0, VIEW, do_last_line);
650

651
    free_shortcutage(&goto_list);
Chris Allegretta's avatar
Chris Allegretta committed
652

653
654
    sc_init_one(&goto_list, NANO_HELP_KEY, _("Get Help"),
		IFHELP(nano_help_msg, 0), 0, 0, VIEW, do_help);
655

656
    sc_init_one(&goto_list, NANO_CANCEL_KEY, _("Cancel"),
657
		IFHELP(nano_cancel_msg, 0), 0, 0, VIEW, 0);
Chris Allegretta's avatar
Chris Allegretta committed
658

659
    sc_init_one(&goto_list, NANO_FIRSTLINE_KEY, _("First Line"),
Chris Allegretta's avatar
Chris Allegretta committed
660
		IFHELP(nano_firstline_msg, 0), 0, 0, VIEW, do_first_line);
Chris Allegretta's avatar
Chris Allegretta committed
661

662
    sc_init_one(&goto_list, NANO_LASTLINE_KEY, _("Last Line"),
Chris Allegretta's avatar
Chris Allegretta committed
663
		IFHELP(nano_lastline_msg, 0), 0, 0, VIEW, do_last_line);
Chris Allegretta's avatar
Chris Allegretta committed
664

665
    free_shortcutage(&help_list);
Chris Allegretta's avatar
Chris Allegretta committed
666

667
    sc_init_one(&help_list, NANO_PREVPAGE_KEY, _("Prev Page"),
668
669
		IFHELP(nano_prevpage_msg, 0), NANO_PREVPAGE_FKEY,
		KEY_PPAGE, VIEW, do_page_up);
Chris Allegretta's avatar
Chris Allegretta committed
670

671
    sc_init_one(&help_list, NANO_NEXTPAGE_KEY, _("Next Page"),
672
673
		IFHELP(nano_nextpage_msg, 0),
		NANO_NEXTPAGE_FKEY, KEY_NPAGE, VIEW, do_page_down);
Chris Allegretta's avatar
Chris Allegretta committed
674

675
    sc_init_one(&help_list, NANO_EXIT_KEY, _("Exit"),
676
677
		IFHELP(nano_exit_msg, 0), NANO_EXIT_FKEY, 0, VIEW,
		do_exit);
Chris Allegretta's avatar
Chris Allegretta committed
678

679
    free_shortcutage(&writefile_list);
Chris Allegretta's avatar
Chris Allegretta committed
680

681
682
    sc_init_one(&writefile_list, NANO_HELP_KEY, _("Get Help"),
		IFHELP(nano_help_msg, 0), 0, 0, VIEW, do_help);
683

684
#ifndef DISABLE_BROWSER
685
    sc_init_one(&writefile_list, NANO_TOFILES_KEY, _("To Files"),
686
		IFHELP(nano_tofiles_msg, 0), 0, 0, NOVIEW, 0);
Chris Allegretta's avatar
Chris Allegretta committed
687
#endif
Chris Allegretta's avatar
Chris Allegretta committed
688

689
#ifndef NANO_SMALL
690
691
    sc_init_one(&writefile_list, TOGGLE_DOS_KEY, _("DOS Format"),
		IFHELP(nano_dos_msg, 0), 0, 0, NOVIEW, 0);
692

693
694
    sc_init_one(&writefile_list, TOGGLE_MAC_KEY, _("Mac Format"),
		IFHELP(nano_mac_msg, 0), 0, 0, NOVIEW, 0);
695
696
#endif

697
698
    sc_init_one(&writefile_list, NANO_APPEND_KEY, _("Append"),
		IFHELP(nano_append_msg, 0), 0, 0, NOVIEW, 0);
699

700
701
    sc_init_one(&writefile_list, NANO_PREPEND_KEY, _("Prepend"),
		IFHELP(nano_prepend_msg, 0), 0, 0, NOVIEW, 0);
702

703
704
705
706
707
#ifndef NANO_SMALL
    sc_init_one(&writefile_list, TOGGLE_BACKUP_KEY, _("Backup File"),
		IFHELP(nano_backup_msg, 0), 0, 0, NOVIEW, 0);
#endif

708
709
    sc_init_one(&writefile_list, NANO_CANCEL_KEY, _("Cancel"),
		IFHELP(nano_cancel_msg, 0), 0, 0, VIEW, 0);
710

711
    free_shortcutage(&insertfile_list);
712

713
714
    sc_init_one(&insertfile_list, NANO_HELP_KEY, _("Get Help"),
		IFHELP(nano_help_msg, 0), 0, 0, VIEW, do_help);
715

716
    sc_init_one(&insertfile_list, NANO_CANCEL_KEY, _("Cancel"),
717
		IFHELP(nano_cancel_msg, 0), 0, 0, VIEW, 0);
Chris Allegretta's avatar
Chris Allegretta committed
718

719
#ifndef DISABLE_BROWSER
720
    sc_init_one(&insertfile_list, NANO_TOFILES_KEY, _("To Files"),
721
		IFHELP(nano_tofiles_msg, 0), 0, 0, NOVIEW, 0);
722
#endif
723
724
#ifndef NANO_SMALL
    sc_init_one(&insertfile_list, NANO_EXTCMD_KEY, _("Execute Command"),
725
		IFHELP(nano_execute_msg, 0), 0, 0, NOVIEW, 0);
726
#endif
727

728
    free_shortcutage(&spell_list);
Chris Allegretta's avatar
Chris Allegretta committed
729

730
731
    sc_init_one(&spell_list, NANO_HELP_KEY, _("Get Help"),
		IFHELP(nano_help_msg, 0), 0, 0, VIEW, do_help);
732

733
    sc_init_one(&spell_list, NANO_CANCEL_KEY, _("Cancel"),
734
		IFHELP(nano_cancel_msg, 0), 0, 0, VIEW, 0);
Chris Allegretta's avatar
Chris Allegretta committed
735

736
#ifndef NANO_SMALL
737
    free_shortcutage(&extcmd_list);
Chris Allegretta's avatar
Chris Allegretta committed
738

739
740
    sc_init_one(&extcmd_list, NANO_HELP_KEY, _("Get Help"),
		IFHELP(nano_help_msg, 0), 0, 0, VIEW, do_help);
741
742

    sc_init_one(&extcmd_list, NANO_CANCEL_KEY, _("Cancel"),
743
		IFHELP(nano_cancel_msg, 0), 0, 0, VIEW, 0);
744
#endif
745

746
#ifndef DISABLE_BROWSER
747
    free_shortcutage(&browser_list);
748

749
750
    sc_init_one(&browser_list, NANO_HELP_KEY, _("Get Help"),
		IFHELP(nano_help_msg, 0), 0, 0, VIEW, do_help);
751

752
753
    sc_init_one(&browser_list, NANO_CANCEL_KEY, _("Cancel"),
		IFHELP(nano_cancel_msg, 0), NANO_EXIT_FKEY, 0, VIEW, 0);
754

755
    sc_init_one(&browser_list, NANO_PREVPAGE_KEY, _("Prev Page"),
756
757
		IFHELP(nano_prevpage_msg, 0), NANO_PREVPAGE_FKEY,
		KEY_PPAGE, VIEW, 0);
Chris Allegretta's avatar
Chris Allegretta committed
758

759
    sc_init_one(&browser_list, NANO_NEXTPAGE_KEY, _("Next Page"),
760
761
		IFHELP(nano_nextpage_msg, 0), NANO_NEXTPAGE_FKEY,
		KEY_NPAGE, VIEW, 0);
Chris Allegretta's avatar
Chris Allegretta committed
762

763
    sc_init_one(&browser_list, NANO_GOTO_KEY, _("Go To Dir"),
764
765
		IFHELP(nano_gotodir_msg, NANO_ALT_GOTO_KEY),
		NANO_GOTO_FKEY, 0, VIEW, 0);
Rocco Corsi's avatar
   
Rocco Corsi committed
766

767
    free_shortcutage(&gotodir_list);
768

769
770
    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
771

772
    sc_init_one(&gotodir_list, NANO_CANCEL_KEY, _("Cancel"),
773
		IFHELP(nano_cancel_msg, 0), 0, 0, VIEW, 0);
Chris Allegretta's avatar
Chris Allegretta committed
774
775
#endif

776
777
778
#if !defined(DISABLE_BROWSER) || !defined(DISABLE_MOUSE) || !defined (DISABLE_HELP)
    currshortcut = main_list;
#endif
779
#ifndef NANO_SMALL
780
    toggle_init();
781
#endif
782
}
783

784
785
786
/* 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
787
 * function unless debugging is turned on. */
788
#ifdef DEBUG
789
/* added by SPK for memory cleanup, gracefully return our malloc()s */
Chris Allegretta's avatar
Chris Allegretta committed
790
void thanks_for_all_the_fish(void)
791
{
Chris Allegretta's avatar
Chris Allegretta committed
792
#ifndef DISABLE_OPERATINGDIR
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
    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
    if (help_text != NULL)
	free(help_text);
    if (filename != NULL)
	free(filename);
    if (answer != NULL)
	free(answer);
    if (cutbuffer != NULL)
        free_filestruct(cutbuffer);

    free_shortcutage(&main_list);
    free_shortcutage(&whereis_list);
    free_shortcutage(&replace_list);
    free_shortcutage(&replace_list_2);
Chris Allegretta's avatar
Chris Allegretta committed
821
822
    free_shortcutage(&goto_list);
    free_shortcutage(&gotodir_list);
823
824
    free_shortcutage(&writefile_list);
    free_shortcutage(&insertfile_list);
Chris Allegretta's avatar
Chris Allegretta committed
825
    free_shortcutage(&help_list);
826
    free_shortcutage(&spell_list);
Chris Allegretta's avatar
Chris Allegretta committed
827
828
829
#ifndef NANO_SMALL
    free_shortcutage(&extcmd_list);
#endif
830
831
832
833
834
835
836
837
838
#ifndef DISABLE_BROWSER
    free_shortcutage(&browser_list);
#endif

#ifndef NANO_SMALL
    free_toggles();
#endif

#ifdef ENABLE_MULTIBUFFER
839
    if (open_files != NULL) {
840
841
	/* We free the memory associated with each open file. */
	while (open_files->prev != NULL)
842
	    open_files = open_files->prev;
Chris Allegretta's avatar
Chris Allegretta committed
843
	free_openfilestruct(open_files);
844
    }
845
#else
846
    if (fileage != NULL)
847
848
	free_filestruct(fileage);
#endif
Chris Allegretta's avatar
Chris Allegretta committed
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874

#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;
	    free(bob->val);
	    free(bob);
	}
	while (syntaxes->color != NULL) {
	    colortype *bob = syntaxes->color;

	    syntaxes->color = bob->next;
	    free(bob->start);
	    free(bob->end);
	    free(bob);
	}
	syntaxes = syntaxes->next;
	free(bill);
    }
#endif /* ENABLE_COLOR */
875
}
876
#endif /* DEBUG */