global.c 26 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
openfilestruct *open_files = NULL;	/* The list of open files */
60
61
#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;
Chris Allegretta's avatar
Chris Allegretta committed
102
#ifndef NANO_SMALL
103
shortcut *extcmd_list = NULL;
Chris Allegretta's avatar
Chris Allegretta committed
104
#endif
105
#ifndef DISABLE_BROWSER
106
shortcut *browser_list = NULL;
Chris Allegretta's avatar
Chris Allegretta committed
107
108
#endif

109
110
#ifdef ENABLE_COLOR
    colorstruct colors[NUM_NCOLORS];
111
    colortype *colorstrings = NULL;
112
113
#endif

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

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

122
123
/* Regular expressions */

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

133
#endif
134

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

173
#ifndef NANO_SMALL
174
/* Initialize the toggles in the same manner */
175
void toggle_init_one(int val, char *desc, int flag)
176
{
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
    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;
193
}
194
#endif
195
196
197
198
199
200

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,
201
	*toggle_cuttoend_msg, *toggle_wrap_msg, *toggle_case_msg, 
202
203
	*toggle_backwards_msg, *toggle_noconvert_msg, *toggle_dos_msg,
	*toggle_mac_msg, *toggle_smooth_msg;
204

205
#ifdef HAVE_REGEX_H
206
    char *toggle_regexp_msg;
207
#endif
208

209
210
211
#ifdef ENABLE_MULTIBUFFER
    char *toggle_load_msg;
#endif
212

213
    toggle_const_msg = _("Constant cursor position");
214
    toggle_autoindent_msg = _("Auto indent");
215
    toggle_suspend_msg = _("Suspend");
216
    toggle_nohelp_msg = _("Help mode");
217
    toggle_picomode_msg = _("Pico mode");
218
219
    toggle_mouse_msg = _("Mouse support");
    toggle_cuttoend_msg = _("Cut to end");
220
221
    toggle_backwards_msg = _("Backwards search");
    toggle_case_msg = _("Case sensitive search");
222

223
#ifdef HAVE_REGEX_H
224
    toggle_regexp_msg = _("Regular expression search");
225
#endif
226
227
228
229
230

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

233
234
#ifdef ENABLE_MULTIBUFFER
    toggle_load_msg = _("Multiple file buffers");
235
236
#endif

237
238
239
240
241
242
243
244
245
246
    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);
247
#ifdef HAVE_REGEX_H
248
    toggle_init_one(TOGGLE_REGEXP_KEY, toggle_regexp_msg, USE_REGEXP);
249
#endif
250
251
#ifdef ENABLE_MULTIBUFFER
    toggle_init_one(TOGGLE_LOAD_KEY, toggle_load_msg, MULTIBUFFER);
252
#endif
253
254
255
256
257
    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 */
258
259
}

260
void shortcut_init(int unjustify)
Chris Allegretta's avatar
Chris Allegretta committed
261
262
263
264
265
266
267
268
269
270
271
272
{
    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 =
273
	"", *nano_enter_msg = "", *nano_cancel_msg = 
274
	"", *nano_unjustify_msg = "", *nano_append_msg =
275
	""; 
Chris Allegretta's avatar
Chris Allegretta committed
276

Chris Allegretta's avatar
Chris Allegretta committed
277
278
279
280
#ifdef ENABLE_MULTIBUFFER
    char *nano_openprev_msg = "", *nano_opennext_msg = "";
#endif

Chris Allegretta's avatar
Chris Allegretta committed
281
#ifndef NANO_SMALL
282
    char *nano_tofiles_msg = "", *nano_gotodir_msg = "", *nano_case_msg =
283
	"", *nano_reverse_msg = "", *nano_execute_msg = "";
284
285
    char *nano_dos_msg = "", *nano_mac_msg = ""; 

286
287
288
#ifdef HAVE_REGEX_H
    char *nano_regexp_msg = "", *nano_bracket_msg = "";
#endif
289

Chris Allegretta's avatar
Chris Allegretta committed
290
291
    nano_help_msg = _("Invoke the help menu");
    nano_writeout_msg = _("Write the current file to disk");
292

293
#ifdef ENABLE_MULTIBUFFER
294
295
    nano_exit_msg = _("Close currently loaded file/Exit from nano");
#else
Chris Allegretta's avatar
Chris Allegretta committed
296
    nano_exit_msg = _("Exit from nano");
297
298
#endif

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

346
347
348
    if (main_list != NULL)
	free_shortcutage(&main_list);

349
	sc_init_one(&main_list, NANO_HELP_KEY, _("Get Help"),
350
		    nano_help_msg, 0, NANO_HELP_FKEY, 0, VIEW, do_help);
Chris Allegretta's avatar
Chris Allegretta committed
351

352
#ifdef ENABLE_MULTIBUFFER
353
    if (open_files != NULL && (open_files->prev || open_files->next))
354
	sc_init_one(&main_list, NANO_EXIT_KEY, _("Close"),
355
356
357
		nano_exit_msg, 0, NANO_EXIT_FKEY, 0, VIEW, do_exit);
    else
#endif
358
	sc_init_one(&main_list, NANO_EXIT_KEY, _("Exit"),
Chris Allegretta's avatar
Chris Allegretta committed
359
360
		nano_exit_msg, 0, NANO_EXIT_FKEY, 0, VIEW, do_exit);

361
    sc_init_one(&main_list, NANO_WRITEOUT_KEY, _("WriteOut"),
Chris Allegretta's avatar
Chris Allegretta committed
362
363
364
		    nano_writeout_msg,
		    0, NANO_WRITEOUT_FKEY, 0, NOVIEW, do_writeout_void);

365
    if (ISSET(PICO_MODE))
366
	sc_init_one(&main_list, NANO_JUSTIFY_KEY, _("Justify"),
367
		    nano_justify_msg, 0, NANO_JUSTIFY_FKEY, 0,
368
		    NOVIEW, do_justify);
Chris Allegretta's avatar
Chris Allegretta committed
369
    else
370
371
372

#ifdef ENABLE_MULTIBUFFER
	/* this is so we can view multiple files */
373
	sc_init_one(&main_list, NANO_INSERTFILE_KEY, _("Read File"),
374
375
376
		nano_insert_msg,
		0, NANO_INSERTFILE_FKEY, 0, VIEW, do_insertfile_void);
#else
377
	sc_init_one(&main_list, NANO_INSERTFILE_KEY, _("Read File"),
378
		nano_insert_msg,
379
		0, NANO_INSERTFILE_FKEY, 0, NOVIEW, do_insertfile_void);
380
#endif
381
382

    if (ISSET(PICO_MODE))
383
384
385

#ifdef ENABLE_MULTIBUFFER
	/* this is so we can view multiple files */
386
	sc_init_one(&main_list, NANO_INSERTFILE_KEY, _("Read File"),
387
388
389
		nano_insert_msg,
		0, NANO_INSERTFILE_FKEY, 0, VIEW, do_insertfile_void);
#else
390
	sc_init_one(&main_list, NANO_INSERTFILE_KEY, _("Read File"),
Chris Allegretta's avatar
Chris Allegretta committed
391
		nano_insert_msg,
392
		0, NANO_INSERTFILE_FKEY, 0, NOVIEW, do_insertfile_void);
393
394
#endif

395
    else
396
	sc_init_one(&main_list, NANO_REPLACE_KEY, _("Replace"),
397
		    nano_replace_msg,
398
		    NANO_ALT_REPLACE_KEY, NANO_REPLACE_FKEY, 0, NOVIEW, do_replace);
Chris Allegretta's avatar
Chris Allegretta committed
399

400
    sc_init_one(&main_list, NANO_WHEREIS_KEY, _("Where Is"),
Chris Allegretta's avatar
Chris Allegretta committed
401
402
403
		nano_whereis_msg,
		0, NANO_WHEREIS_FKEY, 0, VIEW, do_search);

404
    sc_init_one(&main_list, NANO_PREVPAGE_KEY, _("Prev Page"),
Chris Allegretta's avatar
Chris Allegretta committed
405
		nano_prevpage_msg,
406
		0, NANO_PREVPAGE_FKEY, KEY_PPAGE, VIEW, do_page_up);
Chris Allegretta's avatar
Chris Allegretta committed
407

408
    sc_init_one(&main_list, NANO_NEXTPAGE_KEY, _("Next Page"),
Chris Allegretta's avatar
Chris Allegretta committed
409
		nano_nextpage_msg,
410
		0, NANO_NEXTPAGE_FKEY, KEY_NPAGE, VIEW, do_page_down);
Chris Allegretta's avatar
Chris Allegretta committed
411

412
    sc_init_one(&main_list, NANO_CUT_KEY, _("Cut Text"),
Chris Allegretta's avatar
Chris Allegretta committed
413
414
		nano_cut_msg, 0, NANO_CUT_FKEY, 0, NOVIEW, do_cut_text);

415
    if (unjustify)
416
	sc_init_one(&main_list, NANO_UNJUSTIFY_KEY, _("UnJustify"),
417
418
		nano_unjustify_msg, 0, 0, 0, NOVIEW, do_uncut_text);
    else
419
	sc_init_one(&main_list, NANO_UNCUT_KEY, _("UnCut Txt"),
Chris Allegretta's avatar
Chris Allegretta committed
420
421
422
		nano_uncut_msg,
		0, NANO_UNCUT_FKEY, 0, NOVIEW, do_uncut_text);

423
    sc_init_one(&main_list, NANO_CURSORPOS_KEY, _("Cur Pos"),
Chris Allegretta's avatar
Chris Allegretta committed
424
		nano_cursorpos_msg,
425
		0, NANO_CURSORPOS_FKEY, 0, VIEW, do_cursorpos_void);
Chris Allegretta's avatar
Chris Allegretta committed
426

427
    sc_init_one(&main_list, NANO_SPELL_KEY, _("To Spell"),
Chris Allegretta's avatar
Chris Allegretta committed
428
429
430
		nano_spell_msg, 0, NANO_SPELL_FKEY, 0, NOVIEW, do_spell);


431
    sc_init_one(&main_list, NANO_UP_KEY, _("Up"),
Chris Allegretta's avatar
Chris Allegretta committed
432
433
		nano_up_msg, 0, KEY_UP, 0, VIEW, do_up);

434
    sc_init_one(&main_list, NANO_DOWN_KEY, _("Down"),
Chris Allegretta's avatar
Chris Allegretta committed
435
436
		nano_down_msg, 0, KEY_DOWN, 0, VIEW, do_down);

437
    sc_init_one(&main_list, NANO_FORWARD_KEY, _("Forward"),
Chris Allegretta's avatar
Chris Allegretta committed
438
439
		nano_forward_msg, 0, KEY_RIGHT, 0, VIEW, do_right);

440
    sc_init_one(&main_list, NANO_BACK_KEY, _("Back"),
Chris Allegretta's avatar
Chris Allegretta committed
441
442
		nano_back_msg, 0, KEY_LEFT, 0, VIEW, do_left);

443
    sc_init_one(&main_list, NANO_HOME_KEY, _("Home"),
Chris Allegretta's avatar
Chris Allegretta committed
444
445
		nano_home_msg, 0, KEY_HOME, 362, VIEW, do_home);

446
    sc_init_one(&main_list, NANO_END_KEY, _("End"),
Chris Allegretta's avatar
Chris Allegretta committed
447
448
		nano_end_msg, 0, KEY_END, 385, VIEW, do_end);

449
    sc_init_one(&main_list, NANO_REFRESH_KEY, _("Refresh"),
Chris Allegretta's avatar
Chris Allegretta committed
450
451
		nano_refresh_msg, 0, 0, 0, VIEW, total_refresh);

452
    sc_init_one(&main_list, NANO_MARK_KEY, _("Mark Text"),
453
		nano_mark_msg, NANO_ALT_MARK_KEY, 0, 0, NOVIEW, do_mark);
Chris Allegretta's avatar
Chris Allegretta committed
454

455
    sc_init_one(&main_list, NANO_DELETE_KEY, _("Delete"),
456
		nano_delete_msg, 0, KEY_DC,
Chris Allegretta's avatar
Chris Allegretta committed
457
458
		NANO_CONTROL_D, NOVIEW, do_delete);

459
    sc_init_one(&main_list, NANO_BACKSPACE_KEY, _("Backspace"),
Chris Allegretta's avatar
Chris Allegretta committed
460
461
462
		nano_backspace_msg, 0,
		KEY_BACKSPACE, 127, NOVIEW, do_backspace);

463
    sc_init_one(&main_list, NANO_TAB_KEY, _("Tab"),
Chris Allegretta's avatar
Chris Allegretta committed
464
465
		nano_tab_msg, 0, 0, 0, NOVIEW, do_tab);

466
    if (ISSET(PICO_MODE))
467
	sc_init_one(&main_list, NANO_REPLACE_KEY, _("Replace"),
Chris Allegretta's avatar
Chris Allegretta committed
468
		    nano_replace_msg,
469
		    NANO_ALT_REPLACE_KEY, NANO_REPLACE_FKEY, 0, NOVIEW, do_replace);
Chris Allegretta's avatar
Chris Allegretta committed
470
    else
471
	sc_init_one(&main_list, NANO_JUSTIFY_KEY, _("Justify"),
472
		    nano_justify_msg, 0, NANO_JUSTIFY_FKEY, 0,
473
		    NOVIEW, do_justify);
Chris Allegretta's avatar
Chris Allegretta committed
474

475
    sc_init_one(&main_list, NANO_ENTER_KEY, _("Enter"),
Chris Allegretta's avatar
Chris Allegretta committed
476
477
478
		nano_enter_msg,
		0, KEY_ENTER, NANO_CONTROL_M, NOVIEW, do_enter_void);

479
    sc_init_one(&main_list, NANO_GOTO_KEY, _("Goto Line"),
480
		    nano_goto_msg,
481
		    NANO_ALT_GOTO_KEY, NANO_GOTO_FKEY, 0, VIEW, do_gotoline_void);
482

483
#if (!defined NANO_SMALL) && (defined HAVE_REGEX_H)
484
    sc_init_one(&main_list, -9, _("Find Other Bracket"),
485
486
487
		    nano_bracket_msg,
		    NANO_BRACKET_KEY, 0, 0, VIEW, do_find_bracket);
#endif
Chris Allegretta's avatar
Chris Allegretta committed
488

489
490
491
492
493
494
495
496
#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
497

498
499
500
    if (whereis_list != NULL)
	free_shortcutage(&whereis_list);

501
    sc_init_one(&whereis_list, NANO_HELP_KEY,
502
503
		_("Get Help"), nano_help_msg, 0, 0, 0, VIEW, do_help);

504
    sc_init_one(&whereis_list, NANO_CANCEL_KEY,
505
506
		_("Cancel"), nano_cancel_msg, 0, 0, 0, VIEW, 0);

507
    sc_init_one(&whereis_list, NANO_FIRSTLINE_KEY, _("First Line"),
Chris Allegretta's avatar
Chris Allegretta committed
508
509
		nano_firstline_msg, 0, 0, 0, VIEW, do_first_line);

510
    sc_init_one(&whereis_list, NANO_LASTLINE_KEY, _("Last Line"),
Chris Allegretta's avatar
Chris Allegretta committed
511
512
		nano_lastline_msg, 0, 0, 0, VIEW, do_last_line);

513
    sc_init_one(&whereis_list, NANO_OTHERSEARCH_KEY, _("Replace"),
Chris Allegretta's avatar
Chris Allegretta committed
514
515
		nano_replace_msg, 0, 0, 0, VIEW, do_replace);

516
    sc_init_one(&whereis_list, NANO_FROMSEARCHTOGOTO_KEY,
517
518
		_("Goto Line"), nano_goto_msg, 0, 0, 0, VIEW,
		do_gotoline_void);
519

520
#ifndef NANO_SMALL
521
    sc_init_one(&whereis_list, TOGGLE_CASE_KEY, _("Case Sens"),
522
523
		nano_case_msg, 0, 0, 0, VIEW, 0);

524
    sc_init_one(&whereis_list, TOGGLE_BACKWARDS_KEY, _("Direction"),
Chris Allegretta's avatar
Chris Allegretta committed
525
		nano_reverse_msg, 0, 0, 0, VIEW, 0);
Chris Allegretta's avatar
Chris Allegretta committed
526

527
#ifdef HAVE_REGEX_H
528
    sc_init_one(&whereis_list, TOGGLE_REGEXP_KEY,
529
		_("Regexp"), nano_regexp_msg, 0, 0, 0, VIEW, 0);
530
#endif
531
#endif /* !NANO_SMALL */
532

533
534
    if (replace_list != NULL)
	free_shortcutage(&replace_list);
535

536
    sc_init_one(&replace_list, NANO_HELP_KEY,
537
538
		_("Get Help"), nano_help_msg, 0, 0, 0, VIEW, do_help);

539
    sc_init_one(&replace_list, NANO_CANCEL_KEY,
540
		_("Cancel"), nano_cancel_msg, 0, 0, 0, VIEW, 0);
Chris Allegretta's avatar
Chris Allegretta committed
541

542
    sc_init_one(&replace_list, NANO_FIRSTLINE_KEY, _("First Line"),
Chris Allegretta's avatar
Chris Allegretta committed
543
544
		nano_firstline_msg, 0, 0, 0, VIEW, do_first_line);

545
    sc_init_one(&replace_list, NANO_LASTLINE_KEY, _("Last Line"),
Chris Allegretta's avatar
Chris Allegretta committed
546
547
		nano_lastline_msg, 0, 0, 0, VIEW, do_last_line);

548
    sc_init_one(&replace_list, NANO_OTHERSEARCH_KEY, _("No Replace"),
Chris Allegretta's avatar
Chris Allegretta committed
549
550
		nano_whereis_msg, 0, 0, 0, VIEW, do_search);

551
    sc_init_one(&replace_list, NANO_FROMSEARCHTOGOTO_KEY,
552
553
		_("Goto Line"), nano_goto_msg, 0, 0, 0, VIEW,
		do_gotoline_void);
554

555
#ifndef NANO_SMALL
556
    sc_init_one(&replace_list, TOGGLE_CASE_KEY, _("Case Sens"),
557
558
		nano_case_msg, 0, 0, 0, VIEW, 0);

559
    sc_init_one(&replace_list, TOGGLE_BACKWARDS_KEY, _("Direction"),
Chris Allegretta's avatar
Chris Allegretta committed
560
		nano_reverse_msg, 0, 0, 0, VIEW, 0);
561

562
#ifdef HAVE_REGEX_H
563
    sc_init_one(&replace_list, TOGGLE_REGEXP_KEY, 
564
		_("Regexp"), nano_regexp_msg, 0, 0, 0, VIEW, 0);
565
#endif
566
#endif /* !NANO_SMALL */
567

568
569
    if (replace_list_2 != NULL)
	free_shortcutage(&replace_list_2);
570

571
    sc_init_one(&replace_list_2, NANO_HELP_KEY,
572
573
		_("Get Help"), nano_help_msg, 0, 0, 0, VIEW, do_help);

574
    sc_init_one(&replace_list_2, NANO_CANCEL_KEY,
575
		_("Cancel"), nano_cancel_msg, 0, 0, 0, VIEW, 0);
576

577
    sc_init_one(&replace_list_2, NANO_FIRSTLINE_KEY, _("First Line"),
578
579
		nano_firstline_msg, 0, 0, 0, VIEW, do_first_line);

580
    sc_init_one(&replace_list_2, NANO_LASTLINE_KEY, _("Last Line"),
581
582
		nano_lastline_msg, 0, 0, 0, VIEW, do_last_line);

583
584
    if (goto_list != NULL)
	free_shortcutage(&goto_list);
Chris Allegretta's avatar
Chris Allegretta committed
585

586
    sc_init_one(&goto_list, NANO_HELP_KEY,
587
588
		_("Get Help"), nano_help_msg, 0, 0, 0, VIEW, do_help);

589
    sc_init_one(&goto_list, NANO_CANCEL_KEY, _("Cancel"),
590
		nano_cancel_msg, 0, 0, 0, VIEW, 0);
Chris Allegretta's avatar
Chris Allegretta committed
591

592
    sc_init_one(&goto_list, NANO_FIRSTLINE_KEY, _("First Line"),
Chris Allegretta's avatar
Chris Allegretta committed
593
594
		nano_firstline_msg, 0, 0, 0, VIEW, &do_first_line);

595
    sc_init_one(&goto_list, NANO_LASTLINE_KEY, _("Last Line"),
Chris Allegretta's avatar
Chris Allegretta committed
596
597
		nano_lastline_msg, 0, 0, 0, VIEW, &do_last_line);

598
599
    if (help_list != NULL)
	free_shortcutage(&help_list);
Chris Allegretta's avatar
Chris Allegretta committed
600

601
    sc_init_one(&help_list, NANO_PREVPAGE_KEY, _("Prev Page"),
Chris Allegretta's avatar
Chris Allegretta committed
602
		nano_prevpage_msg,
603
		0, NANO_PREVPAGE_FKEY, KEY_PPAGE, VIEW, do_page_up);
Chris Allegretta's avatar
Chris Allegretta committed
604

605
    sc_init_one(&help_list, NANO_NEXTPAGE_KEY, _("Next Page"),
Chris Allegretta's avatar
Chris Allegretta committed
606
		nano_nextpage_msg,
607
		0, NANO_NEXTPAGE_FKEY, KEY_NPAGE, VIEW, do_page_down);
Chris Allegretta's avatar
Chris Allegretta committed
608

609
    sc_init_one(&help_list, NANO_EXIT_KEY, _("Exit"),
Chris Allegretta's avatar
Chris Allegretta committed
610
611
		nano_exit_msg, 0, NANO_EXIT_FKEY, 0, VIEW, do_exit);

612
613
    if (writefile_list != NULL)
	free_shortcutage(&writefile_list);
Chris Allegretta's avatar
Chris Allegretta committed
614

615
    sc_init_one(&writefile_list, NANO_HELP_KEY,
616
617
		_("Get Help"), nano_help_msg, 0, 0, 0, VIEW, do_help);

618
#ifndef DISABLE_BROWSER
619
    sc_init_one(&writefile_list, NANO_TOFILES_KEY, _("To Files"),
Chris Allegretta's avatar
Chris Allegretta committed
620
621
		nano_tofiles_msg, 0, 0, 0, NOVIEW, 0);
#endif
Chris Allegretta's avatar
Chris Allegretta committed
622

623
624
625
626
627
628
629
630
631
632
#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"),
633
634
		nano_append_msg, 0, 0, 0, NOVIEW, 0);

635
636
637
    sc_init_one(&writefile_list, NANO_CANCEL_KEY, 
		_("Cancel"), nano_cancel_msg, 0, 0, 0, VIEW, 0);

638
639
    if (insertfile_list != NULL)
	free_shortcutage(&insertfile_list);
640
641

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

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

647
#ifndef DISABLE_BROWSER
648
    sc_init_one(&insertfile_list, NANO_TOFILES_KEY, _("To Files"),
649
650
		nano_tofiles_msg, 0, 0, 0, NOVIEW, 0);
#endif
651
652
653
654
#ifndef NANO_SMALL
    sc_init_one(&insertfile_list, NANO_EXTCMD_KEY, _("Execute Command"),
		nano_execute_msg, 0, 0, 0, NOVIEW, 0);
#endif
655

Chris Allegretta's avatar
Chris Allegretta committed
656
657
658
    if (spell_list != NULL)
	free_shortcutage(&spell_list);

659
    sc_init_one(&spell_list, NANO_HELP_KEY,
660
		_("Get Help"), nano_help_msg, 0, 0, 0, VIEW, do_help);
661

662
    sc_init_one(&spell_list, NANO_CANCEL_KEY, _("Cancel"),
Chris Allegretta's avatar
Chris Allegretta committed
663
664
		nano_cancel_msg, 0, 0, 0, VIEW, 0);

665
#ifndef NANO_SMALL
Chris Allegretta's avatar
Chris Allegretta committed
666
667
668
    if (extcmd_list != NULL)
	free_shortcutage(&extcmd_list);

669
670
671
672
673
674
    sc_init_one(&extcmd_list, NANO_HELP_KEY,
		_("Get Help"), nano_help_msg, 0, 0, 0, VIEW, do_help);

    sc_init_one(&extcmd_list, NANO_CANCEL_KEY, _("Cancel"),
		nano_cancel_msg, 0, 0, 0, VIEW, 0);
#endif
675

676
#ifndef DISABLE_BROWSER
677
678
679
680

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

681
    sc_init_one(&browser_list, NANO_HELP_KEY,
682
683
		_("Get Help"), nano_help_msg, 0, 0, 0, VIEW, do_help);

684
    sc_init_one(&browser_list, NANO_EXIT_KEY, _("Exit"),
685
686
		nano_exit_msg, 0, NANO_EXIT_FKEY, 0, VIEW, 0);

687
    sc_init_one(&browser_list, NANO_PREVPAGE_KEY, _("Prev Page"),
Chris Allegretta's avatar
Chris Allegretta committed
688
689
690
		nano_prevpage_msg,
		0, NANO_PREVPAGE_FKEY, KEY_PPAGE, VIEW, 0);

691
    sc_init_one(&browser_list, NANO_NEXTPAGE_KEY, _("Next Page"),
Chris Allegretta's avatar
Chris Allegretta committed
692
693
694
		nano_nextpage_msg,
		0, NANO_NEXTPAGE_FKEY, KEY_NPAGE, VIEW, 0);

695
    sc_init_one(&browser_list, NANO_GOTO_KEY, _("Goto"),
696
697
		nano_gotodir_msg, NANO_ALT_GOTO_KEY, NANO_GOTO_FKEY, 0, 
		VIEW, 0);
Rocco Corsi's avatar
   
Rocco Corsi committed
698

699
700
701
    if (gotodir_list != NULL)
	free_shortcutage(&gotodir_list);

702
    sc_init_one(&gotodir_list, NANO_HELP_KEY,
703
		_("Get Help"), nano_help_msg, 0, 0, 0, VIEW, do_help);
Chris Allegretta's avatar
Chris Allegretta committed
704

705
    sc_init_one(&gotodir_list, NANO_CANCEL_KEY, _("Cancel"),
Rocco Corsi's avatar
   
Rocco Corsi committed
706
707
		nano_cancel_msg, 0, 0, 0, VIEW, 0);

Chris Allegretta's avatar
Chris Allegretta committed
708
709
710
#endif


711
712
713
714
#if !defined(DISABLE_BROWSER) || !defined(DISABLE_MOUSE) || !defined (DISABLE_HELP)
    currshortcut = main_list;
#endif

715
    toggle_init();
Chris Allegretta's avatar
Chris Allegretta committed
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

/* 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
762
    openfilestruct * current_open_file;
763
764
#endif

Chris Allegretta's avatar
Chris Allegretta committed
765
#ifndef DISABLE_OPERATINGDIR
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
810
811
812
    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;
813
814
815
816
    if (open_files != NULL) {
	while (open_files->prev != NULL) 
	    open_files = open_files->prev;
	while (open_files->next != NULL) {
817
  /* cleanup of a multi buf . . . */
818
819
820
	    open_files = open_files->next;
	    if (open_files->prev != current_open_file) 
		free_openfilestruct(open_files->prev);
821
822
        }
  /* cleanup of last multi buf . . . */
823
	free_openfilestruct(open_files);
824
    }
825
#else
826
827
828
  /* starting the cleanup of fileage now . . . */

    if (fileage != NULL)
829
830
	free_filestruct(fileage);
#endif
831
832
833
834

    /* that is all for now */

}