Everything from DB's patch that makes any sense to me

git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1241 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
This commit is contained in:
Chris Allegretta 2002-07-24 01:02:26 +00:00
parent c46337b9c7
commit dffa207320
3 changed files with 122 additions and 162 deletions

105
ChangeLog
View File

@ -90,10 +90,36 @@ CVS Code -
- Fix minor bugs with importing certain text files in Mac
format. (DLR)
- files.c:
append_slash_if_dir(), input_tab()
- Changed variable names: lastWasTab -> lastwastab, matchBuf ->
matchbuf. (DLR)
check_operating_dir()
- Memory leak fix. (David Benbennick)
check_writable_directory()
- Optimizations (David Benbennick).
cwd_tab_completion()
- Changed a variable name: dirName -> dirname. (DLR)
do_browser()
- Optimizations and mouse selection fixes (David Benbennick).
do_writeout()
- Fix problem with formatstr's being defined as NULL when
--enable-tiny is used. Since formatstr isn't ever used in tiny
mode, don't bother even creating the variable. (David
Benbennick and DLR)
do_insertfile()
- Memory leak fix (accidentally dropped 1st time).
(David Benbennick).
get_full_path()
- Memory leak fix. Also, make it properly interpret ~/ notation
so, among other things, the option "--operatingdir ~" works.
(David Benbennick)
- More optimizations (David Benbennick).
new_file()
- Make sure current_x is zero; this fixes a problem where the
current cursor position wasn't reset when reading in a file in
multibuffer mode. (David Benbennick)
- Use make_new_node rather than setting up fileage by hand
(David Benbennick).
read_file(), read_line()
- Rework to properly handle nulls in the input file, fix
detection of binary files to properly mark a file as binary if
@ -108,24 +134,7 @@ CVS Code -
writing a marked selection to a file, save and restore totsize
so it isn't decreased by the size of the selection afterward.
(DLR)
do_writeout()
- Fix problem with formatstr's being defined as NULL when
--enable-tiny is used. Since formatstr isn't ever used in tiny
mode, don't bother even creating the variable. (David
Benbennick and DLR)
do_insertfile()
- Memory leak fix. (David Benbennick)
get_full_path()
- Memory leak fix. Also, make it properly interpret ~/ notation
so, among other things, the option "--operatingdir ~" works.
(David Benbennick)
check_operating_dir()
- Memory leak fix. (David Benbennick)
cwd_tab_completion()
- Changed a variable name: dirName -> dirname. (DLR)
append_slash_if_dir(), input_tab()
- Changed variable names: lastWasTab -> lastwastab, matchBuf ->
matchbuf. (DLR)
- Optimizations (David Benbennick).
- global.c:
free_toggles()
- Only include if we're not using tiny mode. (David Benbennick)
@ -150,39 +159,43 @@ CVS Code -
- nanorc.sample:
- Put in much less crappy example regex rules for c-file.
- nano.c:
clear_filename()
- Remove this function, as it has unneeded functionality, is
short enough to be inlined, and is only called in two spots
anyway. (DLR)
die()
- Rework slightly to remove redundant printing of last message
and print all messages after resetting the terminal. (DLR)
do_backspace()
- Make sure placewewant is set properly, and that the mark is
moved backwards. (David Benbennick)
do_char()
- Fix a problem where, if ENABLE_COLOR wasn't used, typing
characters on a marked line before the beginning of the mark
would make the highlight short by one. (David Benbennick)
die()
- Rework slightly to remove redundant printing of last message
and print all messages after resetting the terminal. (DLR)
global_init()
- Call die_too_small() when fill is 0. (DLR)
usage()
- List the options that are ignored for the purpose of Pico
compatibility, and make some minor consistency fixes. (DLR)
do_cont()
- Handle the case where the window was resized while we were
stopped. (David Benbennick)
do_delete()
- Make sure placewewant is set properly, to match Pico's
behavior. (DLR)
do_int_spell(), do_alt_spell()
- Rework to save the marked selection before doing spell checking
and restore it afterward. (DLR)
do_next_word(), do_prev_word()
- Fix a problem where highlighting isn't done properly after
calling either of these, and another problem where the cursor
would move back too far in certain cases with do_prev_word().
(David Benbennick)
do_backspace()
- Make sure placewewant is set properly, and that the mark is
moved backwards. (David Benbennick)
do_delete()
- Make sure placewewant is set properly, to match Pico's
behavior. (DLR)
clear_filename()
- Remove this function, as it has unneeded functionality, is
short enough to be inlined, and is only called in two spots
anyway. (DLR)
do_int_spell(), do_alt_spell()
- Rework to save the marked selection before doing spell checking
and restore it afterward. (DLR)
do_cont()
- Handle the case where the window was resized while we were
stopped. (David Benbennick)
do_toggle()
- Since the search mode toggles aren't global anymore, we don't
need to explicitly block them here anymore (which will end up
blocking the global backup mode toggle, which is the same as
the backwards search toggle). (DLR)
do_wrap()
- fill fixes and 'two short word wrap' bug (David Benbennick).
global_init()
- Call die_too_small() when fill is 0. (DLR)
handle_sigwinch()
- Make sure we adjust fill when the window is resized. (David
Benbennick)
@ -190,11 +203,6 @@ CVS Code -
help_init()
- Since the return value of snprintf() isn't well defined, use
sprintf() instead. (David Benbennick)
do_toggle()
- Since the search mode toggles aren't global anymore, we don't
need to explicitly block them here anymore (which will end up
blocking the global backup mode toggle, which is the same as
the backwards search toggle). (DLR)
main()
- Rework to blank out filename manually before doing anything
with it, instead of calling clear_filename() in two places.
@ -211,6 +219,9 @@ CVS Code -
can be treated separately from -r/-T string. (DLR)
- Fix so that Esc-Esc-Space is properly treated as Ctrl-Space.
(DLR)
usage()
- List the options that are ignored for the purpose of Pico
compatibility, and make some minor consistency fixes. (DLR)
- nano.h:
- Fix some space/tab formatting for flags (DLR).
- proto.h:

160
files.c
View File

@ -72,16 +72,14 @@ void load_file(int update)
/* What happens when there is no file to open? aiee! */
void new_file(void)
{
fileage = nmalloc(sizeof(filestruct));
fileage = make_new_node(NULL);
fileage->data = charalloc(1);
fileage->data[0] = '\0';
fileage->prev = NULL;
fileage->next = NULL;
fileage->lineno = 1;
filebot = fileage;
edittop = fileage;
editbot = fileage;
current = fileage;
current_x = 0;
totlines = 1;
totsize = 0;
@ -258,7 +256,6 @@ int read_file(FILE *f, const char *filename, int quiet)
/* Did we not get a newline but still have stuff to do? */
if (len > 0) {
#ifndef NANO_SMALL
/* If file conversion isn't disabled, the last character in
this file is a CR and fileformat isn't set yet, make sure
@ -433,18 +430,14 @@ int do_insertfile(int loading_file)
#endif
#ifndef DISABLE_OPERATINGDIR
if (operating_dir && (strcmp(operating_dir, "."))) {
if (operating_dir && strcmp(operating_dir, "."))
i = statusq(1, insertfile_list, "", _("File to insert [from %s] "),
operating_dir);
} else {
#endif
i = statusq(1, insertfile_list, "", _("File to insert [from ./] "));
#ifndef DISABLE_OPERATINGDIR
}
else
#endif
i = statusq(1, insertfile_list, "", _("File to insert [from ./] "));
if (i != -1) {
#ifdef DEBUG
fprintf(stderr, _("filename is %s\n"), answer);
#endif
@ -457,28 +450,27 @@ int do_insertfile(int loading_file)
#ifndef DISABLE_BROWSER
if (i == NANO_TOFILES_KEY) {
char *tmp = do_browse_from(realname);
#if !defined(DISABLE_HELP) || !defined(DISABLE_MOUSE)
currshortcut = insertfile_list;
#endif
#ifdef DISABLE_TABCOMP
realname = NULL;
#endif
if (tmp != NULL)
realname = mallocstrcpy(realname, tmp);
else
if (tmp != NULL) {
free(realname);
realname = tmp;
} else
return do_insertfile(loading_file);
}
#endif
#ifndef DISABLE_OPERATINGDIR
if (operating_dir) {
if (check_operating_dir(realname, 0)) {
statusbar(_("Can't insert file from outside of %s"), operating_dir);
return 0;
}
if (operating_dir && check_operating_dir(realname, 0)) {
statusbar(_("Can't insert file from outside of %s"),
operating_dir);
return 0;
}
#endif
@ -497,10 +489,8 @@ int do_insertfile(int loading_file)
#ifdef ENABLE_MULTIBUFFER
if (loading_file) {
/* update the current entry in the open_files structure */
add_open_file(1);
new_file();
UNSET(MODIFIED);
#ifndef NANO_SMALL
@ -510,14 +500,11 @@ int do_insertfile(int loading_file)
#endif
#ifndef NANO_SMALL
if (i == NANO_EXTCMD_KEY) {
if (i == NANO_EXTCMD_KEY)
i = open_pipe(answer);
}
else
#endif /* NANO_SMALL */
{
i = open_file(realname, 1, loading_file);
}
#ifdef ENABLE_MULTIBUFFER
if (loading_file)
@ -535,7 +522,6 @@ int do_insertfile(int loading_file)
load_file(0);
else
#endif
set_modified();
/* Here we want to rebuild the edit window */
@ -990,11 +976,12 @@ int close_open_file(void)
* yet on disk); it is not done if the relative path doesn't exist (since
* the first call to chdir() will fail then).
*/
char *get_full_path(const char *origpath)
char *get_full_path(char *origpath)
{
char *newpath = NULL, *last_slash, *d_here, *d_there, *d_there_file, tmp;
int path_only, last_slash_index;
struct stat fileinfo;
char *expanded_origpath;
/* first, get the current directory, and tack a slash onto the end of
it, unless it turns out to be "/", in which case leave it alone */
@ -1017,21 +1004,13 @@ char *get_full_path(const char *origpath)
a new file that hasn't been saved to disk yet (i. e. set
path_only to 0); if stat() succeeds, set path_only to 0 if
origpath doesn't refer to a directory, or to 1 if it does */
path_only = stat(origpath, &fileinfo);
if (path_only == -1)
path_only = 0;
else {
if (S_ISDIR(fileinfo.st_mode))
path_only = 1;
else
path_only = 0;
}
path_only = !stat(origpath, &fileinfo) && S_ISDIR(fileinfo.st_mode);
expanded_origpath = real_dir_from_tilde(origpath);
/* save the value of origpath in both d_there and d_there_file */
d_there = charalloc(strlen(origpath) + 1);
d_there_file = charalloc(strlen(origpath) + 1);
strcpy(d_there, origpath);
strcpy(d_there_file, origpath);
d_there = mallocstrcpy(NULL, expanded_origpath);
d_there_file = mallocstrcpy(NULL, expanded_origpath);
free(expanded_origpath);
/* if we have a path but no filename, tack slashes onto the ends
of both d_there and d_there_file, if they don't end in slashes
@ -1051,13 +1030,9 @@ char *get_full_path(const char *origpath)
/* if we didn't find one, copy d_here into d_there; all data is
then set up */
if (!last_slash) {
d_there = nrealloc(d_there, strlen(d_here) + 1);
strcpy(d_there, d_here);
}
if (!last_slash)
d_there = mallocstrcpy(d_there, d_here);
else {
/* otherwise, remove all non-path elements from d_there
(i. e. everything after the last slash) */
last_slash_index = strlen(d_there) - strlen(last_slash);
@ -1075,7 +1050,6 @@ char *get_full_path(const char *origpath)
/* now go to the path specified in d_there */
if (chdir(d_there) != -1) {
/* get the full pathname, and save it back in d_there,
tacking a slash on the end if we have a path but no
filename; if the saving fails, get out */
@ -1138,7 +1112,7 @@ char *get_full_path(const char *origpath)
* get_full_path()). On error, if the path doesn't reference a
* directory, or if the directory isn't writable, it returns NULL.
*/
char *check_writable_directory(const char *path) {
char *check_writable_directory(char *path) {
char *full_path = get_full_path(path);
int writable;
@ -1150,11 +1124,7 @@ char *check_writable_directory(const char *path) {
/* otherwise, stat() the full path to see if it's writable by the
user; set writable to 1 if it is, or 0 if it isn't */
stat(full_path, &fileinfo);
if (fileinfo.st_mode & S_IWUSR)
writable = 1;
else
writable = 0;
writable = !stat(full_path, &fileinfo) && (fileinfo.st_mode & S_IWUSR);
/* if the full path doesn't end in a slash (meaning get_full_path()
found that it isn't a directory) or isn't writable, free full_path
@ -1280,6 +1250,7 @@ int check_operating_dir(char *currpath, int allow_tabcomp)
/* if the operating directory is "/", that's the same as having no
operating directory, so discard it and get out */
if (!strcmp(operating_dir, "/")) {
free(operating_dir);
operating_dir = NULL;
return 0;
}
@ -1294,6 +1265,7 @@ int check_operating_dir(char *currpath, int allow_tabcomp)
/* if get_full_path() failed, discard the operating directory */
if (!full_operating_dir) {
free(operating_dir);
operating_dir = NULL;
return 0;
}
@ -1302,6 +1274,8 @@ int check_operating_dir(char *currpath, int allow_tabcomp)
having no operating directory, so discard it and get out */
if (!strcmp(full_operating_dir, "/")) {
free(full_operating_dir);
full_operating_dir = NULL;
free(operating_dir);
operating_dir = NULL;
return 0;
}
@ -2567,42 +2541,41 @@ char *do_browser(char *inpath)
col = 0;
/* Compute line number we're on now, so we don't divide by zero later */
if (width == 0)
lineno = selected;
else
lineno = selected / width;
lineno = selected;
if (width != 0)
lineno /= width;
switch (kbinput) {
#ifndef DISABLE_MOUSE
#ifdef NCURSES_MOUSE_VERSION
case KEY_MOUSE:
case KEY_MOUSE:
if (getmouse(&mevent) == ERR)
return retval;
return retval;
/* If they clicked in the edit window, they probably clicked
on a file */
if (wenclose(edit, mevent.y, mevent.x)) {
if (wenclose(edit, mevent.y, mevent.x)) {
int selectedbackup = selected;
mevent.y -= 2;
/* If we're on line 0, don't toy with finding out what
page we're on */
if (lineno / editwinrows == 0)
selected = mevent.y * width + mevent.x / longest;
else
selected = (lineno / editwinrows) * editwinrows * width
+ mevent.y * width + mevent.x / longest;
/* Longest is the width of each column. There are two
* spaces between each column. */
selected = (lineno / editwinrows) * editwinrows * width
+ mevent.y * width + mevent.x / (longest + 2);
/* If they clicked beyond the end of a row, select the
* end of that row. */
if (mevent.x > width * (longest + 2))
selected--;
/* If we're off the screen, reset to the last item.
If we clicked where we did last time, select this name! */
if (selected > numents - 1)
selected = numents - 1;
else if (selectedbackup == selected) {
else if (selectedbackup == selected)
ungetch('s'); /* Unget the 'select' key */
break;
}
} else /* Must be clicking a shortcut */
do_mouse();
@ -2639,16 +2612,7 @@ char *do_browser(char *inpath)
case NANO_PREVPAGE_FKEY:
case KEY_PPAGE:
case '-':
if (lineno % editwinrows == 0) {
if (selected - (editwinrows * width) >= 0)
selected -= editwinrows * width;
else
selected = 0;
}
else if (selected - (editwinrows +
lineno % editwinrows) * width >= 0)
if (selected >= (editwinrows + lineno % editwinrows) * width)
selected -= (editwinrows + lineno % editwinrows) * width;
else
selected = 0;
@ -2657,16 +2621,8 @@ char *do_browser(char *inpath)
case NANO_NEXTPAGE_FKEY:
case KEY_NPAGE:
case ' ':
if (lineno % editwinrows == 0) {
if (selected + (editwinrows * width) <= numents - 1)
selected += editwinrows * width;
else
selected = numents - 1;
}
else if (selected + (editwinrows -
lineno % editwinrows) * width <= numents - 1)
selected += (editwinrows - lineno % editwinrows) * width;
else
selected += (editwinrows - lineno % editwinrows) * width;
if (selected >= numents)
selected = numents - 1;
break;
case NANO_HELP_KEY:
@ -2677,7 +2633,6 @@ char *do_browser(char *inpath)
case NANO_ENTER_KEY:
case 's': /* More Pico compatibility */
case 'S':
/* You can't cd up from / */
if (!strcmp(filelist[selected], "/..") && !strcmp(path, "/")) {
statusbar(_("Can't move up a directory"));
@ -2767,9 +2722,8 @@ char *do_browser(char *inpath)
}
if (answer[0] != '/') {
char *saveanswer = NULL;
char *saveanswer = mallocstrcpy(NULL, answer);
saveanswer = mallocstrcpy(saveanswer, answer);
answer = nrealloc(answer, strlen(path) + strlen(saveanswer) + 2);
sprintf(answer, "%s/%s", path, saveanswer);
free(saveanswer);
@ -2793,8 +2747,8 @@ char *do_browser(char *inpath)
case 'E':
case NANO_CANCEL_KEY:
case NANO_EXIT_FKEY:
abort = 1;
break;
abort = 1;
break;
}
if (abort)
break;
@ -2846,13 +2800,11 @@ char *do_browser(char *inpath)
}
/* Hilight the currently selected file/dir */
if (j == selected) {
if (j == selected)
wattron(edit, A_REVERSE);
}
waddnstr(edit, foo, strlen(foo));
if (j == selected) {
waddstr(edit, foo);
if (j == selected)
wattroff(edit, A_REVERSE);
}
/* And add some space between the cols */
waddstr(edit, " ");
@ -2860,7 +2812,7 @@ char *do_browser(char *inpath)
/* And if the next entry isn't going to fit on the
line, move to the next one */
if (col > (COLS - longest)) {
if (col > COLS - longest) {
editline++;
wmove(edit, editline, 0);
col = 0;

19
nano.c
View File

@ -212,7 +212,7 @@ static void global_init(int save_cutbuffer)
#ifndef DISABLE_WRAPJUSTIFY
fill = wrap_at;
if (fill < 0)
if (fill <= 0)
fill += COLS;
if (fill < MIN_FILL_LENGTH)
die_too_small();
@ -573,7 +573,7 @@ void do_char(char ch)
do_right();
#ifndef DISABLE_WRAPPING
if (!ISSET(NO_WRAP) && (ch != '\t'))
if (!ISSET(NO_WRAP) && ch != '\t')
refresh = do_wrap(current);
#endif
@ -841,7 +841,7 @@ int do_wrap(filestruct *inptr)
wrap_loc = i;
}
}
if (wrap_loc < 0 || wrap_loc == (len - 1))
if (wrap_loc < 0 || wrap_loc == len - 1 || i == len)
return 0;
/* Step 2, making the new wrap line. It will consist of indentation +
@ -959,11 +959,7 @@ int do_wrap(filestruct *inptr)
* right. */
if (mark_beginbuf == inptr && mark_beginx > wrap_loc) {
mark_beginbuf = inptr->next;
mark_beginx -=
#ifndef NANO_SMALL
-indent_len +
#endif
wrap_loc + 1;
mark_beginx -= wrap_loc - indent_len + 1;
} else if (wrapping && mark_beginbuf == inptr->next)
mark_beginx += after_break_len;
#endif /* !NANO_SMALL */
@ -1780,7 +1776,7 @@ void handle_sigwinch(int s)
#ifndef DISABLE_WRAPJUSTIFY
fill = wrap_at;
if (fill < 0)
if (fill <= 0)
fill += COLS;
if (fill < MIN_FILL_LENGTH)
die_too_small();
@ -1929,7 +1925,8 @@ int do_tab(void)
return 1;
}
#if !defined(DISABLE_WRAPJUSTIFY) && !defined(NANO_SMALL)
#if !defined(DISABLE_WRAPPING) && !defined(NANO_SMALL) || \
!defined(DISABLE_JUSTIFY)
/* The "indentation" of a line is the white-space between the quote part
* and the non-white-space of the line. */
size_t indent_length(const char *line) {
@ -1942,7 +1939,7 @@ size_t indent_length(const char *line) {
}
return len;
}
#endif /* !DISABLE_WRAPJUSTIFY && !NANO_SMALL */
#endif /* !DISABLE_WRAPPING && !NANO_SMALL || !DISABLE_JUSTIFY */
#ifndef DISABLE_JUSTIFY
/* justify_format() replaces Tab by Space and multiple spaces by 1 (except