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

#include "config.h"
23

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

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

32
#ifndef DISABLE_WRAPJUSTIFY
33
34
35
/* wrap_at might be set in rcfile.c or nano.c. */
ssize_t wrap_at = -CHARS_FROM_EOL;	/* Right justified fill value,
					   allows resize */
36
37
#endif

Chris Allegretta's avatar
Chris Allegretta committed
38
39
40
41
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? */

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

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

Chris Allegretta's avatar
Chris Allegretta committed
52
53
54
55
56
57
58
59
60
61
62
63
64
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 *filebot = NULL;	/* Last node in the file struct */
filestruct *cutbuffer = NULL;	/* A place to store cut text */

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

69
70
71
72
73
74
#if !defined(NANO_SMALL) && defined(ENABLE_NANORC)
char *whitespace = NULL;	/* Characters used when displaying
				   the first characters of tabs and
				   spaces. */
#endif

75
#ifndef DISABLE_JUSTIFY
76
77
78
79
80
char *punct = NULL;		/* Closing punctuation that can end
				   sentences. */
char *brackets = NULL;		/* Closing brackets that can follow
				   closing punctuation and can end
				   sentences. */
Chris Allegretta's avatar
Chris Allegretta committed
81
82
char *quotestr = NULL;		/* Quote string.  The default value is
				   set in main(). */
Chris Allegretta's avatar
Chris Allegretta committed
83
#endif
84

85
86
87
88
#ifndef NANO_SMALL
char *backup_dir = NULL;	/* Backup directory. */
#endif

89
90
int resetstatuspos;		/* Hack for resetting the status bar 
				   cursor position */
Chris Allegretta's avatar
Chris Allegretta committed
91
char *answer = NULL;		/* Answer str to many questions */
Chris Allegretta's avatar
Chris Allegretta committed
92
int totlines = 0;		/* Total number of lines in the file */
93
long totsize = 0;		/* Total number of bytes in the file */
94
int placewewant = 0;		/* The column we'd like the cursor
Chris Allegretta's avatar
Chris Allegretta committed
95
96
97
				   to jump to when we go to the
				   next or previous line */

98
99
ssize_t tabsize = -1;		/* Our internal tabsize variable.  The
				   default value is set in main(). */
100

Chris Allegretta's avatar
Chris Allegretta committed
101
char *hblank = NULL;		/* A horizontal blank line */
Chris Allegretta's avatar
Chris Allegretta committed
102
#ifndef DISABLE_HELP
Chris Allegretta's avatar
Chris Allegretta committed
103
char *help_text;		/* The text in the help window */
Chris Allegretta's avatar
Chris Allegretta committed
104
#endif
Chris Allegretta's avatar
Chris Allegretta committed
105
106
107

/* More stuff for the marker select */

Chris Allegretta's avatar
Chris Allegretta committed
108
#ifndef NANO_SMALL
109
filestruct *mark_beginbuf;	/* The begin marker buffer */
Chris Allegretta's avatar
Chris Allegretta committed
110
int mark_beginx;		/* X value in the string to start */
Chris Allegretta's avatar
Chris Allegretta committed
111
#endif
Chris Allegretta's avatar
Chris Allegretta committed
112

113
#ifndef DISABLE_OPERATINGDIR
114
115
char *operating_dir = NULL;	/* Operating directory, which we can't */
char *full_operating_dir = NULL;/* go higher than */
116
117
#endif

118
#ifndef DISABLE_SPELLER
119
char *alt_speller = NULL;		/* Alternative spell command */
120
121
#endif

122
123
124
shortcut *main_list = NULL;
shortcut *whereis_list = NULL;
shortcut *replace_list = NULL;
125
shortcut *replace_list_2 = NULL; 	/* 2nd half of replace dialog */
126
127
128
shortcut *goto_list = NULL;
shortcut *writefile_list = NULL;
shortcut *insertfile_list = NULL;
Chris Allegretta's avatar
Chris Allegretta committed
129
#ifndef DISABLE_HELP
130
shortcut *help_list = NULL;
Chris Allegretta's avatar
Chris Allegretta committed
131
132
#endif
#ifndef DISABLE_SPELLER
133
shortcut *spell_list = NULL;
Chris Allegretta's avatar
Chris Allegretta committed
134
#endif
Chris Allegretta's avatar
Chris Allegretta committed
135
#ifndef NANO_SMALL
136
shortcut *extcmd_list = NULL;
Chris Allegretta's avatar
Chris Allegretta committed
137
#endif
138
#ifndef DISABLE_BROWSER
139
shortcut *browser_list = NULL;
140
shortcut *gotodir_list = NULL;
Chris Allegretta's avatar
Chris Allegretta committed
141
#endif
142

143
#ifdef ENABLE_COLOR
144
145
146
const colortype *colorstrings = NULL;
syntaxtype *syntaxes = NULL;
char *syntaxstr = NULL;
147
148
#endif

149
#if !defined(DISABLE_BROWSER) || !defined(DISABLE_HELP) || !defined(DISABLE_MOUSE)
Chris Allegretta's avatar
Chris Allegretta committed
150
const shortcut *currshortcut;	/* Current shortcut list we're using */
151
#endif
152

153
#ifndef NANO_SMALL
154
toggle *toggles = NULL;
155
#endif
Chris Allegretta's avatar
Chris Allegretta committed
156

157
158
159
160
161
#ifndef NANO_SMALL
historyheadtype search_history;
historyheadtype replace_history;
#endif

162
163
/* Regular expressions */

164
#ifdef HAVE_REGEX_H
165
166
167
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
168
#endif
169

170
171
172
173
174
int curses_ended = FALSE;	/* Indicates to statusbar() to simply
				 * write to stderr, since endwin() has
				 * ended curses mode. */


175
size_t length_of_list(const shortcut *s)
176
{
177
    size_t i = 0;
178

179
    for (; s != NULL; s = s->next)
180
181
182
183
	i++;
    return i;
}

Chris Allegretta's avatar
Chris Allegretta committed
184
/* Initialize a struct *without* our lovely braces =( */
185
void sc_init_one(shortcut **shortcutage, int ctrlval, const char *desc,
186
#ifndef DISABLE_HELP
187
	const char *help,
188
#endif
189
	int metaval, int funcval, int miscval, int view, void
190
	(*func)(void))
Chris Allegretta's avatar
Chris Allegretta committed
191
{
192
193
194
    shortcut *s;

    if (*shortcutage == NULL) {
David Lawrence Ramsey's avatar
   
David Lawrence Ramsey committed
195
	*shortcutage = (shortcut *)nmalloc(sizeof(shortcut));
196
197
198
199
	s = *shortcutage;
    } else {
	for (s = *shortcutage; s->next != NULL; s = s->next)
	    ;
David Lawrence Ramsey's avatar
   
David Lawrence Ramsey committed
200
	s->next = (shortcut *)nmalloc(sizeof(shortcut));
201
202
203
	s = s->next; 
    }

204
    s->ctrlval = ctrlval;
205
    s->desc = _(desc);
206
#ifndef DISABLE_HELP
207
    s->help = _(help);
208
#endif
209
210
211
    s->metaval = metaval;
    s->funcval = funcval;
    s->miscval = miscval;
Chris Allegretta's avatar
Chris Allegretta committed
212
213
    s->viewok = view;
    s->func = func;
214
    s->next = NULL;
Chris Allegretta's avatar
Chris Allegretta committed
215
216
}

217
void shortcut_init(int unjustify)
218
{
219
220
221
222
223
224
225
226
227
228
229
230
231
232
    const char *get_help_msg = N_("Get Help");
    const char *exit_msg = N_("Exit");
    const char *prev_page_msg = N_("Prev Page");
    const char *next_page_msg = N_("Next Page");
    const char *replace_msg = N_("Replace");
    const char *go_to_line_msg = N_("Go To Line");
    const char *cancel_msg = N_("Cancel");
    const char *first_line_msg = N_("First Line");
    const char *last_line_msg = N_("Last Line");
#ifndef NANO_SMALL
    const char *case_sens_msg = N_("Case Sens");
    const char *direction_msg = N_("Direction");
#ifdef HAVE_REGEX_H
    const char *regexp_msg = N_("Regexp");
233
#endif
234
235
236
237
    const char *history_msg = N_("History");
#endif /* !NANO_SMALL */
#ifndef DISABLE_BROWSER
    const char *to_files_msg = N_("To Files");
238
#endif
239

240
241
242
#ifndef DISABLE_HELP
    const char *nano_help_msg = N_("Invoke the help menu");
    const char *nano_exit_msg =
243
#ifdef ENABLE_MULTIBUFFER
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
	N_("Close currently loaded file/Exit from nano")
#else
   	N_("Exit from nano")
#endif
	;
    const char *nano_writeout_msg = N_("Write the current file to disk");
    const char *nano_justify_msg = N_("Justify the current paragraph");
    const char *nano_insert_msg =
	N_("Insert another file into the current one");
    const char *nano_whereis_msg = N_("Search for text within the editor");
    const char *nano_prevpage_msg = N_("Move to the previous screen");
    const char *nano_nextpage_msg = N_("Move to the next screen");
    const char *nano_cut_msg =
	N_("Cut the current line and store it in the cutbuffer");
    const char *nano_uncut_msg =
	N_("Uncut from the cutbuffer into the current line");
    const char *nano_cursorpos_msg = N_("Show the position of the cursor");
    const char *nano_spell_msg = N_("Invoke the spell checker, if available");
    const char *nano_goto_msg = N_("Go to a specific line number");
    const char *nano_replace_msg = N_("Replace text within the editor");
    const char *nano_prevline_msg = N_("Move to the previous line");
    const char *nano_nextline_msg = N_("Move to the next line");
    const char *nano_forward_msg = N_("Move forward one character");
    const char *nano_back_msg = N_("Move back one character");
    const char *nano_home_msg = N_("Move to the beginning of the current line");
    const char *nano_end_msg = N_("Move to the end of the current line");
    const char *nano_refresh_msg = N_("Refresh (redraw) the current screen");
    const char *nano_mark_msg = N_("Mark text at the current cursor location");
    const char *nano_delete_msg = N_("Delete the character under the cursor");
    const char *nano_backspace_msg =
	N_("Delete the character to the left of the cursor");
    const char *nano_tab_msg = N_("Insert a tab character");
    const char *nano_enter_msg =
	N_("Insert a carriage return at the cursor position");
    const char *nano_nextword_msg = N_("Move forward one word");
    const char *nano_prevword_msg = N_("Move backward one word");
    const char *nano_verbatim_msg = N_("Insert character(s) verbatim");
281
#ifdef ENABLE_MULTIBUFFER
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
    const char *nano_openprev_msg = N_("Switch to previous file buffer");
    const char *nano_opennext_msg = N_("Switch to next file buffer");
#endif
#if !defined(NANO_SMALL) && defined(HAVE_REGEX_H)
    const char *nano_bracket_msg = N_("Find other bracket");
#endif
    const char *nano_whereis_next_msg = N_("Repeat last search");
    const char *nano_cancel_msg = N_("Cancel the current function");
    const char *nano_firstline_msg = N_("Go to the first line of the file");
    const char *nano_lastline_msg = N_("Go to the last line of the file");
    const char *nano_parabegin_msg =
	N_("Go to the beginning of the current paragraph");
    const char *nano_paraend_msg =
	N_("Go to the end of the current paragraph");
    const char *nano_fulljustify_msg = N_("Justify the entire file");
#ifndef NANO_SMALL
    const char *nano_case_msg =
	N_("Make the current search/replace case (in)sensitive");
    const char *nano_reverse_msg =
	N_("Make the current search/replace go backwards");
#ifdef HAVE_REGEX_H
    const char *nano_regexp_msg = N_("Use regular expressions");
304
#endif
305
306
    const char *nano_editstr_msg =
	N_("Edit the previous search/replace strings");
307
#endif /* !NANO_SMALL */
308

309
310
#ifndef DISABLE_BROWSER
    const char *nano_tofiles_msg = N_("Go to file browser");
Chris Allegretta's avatar
Chris Allegretta committed
311
#endif
312
313
314
#ifndef NANO_SMALL
    const char *nano_dos_msg = N_("Write file out in DOS format");
    const char *nano_mac_msg = N_("Write file out in Mac format");
315
#endif
316
317
318
319
320
    const char *nano_append_msg = N_("Append to the current file");
    const char *nano_prepend_msg = N_("Prepend to the current file");
#ifndef NANO_SMALL
    const char *nano_backup_msg = N_("Back up original file when saving");
    const char *nano_execute_msg = N_("Execute external command");
321
#endif
322
323
324
325
326
#if defined(ENABLE_MULTIBUFFER) && !defined(NANO_SMALL)
    const char *nano_multibuffer_msg = N_("Insert into new buffer");
#endif
#ifndef DISABLE_BROWSER
    const char *nano_gotodir_msg = N_("Go to directory");
Chris Allegretta's avatar
Chris Allegretta committed
327
#endif
328
#endif /* !DISABLE_HELP */
Chris Allegretta's avatar
Chris Allegretta committed
329

David Lawrence Ramsey's avatar
David Lawrence Ramsey committed
330
331
332
/* 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 4th one should not be there. */
David Lawrence Ramsey's avatar
David Lawrence Ramsey committed
333
#ifndef DISABLE_HELP
334
#  define IFHELP(help, nextvar) help, nextvar
David Lawrence Ramsey's avatar
David Lawrence Ramsey committed
335
336
#else
#  define IFHELP(help, nextvar) nextvar
337
#endif
338

339
340
    free_shortcutage(&main_list);

341
    /* Translators: try to keep this string under 10 characters long */
342
343
344
    sc_init_one(&main_list, NANO_HELP_KEY, get_help_msg,
	IFHELP(nano_help_msg, NANO_NO_KEY), NANO_HELP_FKEY,
	NANO_NO_KEY, VIEW,
345
346
347
348
349
350
#ifndef DISABLE_HELP
		do_help
#else
		nano_disabled_msg
#endif
		);
Chris Allegretta's avatar
Chris Allegretta committed
351

352
#ifdef ENABLE_MULTIBUFFER
353
    if (open_files != NULL && (open_files->prev != NULL || open_files->next != NULL))
354
    /* Translators: try to keep this string under 10 characters long */
355
	sc_init_one(&main_list, NANO_EXIT_KEY, N_("Close"),
David Lawrence Ramsey's avatar
   
David Lawrence Ramsey committed
356
357
		IFHELP(nano_exit_msg, NANO_NO_KEY), NANO_EXIT_FKEY,
		NANO_NO_KEY, VIEW, do_exit);
358
359
    else
#endif
360

361
    /* Translators: try to keep this string under 10 characters long */
362
	sc_init_one(&main_list, NANO_EXIT_KEY, exit_msg,
David Lawrence Ramsey's avatar
   
David Lawrence Ramsey committed
363
364
		IFHELP(nano_exit_msg, NANO_NO_KEY), NANO_EXIT_FKEY,
		NANO_NO_KEY, VIEW, do_exit);
Chris Allegretta's avatar
Chris Allegretta committed
365

366
    /* Translators: try to keep this string under 10 characters long */
367
368
369
    sc_init_one(&main_list, NANO_WRITEOUT_KEY, N_("WriteOut"),
	IFHELP(nano_writeout_msg, NANO_NO_KEY), NANO_WRITEOUT_FKEY,
	NANO_NO_KEY, NOVIEW, do_writeout_void);
Chris Allegretta's avatar
Chris Allegretta committed
370

371
    /* Translators: try to keep this string under 10 characters long */
372
373
374
    sc_init_one(&main_list, NANO_JUSTIFY_KEY, N_("Justify"),
	IFHELP(nano_justify_msg, NANO_NO_KEY),
	NANO_JUSTIFY_FKEY, NANO_NO_KEY, NOVIEW,
375
#ifndef DISABLE_JUSTIFY
376
		do_justify_void
377
378
379
380
#else
		nano_disabled_msg
#endif
		);
381

382
383
384
385
386
    /* We allow inserting files in view mode if multibuffers are
     * available, so that we can view multiple files. */
    /* If we're using restricted mode, inserting files is disabled since
     * it allows reading from or writing to files not specified on the
     * command line. */
387
    /* Translators: try to keep this string under 10 characters long */
388
389
390
    sc_init_one(&main_list, NANO_INSERTFILE_KEY, N_("Read File"),
	IFHELP(nano_insert_msg, NANO_NO_KEY), NANO_INSERTFILE_FKEY,
	NANO_NO_KEY,
391
#ifdef ENABLE_MULTIBUFFER
392
		VIEW
393
#else
394
		NOVIEW
395
#endif
396
		, !ISSET(RESTRICTED) ? do_insertfile_void : nano_disabled_msg);
Chris Allegretta's avatar
Chris Allegretta committed
397

398
    /* Translators: try to keep this string under 10 characters long */
399
400
401
    sc_init_one(&main_list, NANO_WHEREIS_KEY, N_("Where Is"),
	IFHELP(nano_whereis_msg, NANO_NO_KEY), NANO_WHEREIS_FKEY,
	NANO_NO_KEY, VIEW, do_search);
Chris Allegretta's avatar
Chris Allegretta committed
402

403
    /* Translators: try to keep this string under 10 characters long */
404
405
406
    sc_init_one(&main_list, NANO_PREVPAGE_KEY, prev_page_msg,
	IFHELP(nano_prevpage_msg, NANO_NO_KEY), NANO_PREVPAGE_FKEY,
	NANO_NO_KEY, VIEW, do_page_up);
Chris Allegretta's avatar
Chris Allegretta committed
407

408
    /* Translators: try to keep this string under 10 characters long */
409
410
411
    sc_init_one(&main_list, NANO_NEXTPAGE_KEY, next_page_msg,
	IFHELP(nano_nextpage_msg, NANO_NO_KEY), NANO_NEXTPAGE_FKEY,
	NANO_NO_KEY, VIEW, do_page_down);
Chris Allegretta's avatar
Chris Allegretta committed
412

413
    /* Translators: try to keep this string under 10 characters long */
414
415
416
    sc_init_one(&main_list, NANO_CUT_KEY, N_("Cut Text"),
	IFHELP(nano_cut_msg, NANO_NO_KEY), NANO_CUT_FKEY,
	NANO_NO_KEY, NOVIEW, do_cut_text);
Chris Allegretta's avatar
Chris Allegretta committed
417

418
    if (unjustify)
419
    /* Translators: try to keep this string under 10 characters long */
420
421
	sc_init_one(&main_list, NANO_UNJUSTIFY_KEY, N_("UnJustify"),
		IFHELP(NULL, NANO_NO_KEY), NANO_UNJUSTIFY_FKEY,
422
		NANO_NO_KEY, NOVIEW, 0);
423
    else
424
    /* Translators: try to keep this string under 10 characters long */
425
	sc_init_one(&main_list, NANO_UNCUT_KEY, N_("UnCut Txt"),
David Lawrence Ramsey's avatar
   
David Lawrence Ramsey committed
426
427
		IFHELP(nano_uncut_msg, NANO_NO_KEY), NANO_UNCUT_FKEY,
		NANO_NO_KEY, NOVIEW, do_uncut_text);
Chris Allegretta's avatar
Chris Allegretta committed
428

429
    /* Translators: try to keep this string under 10 characters long */
430
431
432
    sc_init_one(&main_list, NANO_CURSORPOS_KEY, N_("Cur Pos"),
	IFHELP(nano_cursorpos_msg, NANO_NO_KEY), NANO_CURSORPOS_FKEY,
	NANO_NO_KEY, VIEW, do_cursorpos_void);
Chris Allegretta's avatar
Chris Allegretta committed
433

434
435
436
    /* If we're using restricted mode, spell checking is disabled
     * because it allows reading from or writing to files not specified
     * on the command line. */
437
    /* Translators: try to keep this string under 10 characters long */
438
    sc_init_one(&main_list, NANO_SPELL_KEY, N_("To Spell"),
David Lawrence Ramsey's avatar
   
David Lawrence Ramsey committed
439
		IFHELP(nano_spell_msg, NANO_NO_KEY), NANO_SPELL_FKEY,
440
441
442
443
444
		NANO_NO_KEY, NOVIEW,
#ifndef DISABLE_SPELLER
		!ISSET(RESTRICTED) ? do_spell :
#endif
		nano_disabled_msg);
445

446
447
448
    sc_init_one(&main_list, NANO_GOTO_KEY, go_to_line_msg,
	IFHELP(nano_goto_msg, NANO_ALT_GOTO_KEY), NANO_GOTO_FKEY,
	NANO_NO_KEY, VIEW, do_gotoline_void);
449

450
451
452
    sc_init_one(&main_list, NANO_REPLACE_KEY, replace_msg,
	IFHELP(nano_replace_msg, NANO_ALT_REPLACE_KEY), NANO_REPLACE_FKEY,
	NANO_NO_KEY, NOVIEW, do_replace);
Chris Allegretta's avatar
Chris Allegretta committed
453

454
455
456
    sc_init_one(&main_list, NANO_PREVLINE_KEY, N_("Prev Line"),
	IFHELP(nano_prevline_msg, NANO_NO_KEY), NANO_NO_KEY,
	NANO_NO_KEY, VIEW, do_up);
Chris Allegretta's avatar
Chris Allegretta committed
457

458
459
460
    sc_init_one(&main_list, NANO_NEXTLINE_KEY, N_("Next Line"),
	IFHELP(nano_nextline_msg, NANO_NO_KEY), NANO_NO_KEY,
	NANO_NO_KEY, VIEW, do_down);
Chris Allegretta's avatar
Chris Allegretta committed
461

462
463
464
    sc_init_one(&main_list, NANO_FORWARD_KEY, N_("Forward"),
	IFHELP(nano_forward_msg, NANO_NO_KEY), NANO_NO_KEY,
	NANO_NO_KEY, VIEW, do_right_void);
Chris Allegretta's avatar
Chris Allegretta committed
465

466
467
468
    sc_init_one(&main_list, NANO_BACK_KEY, N_("Back"),
	IFHELP(nano_back_msg, NANO_NO_KEY), NANO_NO_KEY,
	NANO_NO_KEY, VIEW, do_left_void);
Chris Allegretta's avatar
Chris Allegretta committed
469

470
471
472
    sc_init_one(&main_list, NANO_HOME_KEY, N_("Home"),
	IFHELP(nano_home_msg, NANO_NO_KEY), NANO_NO_KEY,
	NANO_NO_KEY, VIEW, do_home);
Chris Allegretta's avatar
Chris Allegretta committed
473

474
475
476
    sc_init_one(&main_list, NANO_END_KEY, N_("End"),
	IFHELP(nano_end_msg, NANO_NO_KEY), NANO_NO_KEY,
	NANO_NO_KEY, VIEW, do_end);
Chris Allegretta's avatar
Chris Allegretta committed
477

478
479
480
    sc_init_one(&main_list, NANO_REFRESH_KEY, N_("Refresh"),
	IFHELP(nano_refresh_msg, NANO_NO_KEY), NANO_NO_KEY,
	NANO_NO_KEY, VIEW, total_refresh);
Chris Allegretta's avatar
Chris Allegretta committed
481

482
483
484
    sc_init_one(&main_list, NANO_MARK_KEY, N_("Mark Text"),
	IFHELP(nano_mark_msg, NANO_ALT_MARK_KEY),
	NANO_NO_KEY, NANO_NO_KEY, NOVIEW,
485
486
487
488
489
490
#ifndef NANO_SMALL
		do_mark
#else
		nano_disabled_msg
#endif
		);
Chris Allegretta's avatar
Chris Allegretta committed
491

492
493
494
    sc_init_one(&main_list, NANO_DELETE_KEY, N_("Delete"),
	IFHELP(nano_delete_msg, NANO_NO_KEY), NANO_NO_KEY,
	NANO_NO_KEY, NOVIEW, do_delete);
Chris Allegretta's avatar
Chris Allegretta committed
495

496
497
498
    sc_init_one(&main_list, NANO_BACKSPACE_KEY, N_("Backspace"),
	IFHELP(nano_backspace_msg, NANO_NO_KEY), NANO_NO_KEY,
	NANO_NO_KEY, NOVIEW, do_backspace);
Chris Allegretta's avatar
Chris Allegretta committed
499

500
501
502
    sc_init_one(&main_list, NANO_TAB_KEY, N_("Tab"),
	IFHELP(nano_tab_msg, NANO_NO_KEY), NANO_NO_KEY,
	NANO_NO_KEY, NOVIEW, do_tab);
Chris Allegretta's avatar
Chris Allegretta committed
503

504
505
506
    sc_init_one(&main_list, NANO_ENTER_KEY, N_("Enter"),
	IFHELP(nano_enter_msg, NANO_NO_KEY), NANO_NO_KEY,
	NANO_NO_KEY, NOVIEW, do_enter);
507

508
#ifndef NANO_SMALL
509
510
511
    sc_init_one(&main_list, NANO_NEXTWORD_KEY, N_("Next Word"),
	IFHELP(nano_nextword_msg, NANO_NO_KEY), NANO_NO_KEY,
	NANO_NO_KEY, VIEW, do_next_word);
512

513
514
515
    sc_init_one(&main_list, NANO_NO_KEY, N_("Prev Word"),
	IFHELP(nano_prevword_msg, NANO_PREVWORD_KEY), NANO_NO_KEY,
	NANO_NO_KEY, VIEW, do_prev_word);
516
#endif
517

518
519
520
    sc_init_one(&main_list, NANO_NO_KEY, N_("Verbatim Input"),
	IFHELP(nano_verbatim_msg, NANO_VERBATIM_KEY), NANO_NO_KEY,
	NANO_NO_KEY, NOVIEW, do_verbatim_input);
521

522
#ifdef ENABLE_MULTIBUFFER
523
524
525
    sc_init_one(&main_list, NANO_NO_KEY, N_("Previous File"),
	IFHELP(nano_openprev_msg, NANO_OPENPREV_KEY), NANO_NO_KEY,
	NANO_OPENPREV_ALTKEY, VIEW, open_prevfile_void);
526

527
528
529
    sc_init_one(&main_list, NANO_NO_KEY, N_("Next File"),
	IFHELP(nano_opennext_msg, NANO_OPENNEXT_KEY), NANO_NO_KEY,
	NANO_OPENNEXT_ALTKEY, VIEW, open_nextfile_void);
530
#endif
531

532
533
#ifndef NANO_SMALL
#ifdef HAVE_REGEX_H
534
535
536
    sc_init_one(&main_list, NANO_NO_KEY, N_("Find Other Bracket"),
	IFHELP(nano_bracket_msg, NANO_BRACKET_KEY), NANO_NO_KEY,
	NANO_NO_KEY, VIEW, do_find_bracket);
537
538
#endif

539
540
541
    sc_init_one(&main_list, NANO_NO_KEY, N_("Where Is Next"),
	IFHELP(nano_whereis_next_msg, NANO_WHEREIS_NEXT_KEY),
	NANO_NO_KEY, NANO_NO_KEY, VIEW, do_research);
542
#endif
543

544
    free_shortcutage(&whereis_list);
545

546
547
548
    sc_init_one(&whereis_list, NANO_HELP_KEY, get_help_msg,
	IFHELP(nano_help_msg, NANO_NO_KEY), NANO_HELP_FKEY,
	NANO_NO_KEY, VIEW,
549
550
551
552
553
554
#ifndef DISABLE_HELP
		do_help
#else
		nano_disabled_msg
#endif
		);
555

556
    /* Translators: try to keep this string under 10 characters long */
557
558
559
    sc_init_one(&whereis_list, NANO_CANCEL_KEY, cancel_msg,
	IFHELP(nano_cancel_msg, NANO_NO_KEY), NANO_NO_KEY,
	NANO_NO_KEY, VIEW, 0);
560

561
    /* Translators: try to keep this string under 10 characters long */
562
563
564
    sc_init_one(&whereis_list, NANO_FIRSTLINE_KEY, first_line_msg,
	IFHELP(nano_firstline_msg, NANO_NO_KEY), NANO_FIRSTLINE_FKEY,
	NANO_NO_KEY, VIEW, do_first_line);
Chris Allegretta's avatar
Chris Allegretta committed
565

566
    /* Translators: try to keep this string under 10 characters long */
567
568
569
    sc_init_one(&whereis_list, NANO_LASTLINE_KEY, last_line_msg,
	IFHELP(nano_lastline_msg, NANO_NO_KEY), NANO_LASTLINE_FKEY,
	NANO_NO_KEY, VIEW, do_last_line);
Chris Allegretta's avatar
Chris Allegretta committed
570

571
    /* Translators: try to keep this string under 10 characters long */
572
573
574
    sc_init_one(&whereis_list, NANO_OTHERSEARCH_KEY, replace_msg,
	IFHELP(nano_replace_msg, NANO_NO_KEY), NANO_REPLACE_FKEY,
	NANO_NO_KEY, VIEW, do_replace);
Chris Allegretta's avatar
Chris Allegretta committed
575

576
    /* Translators: try to keep this string under 10 characters long */
577
578
579
    sc_init_one(&whereis_list, NANO_FROMSEARCHTOGOTO_KEY, go_to_line_msg,
	IFHELP(nano_goto_msg, NANO_NO_KEY), NANO_GOTO_FKEY,
	NANO_NO_KEY, VIEW, do_gotoline_void);
580

581
582
#ifndef DISABLE_JUSTIFY
    /* Translators: try to keep this string under 10 characters long */
583
584
585
    sc_init_one(&whereis_list, NANO_PARABEGIN_KEY, N_("Beg of Par"),
	IFHELP(nano_parabegin_msg, NANO_NO_KEY), NANO_NO_KEY,
	NANO_NO_KEY, VIEW, do_para_begin);
586
587

    /* Translators: try to keep this string under 10 characters long */
588
589
590
    sc_init_one(&whereis_list, NANO_PARAEND_KEY, N_("End of Par"),
	IFHELP(nano_paraend_msg, NANO_NO_KEY), NANO_NO_KEY,
	NANO_NO_KEY, VIEW, do_para_end);
591
592

    /* Translators: try to keep this string under 10 characters long */
593
594
595
    sc_init_one(&whereis_list, NANO_FULLJUSTIFY_KEY, N_("FullJstify"),
	IFHELP(nano_fulljustify_msg, NANO_NO_KEY), NANO_NO_KEY,
	NANO_NO_KEY, NOVIEW, do_full_justify);
596
597
#endif

598
#ifndef NANO_SMALL
599
    /* Translators: try to keep this string under 10 characters long */
600
601
602
    sc_init_one(&whereis_list, NANO_NO_KEY, case_sens_msg,
	IFHELP(nano_case_msg, TOGGLE_CASE_KEY), NANO_NO_KEY,
	NANO_NO_KEY, VIEW, 0);
603

604
    /* Translators: try to keep this string under 10 characters long */
605
606
607
    sc_init_one(&whereis_list, NANO_NO_KEY, direction_msg,
	IFHELP(nano_reverse_msg, TOGGLE_BACKWARDS_KEY), NANO_NO_KEY,
	NANO_NO_KEY, VIEW, 0);
Chris Allegretta's avatar
Chris Allegretta committed
608

609
#ifdef HAVE_REGEX_H
610
    /* Translators: try to keep this string under 10 characters long */
611
612
613
    sc_init_one(&whereis_list, NANO_NO_KEY, regexp_msg,
	IFHELP(nano_regexp_msg, TOGGLE_REGEXP_KEY), NANO_NO_KEY,
	NANO_NO_KEY, VIEW, 0);
614
#endif
615
616

#ifndef NANO_SMALL
617
    /* Translators: try to keep this string under 10 characters long */
618
619
620
    sc_init_one(&whereis_list, NANO_HISTORY_KEY, history_msg,
	IFHELP(nano_editstr_msg, NANO_NO_KEY), NANO_NO_KEY,
	NANO_NO_KEY, VIEW, 0);
621
622
#endif

623
#endif /* !NANO_SMALL */
624

625
    free_shortcutage(&replace_list);
626

627
628
629
    sc_init_one(&replace_list, NANO_HELP_KEY, get_help_msg,
	IFHELP(nano_help_msg, NANO_NO_KEY), NANO_HELP_FKEY,
	NANO_NO_KEY, VIEW,
630
631
632
633
634
635
#ifndef DISABLE_HELP
		do_help
#else
		nano_disabled_msg
#endif
		);
636

637
638
639
    sc_init_one(&replace_list, NANO_CANCEL_KEY, cancel_msg,
	IFHELP(nano_cancel_msg, NANO_NO_KEY), NANO_NO_KEY,
	NANO_NO_KEY, VIEW, 0);
Chris Allegretta's avatar
Chris Allegretta committed
640

641
642
643
    sc_init_one(&replace_list, NANO_FIRSTLINE_KEY, first_line_msg,
	IFHELP(nano_firstline_msg, NANO_NO_KEY), NANO_FIRSTLINE_FKEY,
	NANO_NO_KEY, VIEW, do_first_line);
Chris Allegretta's avatar
Chris Allegretta committed
644

645
646
647
    sc_init_one(&replace_list, NANO_LASTLINE_KEY, last_line_msg,
	IFHELP(nano_lastline_msg, NANO_NO_KEY), NANO_LASTLINE_FKEY,
	NANO_NO_KEY, VIEW, do_last_line);
Chris Allegretta's avatar
Chris Allegretta committed
648

649
    /* Translators: try to keep this string under 12 characters long */
650
651
652
    sc_init_one(&replace_list, NANO_OTHERSEARCH_KEY, N_("No Replace"),
	IFHELP(nano_whereis_msg, NANO_NO_KEY), NANO_REPLACE_FKEY,
	NANO_NO_KEY, VIEW, do_search);
Chris Allegretta's avatar
Chris Allegretta committed
653

654
655
656
    sc_init_one(&replace_list, NANO_FROMSEARCHTOGOTO_KEY, go_to_line_msg,
	IFHELP(nano_goto_msg, NANO_NO_KEY), NANO_GOTO_FKEY,
	NANO_NO_KEY, VIEW, do_gotoline_void);
657

658
#ifndef NANO_SMALL
659
660
661
    sc_init_one(&replace_list, NANO_NO_KEY, case_sens_msg,
	IFHELP(nano_case_msg, TOGGLE_CASE_KEY), NANO_NO_KEY,
	NANO_NO_KEY, VIEW, 0);
662

663
664
665
    sc_init_one(&replace_list, NANO_NO_KEY, direction_msg,
	IFHELP(nano_reverse_msg, TOGGLE_BACKWARDS_KEY), NANO_NO_KEY,
	NANO_NO_KEY, VIEW, 0);
666

667
#ifdef HAVE_REGEX_H
668
669
670
    sc_init_one(&replace_list, NANO_NO_KEY, regexp_msg,
	IFHELP(nano_regexp_msg, TOGGLE_REGEXP_KEY), NANO_NO_KEY,
	NANO_NO_KEY, VIEW, 0);
671
#endif
672

673
674
675
    sc_init_one(&replace_list, NANO_HISTORY_KEY, history_msg,
	IFHELP(nano_editstr_msg, NANO_NO_KEY), NANO_NO_KEY,
	NANO_NO_KEY, VIEW, 0);
676
#endif /* !NANO_SMALL */
677

678
    free_shortcutage(&replace_list_2);
679

680
681
682
    sc_init_one(&replace_list_2, NANO_HELP_KEY, get_help_msg,
	IFHELP(nano_help_msg, NANO_NO_KEY), NANO_HELP_FKEY,
	NANO_NO_KEY, VIEW,
683
684
685
686
687
688
#ifndef DISABLE_HELP
		do_help
#else
		nano_disabled_msg
#endif
		);
689

690
691
692
    sc_init_one(&replace_list_2, NANO_CANCEL_KEY, cancel_msg,
	IFHELP(nano_cancel_msg, NANO_NO_KEY), NANO_NO_KEY,
	NANO_NO_KEY, VIEW, 0);
693

694
695
696
    sc_init_one(&replace_list_2, NANO_FIRSTLINE_KEY, first_line_msg,
	IFHELP(nano_firstline_msg, NANO_NO_KEY), NANO_NO_KEY,
	NANO_NO_KEY, VIEW, do_first_line);
697

698
699
700
    sc_init_one(&replace_list_2, NANO_LASTLINE_KEY, last_line_msg,
	IFHELP(nano_lastline_msg, NANO_NO_KEY), NANO_NO_KEY,
	NANO_NO_KEY, VIEW, do_last_line);
701

702
#ifndef NANO_SMALL
703
704
705
    sc_init_one(&replace_list_2, NANO_HISTORY_KEY, history_msg,
	IFHELP(nano_editstr_msg, NANO_NO_KEY), NANO_NO_KEY,
	NANO_NO_KEY, VIEW, 0);
706
707
#endif

708
    free_shortcutage(&goto_list);
Chris Allegretta's avatar
Chris Allegretta committed
709

710
711
712
    sc_init_one(&goto_list, NANO_HELP_KEY, get_help_msg,
	IFHELP(nano_help_msg, NANO_NO_KEY), NANO_HELP_FKEY,
	NANO_NO_KEY, VIEW,
713
714
715
716
717
718
#ifndef DISABLE_HELP
		do_help
#else
		nano_disabled_msg
#endif
		);
719

720
721
722
    sc_init_one(&goto_list, NANO_CANCEL_KEY, cancel_msg,
	IFHELP(nano_cancel_msg, NANO_NO_KEY), NANO_NO_KEY,
	NANO_NO_KEY, VIEW, 0);
Chris Allegretta's avatar
Chris Allegretta committed
723

724
725
726
    sc_init_one(&goto_list, NANO_FIRSTLINE_KEY, first_line_msg,
	IFHELP(nano_firstline_msg, NANO_NO_KEY), NANO_NO_KEY,
	NANO_NO_KEY, VIEW, do_first_line);
Chris Allegretta's avatar
Chris Allegretta committed
727

728
729
730
    sc_init_one(&goto_list, NANO_LASTLINE_KEY, last_line_msg,
	IFHELP(nano_lastline_msg, NANO_NO_KEY), NANO_NO_KEY,
	NANO_NO_KEY, VIEW, do_last_line);
Chris Allegretta's avatar
Chris Allegretta committed
731

Chris Allegretta's avatar
Chris Allegretta committed
732
#ifndef DISABLE_HELP
733
    free_shortcutage(&help_list);
Chris Allegretta's avatar
Chris Allegretta committed
734

735
736
737
    sc_init_one(&help_list, NANO_PREVPAGE_KEY, prev_page_msg,
	IFHELP(nano_prevpage_msg, NANO_NO_KEY), NANO_PREVPAGE_FKEY,
	NANO_NO_KEY, VIEW, 0);
Chris Allegretta's avatar
Chris Allegretta committed
738

739
740
741
    sc_init_one(&help_list, NANO_NEXTPAGE_KEY, next_page_msg,
	IFHELP(nano_nextpage_msg, NANO_NO_KEY), NANO_NEXTPAGE_FKEY,
	NANO_NO_KEY, VIEW, 0);
742

743
744
745
    sc_init_one(&help_list, NANO_PREVLINE_KEY, N_("Prev Line"),
	IFHELP(nano_prevline_msg, NANO_NO_KEY), NANO_NO_KEY,
	NANO_NO_KEY, VIEW, 0);
746

747
748
749
    sc_init_one(&help_list, NANO_NEXTLINE_KEY, N_("Next Line"),
	IFHELP(nano_nextline_msg, NANO_NO_KEY), NANO_NO_KEY,
	NANO_NO_KEY, VIEW, 0);
Chris Allegretta's avatar
Chris Allegretta committed
750

751
752
753
    sc_init_one(&help_list, NANO_EXIT_KEY, exit_msg,
	IFHELP(nano_exit_msg, NANO_NO_KEY), NANO_EXIT_FKEY,
	NANO_NO_KEY, VIEW, 0);
Chris Allegretta's avatar
Chris Allegretta committed
754
#endif
Chris Allegretta's avatar
Chris Allegretta committed
755

756
    free_shortcutage(&writefile_list);
Chris Allegretta's avatar
Chris Allegretta committed
757

758
759
760
    sc_init_one(&writefile_list, NANO_HELP_KEY, get_help_msg,
	IFHELP(nano_help_msg, NANO_NO_KEY), NANO_HELP_FKEY,
	NANO_NO_KEY, VIEW,
761
762
763
764
765
766
#ifndef DISABLE_HELP
		do_help
#else
		nano_disabled_msg
#endif
		);
767

768
769
770
771
    sc_init_one(&writefile_list, NANO_CANCEL_KEY, cancel_msg,
	IFHELP(nano_cancel_msg, NANO_NO_KEY), NANO_NO_KEY,
	NANO_NO_KEY, VIEW, 0);

772
#ifndef DISABLE_BROWSER
773
774
    /* If we're using restricted mode, the file browser is disabled.
     * It's useless since inserting files is disabled. */
775
    /* Translators: try to keep this string under 16 characters long */
776
    if (!ISSET(RESTRICTED))
777
	sc_init_one(&writefile_list, NANO_TOFILES_KEY, to_files_msg,
David Lawrence Ramsey's avatar
   
David Lawrence Ramsey committed
778
779
		IFHELP(nano_tofiles_msg, NANO_NO_KEY), NANO_NO_KEY,
		NANO_NO_KEY, NOVIEW, 0);
Chris Allegretta's avatar
Chris Allegretta committed
780
#endif
Chris Allegretta's avatar
Chris Allegretta committed
781

782
#ifndef NANO_SMALL
783
784
785
786
787
788
    /* If we're using restricted mode, the DOS format, Mac format,
     * append, prepend, and backup toggles are disabled.  The first and
     * second are useless since inserting files is disabled, the third
     * and fourth are disabled because they allow writing to files not
     * specified on the command line, and the fifth is useless since
     * backups are disabled. */
789
    /* Translators: try to keep this string under 16 characters long */
790
    if (!ISSET(RESTRICTED))
791
	sc_init_one(&writefile_list, NANO_NO_KEY, N_("DOS Format"),
David Lawrence Ramsey's avatar
   
David Lawrence Ramsey committed
792
793
		IFHELP(nano_dos_msg, TOGGLE_DOS_KEY), NANO_NO_KEY,
		NANO_NO_KEY, NOVIEW, 0);
794

795
    /* Translators: try to keep this string under 16 characters long */
796
    if (!ISSET(RESTRICTED))
797
	sc_init_one(&writefile_list, NANO_NO_KEY, N_("Mac Format"),
David Lawrence Ramsey's avatar
   
David Lawrence Ramsey committed
798
799
		IFHELP(nano_mac_msg, TOGGLE_MAC_KEY), NANO_NO_KEY,
		NANO_NO_KEY, NOVIEW, 0);
800
801
#endif

802
    /* Translators: try to keep this string under 16 characters long */
803
    if (!ISSET(RESTRICTED))
804
	sc_init_one(&writefile_list, NANO_NO_KEY, N_("Append"),
David Lawrence Ramsey's avatar
   
David Lawrence Ramsey committed
805
806
		IFHELP(nano_append_msg, NANO_APPEND_KEY), NANO_NO_KEY,
		NANO_NO_KEY, NOVIEW, 0);
807

808
    /* Translators: try to keep this string under 16 characters long */
809
    if (!ISSET(RESTRICTED))
810
	sc_init_one(&writefile_list, NANO_NO_KEY, N_("Prepend"),
David Lawrence Ramsey's avatar
   
David Lawrence Ramsey committed
811
812
		IFHELP(nano_prepend_msg, NANO_PREPEND_KEY), NANO_NO_KEY,
		NANO_NO_KEY, NOVIEW, 0);
813

814
#ifndef NANO_SMALL
815
    /* Translators: try to keep this string under 16 characters long */
816
    if (!ISSET(RESTRICTED))
817
	sc_init_one(&writefile_list, NANO_NO_KEY, N_("Backup File"),
David Lawrence Ramsey's avatar
   
David Lawrence Ramsey committed
818
819
		IFHELP(nano_backup_msg, TOGGLE_BACKUP_KEY), NANO_NO_KEY,
		NANO_NO_KEY, NOVIEW, 0);
820
821
#endif

822
    free_shortcutage(&insertfile_list);
823

824
825
826
    sc_init_one(&insertfile_list, NANO_HELP_KEY, get_help_msg,
	IFHELP(nano_help_msg, NANO_NO_KEY), NANO_HELP_FKEY,
	NANO_NO_KEY, VIEW,
827
828
829
830
831
832
#ifndef DISABLE_HELP
		do_help
#else
		nano_disabled_msg
#endif
		);
833

834
    sc_init_one(&insertfile_list, NANO_CANCEL_KEY, cancel_msg,
David Lawrence Ramsey's avatar
   
David Lawrence Ramsey committed
835
836
		IFHELP(nano_cancel_msg, NANO_NO_KEY), NANO_NO_KEY,
		NANO_NO_KEY, VIEW, 0);
Chris Allegretta's avatar
Chris Allegretta committed
837

838
#ifndef DISABLE_BROWSER
839
840
    /* If we're using restricted mode, the file browser is disabled.
     * It's useless since inserting files is disabled. */
841
    if (!ISSET(RESTRICTED))
842
	sc_init_one(&insertfile_list, NANO_TOFILES_KEY, to_files_msg,
David Lawrence Ramsey's avatar
   
David Lawrence Ramsey committed
843
844
		IFHELP(nano_tofiles_msg, NANO_NO_KEY), NANO_NO_KEY,
		NANO_NO_KEY, NOVIEW, 0);
845
#endif
846

847
#ifndef NANO_SMALL
848
849
    /* If we're using restricted mode, command execution is disabled.
     * It's useless since inserting files is disabled. */
850
    /* Translators: try to keep this string under 22 characters long */
851
    if (!ISSET(RESTRICTED))
852
	sc_init_one(&insertfile_list, NANO_EXTCMD_KEY, N_("Execute Command"),
David Lawrence Ramsey's avatar
   
David Lawrence Ramsey committed
853
854
		IFHELP(nano_execute_msg, NANO_NO_KEY), NANO_NO_KEY,
		NANO_NO_KEY, NOVIEW, 0);
855

856
#ifdef ENABLE_MULTIBUFFER
857
858
    /* If we're using restricted mode, the multibuffer toggle is
     * disabled.  It's useless since inserting files is disabled. */
859
    /* Translators: try to keep this string under 22 characters long */
860
861
    if (!ISSET(RESTRICTED))
	sc_init_one(&insertfile_list, NANO_NO_KEY, _("New Buffer"),
David Lawrence Ramsey's avatar
   
David Lawrence Ramsey committed
862
863
		IFHELP(nano_multibuffer_msg, TOGGLE_MULTIBUFFER_KEY), NANO_NO_KEY,
		NANO_NO_KEY, NOVIEW, 0);
864
#endif
865
#endif
866

Chris Allegretta's avatar
Chris Allegretta committed
867
#ifndef DISABLE_SPELLER
868
    free_shortcutage(&spell_list);
Chris Allegretta's avatar
Chris Allegretta committed
869

870
871
872
    sc_init_one(&spell_list, NANO_HELP_KEY, get_help_msg,
	IFHELP(nano_help_msg, NANO_NO_KEY), NANO_HELP_FKEY,
	NANO_NO_KEY, VIEW,
873
874
875
876
877
878
#ifndef DISABLE_HELP
		do_help
#else
		nano_disabled_msg
#endif
		);
879

880
881
882
    sc_init_one(&spell_list, NANO_CANCEL_KEY, cancel_msg,
	IFHELP(nano_cancel_msg, NANO_NO_KEY), NANO_NO_KEY,
	NANO_NO_KEY, VIEW, 0);
Chris Allegretta's avatar
Chris Allegretta committed
883
#endif
Chris Allegretta's avatar
Chris Allegretta committed
884

885
#ifndef NANO_SMALL
886
    free_shortcutage(&extcmd_list);
Chris Allegretta's avatar
Chris Allegretta committed
887

888
889
890
    sc_init_one(&extcmd_list, NANO_HELP_KEY, get_help_msg,
	IFHELP(nano_help_msg, NANO_NO_KEY), NANO_HELP_FKEY,
	NANO_NO_KEY, VIEW,
891
892
893
894
895
896
#ifndef DISABLE_HELP
		do_help
#else
		nano_disabled_msg
#endif
		);
897

898
899
900
    sc_init_one(&extcmd_list, NANO_CANCEL_KEY, cancel_msg,
	IFHELP(nano_cancel_msg, NANO_NO_KEY), NANO_NO_KEY,
	NANO_NO_KEY, VIEW, 0);
901
#endif
902

903
#ifndef DISABLE_BROWSER
904
    free_shortcutage(&browser_list);
905

906
907
908
    sc_init_one(&browser_list, NANO_HELP_KEY, get_help_msg,
	IFHELP(nano_help_msg, NANO_NO_KEY), NANO_HELP_FKEY,
	NANO_NO_KEY, VIEW,
909
910
911
912
913
914
#ifndef DISABLE_HELP
		do_help
#else
		nano_disabled_msg
#endif
		);
915

916
917
918
    sc_init_one(&browser_list, NANO_CANCEL_KEY, cancel_msg,
	IFHELP(nano_cancel_msg, NANO_NO_KEY), NANO_NO_KEY,
	NANO_NO_KEY, VIEW, 0);
919

920
921
922
    sc_init_one(&browser_list, NANO_PREVPAGE_KEY, prev_page_msg,
	IFHELP(nano_prevpage_msg, NANO_NO_KEY), NANO_PREVPAGE_FKEY,
	NANO_NO_KEY, VIEW, 0);
Chris Allegretta's avatar
Chris Allegretta committed
923

924
925
926
    sc_init_one(&browser_list, NANO_NEXTPAGE_KEY, next_page_msg,
	IFHELP(nano_nextpage_msg, NANO_NO_KEY), NANO_NEXTPAGE_FKEY,
	NANO_NO_KEY, VIEW, 0);
Chris Allegretta's avatar
Chris Allegretta committed
927

928
    /* Translators: try to keep this string under 22 characters long */
929
930
931
    sc_init_one(&browser_list, NANO_GOTO_KEY, N_("Go To Dir"),
	IFHELP(nano_gotodir_msg, NANO_ALT_GOTO_KEY), NANO_GOTO_FKEY,
	NANO_NO_KEY, VIEW, 0);
Rocco Corsi's avatar
   
Rocco Corsi committed
932

933
    free_shortcutage(&gotodir_list);
934

935
936
937
    sc_init_one(&gotodir_list, NANO_HELP_KEY, get_help_msg,
	IFHELP(nano_help_msg, NANO_NO_KEY), NANO_HELP_FKEY,
	NANO_NO_KEY, VIEW,
938
939
940
941
942
943
#ifndef DISABLE_HELP
		do_help
#else
		nano_disabled_msg
#endif
		);
Chris Allegretta's avatar
Chris Allegretta committed
944

945
946
947
    sc_init_one(&gotodir_list, NANO_CANCEL_KEY, cancel_msg,
	IFHELP(nano_cancel_msg, NANO_NO_KEY), NANO_NO_KEY,
	NANO_NO_KEY, VIEW, 0);
Chris Allegretta's avatar
Chris Allegretta committed
948
949
#endif

950
#if !defined(DISABLE_BROWSER) || !defined(DISABLE_HELP) || !defined(DISABLE_MOUSE)
951
952
    currshortcut = main_list;
#endif
953
#ifndef NANO_SMALL
954
    toggle_init();
955
#endif
956
}
957

958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
/* Deallocate the given shortcut. */
void free_shortcutage(shortcut **shortcutage)
{
    assert(shortcutage != NULL);
    while (*shortcutage != NULL) {
	shortcut *ps = *shortcutage;
	*shortcutage = (*shortcutage)->next;
	free(ps);
    }
}

#ifndef NANO_SMALL
/* Create one new toggle structure, at the end of the toggles linked
 * list. */
void toggle_init_one(int val, const char *desc, long flag)
{
    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;
}

void toggle_init(void)
{
    /* There is no need to reinitialize the toggles.  They can't
     * change. */
    if (toggles != NULL)
	return;

    toggle_init_one(TOGGLE_NOHELP_KEY, N_("Help mode"), NO_HELP);
#ifdef ENABLE_MULTIBUFFER
    /* If we're using restricted mode, the multibuffer toggle is
     * disabled.  It's useless since inserting files is disabled. */
    if (!ISSET(RESTRICTED))
	toggle_init_one(TOGGLE_MULTIBUFFER_KEY, N_("Multiple file buffers"),
		MULTIBUFFER);
#endif
    toggle_init_one(TOGGLE_CONST_KEY, N_("Constant cursor position"),
	CONSTUPDATE);
    toggle_init_one(TOGGLE_AUTOINDENT_KEY, N_("Auto indent"), AUTOINDENT);
#ifndef DISABLE_WRAPPING
    toggle_init_one(TOGGLE_WRAP_KEY, N_("Auto line wrap"), NO_WRAP);
#endif
    toggle_init_one(TOGGLE_CUTTOEND_KEY, N_("Cut to end"), CUT_TO_END);
    /* If we're using restricted mode, the suspend toggle is disabled.
     * It's useless since suspending is disabled. */
    if (!ISSET(RESTRICTED))
	toggle_init_one(TOGGLE_SUSPEND_KEY, N_("Suspend"), SUSPEND);
#ifndef DISABLE_MOUSE
    toggle_init_one(TOGGLE_MOUSE_KEY, N_("Mouse support"), USE_MOUSE);
#endif
    /* If we're using restricted mode, the no-conversion, DOS format,
     * Mac format, and backup toggles are disabled.  The first, second,
     * and third are useless since inserting files is disabled, and the
     * fourth is useless since backups are disabled. */
    if (!ISSET(RESTRICTED)) {
	toggle_init_one(TOGGLE_NOCONVERT_KEY,
		N_("No conversion from DOS/Mac format"), NO_CONVERT);
	toggle_init_one(TOGGLE_DOS_KEY, N_("Writing file in DOS format"),
		DOS_FILE);
	toggle_init_one(TOGGLE_MAC_KEY, N_("Writing file in Mac format"),
		MAC_FILE);
1032
	toggle_init_one(TOGGLE_BACKUP_KEY, N_("Backup files"), BACKUP_FILE);
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
    }
    toggle_init_one(TOGGLE_SMOOTH_KEY, N_("Smooth scrolling"), SMOOTHSCROLL);
    toggle_init_one(TOGGLE_SMARTHOME_KEY, N_("Smart home key"), SMART_HOME);
#ifdef ENABLE_COLOR
    toggle_init_one(TOGGLE_SYNTAX_KEY, N_("Color syntax highlighting"),
	COLOR_SYNTAX);
#endif
#ifdef ENABLE_NANORC
    toggle_init_one(TOGGLE_WHITESPACE_KEY, N_("Whitespace display"),
	WHITESPACE_DISPLAY);
#endif
}

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

1060
1061
1062
/* 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
1063
 * function unless debugging is turned on. */
1064
#ifdef DEBUG
1065
/* Added by SPK for memory cleanup; gracefully return our malloc()s. */
Chris Allegretta's avatar
Chris Allegretta committed
1066
void thanks_for_all_the_fish(void)
1067
{
1068
1069
1070
1071
    delwin(topwin);
    delwin(edit);
    delwin(bottomwin);

Chris Allegretta's avatar
Chris Allegretta committed
1072
1073
1074
1075
#ifndef DISABLE_JUSTIFY
    if (quotestr != NULL)
	free(quotestr);
#endif
1076
1077
1078
1079
#ifndef NANO_SMALL
    if (backup_dir != NULL)
        free(backup_dir);
#endif
Chris Allegretta's avatar
Chris Allegretta committed
1080
#ifndef DISABLE_OPERATINGDIR
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
    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
1096
#ifndef DISABLE_HELP
1097
1098
    if (help_text != NULL)
	free(help_text);
1099
#endif
1100
1101
1102
1103
1104
    if (filename != NULL)
	free(filename);
    if (answer != NULL)
	free(answer);
    if (cutbuffer != NULL)
Chris Allegretta's avatar
Chris Allegretta committed
1105
	free_filestruct(cutbuffer);
1106
1107
1108
1109
1110

    free_shortcutage(&main_list);
    free_shortcutage(&whereis_list);
    free_shortcutage(&replace_list);
    free_shortcutage(&replace_list_2);
Chris Allegretta's avatar
Chris Allegretta committed
1111
    free_shortcutage(&goto_list);
1112
1113
    free_shortcutage(&writefile_list);
    free_shortcutage(&insertfile_list);
Chris Allegretta's avatar
Chris Allegretta committed
1114
#ifndef DISABLE_HELP
Chris Allegretta's avatar
Chris Allegretta committed
1115
    free_shortcutage(&help_list);
Chris Allegretta's avatar
Chris Allegretta committed
1116
1117
#endif
#ifndef DISABLE_SPELLER
1118
    free_shortcutage(&spell_list);
Chris Allegretta's avatar
Chris Allegretta committed
1119
#endif
Chris Allegretta's avatar
Chris Allegretta committed
1120
1121
1122
#ifndef NANO_SMALL
    free_shortcutage(&extcmd_list);
#endif
1123
1124
#ifndef DISABLE_BROWSER
    free_shortcutage(&browser_list);
Chris Allegretta's avatar
Chris Allegretta committed
1125
    free_shortcutage(&gotodir_list);
1126
1127
1128
1129
1130
1131
1132
#endif

#ifndef NANO_SMALL
    free_toggles();
#endif

#ifdef ENABLE_MULTIBUFFER
1133
    if (open_files != NULL) {
1134
	/* We free the memory associated with each open file. */
1135
1136
	while (open_files->prev != NULL)
	    open_files = open_files->prev;
Chris Allegretta's avatar
Chris Allegretta committed
1137
	free_openfilestruct(open_files);
1138
    }
1139
#else
1140
    free_filestruct(fileage);
1141
#endif
Chris Allegretta's avatar
Chris Allegretta committed
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152

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

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

	    syntaxes->extensions = bob->next;
Chris Allegretta's avatar
Chris Allegretta committed
1153
	    regfree(&bob->val);
Chris Allegretta's avatar
Chris Allegretta committed
1154
1155
1156
1157
1158
1159
	    free(bob);
	}
	while (syntaxes->color != NULL) {
	    colortype *bob = syntaxes->color;

	    syntaxes->color = bob->next;
Chris Allegretta's avatar
Chris Allegretta committed
1160
1161
	    regfree(&bob->start);
	    if (bob->end != NULL)
1162
1163
		regfree(bob->end);
	    free(bob->end);
Chris Allegretta's avatar
Chris Allegretta committed
1164
1165
1166
1167
1168
1169
	    free(bob);
	}
	syntaxes = syntaxes->next;
	free(bill);
    }
#endif /* ENABLE_COLOR */
1170
1171
1172
1173
1174
#ifndef NANO_SMALL
    /* free history lists */
    free_history(&search_history);
    free_history(&replace_history);
#endif
1175
}
1176
#endif /* DEBUG */