global.c 27.1 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
27
28
29
30
31
32
33
34
35
36
37
38
#include "nano.h"
#include "proto.h"

#ifndef NANO_SMALL
#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 */
Chris Allegretta's avatar
Chris Allegretta committed
41
42
43
WINDOW *edit;			/* The file portion of the editor  */
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
90
91
92
#ifndef DISABLE_SPELLER
char *alt_speller;		/* Alternative spell command */
#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
114
#endif

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

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

123
124
/* Regular expressions */

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

134
#endif
135

136
int length_of_list(const shortcut *s) 
137
138
139
{
    int i = 0;

140
    for (; s != NULL; s = s->next)
141
142
143
144
145
	i++;

    return i;
}

Chris Allegretta's avatar
Chris Allegretta committed
146
/* Initialize a struct *without* our lovely braces =( */
147
148
149
150
151
152
153
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
154
{
155
156
157
158
159
160
161
162
163
164
165
166
    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
167
168
    s->val = key;
    s->desc = desc;
169
#ifndef DISABLE_HELP
Chris Allegretta's avatar
Chris Allegretta committed
170
    s->help = help;
171
#endif /* !DISABLE_HELP */
Chris Allegretta's avatar
Chris Allegretta committed
172
173
174
175
176
    s->altval = alt;
    s->misc1 = misc1;
    s->misc2 = misc2;
    s->viewok = view;
    s->func = func;
177
    s->next = NULL;
Chris Allegretta's avatar
Chris Allegretta committed
178
179
}

180
#ifndef NANO_SMALL
181
182
183
/* 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)
184
{
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
    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;
201
202
}

203
204
205
206
207
208
209
210
211
212
213
214
215
216
/* 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)
217
218
219
{
    char *toggle_const_msg, *toggle_autoindent_msg, *toggle_suspend_msg,
	*toggle_nohelp_msg, *toggle_picomode_msg, *toggle_mouse_msg,
220
	*toggle_cuttoend_msg, *toggle_wrap_msg, *toggle_case_msg, 
221
222
	*toggle_backwards_msg, *toggle_noconvert_msg, *toggle_dos_msg,
	*toggle_mac_msg, *toggle_smooth_msg;
223

224
#ifdef HAVE_REGEX_H
225
    char *toggle_regexp_msg;
226
#endif
227

228
229
230
#ifdef ENABLE_MULTIBUFFER
    char *toggle_load_msg;
#endif
231

232
    toggle_const_msg = _("Constant cursor position");
233
    toggle_autoindent_msg = _("Auto indent");
234
    toggle_suspend_msg = _("Suspend");
235
    toggle_nohelp_msg = _("Help mode");
236
    toggle_picomode_msg = _("Pico mode");
237
238
    toggle_mouse_msg = _("Mouse support");
    toggle_cuttoend_msg = _("Cut to end");
239
240
    toggle_backwards_msg = _("Backwards search");
    toggle_case_msg = _("Case sensitive search");
241

242
#ifdef HAVE_REGEX_H
243
    toggle_regexp_msg = _("Regular expression search");
244
#endif
245
246
247
248
249

    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");
250
    toggle_wrap_msg = _("Auto wrap");
251

252
253
#ifdef ENABLE_MULTIBUFFER
    toggle_load_msg = _("Multiple file buffers");
254
255
#endif

256
257
    free_toggles();

258
259
260
261
262
263
264
265
266
267
    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);
268
#ifdef HAVE_REGEX_H
269
    toggle_init_one(TOGGLE_REGEXP_KEY, toggle_regexp_msg, USE_REGEXP);
270
#endif
271
272
#ifdef ENABLE_MULTIBUFFER
    toggle_init_one(TOGGLE_LOAD_KEY, toggle_load_msg, MULTIBUFFER);
273
#endif
274
275
276
277
    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);
278
}
279
#endif /* !NANO_SMALL */
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294


/* 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;
295
296
}

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

Chris Allegretta's avatar
Chris Allegretta committed
315
316
317
318
#ifdef ENABLE_MULTIBUFFER
    char *nano_openprev_msg = "", *nano_opennext_msg = "";
#endif

319
    char *nano_tofiles_msg = "", *nano_gotodir_msg = "", *nano_case_msg =
320
	"", *nano_reverse_msg = "", *nano_execute_msg = "";
321
322
    char *nano_dos_msg = "", *nano_mac_msg = ""; 

323
324
325
#ifdef HAVE_REGEX_H
    char *nano_regexp_msg = "", *nano_bracket_msg = "";
#endif
326

Chris Allegretta's avatar
Chris Allegretta committed
327
328
    nano_help_msg = _("Invoke the help menu");
    nano_writeout_msg = _("Write the current file to disk");
329

330
#ifdef ENABLE_MULTIBUFFER
331
332
    nano_exit_msg = _("Close currently loaded file/Exit from nano");
#else
Chris Allegretta's avatar
Chris Allegretta committed
333
    nano_exit_msg = _("Exit from nano");
334
335
#endif

Chris Allegretta's avatar
Chris Allegretta committed
336
337
    nano_goto_msg = _("Goto a specific line number");
    nano_justify_msg = _("Justify the current paragraph");
338
    nano_unjustify_msg = _("Unjustify after a justify");
Chris Allegretta's avatar
Chris Allegretta committed
339
340
341
342
343
344
345
    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");
346
    nano_cursorpos_msg = _("Show the position of the cursor");
Chris Allegretta's avatar
Chris Allegretta committed
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
    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
365
    nano_tofiles_msg = _("Go to file browser");
366
    nano_execute_msg = _("Execute external command");
Rocco Corsi's avatar
   
Rocco Corsi committed
367
    nano_gotodir_msg = _("Goto Directory");
Chris Allegretta's avatar
Chris Allegretta committed
368
    nano_cancel_msg = _("Cancel the current function");
369
    nano_append_msg = _("Append to the current file");
370
    nano_prepend_msg = _("Prepend to the current file");
371
    nano_reverse_msg = _("Search backwards");
372
373
    nano_dos_msg = _("Write file out in DOS format");
    nano_mac_msg = _("Write file out in Mac format");
374
#ifdef HAVE_REGEX_H
375
376
    nano_regexp_msg = _("Use Regular expressions");
    nano_bracket_msg = _("Find other bracket");
377
#endif
378
379
380
#ifdef ENABLE_MULTIBUFFER
    nano_openprev_msg = _("Open previously loaded file");
    nano_opennext_msg = _("Open next loaded file");
Chris Allegretta's avatar
Chris Allegretta committed
381
#endif
382
#endif /* !DISABLE_HELP */
Chris Allegretta's avatar
Chris Allegretta committed
383

384
    free_shortcutage(&main_list);
385

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

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

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

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

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

    if (ISSET(PICO_MODE))
432
433
434

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

444
    else
445
	sc_init_one(&main_list, NANO_REPLACE_KEY, _("Replace"),
446
		    IFHELP(nano_replace_msg,)
447
		    NANO_ALT_REPLACE_KEY, NANO_REPLACE_FKEY, 0, NOVIEW, do_replace);
Chris Allegretta's avatar
Chris Allegretta committed
448

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

544
#if (!defined NANO_SMALL) && (defined HAVE_REGEX_H)
545
    sc_init_one(&main_list, -9, _("Find Other Bracket"),
546
		    IFHELP(nano_bracket_msg,)
547
548
		    NANO_BRACKET_KEY, 0, 0, VIEW, do_find_bracket);
#endif
Chris Allegretta's avatar
Chris Allegretta committed
549

550
551
#ifdef ENABLE_MULTIBUFFER
    sc_init_one(&main_list, -9, _("Previous File"),
552
		    IFHELP(nano_openprev_msg,)
553
554
		    NANO_OPENPREV_KEY, 0, 0, VIEW, open_prevfile_void);
    sc_init_one(&main_list, -9, _("Next File"),
555
		    IFHELP(nano_opennext_msg,)
556
557
		    NANO_OPENNEXT_KEY, 0, 0, VIEW, open_nextfile_void);
#endif
558

559
    free_shortcutage(&whereis_list);
560

561
    sc_init_one(&whereis_list, NANO_HELP_KEY,
562
563
		_("Get Help"), IFHELP(nano_help_msg,) 
		0, 0, 0, VIEW, do_help);
564

565
    sc_init_one(&whereis_list, NANO_CANCEL_KEY,
566
567
		_("Cancel"), IFHELP(nano_cancel_msg,) 
		0, 0, 0, VIEW, 0);
568

569
    sc_init_one(&whereis_list, NANO_FIRSTLINE_KEY, _("First Line"),
570
571
		IFHELP(nano_firstline_msg,) 
		0, 0, 0, VIEW, do_first_line);
Chris Allegretta's avatar
Chris Allegretta committed
572

573
    sc_init_one(&whereis_list, NANO_LASTLINE_KEY, _("Last Line"),
574
575
		IFHELP(nano_lastline_msg,) 
		0, 0, 0, VIEW, do_last_line);
Chris Allegretta's avatar
Chris Allegretta committed
576

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

581
582
583
    sc_init_one(&whereis_list, NANO_FROMSEARCHTOGOTO_KEY, _("Goto Line"), 
		IFHELP(nano_goto_msg,) 
		0, 0, 0, VIEW, do_gotoline_void);
584

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

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

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

601
    free_shortcutage(&replace_list);
602

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

607
    sc_init_one(&replace_list, NANO_CANCEL_KEY,
608
609
		_("Cancel"), IFHELP(nano_cancel_msg,) 
		0, 0, 0, VIEW, 0);
Chris Allegretta's avatar
Chris Allegretta committed
610

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

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

619
    sc_init_one(&replace_list, NANO_OTHERSEARCH_KEY, _("No Replace"),
620
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,
624
625
		_("Goto Line"),  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
630
		IFHELP(nano_case_msg,) 
		0, 0, 0, VIEW, 0);
631

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

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

643
    free_shortcutage(&replace_list_2);
644

645
    sc_init_one(&replace_list_2, NANO_HELP_KEY,
646
647
		_("Get Help"), IFHELP(nano_help_msg,) 
		0, 0, 0, VIEW, do_help);
648

649
    sc_init_one(&replace_list_2, NANO_CANCEL_KEY,
650
651
		_("Cancel"), IFHELP(nano_cancel_msg,) 
		0, 0, 0, VIEW, 0);
652

653
    sc_init_one(&replace_list_2, NANO_FIRSTLINE_KEY, _("First Line"),
654
655
		IFHELP(nano_firstline_msg,) 
		0, 0, 0, VIEW, do_first_line);
656

657
    sc_init_one(&replace_list_2, NANO_LASTLINE_KEY, _("Last Line"),
658
659
		IFHELP(nano_lastline_msg,) 
		0, 0, 0, VIEW, do_last_line);
660

661
    free_shortcutage(&goto_list);
Chris Allegretta's avatar
Chris Allegretta committed
662

663
    sc_init_one(&goto_list, NANO_HELP_KEY,
664
665
		_("Get Help"), IFHELP(nano_help_msg,) 
		0, 0, 0, VIEW, do_help);
666

667
    sc_init_one(&goto_list, NANO_CANCEL_KEY, _("Cancel"),
668
669
		IFHELP(nano_cancel_msg,) 
		0, 0, 0, VIEW, 0);
Chris Allegretta's avatar
Chris Allegretta committed
670

671
    sc_init_one(&goto_list, NANO_FIRSTLINE_KEY, _("First Line"),
672
673
		IFHELP(nano_firstline_msg,) 
		0, 0, 0, VIEW, &do_first_line);
Chris Allegretta's avatar
Chris Allegretta committed
674

675
    sc_init_one(&goto_list, NANO_LASTLINE_KEY, _("Last Line"),
676
677
		IFHELP(nano_lastline_msg,) 
		0, 0, 0, VIEW, &do_last_line);
Chris Allegretta's avatar
Chris Allegretta committed
678

679
    free_shortcutage(&help_list);
Chris Allegretta's avatar
Chris Allegretta committed
680

681
    sc_init_one(&help_list, NANO_PREVPAGE_KEY, _("Prev Page"),
682
		IFHELP(nano_prevpage_msg,)
683
		0, NANO_PREVPAGE_FKEY, KEY_PPAGE, VIEW, do_page_up);
Chris Allegretta's avatar
Chris Allegretta committed
684

685
    sc_init_one(&help_list, NANO_NEXTPAGE_KEY, _("Next Page"),
686
		IFHELP(nano_nextpage_msg,)
687
		0, NANO_NEXTPAGE_FKEY, KEY_NPAGE, VIEW, do_page_down);
Chris Allegretta's avatar
Chris Allegretta committed
688

689
    sc_init_one(&help_list, NANO_EXIT_KEY, _("Exit"),
690
691
		IFHELP(nano_exit_msg,)
		0, NANO_EXIT_FKEY, 0, VIEW, do_exit);
Chris Allegretta's avatar
Chris Allegretta committed
692

693
    free_shortcutage(&writefile_list);
Chris Allegretta's avatar
Chris Allegretta committed
694

695
    sc_init_one(&writefile_list, NANO_HELP_KEY,
696
697
		_("Get Help"), IFHELP(nano_help_msg,) 
		0, 0, 0, VIEW, do_help);
698

699
#ifndef DISABLE_BROWSER
700
    sc_init_one(&writefile_list, NANO_TOFILES_KEY, _("To Files"),
701
702
		IFHELP(nano_tofiles_msg,) 
		0, 0, 0, NOVIEW, 0);
Chris Allegretta's avatar
Chris Allegretta committed
703
#endif
Chris Allegretta's avatar
Chris Allegretta committed
704

705
706
#ifndef NANO_SMALL
    sc_init_one(&writefile_list, TOGGLE_DOS_KEY, 
707
708
		_("DOS Format"), IFHELP(nano_dos_msg,) 
		0, 0, 0, NOVIEW, 0);
709
710

    sc_init_one(&writefile_list, TOGGLE_MAC_KEY, 
711
712
		_("Mac Format"), IFHELP(nano_mac_msg,) 
		0, 0, 0, NOVIEW, 0);
713
714
715
716
#endif

    sc_init_one(&writefile_list, 
		NANO_APPEND_KEY, _("Append"),
717
718
		IFHELP(nano_append_msg,) 
		0, 0, 0, NOVIEW, 0);
719

720
721
    sc_init_one(&writefile_list, 
		NANO_PREPEND_KEY, _("Prepend"),
722
723
		IFHELP(nano_prepend_msg,) 
		0, 0, 0, NOVIEW, 0);
724

725
    sc_init_one(&writefile_list, NANO_CANCEL_KEY, 
726
727
		_("Cancel"), IFHELP(nano_cancel_msg,) 
		0, 0, 0, VIEW, 0);
728

729
    free_shortcutage(&insertfile_list);
730
731

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

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

739
#ifndef DISABLE_BROWSER
740
    sc_init_one(&insertfile_list, NANO_TOFILES_KEY, _("To Files"),
741
742
		IFHELP(nano_tofiles_msg,) 
		0, 0, 0, NOVIEW, 0);
743
#endif
744
745
#ifndef NANO_SMALL
    sc_init_one(&insertfile_list, NANO_EXTCMD_KEY, _("Execute Command"),
746
747
		IFHELP(nano_execute_msg,) 
		0, 0, 0, NOVIEW, 0);
748
#endif
749

750
    free_shortcutage(&spell_list);
Chris Allegretta's avatar
Chris Allegretta committed
751

752
    sc_init_one(&spell_list, NANO_HELP_KEY,
753
754
		_("Get Help"), IFHELP(nano_help_msg,) 
		0, 0, 0, VIEW, do_help);
755

756
    sc_init_one(&spell_list, NANO_CANCEL_KEY, _("Cancel"),
757
758
		IFHELP(nano_cancel_msg,) 
		0, 0, 0, VIEW, 0);
Chris Allegretta's avatar
Chris Allegretta committed
759

760
#ifndef NANO_SMALL
761
    free_shortcutage(&extcmd_list);
Chris Allegretta's avatar
Chris Allegretta committed
762

763
    sc_init_one(&extcmd_list, NANO_HELP_KEY,
764
765
		_("Get Help"), IFHELP(nano_help_msg,) 
		0, 0, 0, VIEW, do_help);
766
767

    sc_init_one(&extcmd_list, NANO_CANCEL_KEY, _("Cancel"),
768
769
		IFHELP(nano_cancel_msg,) 
		0, 0, 0, VIEW, 0);
770
#endif
771

772
#ifndef DISABLE_BROWSER
773

774
    free_shortcutage(&browser_list);
775

776
    sc_init_one(&browser_list, NANO_HELP_KEY,
777
778
		_("Get Help"), IFHELP(nano_help_msg,) 
		0, 0, 0, VIEW, do_help);
779

780
    sc_init_one(&browser_list, NANO_EXIT_KEY, _("Exit"),
781
782
		IFHELP(nano_exit_msg,) 
		0, NANO_EXIT_FKEY, 0, VIEW, 0);
783

784
    sc_init_one(&browser_list, NANO_PREVPAGE_KEY, _("Prev Page"),
785
		IFHELP(nano_prevpage_msg,)
Chris Allegretta's avatar
Chris Allegretta committed
786
787
		0, NANO_PREVPAGE_FKEY, KEY_PPAGE, VIEW, 0);

788
    sc_init_one(&browser_list, NANO_NEXTPAGE_KEY, _("Next Page"),
789
		IFHELP(nano_nextpage_msg,)
Chris Allegretta's avatar
Chris Allegretta committed
790
791
		0, NANO_NEXTPAGE_FKEY, KEY_NPAGE, VIEW, 0);

792
    sc_init_one(&browser_list, NANO_GOTO_KEY, _("Goto"),
793
794
		IFHELP(nano_gotodir_msg,) 
		NANO_ALT_GOTO_KEY, NANO_GOTO_FKEY, 0, VIEW, 0);
Rocco Corsi's avatar
   
Rocco Corsi committed
795

796
    free_shortcutage(&gotodir_list);
797

798
    sc_init_one(&gotodir_list, NANO_HELP_KEY,
799
800
		_("Get Help"), IFHELP(nano_help_msg,) 
		0, 0, 0, VIEW, do_help);
Chris Allegretta's avatar
Chris Allegretta committed
801

802
    sc_init_one(&gotodir_list, NANO_CANCEL_KEY, _("Cancel"),
803
804
		IFHELP(nano_cancel_msg,) 
		0, 0, 0, VIEW, 0);
Rocco Corsi's avatar
   
Rocco Corsi committed
805

Chris Allegretta's avatar
Chris Allegretta committed
806
807
808
#endif


809
810
811
812
#if !defined(DISABLE_BROWSER) || !defined(DISABLE_MOUSE) || !defined (DISABLE_HELP)
    currshortcut = main_list;
#endif

813
#ifndef NANO_SMALL
814
    toggle_init();
815
#endif
816
}
817
818
819
820
821

/* added by SPK for memory cleanup, gracefully return our malloc()s */
void thanks_for_all_the_fish(void) 
{
#ifdef ENABLE_MULTIBUFFER
822
    openfilestruct * current_open_file;
823
824
#endif

Chris Allegretta's avatar
Chris Allegretta committed
825
#ifndef DISABLE_OPERATINGDIR
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
    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
/* Cleanup of Multibuffers . . .
   Do not cleanup the current one, that is fileage . . . do the
   rest of them though! (should be none if all went well) */
    current_open_file = open_files;
873
874
875
876
    if (open_files != NULL) {
	while (open_files->prev != NULL) 
	    open_files = open_files->prev;
	while (open_files->next != NULL) {
877
  /* cleanup of a multi buf . . . */
878
879
880
	    open_files = open_files->next;
	    if (open_files->prev != current_open_file) 
		free_openfilestruct(open_files->prev);
881
882
        }
  /* cleanup of last multi buf . . . */
883
	free_openfilestruct(open_files);
884
    }
885
#else
886
887
888
  /* starting the cleanup of fileage now . . . */

    if (fileage != NULL)
889
890
	free_filestruct(fileage);
#endif
891
892
893
894

    /* that is all for now */

}