global.c 28.4 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 <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
30
31
32

/*
 * Global variables
 */
33

Chris Allegretta's avatar
Chris Allegretta committed
34
35
36
37
38
39
/* 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? */

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

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

Chris Allegretta's avatar
Chris Allegretta committed
50
51
52
53
54
55
56
57
58
59
60
61
62
63
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 */

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

68
#ifndef DISABLE_JUSTIFY
Chris Allegretta's avatar
Chris Allegretta committed
69
70
71
#ifdef HAVE_REGEX_H
char *quotestr = "^([ \t]*[|>:}#])+";
#else
72
73
char *quotestr = "> ";		/* Quote string */
#endif
Chris Allegretta's avatar
Chris Allegretta committed
74
#endif
75

Chris Allegretta's avatar
Chris Allegretta committed
76
char *answer = NULL;		/* Answer str to many questions */
Chris Allegretta's avatar
Chris Allegretta committed
77
int totlines = 0;		/* Total number of lines in the file */
78
long totsize = 0;		/* Total number of bytes in the file */
79
int placewewant = 0;		/* The column we'd like the cursor
Chris Allegretta's avatar
Chris Allegretta committed
80
81
82
				   to jump to when we go to the
				   next or previous line */

83
84
int tabsize = 8;		/* Our internal tabsize variable */

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

/* More stuff for the marker select */

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

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

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

104
105
106
shortcut *main_list = NULL;
shortcut *whereis_list = NULL;
shortcut *replace_list = NULL;
107
shortcut *replace_list_2 = NULL; 	/* 2nd half of replace dialog */
108
109
110
111
112
113
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
114
#ifndef NANO_SMALL
115
shortcut *extcmd_list = NULL;
Chris Allegretta's avatar
Chris Allegretta committed
116
#endif
117
#ifndef DISABLE_BROWSER
118
shortcut *browser_list = NULL;
Chris Allegretta's avatar
Chris Allegretta committed
119
120
#endif

121
#ifdef ENABLE_COLOR
122
    const colortype *colorstrings = NULL;
123
    syntaxtype *syntaxes = NULL;
124
    char *syntaxstr = NULL;
125
126
#endif

127
#if !defined(DISABLE_BROWSER) || !defined(DISABLE_MOUSE) || !defined(DISABLE_HELP)
Chris Allegretta's avatar
Chris Allegretta committed
128
const shortcut *currshortcut;	/* Current shortcut list we're using */
129
#endif
130

131
#ifndef NANO_SMALL
132
toggle *toggles = NULL;
133
#endif
Chris Allegretta's avatar
Chris Allegretta committed
134

135
136
/* Regular expressions */

137
#ifdef HAVE_REGEX_H
138
139
140
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
141
#endif
142

143
int length_of_list(const shortcut *s) 
144
145
{
    int i = 0;
146

147
    for (; s != NULL; s = s->next)
148
149
150
151
	i++;
    return i;
}

Chris Allegretta's avatar
Chris Allegretta committed
152
/* Initialize a struct *without* our lovely braces =( */
David Lawrence Ramsey's avatar
David Lawrence Ramsey committed
153
void sc_init_one(shortcut **shortcutage, int key, const char *desc,
154
#ifndef DISABLE_HELP
David Lawrence Ramsey's avatar
David Lawrence Ramsey committed
155
	const char *help,
156
#endif
David Lawrence Ramsey's avatar
David Lawrence Ramsey committed
157
	int alt, int misc1, int misc2, int view, int (*func) (void))
Chris Allegretta's avatar
Chris Allegretta committed
158
{
159
160
161
162
163
164
165
166
167
168
169
170
    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
171
172
    s->val = key;
    s->desc = desc;
173
#ifndef DISABLE_HELP
Chris Allegretta's avatar
Chris Allegretta committed
174
    s->help = help;
175
#endif
Chris Allegretta's avatar
Chris Allegretta committed
176
177
178
179
180
    s->altval = alt;
    s->misc1 = misc1;
    s->misc2 = misc2;
    s->viewok = view;
    s->func = func;
181
    s->next = NULL;
Chris Allegretta's avatar
Chris Allegretta committed
182
183
}

184
#ifndef NANO_SMALL
185
186
/* Create one new toggle structure, at the end of the toggles
 * linked list. */
David Lawrence Ramsey's avatar
David Lawrence Ramsey committed
187
void toggle_init_one(int val, const char *desc, int flag)
188
{
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
    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;
205
206
}

David Lawrence Ramsey's avatar
David Lawrence Ramsey committed
207
void toggle_init(void)
208
209
210
{
    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
211
212
213
214
215
	*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
216
217
218
#ifdef ENABLE_MULTIBUFFER
    char *toggle_load_msg;
#endif
219
220
221
#ifdef ENABLE_COLOR
    char *toggle_syntax_msg;
#endif
222

223
224
225
226
227
228
229
    /* 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;

230
    toggle_const_msg = _("Constant cursor position");
231
    toggle_autoindent_msg = _("Auto indent");
232
    toggle_suspend_msg = _("Suspend");
233
    toggle_nohelp_msg = _("Help mode");
234
    toggle_picomode_msg = _("Pico mode");
235
236
    toggle_mouse_msg = _("Mouse support");
    toggle_cuttoend_msg = _("Cut to end");
237
238
239
    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");
240
    toggle_backup_msg = _("Backing up file");
241
    toggle_smooth_msg = _("Smooth scrolling");
242
243
244
#ifdef ENABLE_COLOR
    toggle_syntax_msg = _("Color syntax highlighting");
#endif
Chris Allegretta's avatar
Chris Allegretta committed
245
#ifndef DISABLE_WRAPPING
246
    toggle_wrap_msg = _("Auto wrap");
Chris Allegretta's avatar
Chris Allegretta committed
247
#endif
248
249
#ifdef ENABLE_MULTIBUFFER
    toggle_load_msg = _("Multiple file buffers");
250
251
#endif

252
253
254
255
256
    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
257
#ifndef DISABLE_WRAPPING
258
    toggle_init_one(TOGGLE_WRAP_KEY, toggle_wrap_msg, NO_WRAP);
Chris Allegretta's avatar
Chris Allegretta committed
259
#endif
260
261
262
263
    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);
264
#endif
265
266
267
    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);
268
    toggle_init_one(TOGGLE_BACKUP_KEY, toggle_backup_msg, BACKUP_FILE);
269
    toggle_init_one(TOGGLE_SMOOTH_KEY, toggle_smooth_msg, SMOOTHSCROLL);
270
271
272
#ifdef ENABLE_COLOR
    toggle_init_one(TOGGLE_SYNTAX_KEY, toggle_syntax_msg, COLOR_SYNTAX);
#endif
273
}
274
275
276
277
278
279
280
281
282
283
284
285
286

#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
287
#endif /* !NANO_SMALL */
288
289

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

300
void shortcut_init(int unjustify)
Chris Allegretta's avatar
Chris Allegretta committed
301
{
302
#ifndef DISABLE_HELP
303
    const char *nano_help_msg = "", *nano_writeout_msg = "", *nano_exit_msg =
304
305
306
307
308
	"", *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
309
310
311
312
313
314
	"", *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 =
315
	"", *nano_enter_msg = "", *nano_cancel_msg =
316
	"", *nano_unjustify_msg = "", *nano_append_msg =
317
318
319
320
321
	"", *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
322

Chris Allegretta's avatar
Chris Allegretta committed
323
#ifdef ENABLE_MULTIBUFFER
324
    const char *nano_openprev_msg = "", *nano_opennext_msg =
325
	"", *nano_multibuffer_msg = "";
Chris Allegretta's avatar
Chris Allegretta committed
326
#endif
327
#ifdef HAVE_REGEX_H
328
    const char *nano_regexp_msg = "", *nano_bracket_msg = "";
329
#endif
330

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

388
    free_shortcutage(&main_list);
389

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

528
    if (ISSET(PICO_MODE))
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
    else
533
	sc_init_one(&main_list, NANO_JUSTIFY_KEY, _("Justify"),
534
535
		    IFHELP(nano_justify_msg, 0),
		    NANO_JUSTIFY_FKEY, 0, NOVIEW, do_justify);
Chris Allegretta's avatar
Chris Allegretta committed
536

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

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

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

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

568
    free_shortcutage(&whereis_list);
569

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

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

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

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

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

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

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

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

596
#ifdef HAVE_REGEX_H
597
598
    sc_init_one(&whereis_list, TOGGLE_REGEXP_KEY, _("Regexp"),
		IFHELP(nano_regexp_msg, 0), 0, 0, VIEW, 0);
599
#endif
600
#endif /* !NANO_SMALL */
601

602
    free_shortcutage(&replace_list);
603

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

607
608
    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
609

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

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

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

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

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

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

629
#ifdef HAVE_REGEX_H
630
631
    sc_init_one(&replace_list, TOGGLE_REGEXP_KEY, _("Regexp"),
		IFHELP(nano_regexp_msg, 0), 0, 0, VIEW, 0);
632
#endif
633
#endif /* !NANO_SMALL */
634

635
    free_shortcutage(&replace_list_2);
636

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

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

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

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

649
    free_shortcutage(&goto_list);
Chris Allegretta's avatar
Chris Allegretta committed
650

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

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

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

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

663
    free_shortcutage(&help_list);
Chris Allegretta's avatar
Chris Allegretta committed
664

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

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

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

677
    free_shortcutage(&writefile_list);
Chris Allegretta's avatar
Chris Allegretta committed
678

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

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

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

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

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

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

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

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

709
    free_shortcutage(&insertfile_list);
710

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

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

717
#ifndef DISABLE_BROWSER
718
    sc_init_one(&insertfile_list, NANO_TOFILES_KEY, _("To Files"),
719
		IFHELP(nano_tofiles_msg, 0), 0, 0, NOVIEW, 0);
720
#endif
721
722
#ifndef NANO_SMALL
    sc_init_one(&insertfile_list, NANO_EXTCMD_KEY, _("Execute Command"),
723
		IFHELP(nano_execute_msg, 0), 0, 0, NOVIEW, 0);
724
#ifdef ENABLE_MULTIBUFFER
725
    sc_init_one(&insertfile_list, TOGGLE_LOAD_KEY, _("New Buffer"),
726
		IFHELP(nano_multibuffer_msg, 0), 0, 0, NOVIEW, 0);
727
#endif
728
#endif
729

730
    free_shortcutage(&spell_list);
Chris Allegretta's avatar
Chris Allegretta committed
731

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

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

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

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

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

748
#ifndef DISABLE_BROWSER
749
    free_shortcutage(&browser_list);
750

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

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

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

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

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

769
    free_shortcutage(&gotodir_list);
770

771
772
    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
773

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

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

786
787
788
/* 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
789
 * function unless debugging is turned on. */
790
#ifdef DEBUG
791
/* added by SPK for memory cleanup, gracefully return our malloc()s */
Chris Allegretta's avatar
Chris Allegretta committed
792
void thanks_for_all_the_fish(void)
793
{
Chris Allegretta's avatar
Chris Allegretta committed
794
#ifndef DISABLE_OPERATINGDIR
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
    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
810
#ifndef DISABLE_HELP
811
812
    if (help_text != NULL)
	free(help_text);
813
#endif
814
815
816
817
818
819
820
821
822
823
824
    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
825
826
    free_shortcutage(&goto_list);
    free_shortcutage(&gotodir_list);
827
828
    free_shortcutage(&writefile_list);
    free_shortcutage(&insertfile_list);
Chris Allegretta's avatar
Chris Allegretta committed
829
    free_shortcutage(&help_list);
830
    free_shortcutage(&spell_list);
Chris Allegretta's avatar
Chris Allegretta committed
831
832
833
#ifndef NANO_SMALL
    free_shortcutage(&extcmd_list);
#endif
834
835
836
837
838
839
840
841
842
#ifndef DISABLE_BROWSER
    free_shortcutage(&browser_list);
#endif

#ifndef NANO_SMALL
    free_toggles();
#endif

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

#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 */
879
}
880
#endif /* DEBUG */