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
    const 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

149
int length_of_list(const shortcut *s) 
150
151
{
    int i = 0;
152

153
    for (; s != NULL; s = s->next)
154
155
156
157
	i++;
    return i;
}

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

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

David Lawrence Ramsey's avatar
David Lawrence Ramsey committed
213
void toggle_init(void)
214
215
216
{
    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
217
218
219
220
221
	*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
222
223
224
#ifdef ENABLE_MULTIBUFFER
    char *toggle_load_msg;
#endif
225

226
227
228
229
230
231
232
    /* 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;

233
    toggle_const_msg = _("Constant cursor position");
234
    toggle_autoindent_msg = _("Auto indent");
235
    toggle_suspend_msg = _("Suspend");
236
    toggle_nohelp_msg = _("Help mode");
237
    toggle_picomode_msg = _("Pico mode");
238
239
    toggle_mouse_msg = _("Mouse support");
    toggle_cuttoend_msg = _("Cut to end");
240
241
242
    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");
243
    toggle_backup_msg = _("Backing up file");
244
    toggle_smooth_msg = _("Smooth scrolling");
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
273
274
275
276
277
278
279
280
281
282
283

#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
284
#endif /* !NANO_SMALL */
285
286

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

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

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

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

385
    free_shortcutage(&main_list);
386

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

506
    sc_init_one(&main_list, NANO_REFRESH_KEY, _("Refresh"),
507
508
		IFHELP(nano_refresh_msg, 0),
		0, 0, VIEW, total_refresh);
Chris Allegretta's avatar
Chris Allegretta committed
509

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

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

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

522
    sc_init_one(&main_list, NANO_TAB_KEY, _("Tab"),
523
		IFHELP(nano_tab_msg, 0), 0, 0, NOVIEW, do_tab);
Chris Allegretta's avatar
Chris Allegretta committed
524

525
    if (ISSET(PICO_MODE))
526
	sc_init_one(&main_list, NANO_REPLACE_KEY, _("Replace"),
527
528
		    IFHELP(nano_replace_msg, NANO_ALT_REPLACE_KEY),
		    NANO_REPLACE_FKEY, 0, NOVIEW, do_replace);
Chris Allegretta's avatar
Chris Allegretta committed
529
    else
530
	sc_init_one(&main_list, NANO_JUSTIFY_KEY, _("Justify"),
531
532
		    IFHELP(nano_justify_msg, 0),
		    NANO_JUSTIFY_FKEY, 0, NOVIEW, do_justify);
Chris Allegretta's avatar
Chris Allegretta committed
533

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

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

542
543
544
#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
545
		0, 0, VIEW, do_next_word);
546
547
548

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

565
    free_shortcutage(&whereis_list);
566

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

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

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

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

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

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

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

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

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

599
    free_shortcutage(&replace_list);
600

601
602
    sc_init_one(&replace_list, NANO_HELP_KEY, _("Get Help"),
		IFHELP(nano_help_msg, 0), 0, 0, VIEW, do_help);
603

604
605
    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
606

607
    sc_init_one(&replace_list, NANO_FIRSTLINE_KEY, _("First Line"),
608
		IFHELP(nano_firstline_msg, 0), 0, 0, VIEW, do_first_line);
Chris Allegretta's avatar
Chris Allegretta committed
609

610
    sc_init_one(&replace_list, NANO_LASTLINE_KEY, _("Last Line"),
611
		IFHELP(nano_lastline_msg, 0), 0, 0, VIEW, do_last_line);
Chris Allegretta's avatar
Chris Allegretta committed
612

613
    sc_init_one(&replace_list, NANO_OTHERSEARCH_KEY, _("No Replace"),
614
		IFHELP(nano_whereis_msg, 0), 0, 0, VIEW, do_search);
Chris Allegretta's avatar
Chris Allegretta committed
615

616
    sc_init_one(&replace_list, NANO_FROMSEARCHTOGOTO_KEY, _("Go To Line"), 
617
		IFHELP(nano_goto_msg, 0), 0, 0, VIEW, do_gotoline_void);
618

619
#ifndef NANO_SMALL
620
    sc_init_one(&replace_list, TOGGLE_CASE_KEY, _("Case Sens"),
621
		IFHELP(nano_case_msg, 0), 0, 0, VIEW, 0);
622

623
    sc_init_one(&replace_list, TOGGLE_BACKWARDS_KEY, _("Direction"),
624
		IFHELP(nano_reverse_msg, 0), 0, 0, VIEW, 0);
625

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

632
    free_shortcutage(&replace_list_2);
633

634
635
    sc_init_one(&replace_list_2, NANO_HELP_KEY, _("Get Help"),
		IFHELP(nano_help_msg, 0), 0, 0, VIEW, do_help);
636

637
638
    sc_init_one(&replace_list_2, NANO_CANCEL_KEY, _("Cancel"),
		IFHELP(nano_cancel_msg, 0), 0, 0, VIEW, 0);
639

640
    sc_init_one(&replace_list_2, NANO_FIRSTLINE_KEY, _("First Line"),
641
		IFHELP(nano_firstline_msg, 0), 0, 0, VIEW, do_first_line);
642

643
    sc_init_one(&replace_list_2, NANO_LASTLINE_KEY, _("Last Line"),
644
		IFHELP(nano_lastline_msg, 0), 0, 0, VIEW, do_last_line);
645

646
    free_shortcutage(&goto_list);
Chris Allegretta's avatar
Chris Allegretta committed
647

648
649
    sc_init_one(&goto_list, NANO_HELP_KEY, _("Get Help"),
		IFHELP(nano_help_msg, 0), 0, 0, VIEW, do_help);
650

651
    sc_init_one(&goto_list, NANO_CANCEL_KEY, _("Cancel"),
652
		IFHELP(nano_cancel_msg, 0), 0, 0, VIEW, 0);
Chris Allegretta's avatar
Chris Allegretta committed
653

654
    sc_init_one(&goto_list, NANO_FIRSTLINE_KEY, _("First Line"),
Chris Allegretta's avatar
Chris Allegretta committed
655
		IFHELP(nano_firstline_msg, 0), 0, 0, VIEW, do_first_line);
Chris Allegretta's avatar
Chris Allegretta committed
656

657
    sc_init_one(&goto_list, NANO_LASTLINE_KEY, _("Last Line"),
Chris Allegretta's avatar
Chris Allegretta committed
658
		IFHELP(nano_lastline_msg, 0), 0, 0, VIEW, do_last_line);
Chris Allegretta's avatar
Chris Allegretta committed
659

660
    free_shortcutage(&help_list);
Chris Allegretta's avatar
Chris Allegretta committed
661

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

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

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

674
    free_shortcutage(&writefile_list);
Chris Allegretta's avatar
Chris Allegretta committed
675

676
677
    sc_init_one(&writefile_list, NANO_HELP_KEY, _("Get Help"),
		IFHELP(nano_help_msg, 0), 0, 0, VIEW, do_help);
678

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

684
#ifndef NANO_SMALL
685
686
    sc_init_one(&writefile_list, TOGGLE_DOS_KEY, _("DOS Format"),
		IFHELP(nano_dos_msg, 0), 0, 0, NOVIEW, 0);
687

688
689
    sc_init_one(&writefile_list, TOGGLE_MAC_KEY, _("Mac Format"),
		IFHELP(nano_mac_msg, 0), 0, 0, NOVIEW, 0);
690
691
#endif

692
693
    sc_init_one(&writefile_list, NANO_APPEND_KEY, _("Append"),
		IFHELP(nano_append_msg, 0), 0, 0, NOVIEW, 0);
694

695
696
    sc_init_one(&writefile_list, NANO_PREPEND_KEY, _("Prepend"),
		IFHELP(nano_prepend_msg, 0), 0, 0, NOVIEW, 0);
697

698
699
700
701
702
#ifndef NANO_SMALL
    sc_init_one(&writefile_list, TOGGLE_BACKUP_KEY, _("Backup File"),
		IFHELP(nano_backup_msg, 0), 0, 0, NOVIEW, 0);
#endif

703
704
    sc_init_one(&writefile_list, NANO_CANCEL_KEY, _("Cancel"),
		IFHELP(nano_cancel_msg, 0), 0, 0, VIEW, 0);
705

706
    free_shortcutage(&insertfile_list);
707

708
709
    sc_init_one(&insertfile_list, NANO_HELP_KEY, _("Get Help"),
		IFHELP(nano_help_msg, 0), 0, 0, VIEW, do_help);
710

711
    sc_init_one(&insertfile_list, NANO_CANCEL_KEY, _("Cancel"),
712
		IFHELP(nano_cancel_msg, 0), 0, 0, VIEW, 0);
Chris Allegretta's avatar
Chris Allegretta committed
713

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

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

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

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

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

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

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

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

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

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

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

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

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

766
    free_shortcutage(&gotodir_list);
767

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

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

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

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

#ifndef NANO_SMALL
    free_toggles();
#endif

#ifdef ENABLE_MULTIBUFFER
840
    if (open_files != NULL) {
841
842
	/* We free the memory associated with each open file. */
	while (open_files->prev != NULL)
843
	    open_files = open_files->prev;
Chris Allegretta's avatar
Chris Allegretta committed
844
	free_openfilestruct(open_files);
845
    }
846
#else
847
    if (fileage != NULL)
848
849
	free_filestruct(fileage);
#endif
Chris Allegretta's avatar
Chris Allegretta committed
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
875

#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 */
876
}
877
#endif /* DEBUG */