]> git.wh0rd.org Git - nano.git/commitdiff
DLR: latest patch
authorDavid Lawrence Ramsey <pooka109@gmail.com>
Thu, 13 Jun 2002 00:40:19 +0000 (00:40 +0000)
committerDavid Lawrence Ramsey <pooka109@gmail.com>
Thu, 13 Jun 2002 00:40:19 +0000 (00:40 +0000)
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1221 35c25a1d-7b9e-4130-9fde-d3aeb78583b8

18 files changed:
ChangeLog
TODO
acconfig.h
color.c
cut.c
faq.html
files.c
global.c
move.c
nano.1
nano.1.html
nano.c
nanorc.sample
proto.h
rcfile.c
search.c
utils.c
winio.c

index 6e4828ccca0caf7092a04991db9c71ae8b6f2e0f..7ba928b6296c529dd0fd83f6e1ef73149016bdab 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -3,11 +3,88 @@ CVS Code -
        - Translation updates (see po/ChangeLog for details).
        - Upgraded to gettext 0.11.2 (Jordi).
          Removed intl/ entirely, and a few more tweaks by gettextize.
+       - i18nized a few strings used in DEBUG mode. (DLR)
+       - Some chars being assigned 0 are now assigned '\0'. (DLR)
+       - Put header files in a more consistent order. (DLR)
+       - Remove some unneeded blank lines and spaces, and make some
+         spacing more consistent. (DLR)
+       - When possible, use iscntrl() to determine whether a character
+         is a control character or not. (DLR)
+       - Miscellaneous typo fixes. (DLR)
+- files.c:
+  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
+         the only binary characters it contains are ASCII 127's, and
+         after reading the last line of a file that doesn't end in a
+         newline, increment totsize.  Remove previous kludge to set
+         totsize properly. (DLR)
+  write_file():
+       - Rework to properly handle nulls in the input file.  When
+         appending/prepending, don't change the current file's name to
+         the name of the file it's being appended/prepended to.  When
+         writing a marked selection to a file, save and restore totsize
+         so it isn't decreased by the size of the selection afterward.
+         (DLR)
+  append_slash_if_dir(), input_tab():
+       - Changed a variable name: lastWasTab -> lastwastab. (DLR)
 - global.c:
   shortcut_init()
        - Rework IFHELP macro (David Benbennick).
+- move.c:
+  page_down(), page_up():
+       - Put sanity checks for current_x back in, to avoid rare
+         segfaults (oops). Now, however, they are only called when
+         placewewant is zero instead of being called unconditionally;
+         see changes to winio.c:actual_x_from_start() below. (DLR)
 - 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)
+  do_int_spell(), do_alt_spell():
+       - Rework to save the marked selection before doing spell checking
+         and restore it afterward. (DLR)
+  main():
+       - Rework to blank out filename manually before doing anything
+         with it, instead of calling clear_filename() in two places.
+         Make startline an int instead of a long, since it's supposed to
+         hold a line number. (DLR)
+- search.c:
+  findnextstr():
+       - Update the current line at current_x if we don't find a match.
+         (DLR)
+  do_gotopos():
+       - Simplify the sanity check to only put x within the range of the
+         current line; don't call actual_x() anymore. (DLR)
+- utils.c:
+       - Add sunder() and unsunder().  These functions convert nulls
+         other than the terminating null in strings to newlines and
+         back; they're used to handle null characters in files properly.
+         (DLR)
+- winio.c:
+  actual_x_from_start():
+       - Overhaul to make cursor placement more like that of Pico: add
+         sanity check for i, and then place i as close to the value of
+         xplus column as possible.  This change is most noticeable when
+         moving down through binary files. (DLR)
+  nanogetstr():
+       - After the user presses Enter at the prompt, refresh the edit
+         window in case there's a list of possible filename matches
+         (left over from attempted tab completion) on it. (DLR)
+  update_line():
+       - When marking control characters, make sure the mark moves
+         forward by two characters inctead of one.  Rework control
+         character display routine to display newlines within the line
+         (which should never occur under normal circumstances; they will
+         only be there if the line had nulls in it and was unsunder()ed
+         beforehand) as ^@'s. (DLR)
+  do_help():
+       - Add support for the handled keyboard escape sequences in the
+         help menu, as they are needed with some terminals (e.g. xterm
+         with TERM=ansi). (DLR)
 - THANKS:
        - Completed a bit (Jordi).
 GNU nano 1.1.9 - 05/12/2002
@@ -88,7 +165,7 @@ GNU nano 1.1.9 - 05/12/2002
          (David Lawrence Ramsey).
 - winio.c:
   edit_add()
-       - Changed some syntax hilight computations for the sake of COLS.
+       - Changed some syntax highlight computations for the sake of COLS.
        - Add in the necessary regfree() calls to stop nano from leaking
          memory like a sieve when using color syntax highlighting :-)
   botombars(), onekey()
diff --git a/TODO b/TODO
index a05cf5cb00f808fdb9c5097d3acacec36a9c86de..204be3987856ce359b114368a1c3370dbfd3fb73 100644 (file)
--- a/TODO
+++ b/TODO
@@ -19,7 +19,6 @@ For version 1.4:
 - UTF-8 support.
 - Undo/Redo key?
 
-
 Old requests:
 
 For version 1.0:
index 32dba2f37b18945d109c0a4e0ec09c3964f6e69d..ee7cc78d2b81b1edb194633c77e1b67c86a78b88 100644 (file)
@@ -66,7 +66,7 @@
 /* Define this if your curses library has the use_default_colors command */
 #undef HAVE_USE_DEFAULT_COLORS
 
-/* Define this to have syntax hilighting, requires ENABLE_NANORC too! */
+/* Define this to have syntax highlighting, requires ENABLE_NANORC too! */
 #undef ENABLE_COLOR
 
 /* Define this to enable undoing....something */
diff --git a/color.c b/color.c
index 6edcb5570f0c88e8abc4e4386d5cc2a6a3929811..7471f491fcf3269d877fd633ccbde90dff41bb1a 100644 (file)
--- a/color.c
+++ b/color.c
@@ -43,7 +43,7 @@
 void color_on(WINDOW *win, int whatever)
 {
     /* Temporary fallback, if the color value hasn't been set, 
-       turn on hilighting */
+       turn on highlighting */
     if (!colors[whatever - FIRST_COLORNUM].set) {
        wattron(win, A_REVERSE);
        return;
@@ -78,7 +78,6 @@ void color_off(WINDOW *win, int whatever)
         wattroff(win, A_BOLD);
 }
 
-
 void colorinit_one(int colortoset, short fg, short bg, int bold)
 {
     colors[colortoset - FIRST_COLORNUM].fg = fg;
@@ -135,7 +134,7 @@ int do_colorinit(void)
                init_pair(i, tmpcolor->fg, tmpcolor->bg);
 
 #ifdef DEBUG
-           fprintf(stderr, "Running init_pair with fg = %d and bg = %d\n", tmpcolor->fg, tmpcolor->bg);
+           fprintf(stderr, _("Running init_pair with fg = %d and bg = %d\n"), tmpcolor->fg, tmpcolor->bg);
 #endif
 
            tmpcolor->pairnum = i;
@@ -209,4 +208,3 @@ void update_color(void)
 }
 
 #endif /* ENABLE_COLOR */
-
diff --git a/cut.c b/cut.c
index 2250776e6f105acb20efd8573900928274684d7a..a8161a05329db7bbe177ffd6feec98be84e5da51 100644 (file)
--- a/cut.c
+++ b/cut.c
@@ -94,7 +94,7 @@ void cut_marked_segment(filestruct * top, int top_x, filestruct * bot,
            current_x = top_x;
            update_cursor();
        }
-       tmpstr[newsize - 1] = 0;
+       tmpstr[newsize - 1] = '\0';
        tmp->data = tmpstr;
        add_to_cutbuffer(tmp);
        dump_buffer(cutbuffer);
@@ -233,7 +233,7 @@ int do_cut_text(void)
                junk = NULL;
                junk = make_new_node(current);
                junk->data = charalloc(1);
-               junk->data[0] = 0;
+               junk->data[0] = '\0';
 
                add_to_cutbuffer(junk);
                dump_buffer(cutbuffer);
index 1732376ef51c5dbb7adcb772438e688e9be6b7ce..8767c28011c46c88e002f143fb87eb4e0862d4c2 100644 (file)
--- a/faq.html
+++ b/faq.html
@@ -342,7 +342,7 @@ install</b>.</font></blockquote>
 'gettext' and/or 'gettextdomain'.&nbsp; What can I do about it?</font></h2>
 
 <blockquote><font color="#330000">Try doing a <b>./configure --with-included-gettext</b>
-and see if that solves your problem.&nbsp; You make need to do a <b>make
+and see if that solves your problem.&nbsp; You may need to do a <b>make
 clean ; make</b> to get it to work fully.</font></blockquote>
 
 <h2>
@@ -694,6 +694,7 @@ and you should know the answer.</font></blockquote>
 <a NAME="8"></a><font color="#330000">8. ChangeLog</font>
 </h2>
 
+<blockquote>2002/05/15 - Typo fix (DLR).</blockquote>
 <blockquote>2001/12/26 - Misc. fixes (Aaron S. Hawley, DLR).</blockquote>
 <blockquote>2001/10/02 - Update for Free Translation Project.</blockquote>
 <blockquote>2001/10/02 - Assorted fixes, Debian additions.</blockquote>
diff --git a/files.c b/files.c
index d9599b04043d77dd363a896bb01bb5d6a522cf99..3ec476d85bfdfe3ecc537cd84904670e97351a2d 100644 (file)
--- a/files.c
+++ b/files.c
@@ -33,7 +33,6 @@
 #include <ctype.h>
 #include <dirent.h>
 #include <pwd.h>
-
 #include "proto.h"
 #include "nano.h"
 
@@ -108,11 +107,15 @@ void new_file(void)
 
 }
 
-filestruct *read_line(char *buf, filestruct *prev, int *line1ins)
+filestruct *read_line(char *buf, filestruct *prev, int *line1ins, int len)
 {
     filestruct *fileptr;
 
     fileptr = nmalloc(sizeof(filestruct));
+
+    /* nulls to newlines; len is the string's real length here */
+    unsunder(buf, len);
+
     fileptr->data = charalloc(strlen(buf) + 2);
     strcpy(fileptr->data, buf);
 
@@ -120,7 +123,7 @@ filestruct *read_line(char *buf, filestruct *prev, int *line1ins)
     /* If it's a DOS file (CRLF), and file conversion isn't disabled,
        strip out the CR part */
     if (!ISSET(NO_CONVERT) && buf[strlen(buf) - 1] == '\r') {
-       fileptr->data[strlen(buf) - 1] = 0;
+       fileptr->data[strlen(buf) - 1] = '\0';
        totsize--;
 
        if (!fileformat)
@@ -158,8 +161,8 @@ filestruct *read_line(char *buf, filestruct *prev, int *line1ins)
 
 int read_file(FILE *f, const char *filename, int quiet)
 {
-    int num_lines = 0;
-    signed char input;         /* current input character */
+    int num_lines = 0, len = 0;
+    char input;                /* current input character */
     char *buf;
     long i = 0, bufx = 128;
     filestruct *fileptr = current, *tmp = NULL;
@@ -181,28 +184,51 @@ int read_file(FILE *f, const char *filename, int quiet)
     while ((input_int = getc(f)) != EOF) {
         input = (char) input_int;
 #ifndef NANO_SMALL
-       if (!ISSET(NO_CONVERT) && input >= 0 && input <= 31
-               && input != 127 && input != '\t' && input != '\r'
-               && input != '\n')
-       /* If the file has binary chars in it, don't stupidly
-          assume it's a DOS or Mac formatted file! */
-       SET(NO_CONVERT);
+       if (!ISSET(NO_CONVERT) && iscntrl((int) input) && input != '\t'
+               && input != '\r' && input != '\n') {
+           /* If the file has binary chars in it, don't stupidly
+              assume it's a DOS or Mac formatted file! */
+           SET(NO_CONVERT);
+       }
 #endif
 
+       /* calculate the total length of the line; it might have nulls in
+          it, so we can't just use strlen() */
+       len++;
+
        if (input == '\n') {
-           fileptr = read_line(buf, fileptr, &line1ins);
+
+           /* don't count the newline in the line length */
+           len--;
+
+           /* read in the line properly */
+           fileptr = read_line(buf, fileptr, &line1ins, len);
+
+           /* reset the line length, in preparation for the next line */
+           len = 0;
+
            num_lines++;
-           buf[0] = 0;
+           buf[0] = '\0';
            i = 0;
 #ifndef NANO_SMALL
        /* If it's a Mac file (no LF just a CR), and file conversion
           isn't disabled, handle it! */
-       } else if (!ISSET(NO_CONVERT) && i > 0 && buf[i-1] == '\r') {
+       } else if (!ISSET(NO_CONVERT) && i > 0 && buf[i - 1] == '\r') {
            fileformat = 2;
-           fileptr = read_line(buf, fileptr, &line1ins);
+
+           /* don't count the newline in the line length */
+           len--;
+
+           /* read in the line properly */
+           fileptr = read_line(buf, fileptr, &line1ins, len);
+
+           /* reset the line length, in preparation for the next line */
+           len = 0;
+
            num_lines++;
+           totsize++;
            buf[0] = input;
-           buf[1] = 0;
+           buf[1] = '\0';
            i = 1;
 #endif
        } else {
@@ -216,7 +242,7 @@ int read_file(FILE *f, const char *filename, int quiet)
                bufx += 128;
            }
            buf[i] = input;
-           buf[i + 1] = 0;
+           buf[i + 1] = '\0';
            i++;
        }
        totsize++;
@@ -229,10 +255,14 @@ int read_file(FILE *f, const char *filename, int quiet)
     }
 
     /* Did we not get a newline but still have stuff to do? */
-    if (buf[0]) {
-       fileptr = read_line(buf, fileptr, &line1ins);
+    if (len > 0) {
+
+       /* read in the LAST line properly */
+       fileptr = read_line(buf, fileptr, &line1ins, len);
+
        num_lines++;
-       buf[0] = 0;
+       totsize++;
+       buf[0] = '\0';
     }
 
     /* Did we even GET a file if we don't already have one? */
@@ -450,13 +480,6 @@ int do_insertfile(int loading_file)
        }
 #endif
 
-       /* Here is a kludge.  If the current file is blank (including
-        * after new_file()), then totlines==1 and totsize==0.  Thus
-        * after open_pipe() or open_file() below, the totsize is short
-        * by one. */
-       if (totlines==1 && totsize==0)
-           totsize++;
-
 #ifndef NANO_SMALL
        if (i == NANO_EXTCMD_KEY) {
            i = open_pipe(answer);
@@ -1212,7 +1235,7 @@ int check_operating_dir(char *currpath, int allow_tabcomp)
  * append == 2 means we are prepending instead of overwriting.
  *
  * nonamechange means don't change the current filename, it is ignored
- * if tmp == 1.
+ * if tmp == 1 or if we're appending/prepending.
  */
 int write_file(char *name, int tmp, int append, int nonamechange)
 {
@@ -1312,7 +1335,7 @@ int write_file(char *name, int tmp, int append, int nonamechange)
 
     dump_buffer(fileage);
 
-    f = fdopen(fd, append==1 ? "ab" : "wb");
+    f = fdopen(fd, append == 1 ? "ab" : "wb");
     if (!f) {
         statusbar(_("Could not open file for writing: %s"),
                   strerror(errno));
@@ -1326,7 +1349,15 @@ int write_file(char *name, int tmp, int append, int nonamechange)
            break;
 
        data_len = strlen(fileptr->data);
+
+       /* newlines to nulls, just before we write to disk */
+       sunder(fileptr->data);
+
        size = fwrite(fileptr->data, 1, data_len, f);
+
+       /* nulls to newlines; data_len is the string's real length here */
+       unsunder(fileptr->data, data_len);
+
        if (size < data_len) {
            statusbar(_("Could not open file for writing: %s"),
                      strerror(errno));
@@ -1354,7 +1385,15 @@ int write_file(char *name, int tmp, int append, int nonamechange)
        int data_len;
 
        data_len = strlen(fileptr->data);
+
+       /* newlines to nulls, just before we write to disk */
+       sunder(fileptr->data);
+
        size = fwrite(fileptr->data, 1, data_len, f);
+
+       /* nulls to newlines; data_len is the string's real length here */
+       unsunder(fileptr->data, data_len);
+
        if (size < data_len) {
            statusbar(_("Could not open file for writing: %s"),
                      strerror(errno));
@@ -1486,7 +1525,7 @@ int write_file(char *name, int tmp, int append, int nonamechange)
        statusbar(_("Could not set permissions %o on %s: %s"),
                  mask, realname, strerror(errno));
 
-    if (!tmp) {
+    if (!tmp && !append) {
        if (!nonamechange)
            filename = mallocstrcpy(filename, realname);
 
@@ -1589,9 +1628,9 @@ int do_writeout(char *path, int exiting, int append)
            TOGGLE(MAC_FILE);
            return(do_writeout(answer, exiting, append));
        } else if (i == NANO_PREPEND_KEY)
-           return(do_writeout(answer, exiting, append==2 ? 0 : 2));
+           return(do_writeout(answer, exiting, append == 2 ? 0 : 2));
        else if (i == NANO_APPEND_KEY)
-           return(do_writeout(answer, exiting, append==1 ? 0 : 1));
+           return(do_writeout(answer, exiting, append == 1 ? 0 : 1));
 
 #ifdef DEBUG
            fprintf(stderr, _("filename is %s"), answer);
@@ -1622,6 +1661,7 @@ int do_writeout(char *path, int exiting, int append)
            filestruct *fileagebak = fileage;   
            filestruct *filebotbak = filebot;
            filestruct *cutback = cutbuffer;
+           long totsizebak = totsize;
            int oldmod = 0;
            cutbuffer = NULL;
 
@@ -1648,6 +1688,7 @@ int do_writeout(char *path, int exiting, int append)
            fileage = fileagebak;
            filebot = filebotbak;
            cutbuffer = cutback;
+           totsize = totsizebak;
            if (oldmod)
                set_modified();
        } else
@@ -1708,7 +1749,7 @@ char *real_dir_from_tilde(char *buf)
                ;
 
            find_user = mallocstrcpy(find_user, &buf[1]);
-           find_user[i - 1] = 0;
+           find_user[i - 1] = '\0';
 
            for (userdata = getpwent(); userdata != NULL && 
                  strcmp(userdata->pw_name, find_user); 
@@ -1732,7 +1773,7 @@ char *real_dir_from_tilde(char *buf)
 }
 
 /* Tack a slash onto the string we're completing if it's a directory */
-int append_slash_if_dir(char *buf, int *lastWasTab, int *place)
+int append_slash_if_dir(char *buf, int *lastwastab, int *place)
 {
     char *dirptr;
     struct stat fileinfo;
@@ -1746,7 +1787,7 @@ int append_slash_if_dir(char *buf, int *lastWasTab, int *place)
        strncat(buf, "/", 1);
        *place += 1;
        /* now we start over again with # of tabs so far */
-       *lastWasTab = 0;
+       *lastwastab = 0;
        ret = 1;
     }
 
@@ -1844,7 +1885,7 @@ char **cwd_tab_completion(char *buf, int *num_matches)
        tmp++;
 
        strncpy(dirName, buf, tmp - buf + 1);
-       dirName[tmp - buf] = 0;
+       dirName[tmp - buf] = '\0';
 
     } else {
 
@@ -1933,7 +1974,7 @@ char **cwd_tab_completion(char *buf, int *num_matches)
 /* This function now has an arg which refers to how much the 
  * statusbar (place) should be advanced, i.e. the new cursor pos.
  */
-char *input_tab(char *buf, int place, int *lastWasTab, int *newplace, int *list)
+char *input_tab(char *buf, int place, int *lastwastab, int *newplace, int *list)
 {
     /* Do TAB completion */
     static int num_matches = 0, match_matches = 0;
@@ -1944,10 +1985,10 @@ char *input_tab(char *buf, int place, int *lastWasTab, int *newplace, int *list)
 
     *list = 0;
 
-    if (*lastWasTab == FALSE) {
+    if (*lastwastab == FALSE) {
        char *tmp, *copyto, *matchBuf;
 
-       *lastWasTab = 1;
+       *lastwastab = 1;
 
        /* Make a local copy of the string -- up to the position of the
           cursor */
@@ -2006,7 +2047,7 @@ char *input_tab(char *buf, int place, int *lastWasTab, int *newplace, int *list)
                tmp = buf;
 
            if (!strcmp(tmp, matches[0]))
-               is_dir = append_slash_if_dir(buf, lastWasTab, newplace);
+               is_dir = append_slash_if_dir(buf, lastwastab, newplace);
 
            if (is_dir)
                break;
@@ -2028,7 +2069,7 @@ char *input_tab(char *buf, int place, int *lastWasTab, int *newplace, int *list)
                *newplace = 0;
 
            /* Is it a directory? */
-           append_slash_if_dir(buf, lastWasTab, newplace);
+           append_slash_if_dir(buf, lastwastab, newplace);
 
            break;
        default:
index 779eb336771e745a282b8ed5a3d8f25da30648b6..1a4157e5d1ccdc47e1122acb46d65a88a7d90120 100644 (file)
--- a/global.c
+++ b/global.c
@@ -23,8 +23,8 @@
 
 #include <assert.h>
 #include <sys/stat.h>
-#include "nano.h"
 #include "proto.h"
+#include "nano.h"
 
 #ifdef ENABLE_NLS
 #include <libintl.h>
@@ -38,7 +38,7 @@
  */
 
 int flags = 0;                 /* Our new flag containing many options */
-WINDOW *edit;                  /* The file portion of the editor  */
+WINDOW *edit;                  /* The file portion of the editor */
 WINDOW *topwin;                        /* Top line of screen */
 WINDOW *bottomwin;             /* Bottom buffer */
 char *filename = NULL;         /* Name of the file */
diff --git a/move.c b/move.c
index 73a2691b280f4bf74e5cd0c460778bd2f737a368..78766953331704040774db04049ad54231dc7d16 100644 (file)
--- a/move.c
+++ b/move.c
@@ -112,9 +112,10 @@ int do_down(void)
 {
     wrap_reset();
     if (current->next != NULL) {
-       update_line(current->prev, 0);
        if (placewewant > 0)
            current_x = actual_x(current->next, placewewant);
+       else if (current_x > strlen(current->next->data))
+           current_x = strlen(current->next->data);
     } else {
        UNSET(KEEP_CUTBUFFER);
        check_statblank();
@@ -155,12 +156,11 @@ void page_up(void)
        current_y = 0;
 
     update_cursor();
-
 }
 
 int do_page_up(void)
 {
-   int i;
+    int i;
 
     wrap_reset();
     current_x = 0;
@@ -182,13 +182,14 @@ int do_page_up(void)
     return 1;
 }
 
-
 int do_up(void)
 {
     wrap_reset();
     if (current->prev != NULL) {
        if (placewewant > 0)
            current_x = actual_x(current->prev, placewewant);
+       else if (current_x > strlen(current->prev->data))
+           current_x = strlen(current->prev->data);
     }
     if (current_y > 0)
        current_y--;
diff --git a/nano.1 b/nano.1
index 618fc38a551a31b7e373352dea3fa7d6f4685140..79f01933d8280e67ea1878a75024fa8019b2c9a4 100644 (file)
--- a/nano.1
+++ b/nano.1
@@ -66,7 +66,7 @@ Set the size (width) of a tab.
 Show the current version number and author.
 .TP
 .B \-Y (\-\-syntax=[str])
-Specify a specific syntax hilighting from the .nanorc to use (if available).
+Specify a specific syntax highlighting from the .nanorc to use (if available).
 .TP
 .B \-c (\-\-const)
 Constantly show the cursor position.
index 0cf2be418a64d591deef2ee7f42d7319dac85e1b..2d15d6496a52c6a333eaaca97a404fbc6d1eecbe 100644 (file)
@@ -91,7 +91,7 @@ Show the current version number and author.
 <DT><B>-Y (--syntax=[str])</B>
 
 <DD>
-Specify a specific syntax hilighting from the .nanorc to use (if available).
+Specify a specific syntax highlighting from the .nanorc to use (if available).
 <DT><B>-c (--const)</B>
 
 <DD>
diff --git a/nano.c b/nano.c
index 7b915d34ff6a52cd6655e011fe57ccbae3bf3508..5a2d18bf9cebdc6745186cceecbdf33552076c60 100644 (file)
--- a/nano.c
+++ b/nano.c
@@ -39,7 +39,6 @@
 #include <locale.h>
 #include <limits.h>
 #include <assert.h>
-
 #include "proto.h"
 #include "nano.h"
 
@@ -213,14 +212,6 @@ void print_view_warning(void)
     statusbar(_("Key illegal in VIEW mode"));
 }
 
-void clear_filename(void)
-{
-    if (filename != NULL)
-       free(filename);
-    filename = charalloc(1);
-    filename[0] = 0;
-}
-
 /* Initialize global variables - no better way for now.  If
    save_cutbuffer is nonzero, don't set cutbuffer to NULL. */
 void global_init(int save_cutbuffer)
@@ -253,7 +244,7 @@ void global_init(int save_cutbuffer)
 
     hblank = charalloc(COLS + 1);
     memset(hblank, ' ', COLS);
-    hblank[COLS] = 0;
+    hblank[COLS] = '\0';
 
 }
 
@@ -468,7 +459,7 @@ void null_at(char **data, int index)
 {
 
     /* Ahh!  Damn dereferencing */
-    (*data)[index] = 0;
+    (*data)[index] = '\0';
     align(data);
 }
 
@@ -1367,6 +1358,9 @@ int do_int_spell_fix(char *word)
     char *prevanswer = NULL, *save_search = NULL, *save_replace = NULL;
     filestruct *begin;
     int i = 0, j = 0, beginx, beginx_top, reverse_search_set;
+#ifndef NANO_SMALL
+    int mark_set;
+#endif
 
     /* save where we are */
     begin = current;
@@ -1376,6 +1370,12 @@ int do_int_spell_fix(char *word)
     reverse_search_set = ISSET(REVERSE_SEARCH);
     UNSET(REVERSE_SEARCH);
 
+#ifndef NANO_SMALL
+    /* Make sure the marking highlight is off during Spell Check */
+    mark_set = ISSET(MARK_ISSET);
+    UNSET(MARK_ISSET);
+#endif
+
     /* save the current search/replace strings */
     search_init_globals();
     save_search = mallocstrcpy(save_search, last_search);
@@ -1438,6 +1438,12 @@ int do_int_spell_fix(char *word)
     if (reverse_search_set)
        SET(REVERSE_SEARCH);
 
+#ifndef NANO_SMALL
+    /* restore marking highlight */
+    if (mark_set)
+       SET(MARK_ISSET);
+#endif
+
     edit_update(current, CENTER);
 
     if (i == -1)
@@ -1451,8 +1457,7 @@ int do_int_speller(char *tempfile_name)
 {
     char *read_buff, *read_buff_ptr, *read_buff_word;
     size_t pipe_buff_size, read_buff_size, read_buff_read, bytesread;
-    int in_fd[2], tempfile_fd;
-    int spell_status;
+    int in_fd[2], tempfile_fd, spell_status;
     pid_t pid_spell;
 
     /* Create a pipe to spell program */
@@ -1583,12 +1588,25 @@ int do_alt_speller(char *file_name)
 {
     int alt_spell_status, lineno_cur = current->lineno;
     int x_cur = current_x, y_cur = current_y, pww_cur = placewewant;
+#ifndef NANO_SMALL
+    int mark_set = 0, mbb_lineno_cur, mbx_cur;
+#endif
 
     pid_t pid_spell;
     char *ptr;
     static int arglen = 3;
     static char **spellargs = (char **) NULL;
 
+#ifndef NANO_SMALL
+    mark_set = ISSET(MARK_ISSET);
+    if (mark_set) {
+       /* Save the marking position */
+       mbb_lineno_cur = mark_beginbuf->lineno;
+       mbx_cur = mark_beginx;
+       UNSET(MARK_ISSET);
+    }
+#endif
+
     endwin();
 
     /* Set up an argument list to pass the execvp function */
@@ -1635,6 +1653,15 @@ int do_alt_speller(char *file_name)
     global_init(1);
     open_file(file_name, 0, 1);
 
+#ifndef NANO_SMALL
+    if (mark_set) {
+       /* Restore the marking position */
+       do_gotopos(mbb_lineno_cur, mbx_cur, y_cur, 0);
+       mark_beginbuf = current;
+       SET(MARK_ISSET);
+    }
+#endif
+
     /* go back to the old position, mark the file as modified, and make
        sure that the titlebar is refreshed */
     do_gotopos(lineno_cur, x_cur, y_cur, pww_cur);
@@ -2043,7 +2070,7 @@ void handle_sigwinch(int s)
 
     hblank = nrealloc(hblank, COLS + 1);
     memset(hblank, ' ', COLS);
-    hblank[COLS] = 0;
+    hblank[COLS] = '\0';
 
 #ifdef HAVE_RESIZETERM
     resizeterm(LINES, COLS);
@@ -2788,7 +2815,7 @@ int main(int argc, char *argv[])
 {
     int optchr;
     int kbinput;               /* Input from keyboard */
-    long startline = 0;                /* Line to try and start at */
+    int startline = 0;         /* Line to try and start at */
     int keyhandled;            /* Have we handled the keystroke yet? */
     int modify_control_seq;
     char *argv0;
@@ -3022,6 +3049,11 @@ int main(int argc, char *argv[])
 
     }
 
+    /* Clear the filename we'll be using */
+    filename = charalloc(1);
+    filename[0] = '\0';
+
+    /* See if we were invoked with the name "pico" */
     argv0 = strrchr(argv[0], '/');
     if ((argv0 && strstr(argv0, "pico"))
        || (!argv0 && strstr(argv[0], "pico")))
@@ -3029,23 +3061,17 @@ int main(int argc, char *argv[])
 
     /* See if there's a non-option in argv (first non-option is the
        filename, if +LINE is not given) */
-    if (argc == 1 || argc <= optind)
-       clear_filename();
-    else {
+    if (argc > 1 && argc > optind) {
        /* Look for the +line flag... */
        if (argv[optind][0] == '+') {
            startline = atoi(&argv[optind][1]);
            optind++;
-           if (argc == 1 || argc <= optind)
-               clear_filename();
-           else
+           if (argc > 1 && argc > optind)
                filename = mallocstrcpy(filename, argv[optind]);
-
        } else
            filename = mallocstrcpy(filename, argv[optind]);
     }
 
-
     /* First back up the old settings so they can be restored, duh */
     tcgetattr(0, &oldterm);
 
@@ -3138,7 +3164,7 @@ int main(int argc, char *argv[])
 
        kbinput = wgetch(edit);
 #ifdef DEBUG
-       fprintf(stderr, "AHA!  %c (%d)\n", kbinput, kbinput);
+       fprintf(stderr, _("AHA!  %c (%d)\n"), kbinput, kbinput);
 #endif
 
        if (kbinput == 27) {    /* Grab Alt-key stuff first */
@@ -3421,7 +3447,7 @@ int main(int argc, char *argv[])
                break;
            default:
 #ifdef DEBUG
-               fprintf(stderr, "I got %c (%d)!\n", kbinput, kbinput);
+               fprintf(stderr, _("I got %c (%d)!\n"), kbinput, kbinput);
 #endif
                /* We no longer stop unhandled sequences so that people with
                   odd character sets can type... */
index 677ff3e24ee8d58ec7ae8a4662c775c731ba22eb..bc23026236e6288860e807e70546d539c2918e21 100644 (file)
 #
 # syntax "mutt"
 # color green "^>.*"
-
diff --git a/proto.h b/proto.h
index df052d1b852b03b54e3fba345ce069ae385ae2f6..f13a64bc1697f30e3c78a720422e8dedfea98223 100644 (file)
--- a/proto.h
+++ b/proto.h
@@ -171,10 +171,12 @@ int do_left(void);
 int do_right(void);
 int check_wildcard_match(const char *text, const char *pattern);
 
-char *input_tab(char *buf, int place, int *lastWasTab, int *newplace, int *list);
+char *input_tab(char *buf, int place, int *lastwastab, int *newplace, int *list);
 char *real_dir_from_tilde(char *buf);
 
 void signal_init(void);
+void unsunder(char *str, int true_len);
+void sunder(char *str);
 void lowercase(char *src);
 void blank_bottombars(void);
 void check_wrap(filestruct * inptr);
index f698fe227457e6c4d12601df4f77d5ae38899337..c02784102af69dd8abc88f6f6aadd386ce5671eb 100644 (file)
--- a/rcfile.c
+++ b/rcfile.c
@@ -221,7 +221,7 @@ void parse_syntax(FILE * rcstream, char *buf, char *ptr)
            tmpsyntax = syntaxes;
 #ifdef DEBUG
            fprintf(stderr,
-                   "Starting a new syntax type\n");
+                   _("Starting a new syntax type\n"));
            fprintf(stderr, "string val=%s\n", nameptr);
 #endif
 
@@ -229,7 +229,7 @@ void parse_syntax(FILE * rcstream, char *buf, char *ptr)
            for (tmpsyntax = syntaxes;
                 tmpsyntax->next != NULL; tmpsyntax = tmpsyntax->next);
 #ifdef DEBUG
-           fprintf(stderr, "Adding new syntax after 1st\n");
+           fprintf(stderr, _("Adding new syntax after 1st\n"));
 #endif
 
            tmpsyntax->next = nmalloc(sizeof(syntaxtype));
@@ -345,17 +345,17 @@ void parse_colors(FILE * rcstream, char *buf, char *ptr)
            tmpcolor = tmpsyntax->color;
 #ifdef DEBUG
            fprintf(stderr,
-                   "Starting a new colorstring for fg %d bg %d\n",
+                   _("Starting a new colorstring for fg %d bg %d\n"),
                    fg, bg);
-           fprintf(stderr, "string val=%s\n", tmp);
+           fprintf(stderr, _("string val=%s\n"), tmp);
 #endif
 
        } else {
            for (tmpcolor = tmpsyntax->color;
                 tmpcolor->next != NULL; tmpcolor = tmpcolor->next);
 #ifdef DEBUG
-           fprintf(stderr, "Adding new entry for fg %d bg %d\n", fg, bg);
-           fprintf(stderr, "string val=%s\n", tmp);
+           fprintf(stderr, _("Adding new entry for fg %d bg %d\n"), fg, bg);
+           fprintf(stderr, _("string val=%s\n"), tmp);
 #endif
 
            tmpcolor->next = nmalloc(sizeof(colortype));
@@ -387,7 +387,7 @@ void parse_colors(FILE * rcstream, char *buf, char *ptr)
            beginning = ptr;
            ptr = parse_next_regex(ptr);
 #ifdef DEBUG
-           fprintf(stderr, "For end part, beginning = \"%s\"\n",
+           fprintf(stderr, _("For end part, beginning = \"%s\"\n"),
                    beginning);
 #endif
            tmp = NULL;
index 3ec2abcf2231bf430367c7d3f26c79fea681f4a5..2862a6a399c9fc175fdcce3ef13dd798d32da0de 100644 (file)
--- a/search.c
+++ b/search.c
@@ -221,7 +221,7 @@ void not_found_msg(char *str)
        char *foo = NULL;
 
        foo = mallocstrcpy(foo, str);
-       foo[COLS / 2] = 0;
+       foo[COLS / 2] = '\0';
        statusbar(_("\"%s...\" not found"), foo);
 
        free(foo);
@@ -274,6 +274,7 @@ filestruct *findnextstr(int quiet, int bracket_mode, filestruct * begin, int beg
            if (search_last_line) {
                if (!quiet)
                    not_found_msg(needle);
+               update_line(fileptr, current_x);
                return NULL;
            }
 
@@ -571,7 +572,7 @@ char *replace_line(void)
 
     /* Head of Original Line */
     strncpy(copy, current->data, current_x);
-    copy[current_x] = 0;
+    copy[current_x] = '\0';
 
     /* Replacement Text */
     if (!ISSET(USE_REGEXP))
@@ -863,11 +864,9 @@ void do_gotopos(int line, int pos_x, int pos_y, int pos_placewewant)
     current_y = pos_y;
     do_gotoline(line, 1);
 
-    /* recalculate the x-coordinate and place we want, just in case their
-       values are insane; if they aren't, they won't be changed by this */
-    current_x = pos_x;
-    pos_placewewant = xplustabs();
-    pos_x = actual_x(current, pos_placewewant);
+    /* make sure that the x-coordinate is sane here */
+    if (pos_x > strlen(current->data))
+       pos_x = strlen(current->data);
 
     /* set the rest of the coordinates up */
     current_x = pos_x;
diff --git a/utils.c b/utils.c
index a46a354d4e151dc941795b9fe8d7897eccd09c56..207a9f79c423f3fdff6c7ef6cf44d53d829eb1bd 100644 (file)
--- a/utils.c
+++ b/utils.c
  *                                                                        *
  **************************************************************************/
 
-#include "config.h"
-
 #include <stdio.h>
 #include <unistd.h>
 #include <stdlib.h>
 #include <string.h>
 #include <ctype.h>
-
-#include "nano.h"
+#include "config.h"
 #include "proto.h"
+#include "nano.h"
 
 #ifdef ENABLE_NLS
 #include <libintl.h>
@@ -52,6 +50,32 @@ int num_of_digits(int n)
     return i;
 }
 
+/* For non-null-terminated lines.  A line, by definition, shouldn't
+   normally have newlines in it, so encode its nulls as newlines. */
+void unsunder(char *str, int true_len)
+{
+    int i;
+    if (strlen(str) < true_len) {
+       for (i = 0; i < true_len; i++) {
+           if (str[i] == '\0')
+               str[i] = '\n';
+       }
+    }
+}
+
+/* For non-null-terminated lines.  A line, by definition, shouldn't
+   normally have newlines in it, so decode its newlines into nulls. */
+void sunder(char *str)
+{
+    int i, true_len = strlen(str);
+    if (strchr(str, '\n')) {
+       for (i = 0; i < true_len; i++) {
+           if (str[i] == '\n')
+               str[i] = '\0';
+       }
+    }
+}
+
 /* Lower case a string - must be null terminated */
 void lowercase(char *src)
 {
diff --git a/winio.c b/winio.c
index 5eadd6a1f882bac99339cff3c2725fe4b93de826..525dd428c1bb5850da000665f25891989339cb05 100644 (file)
--- a/winio.c
+++ b/winio.c
  *                                                                        *
  **************************************************************************/
 
-#include "config.h"
-
 #include <stdarg.h>
 #include <string.h>
 #include <stdlib.h>
 #include <unistd.h>
+#include <ctype.h>
 #include <assert.h>
+#include "config.h"
 #include "proto.h"
 #include "nano.h"
 
@@ -85,7 +85,7 @@ int xpt(filestruct * fileptr, int index)
        } else if (fileptr->data[i] & 0x80)
            /* Make 8 bit chars only 1 column! */
            ;
-       else if (fileptr->data[i] < 32 || fileptr->data[i] == 127)
+       else if (iscntrl((int) fileptr->data[i]))
            tabs++;
     }
 
@@ -114,11 +114,25 @@ int actual_x_from_start(filestruct * fileptr, int xplus, int start)
                tot += tabsize - (tot % tabsize);
        } else if (fileptr->data[i] & 0x80)
            tot++;              /* Make 8 bit chars only 1 column (again) */
-       else if (fileptr->data[i] < 32 || fileptr->data[i] == 127) {
+       else if (iscntrl((int) fileptr->data[i])) {
            i++;
            tot += 2;
        }
 
+       if (i > strlen(fileptr->data))
+           i = strlen(fileptr->data);
+
+       /* see if we're in the x-plus-tabs column of xplus; if not, look
+          for the closest column to it */
+       if (xpt(fileptr, i) < xplus) {
+           while (xpt(fileptr, i) < xplus && i < strlen(fileptr->data))
+               i++;
+       }
+       else if (xpt(fileptr, i) > xplus) {
+           while (xpt(fileptr, i) > xplus && i > start)
+               i--;
+       }
+
 #ifdef DEBUG
     fprintf(stderr, _("actual_x_from_start for xplus=%d returned %d\n"),
            xplus, i);
@@ -151,7 +165,7 @@ int strnlenpt(char *buf, int size)
        } else if (buf[i] & 0x80)
            /* Make 8 bit chars only 1 column! */
            ;
-       else if (buf[i] < 32 || buf[i] == 127)
+       else if (iscntrl((int) buf[i]))
            tabs++;
     }
 
@@ -192,7 +206,6 @@ void blank_bottombars(void)
 
     for (; i <= 2; i++)
        mvwaddstr(bottomwin, i, 0, hblank);
-
 }
 
 void blank_edit(void)
@@ -275,7 +288,7 @@ int nanogetstr(int allowtabs, char *buf, char *def, shortcut *s,
 
     slen = length_of_list(s);
     inputbuf = charalloc(strlen(def) + 1);
-    inputbuf[0] = 0;
+    inputbuf[0] = '\0';
 
     x_left = strlen(buf);
     x = strlen(def) + x_left;
@@ -363,7 +376,7 @@ int nanogetstr(int allowtabs, char *buf, char *def, shortcut *s,
                memmove(inputbuf + (x - x_left),
                        inputbuf + (x - x_left) + 1,
                        strlen(inputbuf) - (x - x_left) - 1);
-               inputbuf[strlen(inputbuf) - 1] = 0;
+               inputbuf[strlen(inputbuf) - 1] = '\0';
            }
            break;
        case NANO_CONTROL_K:
@@ -376,12 +389,12 @@ int nanogetstr(int allowtabs, char *buf, char *def, shortcut *s,
        case NANO_CONTROL_H:
            if (strlen(inputbuf) > 0) {
                if (x == (x_left + strlen(inputbuf)))
-                   inputbuf[strlen(inputbuf) - 1] = 0;
+                   inputbuf[strlen(inputbuf) - 1] = '\0';
                else if (x - x_left) {
                    memmove(inputbuf + (x - x_left) - 1,
                            inputbuf + (x - x_left),
                            strlen(inputbuf) - (x - x_left));
-                   inputbuf[strlen(inputbuf) - 1] = 0;
+                   inputbuf[strlen(inputbuf) - 1] = '\0';
                }
            }
            if (x > strlen(buf))
@@ -447,7 +460,7 @@ int nanogetstr(int allowtabs, char *buf, char *def, shortcut *s,
                        memmove(inputbuf + (x - x_left),
                                inputbuf + (x - x_left) + 1,
                                strlen(inputbuf) - (x - x_left) - 1);
-                       inputbuf[strlen(inputbuf) - 1] = 0;
+                       inputbuf[strlen(inputbuf) - 1] = '\0';
                    }
                    goto skip_tilde;
                case '4':
@@ -504,6 +517,13 @@ int nanogetstr(int allowtabs, char *buf, char *def, shortcut *s,
        nanoget_repaint(buf, inputbuf, x);
        wrefresh(bottomwin);
     }
+#ifndef DISABLE_TABCOMP
+    /* if we've done tab completion, there might be a list of filename
+       matches on the edit window at this point; make sure they're
+       cleared off */
+    if (list)
+       edit_refresh();
+#endif
 
     answer = mallocstrcpy(answer, inputbuf);
     free(inputbuf);
@@ -817,7 +837,7 @@ void edit_add(filestruct * fileptr, int yval, int start, int virt_cur_x,
                        break;
                    }
 #ifdef DEBUG
-                   fprintf(stderr, "Match! (%d chars) \"%s\"\n",
+                   fprintf(stderr, _("Match! (%d chars) \"%s\"\n"),
                            colormatches[0].rm_eo - colormatches[0].rm_so,
                            &fileptr->data[k + colormatches[0].rm_so]);
 #endif
@@ -830,7 +850,7 @@ void edit_add(filestruct * fileptr, int yval, int start, int virt_cur_x,
                            paintlen =
                                colormatches[0].rm_eo - colormatches[0].rm_so;
 #ifdef DEBUG
-                           fprintf(stderr, "paintlen (%d) = eo (%d) - so (%d)\n"
+                           fprintf(stderr, _("paintlen (%d) = eo (%d) - so (%d)\n")
                                paintlen, colormatches[0].rm_eo, colormatches[0].rm_so);
 #endif
 
@@ -838,7 +858,7 @@ void edit_add(filestruct * fileptr, int yval, int start, int virt_cur_x,
                        else {
                            paintlen = COLS - k - colormatches[0].rm_so - 1;
 #ifdef DEBUG
-                           fprintf(stderr, "paintlen (%d) = COLS (%d) - k (%d), - rm.so (%d) - 1\n"
+                           fprintf(stderr, _("paintlen (%d) = COLS (%d) - k (%d), - rm.so (%d) - 1\n")
                                        paintlen, COLS, k, colormatches[0].rm_so);
 #endif
                        }
@@ -941,7 +961,7 @@ void edit_add(filestruct * fileptr, int yval, int start, int virt_cur_x,
                                        &fileptr->data[start + smatch],
                                        ematch - smatch);
 #ifdef DEBUG
-                       fprintf(stderr, "start = %d, smatch = %d, ematch = %d\n", start,
+                       fprintf(stderr, _("start = %d, smatch = %d, ematch = %d\n"), start,
                                smatch, ematch);
 #endif
 
@@ -1181,12 +1201,31 @@ void update_line(filestruct * fileptr, int index)
            if (i < mark_beginx)
                virt_mark_beginx--;
        } else if (realdata[i] == 127) {
-           /* Treat control characters as ^symbol (ASCII 1 - 31, 127) */
+           /* Treat control characters as ^symbol (ASCII 1 - 31 omitting
+              10, 127) */
            fileptr->data[pos++] = '^';
            fileptr->data[pos++] = '?';
-       } else if (realdata[i] >= 1 && realdata[i] <= 31) {
+           if (i < current_x)
+               virt_cur_x++;
+           if (i < mark_beginx)
+               virt_mark_beginx++;
+       } else if (realdata[i] >= 1 && realdata[i] <= 31 && realdata[i] != 10) {
            fileptr->data[pos++] = '^';
            fileptr->data[pos++] = realdata[i] + 64;
+           if (i < current_x)
+               virt_cur_x++;
+           if (i < mark_beginx)
+               virt_mark_beginx++;
+       } else if (realdata[i] == 10) {
+           /* Treat newlines (ASCII 10's) embedded in a line as encoded
+              nulls (ASCII 0's); the line in question should be run
+              through unsunder() before reaching here */
+           fileptr->data[pos++] = '^';
+           fileptr->data[pos++] = '@';
+           if (i < current_x)
+               virt_cur_x++;
+           if (i < mark_beginx)
+               virt_mark_beginx++;
        } else {
            fileptr->data[pos++] = realdata[i];
        }
@@ -1741,9 +1780,36 @@ int do_help(void)
            break;
 #endif
 #endif
+       case 27:
+           kbinput = wgetch(edit);
+           switch(kbinput) {
+           case '[':
+               kbinput = wgetch(edit);
+               switch(kbinput) {
+                   case '5':   /* Alt-[-5 = Page Up */
+                       wgetch(edit);
+                       goto do_pageupkey;
+                       break;
+                   case 'V':   /* Alt-[-V = Page Up in Hurd Console */
+                   case 'I':   /* Alt-[-I = Page Up - FreeBSD Console */
+                       goto do_pageupkey;
+                       break;
+                   case '6':   /* Alt-[-6 = Page Down */
+                       wgetch(edit);
+                       goto do_pagedownkey;
+                       break;
+                   case 'U':   /* Alt-[-U = Page Down in Hurd Console */
+                   case 'G':   /* Alt-[-G = Page Down - FreeBSD Console */
+                       goto do_pagedownkey;
+                       break;
+               }
+               break;
+           }
+           break;
        case NANO_NEXTPAGE_KEY:
        case NANO_NEXTPAGE_FKEY:
        case KEY_NPAGE:
+         do_pagedownkey:
            if (!no_more) {
                blank_edit();
                page++;
@@ -1752,6 +1818,7 @@ int do_help(void)
        case NANO_PREVPAGE_KEY:
        case NANO_PREVPAGE_FKEY:
        case KEY_PPAGE:
+         do_pageupkey:
            if (page > 1) {
                no_more = 0;
                blank_edit();