global.c 25.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 <sys/stat.h>
Chris Allegretta's avatar
Chris Allegretta committed
25
26
27
28
29
30
31
32
33
34
35
36
37
#include "nano.h"
#include "proto.h"

#ifndef NANO_SMALL
#include <libintl.h>
#define _(string) gettext(string)
#else
#define _(string) (string)
#endif

/*
 * Global variables
 */
38

39
int flags = 0;			/* Our new flag containing many options */
Chris Allegretta's avatar
Chris Allegretta committed
40
41
42
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
43
char *filename = NULL;		/* Name of the file */
Chris Allegretta's avatar
Chris Allegretta committed
44
45
46
47
48
49
50
51
52
53
54
55
56
57
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 */

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

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

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

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

Chris Allegretta's avatar
Chris Allegretta committed
75
76
77
78
79
80
81
82
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 */

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

88
89
90
91
#ifndef DISABLE_SPELLER
char *alt_speller;		/* Alternative spell command */
#endif

92
93
94
shortcut *main_list = NULL;
shortcut *whereis_list = NULL;
shortcut *replace_list = NULL;
95
shortcut *replace_list_2 = NULL; 	/* 2nd half of replace dialog */
96
97
98
99
100
101
shortcut *goto_list = NULL;
shortcut *gotodir_list = NULL;
shortcut *writefile_list = NULL;
shortcut *insertfile_list = NULL;
shortcut *help_list = NULL;
shortcut *spell_list = NULL;
102
#ifndef DISABLE_BROWSER
103
shortcut *browser_list = NULL;
Chris Allegretta's avatar
Chris Allegretta committed
104
105
#endif

106
107
#ifdef ENABLE_COLOR
    colorstruct colors[NUM_NCOLORS];
108
    colortype *colorstrings = NULL;
109
110
#endif

111
#if !defined(DISABLE_BROWSER) || !defined(DISABLE_MOUSE) || !defined (DISABLE_HELP)
112
shortcut *currshortcut;			/* Current shortcut list we're using */
113
#endif
114

115
#ifndef NANO_SMALL
116
toggle *toggles = NULL;
117
#endif
Chris Allegretta's avatar
Chris Allegretta committed
118

119
120
/* Regular expressions */

121
#ifdef HAVE_REGEX_H
122
123
124
regex_t search_regexp;		/* Global to store compiled search regexp */
regmatch_t regmatches[10];	/* Match positions for parenthetical
				   subexpressions, max of 10 */
125
#endif
126

127
128
129
130
131
132
133
134
135
136
137
int length_of_list(shortcut *s) 
{
    int i = 0;
    shortcut *t;

    for (t = s; t != NULL; t = t->next)
	i++;

    return i;
}

Chris Allegretta's avatar
Chris Allegretta committed
138
/* Initialize a struct *without* our lovely braces =( */
139
void sc_init_one(shortcut **shortcutage, int key, char *desc, char *help, int alt,
Chris Allegretta's avatar
Chris Allegretta committed
140
141
		 int misc1, int misc2, int view, int (*func) (void))
{
142
143
144
145
146
147
148
149
150
151
152
153
    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
154
155
156
157
158
159
160
161
    s->val = key;
    s->desc = desc;
    s->help = help;
    s->altval = alt;
    s->misc1 = misc1;
    s->misc2 = misc2;
    s->viewok = view;
    s->func = func;
162
    s->next = NULL;
Chris Allegretta's avatar
Chris Allegretta committed
163
164
}

165
#ifndef NANO_SMALL
166
/* Initialize the toggles in the same manner */
167
void toggle_init_one(int val, char *desc, int flag)
168
{
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
    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;
185
}
186
#endif
187
188
189
190
191
192

void toggle_init(void)
{
#ifndef NANO_SMALL
    char *toggle_const_msg, *toggle_autoindent_msg, *toggle_suspend_msg,
	*toggle_nohelp_msg, *toggle_picomode_msg, *toggle_mouse_msg,
193
	*toggle_cuttoend_msg, *toggle_wrap_msg, *toggle_case_msg, 
194
195
	*toggle_backwards_msg, *toggle_noconvert_msg, *toggle_dos_msg,
	*toggle_mac_msg, *toggle_smooth_msg;
196

197
#ifdef HAVE_REGEX_H
198
    char *toggle_regexp_msg;
199
#endif
200

201
202
203
#ifdef ENABLE_MULTIBUFFER
    char *toggle_load_msg;
#endif
204

205
    toggle_const_msg = _("Constant cursor position");
206
    toggle_autoindent_msg = _("Auto indent");
207
    toggle_suspend_msg = _("Suspend");
208
    toggle_nohelp_msg = _("Help mode");
209
    toggle_picomode_msg = _("Pico mode");
210
211
    toggle_mouse_msg = _("Mouse support");
    toggle_cuttoend_msg = _("Cut to end");
212
213
    toggle_backwards_msg = _("Backwards search");
    toggle_case_msg = _("Case sensitive search");
214

215
#ifdef HAVE_REGEX_H
216
    toggle_regexp_msg = _("Regular expression search");
217
#endif
218
219
220
221
222

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

225
226
#ifdef ENABLE_MULTIBUFFER
    toggle_load_msg = _("Multiple file buffers");
227
228
#endif

229
230
231
232
233
234
235
236
237
238
    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);
239
#ifdef HAVE_REGEX_H
240
    toggle_init_one(TOGGLE_REGEXP_KEY, toggle_regexp_msg, USE_REGEXP);
241
#endif
242
243
#ifdef ENABLE_MULTIBUFFER
    toggle_init_one(TOGGLE_LOAD_KEY, toggle_load_msg, MULTIBUFFER);
244
#endif
245
246
247
248
249
    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);
#endif /* !NANO_SMALL */
250
251
}

252
void shortcut_init(int unjustify)
Chris Allegretta's avatar
Chris Allegretta committed
253
254
255
256
257
258
259
260
261
262
263
264
{
    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 =
265
	"", *nano_enter_msg = "", *nano_cancel_msg = 
266
	"", *nano_unjustify_msg = "", *nano_append_msg =
267
	""; 
Chris Allegretta's avatar
Chris Allegretta committed
268
269

#ifndef NANO_SMALL
270
    char *nano_tofiles_msg = "", *nano_gotodir_msg = "", *nano_case_msg =
271
	"", *nano_reverse_msg = "";
272
273
    char *nano_dos_msg = "", *nano_mac_msg = ""; 

274
275
276
#ifdef HAVE_REGEX_H
    char *nano_regexp_msg = "", *nano_bracket_msg = "";
#endif
277
278
279
#ifdef ENABLE_MULTIBUFFER
    char *nano_openprev_msg = "", *nano_opennext_msg = "";
#endif
280

Chris Allegretta's avatar
Chris Allegretta committed
281
282
    nano_help_msg = _("Invoke the help menu");
    nano_writeout_msg = _("Write the current file to disk");
283

284
#ifdef ENABLE_MULTIBUFFER
285
286
    nano_exit_msg = _("Close currently loaded file/Exit from nano");
#else
Chris Allegretta's avatar
Chris Allegretta committed
287
    nano_exit_msg = _("Exit from nano");
288
289
#endif

Chris Allegretta's avatar
Chris Allegretta committed
290
291
    nano_goto_msg = _("Goto a specific line number");
    nano_justify_msg = _("Justify the current paragraph");
292
    nano_unjustify_msg = _("Unjustify after a justify");
Chris Allegretta's avatar
Chris Allegretta committed
293
294
295
296
297
298
299
    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");
300
    nano_cursorpos_msg = _("Show the position of the cursor");
Chris Allegretta's avatar
Chris Allegretta committed
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
    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
319
    nano_tofiles_msg = _("Go to file browser");
Rocco Corsi's avatar
   
Rocco Corsi committed
320
    nano_gotodir_msg = _("Goto Directory");
Chris Allegretta's avatar
Chris Allegretta committed
321
    nano_cancel_msg = _("Cancel the current function");
322
    nano_append_msg = _("Append to the current file");
323
    nano_reverse_msg = _("Search backwards");
324
325
    nano_dos_msg = _("Write file out in DOS format");
    nano_mac_msg = _("Write file out in Mac format");
326
#ifdef HAVE_REGEX_H
327
328
    nano_regexp_msg = _("Use Regular expressions");
    nano_bracket_msg = _("Find other bracket");
329
#endif
330
331
332
#ifdef ENABLE_MULTIBUFFER
    nano_openprev_msg = _("Open previously loaded file");
    nano_opennext_msg = _("Open next loaded file");
Chris Allegretta's avatar
Chris Allegretta committed
333
#endif
334
#endif /* !NANO_SMALL */
Chris Allegretta's avatar
Chris Allegretta committed
335

336
337
338
    if (main_list != NULL)
	free_shortcutage(&main_list);

339
	sc_init_one(&main_list, NANO_HELP_KEY, _("Get Help"),
340
		    nano_help_msg, 0, NANO_HELP_FKEY, 0, VIEW, do_help);
Chris Allegretta's avatar
Chris Allegretta committed
341

342
#ifdef ENABLE_MULTIBUFFER
343
    if (open_files != NULL && (open_files->prev || open_files->next))
344
	sc_init_one(&main_list, NANO_EXIT_KEY, _("Close"),
345
346
347
		nano_exit_msg, 0, NANO_EXIT_FKEY, 0, VIEW, do_exit);
    else
#endif
348
	sc_init_one(&main_list, NANO_EXIT_KEY, _("Exit"),
Chris Allegretta's avatar
Chris Allegretta committed
349
350
		nano_exit_msg, 0, NANO_EXIT_FKEY, 0, VIEW, do_exit);

351
    sc_init_one(&main_list, NANO_WRITEOUT_KEY, _("WriteOut"),
Chris Allegretta's avatar
Chris Allegretta committed
352
353
354
		    nano_writeout_msg,
		    0, NANO_WRITEOUT_FKEY, 0, NOVIEW, do_writeout_void);

355
    if (ISSET(PICO_MODE))
356
	sc_init_one(&main_list, NANO_JUSTIFY_KEY, _("Justify"),
357
		    nano_justify_msg, 0, NANO_JUSTIFY_FKEY, 0,
358
		    NOVIEW, do_justify);
Chris Allegretta's avatar
Chris Allegretta committed
359
    else
360
361
362

#ifdef ENABLE_MULTIBUFFER
	/* this is so we can view multiple files */
363
	sc_init_one(&main_list, NANO_INSERTFILE_KEY, _("Read File"),
364
365
366
		nano_insert_msg,
		0, NANO_INSERTFILE_FKEY, 0, VIEW, do_insertfile_void);
#else
367
	sc_init_one(&main_list, NANO_INSERTFILE_KEY, _("Read File"),
368
		nano_insert_msg,
369
		0, NANO_INSERTFILE_FKEY, 0, NOVIEW, do_insertfile_void);
370
#endif
371
372

    if (ISSET(PICO_MODE))
373
374
375

#ifdef ENABLE_MULTIBUFFER
	/* this is so we can view multiple files */
376
	sc_init_one(&main_list, NANO_INSERTFILE_KEY, _("Read File"),
377
378
379
		nano_insert_msg,
		0, NANO_INSERTFILE_FKEY, 0, VIEW, do_insertfile_void);
#else
380
	sc_init_one(&main_list, NANO_INSERTFILE_KEY, _("Read File"),
Chris Allegretta's avatar
Chris Allegretta committed
381
		nano_insert_msg,
382
		0, NANO_INSERTFILE_FKEY, 0, NOVIEW, do_insertfile_void);
383
384
#endif

385
    else
386
	sc_init_one(&main_list, NANO_REPLACE_KEY, _("Replace"),
387
		    nano_replace_msg,
388
		    NANO_ALT_REPLACE_KEY, NANO_REPLACE_FKEY, 0, NOVIEW, do_replace);
Chris Allegretta's avatar
Chris Allegretta committed
389

390
    sc_init_one(&main_list, NANO_WHEREIS_KEY, _("Where Is"),
Chris Allegretta's avatar
Chris Allegretta committed
391
392
393
		nano_whereis_msg,
		0, NANO_WHEREIS_FKEY, 0, VIEW, do_search);

394
    sc_init_one(&main_list, NANO_PREVPAGE_KEY, _("Prev Page"),
Chris Allegretta's avatar
Chris Allegretta committed
395
		nano_prevpage_msg,
396
		0, NANO_PREVPAGE_FKEY, KEY_PPAGE, VIEW, do_page_up);
Chris Allegretta's avatar
Chris Allegretta committed
397

398
    sc_init_one(&main_list, NANO_NEXTPAGE_KEY, _("Next Page"),
Chris Allegretta's avatar
Chris Allegretta committed
399
		nano_nextpage_msg,
400
		0, NANO_NEXTPAGE_FKEY, KEY_NPAGE, VIEW, do_page_down);
Chris Allegretta's avatar
Chris Allegretta committed
401

402
    sc_init_one(&main_list, NANO_CUT_KEY, _("Cut Text"),
Chris Allegretta's avatar
Chris Allegretta committed
403
404
		nano_cut_msg, 0, NANO_CUT_FKEY, 0, NOVIEW, do_cut_text);

405
    if (unjustify)
406
	sc_init_one(&main_list, NANO_UNJUSTIFY_KEY, _("UnJustify"),
407
408
		nano_unjustify_msg, 0, 0, 0, NOVIEW, do_uncut_text);
    else
409
	sc_init_one(&main_list, NANO_UNCUT_KEY, _("UnCut Txt"),
Chris Allegretta's avatar
Chris Allegretta committed
410
411
412
		nano_uncut_msg,
		0, NANO_UNCUT_FKEY, 0, NOVIEW, do_uncut_text);

413
    sc_init_one(&main_list, NANO_CURSORPOS_KEY, _("Cur Pos"),
Chris Allegretta's avatar
Chris Allegretta committed
414
		nano_cursorpos_msg,
415
		0, NANO_CURSORPOS_FKEY, 0, VIEW, do_cursorpos_void);
Chris Allegretta's avatar
Chris Allegretta committed
416

417
    sc_init_one(&main_list, NANO_SPELL_KEY, _("To Spell"),
Chris Allegretta's avatar
Chris Allegretta committed
418
419
420
		nano_spell_msg, 0, NANO_SPELL_FKEY, 0, NOVIEW, do_spell);


421
    sc_init_one(&main_list, NANO_UP_KEY, _("Up"),
Chris Allegretta's avatar
Chris Allegretta committed
422
423
		nano_up_msg, 0, KEY_UP, 0, VIEW, do_up);

424
    sc_init_one(&main_list, NANO_DOWN_KEY, _("Down"),
Chris Allegretta's avatar
Chris Allegretta committed
425
426
		nano_down_msg, 0, KEY_DOWN, 0, VIEW, do_down);

427
    sc_init_one(&main_list, NANO_FORWARD_KEY, _("Forward"),
Chris Allegretta's avatar
Chris Allegretta committed
428
429
		nano_forward_msg, 0, KEY_RIGHT, 0, VIEW, do_right);

430
    sc_init_one(&main_list, NANO_BACK_KEY, _("Back"),
Chris Allegretta's avatar
Chris Allegretta committed
431
432
		nano_back_msg, 0, KEY_LEFT, 0, VIEW, do_left);

433
    sc_init_one(&main_list, NANO_HOME_KEY, _("Home"),
Chris Allegretta's avatar
Chris Allegretta committed
434
435
		nano_home_msg, 0, KEY_HOME, 362, VIEW, do_home);

436
    sc_init_one(&main_list, NANO_END_KEY, _("End"),
Chris Allegretta's avatar
Chris Allegretta committed
437
438
		nano_end_msg, 0, KEY_END, 385, VIEW, do_end);

439
    sc_init_one(&main_list, NANO_REFRESH_KEY, _("Refresh"),
Chris Allegretta's avatar
Chris Allegretta committed
440
441
		nano_refresh_msg, 0, 0, 0, VIEW, total_refresh);

442
    sc_init_one(&main_list, NANO_MARK_KEY, _("Mark Text"),
443
		nano_mark_msg, NANO_ALT_MARK_KEY, 0, 0, NOVIEW, do_mark);
Chris Allegretta's avatar
Chris Allegretta committed
444

445
    sc_init_one(&main_list, NANO_DELETE_KEY, _("Delete"),
Chris Allegretta's avatar
Chris Allegretta committed
446
447
448
		nano_delete_msg, 0, KEY_DC,
		NANO_CONTROL_D, NOVIEW, do_delete);

449
    sc_init_one(&main_list, NANO_BACKSPACE_KEY, _("Backspace"),
Chris Allegretta's avatar
Chris Allegretta committed
450
451
452
		nano_backspace_msg, 0,
		KEY_BACKSPACE, 127, NOVIEW, do_backspace);

453
    sc_init_one(&main_list, NANO_TAB_KEY, _("Tab"),
Chris Allegretta's avatar
Chris Allegretta committed
454
455
		nano_tab_msg, 0, 0, 0, NOVIEW, do_tab);

456
    if (ISSET(PICO_MODE))
457
	sc_init_one(&main_list, NANO_REPLACE_KEY, _("Replace"),
Chris Allegretta's avatar
Chris Allegretta committed
458
		    nano_replace_msg,
459
		    NANO_ALT_REPLACE_KEY, NANO_REPLACE_FKEY, 0, NOVIEW, do_replace);
Chris Allegretta's avatar
Chris Allegretta committed
460
    else
461
	sc_init_one(&main_list, NANO_JUSTIFY_KEY, _("Justify"),
462
		    nano_justify_msg, 0, NANO_JUSTIFY_FKEY, 0,
463
		    NOVIEW, do_justify);
Chris Allegretta's avatar
Chris Allegretta committed
464

465
    sc_init_one(&main_list, NANO_ENTER_KEY, _("Enter"),
Chris Allegretta's avatar
Chris Allegretta committed
466
467
468
		nano_enter_msg,
		0, KEY_ENTER, NANO_CONTROL_M, NOVIEW, do_enter_void);

469
    sc_init_one(&main_list, NANO_GOTO_KEY, _("Goto Line"),
470
		    nano_goto_msg,
471
		    NANO_ALT_GOTO_KEY, NANO_GOTO_FKEY, 0, VIEW, do_gotoline_void);
472

473
#if (!defined NANO_SMALL) && (defined HAVE_REGEX_H)
474
    sc_init_one(&main_list, -9, _("Find Other Bracket"),
475
476
477
		    nano_bracket_msg,
		    NANO_BRACKET_KEY, 0, 0, VIEW, do_find_bracket);
#endif
Chris Allegretta's avatar
Chris Allegretta committed
478

479
480
481
482
483
484
485
486
#ifdef ENABLE_MULTIBUFFER
    sc_init_one(&main_list, -9, _("Previous File"),
		    nano_openprev_msg,
		    NANO_OPENPREV_KEY, 0, 0, VIEW, open_prevfile_void);
    sc_init_one(&main_list, -9, _("Next File"),
		    nano_opennext_msg,
		    NANO_OPENNEXT_KEY, 0, 0, VIEW, open_nextfile_void);
#endif
487

488
489
490
    if (whereis_list != NULL)
	free_shortcutage(&whereis_list);

491
    sc_init_one(&whereis_list, NANO_HELP_KEY,
492
493
		_("Get Help"), nano_help_msg, 0, 0, 0, VIEW, do_help);

494
    sc_init_one(&whereis_list, NANO_CANCEL_KEY,
495
496
		_("Cancel"), nano_cancel_msg, 0, 0, 0, VIEW, 0);

497
    sc_init_one(&whereis_list, NANO_FIRSTLINE_KEY, _("First Line"),
Chris Allegretta's avatar
Chris Allegretta committed
498
499
		nano_firstline_msg, 0, 0, 0, VIEW, do_first_line);

500
    sc_init_one(&whereis_list, NANO_LASTLINE_KEY, _("Last Line"),
Chris Allegretta's avatar
Chris Allegretta committed
501
502
		nano_lastline_msg, 0, 0, 0, VIEW, do_last_line);

503
    sc_init_one(&whereis_list, NANO_OTHERSEARCH_KEY, _("Replace"),
Chris Allegretta's avatar
Chris Allegretta committed
504
505
		nano_replace_msg, 0, 0, 0, VIEW, do_replace);

506
    sc_init_one(&whereis_list, NANO_FROMSEARCHTOGOTO_KEY,
507
508
		_("Goto Line"), nano_goto_msg, 0, 0, 0, VIEW,
		do_gotoline_void);
509

510
#ifndef NANO_SMALL
511
    sc_init_one(&whereis_list, TOGGLE_CASE_KEY, _("Case Sens"),
512
513
		nano_case_msg, 0, 0, 0, VIEW, 0);

514
    sc_init_one(&whereis_list, TOGGLE_BACKWARDS_KEY, _("Direction"),
Chris Allegretta's avatar
Chris Allegretta committed
515
		nano_reverse_msg, 0, 0, 0, VIEW, 0);
Chris Allegretta's avatar
Chris Allegretta committed
516

517
#ifdef HAVE_REGEX_H
518
    sc_init_one(&whereis_list, TOGGLE_REGEXP_KEY,
519
		_("Regexp"), nano_regexp_msg, 0, 0, 0, VIEW, 0);
520
#endif
521
#endif /* !NANO_SMALL */
522

523
524
    if (replace_list != NULL)
	free_shortcutage(&replace_list);
525

526
    sc_init_one(&replace_list, NANO_HELP_KEY,
527
528
		_("Get Help"), nano_help_msg, 0, 0, 0, VIEW, do_help);

529
    sc_init_one(&replace_list, NANO_CANCEL_KEY,
530
		_("Cancel"), nano_cancel_msg, 0, 0, 0, VIEW, 0);
Chris Allegretta's avatar
Chris Allegretta committed
531

532
    sc_init_one(&replace_list, NANO_FIRSTLINE_KEY, _("First Line"),
Chris Allegretta's avatar
Chris Allegretta committed
533
534
		nano_firstline_msg, 0, 0, 0, VIEW, do_first_line);

535
    sc_init_one(&replace_list, NANO_LASTLINE_KEY, _("Last Line"),
Chris Allegretta's avatar
Chris Allegretta committed
536
537
		nano_lastline_msg, 0, 0, 0, VIEW, do_last_line);

538
    sc_init_one(&replace_list, NANO_OTHERSEARCH_KEY, _("No Replace"),
Chris Allegretta's avatar
Chris Allegretta committed
539
540
		nano_whereis_msg, 0, 0, 0, VIEW, do_search);

541
    sc_init_one(&replace_list, NANO_FROMSEARCHTOGOTO_KEY,
542
543
		_("Goto Line"), nano_goto_msg, 0, 0, 0, VIEW,
		do_gotoline_void);
544

545
#ifndef NANO_SMALL
546
    sc_init_one(&replace_list, TOGGLE_CASE_KEY, _("Case Sens"),
547
548
		nano_case_msg, 0, 0, 0, VIEW, 0);

549
    sc_init_one(&replace_list, TOGGLE_BACKWARDS_KEY, _("Direction"),
Chris Allegretta's avatar
Chris Allegretta committed
550
		nano_reverse_msg, 0, 0, 0, VIEW, 0);
551

552
#ifdef HAVE_REGEX_H
553
    sc_init_one(&replace_list, TOGGLE_REGEXP_KEY, 
554
		_("Regexp"), nano_regexp_msg, 0, 0, 0, VIEW, 0);
555
#endif
556
#endif /* !NANO_SMALL */
557

558
559
    if (replace_list_2 != NULL)
	free_shortcutage(&replace_list_2);
560

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

564
    sc_init_one(&replace_list_2, NANO_CANCEL_KEY,
565
		_("Cancel"), nano_cancel_msg, 0, 0, 0, VIEW, 0);
566

567
    sc_init_one(&replace_list_2, NANO_FIRSTLINE_KEY, _("First Line"),
568
569
		nano_firstline_msg, 0, 0, 0, VIEW, do_first_line);

570
    sc_init_one(&replace_list_2, NANO_LASTLINE_KEY, _("Last Line"),
571
572
		nano_lastline_msg, 0, 0, 0, VIEW, do_last_line);

573
574
    if (goto_list != NULL)
	free_shortcutage(&goto_list);
Chris Allegretta's avatar
Chris Allegretta committed
575

576
    sc_init_one(&goto_list, NANO_HELP_KEY,
577
578
		_("Get Help"), nano_help_msg, 0, 0, 0, VIEW, do_help);

579
    sc_init_one(&goto_list, NANO_CANCEL_KEY, _("Cancel"),
580
		nano_cancel_msg, 0, 0, 0, VIEW, 0);
Chris Allegretta's avatar
Chris Allegretta committed
581

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

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

588
589
    if (help_list != NULL)
	free_shortcutage(&help_list);
Chris Allegretta's avatar
Chris Allegretta committed
590

591
    sc_init_one(&help_list, NANO_PREVPAGE_KEY, _("Prev Page"),
Chris Allegretta's avatar
Chris Allegretta committed
592
		nano_prevpage_msg,
593
		0, NANO_PREVPAGE_FKEY, KEY_PPAGE, VIEW, do_page_up);
Chris Allegretta's avatar
Chris Allegretta committed
594

595
    sc_init_one(&help_list, NANO_NEXTPAGE_KEY, _("Next Page"),
Chris Allegretta's avatar
Chris Allegretta committed
596
		nano_nextpage_msg,
597
		0, NANO_NEXTPAGE_FKEY, KEY_NPAGE, VIEW, do_page_down);
Chris Allegretta's avatar
Chris Allegretta committed
598

599
    sc_init_one(&help_list, NANO_EXIT_KEY, _("Exit"),
Chris Allegretta's avatar
Chris Allegretta committed
600
601
		nano_exit_msg, 0, NANO_EXIT_FKEY, 0, VIEW, do_exit);

602
603
    if (writefile_list != NULL)
	free_shortcutage(&writefile_list);
Chris Allegretta's avatar
Chris Allegretta committed
604

605
    sc_init_one(&writefile_list, NANO_HELP_KEY,
606
607
		_("Get Help"), nano_help_msg, 0, 0, 0, VIEW, do_help);

608
#ifndef DISABLE_BROWSER
609
    sc_init_one(&writefile_list, NANO_TOFILES_KEY, _("To Files"),
Chris Allegretta's avatar
Chris Allegretta committed
610
611
		nano_tofiles_msg, 0, 0, 0, NOVIEW, 0);
#endif
Chris Allegretta's avatar
Chris Allegretta committed
612

613
614
615
616
617
618
619
620
621
622
#ifndef NANO_SMALL
    sc_init_one(&writefile_list, TOGGLE_DOS_KEY, 
		_("DOS Format"), nano_dos_msg, 0, 0, 0, NOVIEW, 0);

    sc_init_one(&writefile_list, TOGGLE_MAC_KEY, 
		_("Mac Format"), nano_mac_msg, 0, 0, 0, NOVIEW, 0);
#endif

    sc_init_one(&writefile_list, 
		NANO_APPEND_KEY, _("Append"),
623
624
		nano_append_msg, 0, 0, 0, NOVIEW, 0);

625
626
627
    sc_init_one(&writefile_list, NANO_CANCEL_KEY, 
		_("Cancel"), nano_cancel_msg, 0, 0, 0, VIEW, 0);

628
629
    if (insertfile_list != NULL)
	free_shortcutage(&insertfile_list);
630
631

    sc_init_one(&insertfile_list, NANO_HELP_KEY,
632
633
		_("Get Help"), nano_help_msg, 0, 0, 0, VIEW, do_help);

634
    sc_init_one(&insertfile_list, NANO_CANCEL_KEY, _("Cancel"),
Chris Allegretta's avatar
Chris Allegretta committed
635
636
		nano_cancel_msg, 0, 0, 0, VIEW, 0);

637
#ifndef DISABLE_BROWSER
638
    sc_init_one(&insertfile_list, NANO_TOFILES_KEY, _("To Files"),
639
640
641
		nano_tofiles_msg, 0, 0, 0, NOVIEW, 0);
#endif

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

645
    sc_init_one(&spell_list, NANO_CANCEL_KEY, _("Cancel"),
Chris Allegretta's avatar
Chris Allegretta committed
646
647
		nano_cancel_msg, 0, 0, 0, VIEW, 0);

648

649
#ifndef DISABLE_BROWSER
650
651
652
653

    if (browser_list != NULL)
	free_shortcutage(&browser_list);

654
    sc_init_one(&browser_list, NANO_HELP_KEY,
655
656
		_("Get Help"), nano_help_msg, 0, 0, 0, VIEW, do_help);

657
    sc_init_one(&browser_list, NANO_EXIT_KEY, _("Exit"),
658
659
		nano_exit_msg, 0, NANO_EXIT_FKEY, 0, VIEW, 0);

660
    sc_init_one(&browser_list, NANO_PREVPAGE_KEY, _("Prev Page"),
Chris Allegretta's avatar
Chris Allegretta committed
661
662
663
		nano_prevpage_msg,
		0, NANO_PREVPAGE_FKEY, KEY_PPAGE, VIEW, 0);

664
    sc_init_one(&browser_list, NANO_NEXTPAGE_KEY, _("Next Page"),
Chris Allegretta's avatar
Chris Allegretta committed
665
666
667
		nano_nextpage_msg,
		0, NANO_NEXTPAGE_FKEY, KEY_NPAGE, VIEW, 0);

668
    sc_init_one(&browser_list, NANO_GOTO_KEY, _("Goto"),
669
670
		nano_gotodir_msg, NANO_ALT_GOTO_KEY, NANO_GOTO_FKEY, 0, 
		VIEW, 0);
Rocco Corsi's avatar
   
Rocco Corsi committed
671

672
673
674
    if (gotodir_list != NULL)
	free_shortcutage(&gotodir_list);

675
    sc_init_one(&gotodir_list, NANO_HELP_KEY,
676
		_("Get Help"), nano_help_msg, 0, 0, 0, VIEW, do_help);
Chris Allegretta's avatar
Chris Allegretta committed
677

678
    sc_init_one(&gotodir_list, NANO_CANCEL_KEY, _("Cancel"),
Rocco Corsi's avatar
   
Rocco Corsi committed
679
680
		nano_cancel_msg, 0, 0, 0, VIEW, 0);

Chris Allegretta's avatar
Chris Allegretta committed
681
682
683
#endif


684
685
686
687
#if !defined(DISABLE_BROWSER) || !defined(DISABLE_MOUSE) || !defined (DISABLE_HELP)
    currshortcut = main_list;
#endif

688
    toggle_init();
Chris Allegretta's avatar
Chris Allegretta committed
689
}
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809

/* delete the structure */
void free_shortcutage(shortcut **shortcutage)
{
    shortcut *s,*ps;

    s = *shortcutage;
    if (s == NULL) {
	return;
    } else {
	s = *shortcutage;
	do {
		ps = s;
		s = s->next; 
		free(ps);
	} while (s->next != NULL);
	free(s);
	*shortcutage = NULL;
    }
}

#ifndef NANO_SMALL
/* clear the toggles */
void free_toggles(void)
{
    toggle *u,*lu;

    if (toggles == NULL) {
	return;
    } else {
	lu = NULL;
	for (u = toggles; u->next != NULL; u = u->next) {
		if (lu != NULL) free(lu);
		lu = u;
	}
	if (lu != NULL) free(lu);
	if (u != NULL) free(u);
    }
}
#endif

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

#ifdef ENABLE_MULTIBUFFER
    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;
    if (open_files != NULL){
        while (open_files->prev != NULL) 
           open_files = open_files->prev;
        while (open_files->next != NULL) {
  /* cleanup of a multi buf . . . */
           if (open_files != current_open_file) 
             free_filestruct(open_files->file);
           open_files = open_files->next;
           free_filestruct(open_files->prev);
        }
  /* cleanup of last multi buf . . . */
        if (open_files != current_open_file) 
	  free_filestruct(open_files->file);
        free_filestruct(open_files);
    }
#endif
  /* starting the cleanup of fileage now . . . */

    if (fileage != NULL)
        free_filestruct(fileage);

    /* that is all for now */

}