global.c 26.2 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
	"", *nano_prepend_msg = ""; 
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_prepend_msg = _("Prepend to the current file");
334
    nano_reverse_msg = _("Search backwards");
335
336
    nano_dos_msg = _("Write file out in DOS format");
    nano_mac_msg = _("Write file out in Mac format");
337
#ifdef HAVE_REGEX_H
338
339
    nano_regexp_msg = _("Use Regular expressions");
    nano_bracket_msg = _("Find other bracket");
340
#endif
341
342
343
#ifdef ENABLE_MULTIBUFFER
    nano_openprev_msg = _("Open previously loaded file");
    nano_opennext_msg = _("Open next loaded file");
Chris Allegretta's avatar
Chris Allegretta committed
344
#endif
345
#endif /* !NANO_SMALL */
Chris Allegretta's avatar
Chris Allegretta committed
346

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

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

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

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

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

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

    if (ISSET(PICO_MODE))
384
385
386

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

636
637
638
639
    sc_init_one(&writefile_list, 
		NANO_PREPEND_KEY, _("Prepend"),
		nano_prepend_msg, 0, 0, 0, NOVIEW, 0);

640
641
642
    sc_init_one(&writefile_list, NANO_CANCEL_KEY, 
		_("Cancel"), nano_cancel_msg, 0, 0, 0, VIEW, 0);

643
644
    if (insertfile_list != NULL)
	free_shortcutage(&insertfile_list);
645
646

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

649
    sc_init_one(&insertfile_list, NANO_CANCEL_KEY, _("Cancel"),
Chris Allegretta's avatar
Chris Allegretta committed
650
651
		nano_cancel_msg, 0, 0, 0, VIEW, 0);

652
#ifndef DISABLE_BROWSER
653
    sc_init_one(&insertfile_list, NANO_TOFILES_KEY, _("To Files"),
654
655
		nano_tofiles_msg, 0, 0, 0, NOVIEW, 0);
#endif
656
657
658
659
#ifndef NANO_SMALL
    sc_init_one(&insertfile_list, NANO_EXTCMD_KEY, _("Execute Command"),
		nano_execute_msg, 0, 0, 0, NOVIEW, 0);
#endif
660

Chris Allegretta's avatar
Chris Allegretta committed
661
662
663
    if (spell_list != NULL)
	free_shortcutage(&spell_list);

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

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

670
#ifndef NANO_SMALL
Chris Allegretta's avatar
Chris Allegretta committed
671
672
673
    if (extcmd_list != NULL)
	free_shortcutage(&extcmd_list);

674
675
676
677
678
679
    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
680

681
#ifndef DISABLE_BROWSER
682
683
684
685

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

686
    sc_init_one(&browser_list, NANO_HELP_KEY,
687
688
		_("Get Help"), nano_help_msg, 0, 0, 0, VIEW, do_help);

689
    sc_init_one(&browser_list, NANO_EXIT_KEY, _("Exit"),
690
691
		nano_exit_msg, 0, NANO_EXIT_FKEY, 0, VIEW, 0);

692
    sc_init_one(&browser_list, NANO_PREVPAGE_KEY, _("Prev Page"),
Chris Allegretta's avatar
Chris Allegretta committed
693
694
695
		nano_prevpage_msg,
		0, NANO_PREVPAGE_FKEY, KEY_PPAGE, VIEW, 0);

696
    sc_init_one(&browser_list, NANO_NEXTPAGE_KEY, _("Next Page"),
Chris Allegretta's avatar
Chris Allegretta committed
697
698
699
		nano_nextpage_msg,
		0, NANO_NEXTPAGE_FKEY, KEY_NPAGE, VIEW, 0);

700
    sc_init_one(&browser_list, NANO_GOTO_KEY, _("Goto"),
701
702
		nano_gotodir_msg, NANO_ALT_GOTO_KEY, NANO_GOTO_FKEY, 0, 
		VIEW, 0);
Rocco Corsi's avatar
   
Rocco Corsi committed
703

704
705
706
    if (gotodir_list != NULL)
	free_shortcutage(&gotodir_list);

707
    sc_init_one(&gotodir_list, NANO_HELP_KEY,
708
		_("Get Help"), nano_help_msg, 0, 0, 0, VIEW, do_help);
Chris Allegretta's avatar
Chris Allegretta committed
709

710
    sc_init_one(&gotodir_list, NANO_CANCEL_KEY, _("Cancel"),
Rocco Corsi's avatar
   
Rocco Corsi committed
711
712
		nano_cancel_msg, 0, 0, 0, VIEW, 0);

Chris Allegretta's avatar
Chris Allegretta committed
713
714
715
#endif


716
717
718
719
#if !defined(DISABLE_BROWSER) || !defined(DISABLE_MOUSE) || !defined (DISABLE_HELP)
    currshortcut = main_list;
#endif

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

/* 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
767
    openfilestruct * current_open_file;
768
769
#endif

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

    if (fileage != NULL)
834
835
	free_filestruct(fileage);
#endif
836
837
838
839

    /* that is all for now */

}