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 <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 =( */
166
167
168
169
static void sc_init_one(shortcut **shortcutage, int key,
		const char *desc,
#ifndef DISABLE_HELP
		const char *help,
170
#endif
171
172
		int alt, int misc1, int misc2, int view,
		int (*func) (void))
Chris Allegretta's avatar
Chris Allegretta committed
173
{
174
175
176
177
178
179
180
181
182
183
184
185
    shortcut *s;

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

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

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

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

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

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

229
230
231
232
	toggles = toggles->next;
	free(pt);
    }
}
233
#endif
234
235

static void toggle_init(void)
236
237
238
{
    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
239
240
241
242
243
	*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
244
245
246
#ifdef ENABLE_MULTIBUFFER
    char *toggle_load_msg;
#endif
247

248
249
250
251
252
253
254
    /* 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;

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

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

/* Deallocate the given shortcut. */
static void free_shortcutage(shortcut **shortcutage)
{
    assert(shortcutage != NULL);
Chris Allegretta's avatar
Chris Allegretta committed
299
300
301
    while (*shortcutage != NULL) {
	shortcut *ps = *shortcutage;
	*shortcutage = (*shortcutage)->next;
302
303
	free(ps);
    }
304
305
}

306
void shortcut_init(int unjustify)
Chris Allegretta's avatar
Chris Allegretta committed
307
{
308
#ifndef DISABLE_HELP
309
310
311
312
313
314
    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
315
316
317
318
319
320
	"", *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 =
321
	"", *nano_enter_msg = "", *nano_cancel_msg =
322
	"", *nano_unjustify_msg = "", *nano_append_msg =
323
324
325
326
327
	"", *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
328

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

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

392
    free_shortcutage(&main_list);
393

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

572
    free_shortcutage(&whereis_list);
573

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

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

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

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

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

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

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

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

600
#ifdef HAVE_REGEX_H
601
602
    sc_init_one(&whereis_list, TOGGLE_REGEXP_KEY, _("Regexp"),
		IFHELP(nano_regexp_msg, 0), 0, 0, VIEW, 0);
603
#endif
604
#endif /* !NANO_SMALL */
605

606
    free_shortcutage(&replace_list);
607

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

611
612
    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
613

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

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

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

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

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

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

633
#ifdef HAVE_REGEX_H
634
635
    sc_init_one(&replace_list, TOGGLE_REGEXP_KEY, _("Regexp"),
		IFHELP(nano_regexp_msg, 0), 0, 0, VIEW, 0);
636
#endif
637
#endif /* !NANO_SMALL */
638

639
    free_shortcutage(&replace_list_2);
640

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

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

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

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

653
    free_shortcutage(&goto_list);
Chris Allegretta's avatar
Chris Allegretta committed
654

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

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

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

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

667
    free_shortcutage(&help_list);
Chris Allegretta's avatar
Chris Allegretta committed
668

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

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

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

681
    free_shortcutage(&writefile_list);
Chris Allegretta's avatar
Chris Allegretta committed
682

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

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

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

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

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

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

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

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

713
    free_shortcutage(&insertfile_list);
714

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

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

721
#ifndef DISABLE_BROWSER
722
    sc_init_one(&insertfile_list, NANO_TOFILES_KEY, _("To Files"),
723
		IFHELP(nano_tofiles_msg, 0), 0, 0, NOVIEW, 0);
724
#endif
725
726
#ifndef NANO_SMALL
    sc_init_one(&insertfile_list, NANO_EXTCMD_KEY, _("Execute Command"),
727
		IFHELP(nano_execute_msg, 0), 0, 0, NOVIEW, 0);
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
810
811
812
813
814
815
816
817
818
819
820
821
822
    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
823
824
    free_shortcutage(&goto_list);
    free_shortcutage(&gotodir_list);
825
826
    free_shortcutage(&writefile_list);
    free_shortcutage(&insertfile_list);
Chris Allegretta's avatar
Chris Allegretta committed
827
    free_shortcutage(&help_list);
828
    free_shortcutage(&spell_list);
Chris Allegretta's avatar
Chris Allegretta committed
829
830
831
#ifndef NANO_SMALL
    free_shortcutage(&extcmd_list);
#endif
832
833
834
835
836
837
838
839
840
#ifndef DISABLE_BROWSER
    free_shortcutage(&browser_list);
#endif

#ifndef NANO_SMALL
    free_toggles();
#endif

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

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