]> git.wh0rd.org Git - nano.git/commitdiff
Everything from DB's patch that makes any sense to me
authorChris Allegretta <chrisa@asty.org>
Wed, 24 Jul 2002 01:02:26 +0000 (01:02 +0000)
committerChris Allegretta <chrisa@asty.org>
Wed, 24 Jul 2002 01:02:26 +0000 (01:02 +0000)
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1241 35c25a1d-7b9e-4130-9fde-d3aeb78583b8

ChangeLog
files.c
nano.c

index e751b22fa395f4abc462b74c4298575e20f0c719..3ccf913c17223f58a5febe00cb7c1aca33e674a3 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -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:
-  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)
+  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)
-  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_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_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)
+  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)
-  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_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_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:
diff --git a/files.c b/files.c
index cf4769760ff7b2eb2644f47b4d2177cbe1f53424..4784ab2bca168483232652cc8a1a327b80d4e658 100644 (file)
--- a/files.c
+++ b/files.c
@@ -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;
diff --git a/nano.c b/nano.c
index 41690aa40418d4db4a739cc9493f2d0e747cd614..c852e065d2f696e34850150f938dd3b7e0875e39 100644 (file)
--- a/nano.c
+++ b/nano.c
@@ -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