global.c 27.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

40
int flags = 0;			/* Our new flag containing many options */
David Lawrence Ramsey's avatar
David Lawrence Ramsey committed
41
WINDOW *edit;			/* The file portion of the editor */
Chris Allegretta's avatar
Chris Allegretta committed
42
43
WINDOW *topwin;			/* Top line of screen */
WINDOW *bottomwin;		/* Bottom buffer */
Chris Allegretta's avatar
Chris Allegretta committed
44
char *filename = NULL;		/* Name of the file */
Chris Allegretta's avatar
Chris Allegretta committed
45
46
47
48
49
50
51
52
53
54
55
56
57
58
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 */

59
#ifdef ENABLE_MULTIBUFFER
60
openfilestruct *open_files = NULL;	/* The list of open files */
61
62
#endif

63
64
65
66
#ifndef DISABLE_JUSTIFY
char *quotestr = "> ";		/* Quote string */
#endif

67
char *answer = NULL;			/* Answer str to many questions */
Chris Allegretta's avatar
Chris Allegretta committed
68
int totlines = 0;		/* Total number of lines in the file */
69
long totsize = 0;		/* Total number of bytes in the file */
70
int placewewant = 0;		/* The column we'd like the cursor
Chris Allegretta's avatar
Chris Allegretta committed
71
72
73
				   to jump to when we go to the
				   next or previous line */

74
75
int tabsize = 8;		/* Our internal tabsize variable */

Chris Allegretta's avatar
Chris Allegretta committed
76
77
78
79
80
81
82
83
char *hblank;			/* A horizontal blank line */
char *help_text;		/* The text in the help window */

/* More stuff for the marker select */

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

84
#ifndef DISABLE_OPERATINGDIR
85
86
char *operating_dir = NULL;	/* Operating directory, which we can't */
char *full_operating_dir = NULL;/* go higher than */
87
88
#endif

89
#ifndef DISABLE_SPELLER
90
char *alt_speller = NULL;		/* Alternative spell command */
91
92
#endif

93
94
95
shortcut *main_list = NULL;
shortcut *whereis_list = NULL;
shortcut *replace_list = NULL;
96
shortcut *replace_list_2 = NULL; 	/* 2nd half of replace dialog */
97
98
99
100
101
102
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
103
#ifndef NANO_SMALL
104
shortcut *extcmd_list = NULL;
Chris Allegretta's avatar
Chris Allegretta committed
105
#endif
106
#ifndef DISABLE_BROWSER
107
shortcut *browser_list = NULL;
Chris Allegretta's avatar
Chris Allegretta committed
108
109
#endif

110
111
#ifdef ENABLE_COLOR
    colorstruct colors[NUM_NCOLORS];
112
    colortype *colorstrings = NULL;
113
    syntaxtype *syntaxes = NULL;
114
    char *syntaxstr = NULL;
115
116
#endif

117
#if !defined(DISABLE_BROWSER) || !defined(DISABLE_MOUSE) || !defined (DISABLE_HELP)
118
shortcut *currshortcut;			/* Current shortcut list we're using */
119
#endif
120

121
#ifndef NANO_SMALL
122
toggle *toggles = NULL;
123
#endif
Chris Allegretta's avatar
Chris Allegretta committed
124

125
126
/* Regular expressions */

127
#ifdef HAVE_REGEX_H
128
129
130
regex_t search_regexp;		/* Global to store compiled search regexp */
regmatch_t regmatches[10];	/* Match positions for parenthetical
				   subexpressions, max of 10 */
131
132
#ifdef ENABLE_COLOR
regex_t color_regexp;		/* Global to store compiled search regexp */
133
regmatch_t colormatches[1];	/* Match positions for parenthetical */
134
135
136

regex_t syntaxfile_regexp;	/* Global to store compiled search regexp */
regmatch_t synfilematches[1];	/* Match positions for parenthetical */
137
138
#endif /* ENABLE_COLOR */

139
#endif
140

141
int length_of_list(const shortcut *s) 
142
143
144
{
    int i = 0;

145
    for (; s != NULL; s = s->next)
146
147
148
149
150
	i++;

    return i;
}

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

185
#ifndef NANO_SMALL
186
187
188
/* 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)
189
{
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
    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;
206
207
}

208
209
210
211
212
213
214
215
216
217
218
219
220
221
/* Deallocate all of the toggles */
static void free_toggles(void)
{
    toggle *pt;	/* Think "previous toggle" */

    while (toggles != NULL) {
	pt = toggles;
	toggles = toggles->next;
	free(pt);
    }
    toggles = NULL;
}

static void toggle_init(void)
222
223
224
{
    char *toggle_const_msg, *toggle_autoindent_msg, *toggle_suspend_msg,
	*toggle_nohelp_msg, *toggle_picomode_msg, *toggle_mouse_msg,
225
	*toggle_cuttoend_msg, *toggle_wrap_msg, *toggle_case_msg, 
226
227
	*toggle_backwards_msg, *toggle_noconvert_msg, *toggle_dos_msg,
	*toggle_mac_msg, *toggle_smooth_msg;
228

229
#ifdef HAVE_REGEX_H
230
    char *toggle_regexp_msg;
231
#endif
232

233
234
235
#ifdef ENABLE_MULTIBUFFER
    char *toggle_load_msg;
#endif
236

237
    toggle_const_msg = _("Constant cursor position");
238
    toggle_autoindent_msg = _("Auto indent");
239
    toggle_suspend_msg = _("Suspend");
240
    toggle_nohelp_msg = _("Help mode");
241
    toggle_picomode_msg = _("Pico mode");
242
243
    toggle_mouse_msg = _("Mouse support");
    toggle_cuttoend_msg = _("Cut to end");
244
245
    toggle_backwards_msg = _("Backwards search");
    toggle_case_msg = _("Case sensitive search");
246

247
#ifdef HAVE_REGEX_H
248
    toggle_regexp_msg = _("Regular expression search");
249
#endif
250
251
252
253
254

    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");
    toggle_smooth_msg = _("Smooth scrolling");
255
    toggle_wrap_msg = _("Auto wrap");
256

257
258
#ifdef ENABLE_MULTIBUFFER
    toggle_load_msg = _("Multiple file buffers");
259
260
#endif

261
262
    free_toggles();

263
264
265
266
267
268
269
270
271
272
    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);
    toggle_init_one(TOGGLE_WRAP_KEY, toggle_wrap_msg, NO_WRAP);
    toggle_init_one(TOGGLE_MOUSE_KEY, toggle_mouse_msg, USE_MOUSE);
    toggle_init_one(TOGGLE_CUTTOEND_KEY, toggle_cuttoend_msg, CUT_TO_END);
    toggle_init_one(TOGGLE_BACKWARDS_KEY, toggle_backwards_msg, REVERSE_SEARCH);
    toggle_init_one(TOGGLE_CASE_KEY, toggle_case_msg, CASE_SENSITIVE);
273
#ifdef HAVE_REGEX_H
274
    toggle_init_one(TOGGLE_REGEXP_KEY, toggle_regexp_msg, USE_REGEXP);
275
#endif
276
277
#ifdef ENABLE_MULTIBUFFER
    toggle_init_one(TOGGLE_LOAD_KEY, toggle_load_msg, MULTIBUFFER);
278
#endif
279
280
281
282
    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);
    toggle_init_one(TOGGLE_SMOOTH_KEY, toggle_smooth_msg, SMOOTHSCROLL);
283
}
284
#endif /* !NANO_SMALL */
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299


/* Deallocate the given shortcut. */
static void free_shortcutage(shortcut **shortcutage)
{
    shortcut *s, *ps;

    assert(shortcutage != NULL);
    s = *shortcutage;
    while (s != NULL) {
	ps = s;
	s = s->next;
	free(ps);
    }
    *shortcutage = NULL;
300
301
}

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

Chris Allegretta's avatar
Chris Allegretta committed
320
321
322
323
#ifdef ENABLE_MULTIBUFFER
    char *nano_openprev_msg = "", *nano_opennext_msg = "";
#endif

324
    char *nano_tofiles_msg = "", *nano_gotodir_msg = "", *nano_case_msg =
325
	"", *nano_reverse_msg = "", *nano_execute_msg = "";
326
327
    char *nano_dos_msg = "", *nano_mac_msg = ""; 

328
329
330
#ifdef HAVE_REGEX_H
    char *nano_regexp_msg = "", *nano_bracket_msg = "";
#endif
331

Chris Allegretta's avatar
Chris Allegretta committed
332
333
    nano_help_msg = _("Invoke the help menu");
    nano_writeout_msg = _("Write the current file to disk");
334

335
#ifdef ENABLE_MULTIBUFFER
336
337
    nano_exit_msg = _("Close currently loaded file/Exit from nano");
#else
Chris Allegretta's avatar
Chris Allegretta committed
338
    nano_exit_msg = _("Exit from nano");
339
340
#endif

341
    nano_goto_msg = _("Go to a specific line number");
Chris Allegretta's avatar
Chris Allegretta committed
342
    nano_justify_msg = _("Justify the current paragraph");
343
    nano_unjustify_msg = _("Unjustify after a justify");
Chris Allegretta's avatar
Chris Allegretta committed
344
345
346
347
348
349
350
    nano_replace_msg = _("Replace text within the editor");
    nano_insert_msg = _("Insert another file into the current one");
    nano_whereis_msg = _("Search for text within the editor");
    nano_prevpage_msg = _("Move to the previous screen");
    nano_nextpage_msg = _("Move to the next screen");
    nano_cut_msg = _("Cut the current line and store it in the cutbuffer");
    nano_uncut_msg = _("Uncut from the cutbuffer into the current line");
351
    nano_cursorpos_msg = _("Show the position of the cursor");
Chris Allegretta's avatar
Chris Allegretta committed
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
    nano_spell_msg = _("Invoke the spell checker (if available)");
    nano_up_msg = _("Move up one line");
    nano_down_msg = _("Move down one line");
    nano_forward_msg = _("Move forward one character");
    nano_back_msg = _("Move back one character");
    nano_home_msg = _("Move to the beginning of the current line");
    nano_end_msg = _("Move to the end of the current line");
    nano_firstline_msg = _("Go to the first line of the file");
    nano_lastline_msg = _("Go to the last line of the file");
    nano_refresh_msg = _("Refresh (redraw) the current screen");
    nano_mark_msg = _("Mark text at the current cursor location");
    nano_delete_msg = _("Delete the character under the cursor");
    nano_backspace_msg =
	_("Delete the character to the left of the cursor");
    nano_tab_msg = _("Insert a tab character");
    nano_enter_msg = _("Insert a carriage return at the cursor position");
    nano_case_msg =
	_("Make the current search or replace case (in)sensitive");
Chris Allegretta's avatar
Chris Allegretta committed
370
    nano_tofiles_msg = _("Go to file browser");
371
    nano_execute_msg = _("Execute external command");
372
    nano_gotodir_msg = _("Go to directory");
Chris Allegretta's avatar
Chris Allegretta committed
373
    nano_cancel_msg = _("Cancel the current function");
374
    nano_append_msg = _("Append to the current file");
375
    nano_prepend_msg = _("Prepend to the current file");
376
    nano_reverse_msg = _("Search backwards");
377
378
    nano_dos_msg = _("Write file out in DOS format");
    nano_mac_msg = _("Write file out in Mac format");
379
#ifdef HAVE_REGEX_H
380
381
    nano_regexp_msg = _("Use Regular expressions");
    nano_bracket_msg = _("Find other bracket");
382
#endif
383
384
385
#ifdef ENABLE_MULTIBUFFER
    nano_openprev_msg = _("Open previously loaded file");
    nano_opennext_msg = _("Open next loaded file");
Chris Allegretta's avatar
Chris Allegretta committed
386
#endif
387
#endif /* !DISABLE_HELP */
Chris Allegretta's avatar
Chris Allegretta committed
388

389
    free_shortcutage(&main_list);
390

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

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

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

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

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

    if (ISSET(PICO_MODE))
437
438
439

#ifdef ENABLE_MULTIBUFFER
	/* this is so we can view multiple files */
440
	sc_init_one(&main_list, NANO_INSERTFILE_KEY, _("Read File"),
441
442
		IFHELP(nano_insert_msg, 0),
		NANO_INSERTFILE_FKEY, 0, VIEW, do_insertfile_void);
443
#else
444
	sc_init_one(&main_list, NANO_INSERTFILE_KEY, _("Read File"),
445
446
		IFHELP(nano_insert_msg, 0),
		NANO_INSERTFILE_FKEY, 0, NOVIEW, do_insertfile_void);
447
448
#endif

449
    else
450
	sc_init_one(&main_list, NANO_REPLACE_KEY, _("Replace"),
451
452
		    IFHELP(nano_replace_msg, NANO_ALT_REPLACE_KEY),
		    NANO_REPLACE_FKEY, 0, NOVIEW, do_replace);
Chris Allegretta's avatar
Chris Allegretta committed
453

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

548
549
550
551
552
553
554
555
556
557
#ifndef NANO_SMALL
    sc_init_one(&main_list, NANO_NEXTWORD_KEY, _("Next Word"),
		IFHELP(_("Move forward one word"), 0),
		0, 0, VIEW, do_next_word_void);

    sc_init_one(&main_list, -9, _("Prev Word"),
		IFHELP(_("Move backward one word"), NANO_PREVWORD_KEY), 0, 0,
		VIEW, do_prev_word_void);
#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
Chris Allegretta's avatar
Chris Allegretta committed
563

564
565
#ifdef ENABLE_MULTIBUFFER
    sc_init_one(&main_list, -9, _("Previous File"),
566
567
		    IFHELP(nano_openprev_msg, NANO_OPENPREV_KEY),
		    0, 0, VIEW, open_prevfile_void);
568
    sc_init_one(&main_list, -9, _("Next File"),
569
570
		    IFHELP(nano_opennext_msg, NANO_OPENNEXT_KEY),
		    0, 0, VIEW, open_nextfile_void);
571
#endif
572

573
    free_shortcutage(&whereis_list);
574

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

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

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

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

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

591
    sc_init_one(&whereis_list, NANO_FROMSEARCHTOGOTO_KEY, _("Go To Line"), 
592
		IFHELP(nano_goto_msg, 0), 0, 0, VIEW, do_gotoline_void);
593

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

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

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

607
    free_shortcutage(&replace_list);
608

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

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

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

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

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

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

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

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

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

640
    free_shortcutage(&replace_list_2);
641

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

709
    free_shortcutage(&insertfile_list);
710

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

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

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

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

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

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

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

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

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

744
#ifndef DISABLE_BROWSER
745

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);
Rocco Corsi's avatar
   
Rocco Corsi committed
773

Chris Allegretta's avatar
Chris Allegretta committed
774
775
776
#endif


777
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
789
790
791
/* 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
 * function unless debugging is turned on.
 */
#ifdef DEBUG
792
793
794
/* added by SPK for memory cleanup, gracefully return our malloc()s */
void thanks_for_all_the_fish(void) 
{
Chris Allegretta's avatar
Chris Allegretta committed
795
#ifndef DISABLE_OPERATINGDIR
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
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
    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);
    free_shortcutage(&help_list);
    free_shortcutage(&writefile_list);
    free_shortcutage(&insertfile_list);
    free_shortcutage(&spell_list);
#ifndef DISABLE_BROWSER
    free_shortcutage(&browser_list);
#endif
    free_shortcutage(&gotodir_list);
    free_shortcutage(&goto_list);

#ifndef NANO_SMALL
    free_toggles();
#endif

#ifdef ENABLE_MULTIBUFFER
839
    if (open_files != NULL) {
840
841
842
843
	/* We free the memory associated with each open file. */
	openfilestruct *next;

	while (open_files->prev != NULL)
844
	    open_files = open_files->prev;
845
846
847
848
849
	do {
	    next = open_files->next;
	    free_openfilestruct(open_files);
	    open_files = next;
	} while (open_files != NULL);
850
    }
851
#else
852
    if (fileage != NULL)
853
854
	free_filestruct(fileage);
#endif
855
}
856
#endif /* DEBUG */