]> git.wh0rd.org Git - nano.git/commitdiff
DLR's latest patch
authorChris Allegretta <chrisa@asty.org>
Sat, 11 May 2002 03:04:44 +0000 (03:04 +0000)
committerChris Allegretta <chrisa@asty.org>
Sat, 11 May 2002 03:04:44 +0000 (03:04 +0000)
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1204 35c25a1d-7b9e-4130-9fde-d3aeb78583b8

12 files changed:
ChangeLog
files.c
move.c
nano.1
nano.1.html
nano.c
nano.h
nano.spec.in
proto.h
rcfile.c
search.c
winio.c

index 9c85d4660653454d3590fdc530159650c0b53f1c..b237ed23feb50981d1ec29c42b2112a71aff0581 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -24,6 +24,11 @@ CVS code -
          syntaxfile_regexp and synfilematches.  Global flag -Y ,--syntax
          to specify the type on the command line, if there's no good 
          filename regex to use.  Global variable syntaxstr.
+       - Changed many strcmp()s and strcpy()s to their equivalent
+         '\0' conterparts (David Lawrence Ramsey).
+       - Many chanes to allow marked cutting to work with multiple
+         file buffers: changes to openfilestruct type in nano.h and
+         files.c (David Lawrence Ramsey).
 - configure.ac:
        - Define NDEBUG to silence asserts (David Benbennick).
 - files.c:
@@ -47,10 +52,15 @@ CVS code -
 - nano.spec.in:
        - Don't put Chris' name as the Packager in the distribution
          by default (Im an idiot).
+       - Fixed Source line (David Lawrence Ramsey).
 - nano.1:
        - Changed references to Debian GNU/Linux to Debian GNU (Jordi).
+- nano.1.html:
+       - Updated for -Y option (David Lawrence Ramsey).
 - rcfile.c
        - Made some rc file errors less fatal.
+       - Added in my patch for getpwent instead of relying on $HOME
+         (David Lawrence Ramsey).
 - winio.c:
   edit_add()
        - Changed some syntax hilight computations for the sake of COLS.
diff --git a/files.c b/files.c
index 9e52548cde79ec2993e8eda7ecfd5d24926d5293..341c4c410f64e4590a1fad6c86e10244d2e61191 100644 (file)
--- a/files.c
+++ b/files.c
@@ -50,15 +50,15 @@ static int fileformat = 0;  /* 0 = *nix, 1 = DOS, 2 = Mac */
 #endif
 
 /* Load file into edit buffer - takes data from file struct */
-void load_file(int quiet)
+void load_file(int update)
 {
     current = fileage;
 
 #ifdef ENABLE_MULTIBUFFER
-    /* if quiet is zero, add a new entry to the open_files structure;
+    /* if update is zero, add a new entry to the open_files structure;
        otherwise, update the current entry (the latter is needed in the
        case of the alternate spell checker) */
-    add_open_file(quiet);
+    add_open_file(update);
 #endif
 
 #ifdef ENABLE_COLOR
@@ -73,7 +73,7 @@ void new_file(void)
 {
     fileage = nmalloc(sizeof(filestruct));
     fileage->data = charalloc(1);
-    strcpy(fileage->data, "");
+    fileage->data[0] = '\0';
     fileage->prev = NULL;
     fileage->next = NULL;
     fileage->lineno = 1;
@@ -88,7 +88,7 @@ void new_file(void)
     /* if there aren't any entries in open_files, create the entry for
        this new file; without this, if nano is started without a filename
        on the command line, a new file will be created, but it will be
-       given no open_files entry, leading to problems later on */
+       given no open_files entry */
     if (!open_files) {
        add_open_file(0);
        /* turn off view mode in this case; this is for consistency
@@ -108,7 +108,7 @@ void new_file(void)
 
 }
 
-filestruct *read_line(char *buf, filestruct * prev, int *line1ins)
+filestruct *read_line(char *buf, filestruct *prev, int *line1ins)
 {
     filestruct *fileptr;
 
@@ -156,10 +156,10 @@ filestruct *read_line(char *buf, filestruct * prev, int *line1ins)
     return fileptr;
 }
 
-int read_file(FILE *f, char *filename, int quiet)
+int read_file(FILE *f, const char *filename, int quiet)
 {
     int num_lines = 0;
-    char input;                /* current input character */
+    signed char input;         /* current input character */
     char *buf;
     long i = 0, bufx = 128;
     filestruct *fileptr = current, *tmp = NULL;
@@ -260,7 +260,9 @@ int read_file(FILE *f, char *filename, int quiet)
        new_magicline();
        totsize--;
 
-       /* Update the edit buffer */
+       /* Update the edit buffer; note that if using multibuffers, a
+          quiet load will update the current open_files entry, while a
+          noisy load will add a new open_files entry */
        load_file(quiet);
     }
 
@@ -281,15 +283,14 @@ int read_file(FILE *f, char *filename, int quiet)
     return 1;
 }
 
-
 /* Open the file (and decide if it exists) */
-int open_file(char *filename, int insert, int quiet)
+int open_file(const char *filename, int insert, int quiet)
 {
     int fd;
     FILE *f;
     struct stat fileinfo;
 
-    if (!strcmp(filename, "") || stat(filename, &fileinfo) == -1) {
+    if (filename[0] == '\0' || stat(filename, &fileinfo) == -1) {
        if (insert && !quiet) {
            statusbar(_("\"%s\" not found"), filename);
            return -1;
@@ -313,7 +314,6 @@ int open_file(char *filename, int insert, int quiet)
                /* Don't open character or block files.  Sorry, /dev/sndstat! */
                statusbar(_("File \"%s\" is a device file"), filename);
 
-
            if (!insert)
                new_file();
            return -1;
@@ -331,7 +331,6 @@ int open_file(char *filename, int insert, int quiet)
     return 1;
 }
 
-
 /* This function will return the name of the first available extension
    of a filename (starting with the filename, then filename.1, etc).
    Memory is allocated for the return value.  If no writable extension 
@@ -365,7 +364,7 @@ char *get_next_filename(const char *name)
 
 int do_insertfile(int loading_file)
 {
-    int i;
+    int i, old_current_x = current_x;
     char *realname = NULL;
 
     wrap_reset();
@@ -428,7 +427,7 @@ int do_insertfile(int loading_file)
        if (i == NANO_EXTCMD_KEY) {
            int ts;
            ts = statusq(1, extcmd_list, "", _("Command to execute "));
-           if (ts == -1  || answer == NULL || !strcmp(answer,"")) {
+           if (ts == -1  || answer == NULL || answer[0] == '\0') {
                statusbar(_("Cancelled"));
                UNSET(KEEP_CUTBUFFER);
                display_main_list();
@@ -445,6 +444,9 @@ int do_insertfile(int loading_file)
 
            new_file();
            UNSET(MODIFIED);
+#ifndef NANO_SMALL
+           UNSET(MARK_ISSET);
+#endif
        }
 #endif
 
@@ -489,6 +491,17 @@ int do_insertfile(int loading_file)
        }
 #endif
 
+#ifdef ENABLE_MULTIBUFFER
+       if (!loading_file) {
+#endif
+
+           /* Restore the old x-coordinate position */
+           current_x = old_current_x;
+
+#ifdef ENABLE_MULTIBUFFER
+       }
+#endif
+
        /* If we've gone off the bottom, recenter; otherwise, just redraw */
        if (current->lineno > editbot->lineno)
            edit_update(current, CENTER);
@@ -582,19 +595,29 @@ int add_open_file(int update)
     /* save current line number */
     open_files->file_lineno = current->lineno;
 
+    /* if we're updating, save current modification status (and marking
+       status, if available) */
+    if (update) {
+#ifndef NANO_SMALL
+       open_files->file_flags = (MODIFIED & ISSET(MODIFIED)) | (MARK_ISSET & ISSET(MARK_ISSET));
+       if (ISSET(MARK_ISSET)) {
+           open_files->file_mark_beginbuf = mark_beginbuf;
+           open_files->file_mark_beginx = mark_beginx;
+       }
+#else
+       open_files->file_flags = (MODIFIED & ISSET(MODIFIED));
+#endif
+    }
+
     /* if we're in view mode and updating, the file contents won't
        have changed, so we won't bother resaving the filestruct
        then; otherwise, we will */
     if (!(ISSET(VIEW_MODE) && !update)) {
-       /* save current filestruct and restore full file position
-          afterward */
-       open_files->fileage = fileage; 
-       do_gotopos(open_files->file_lineno, open_files->file_current_x, open_files->file_current_y, open_files->file_placewewant);
+       /* save current file buffer */
+       open_files->fileage = fileage;
+       open_files->filebot = filebot;
     }
 
-    /* save current modification status */
-    open_files->file_modified = ISSET(MODIFIED);
-
 #ifdef DEBUG
     fprintf(stderr, _("filename is %s"), open_files->filename);
 #endif
@@ -602,21 +625,6 @@ int add_open_file(int update)
     return 0;
 }
 
-/*
- * Update only the filename stored in the current entry.  Return 0 on
- * success or 1 on error.
- */ 
-int open_file_change_name(void)
-{
-    if (!open_files || !filename)
-       return 1;
-
-    /* save current filename */
-    open_files->filename = mallocstrcpy(open_files->filename, filename);
-
-    return 0;
-}
-
 /*
  * Read the current entry in the open_files structure and set up the
  * currently open file using that entry's information.  Return 0 on
@@ -624,7 +632,6 @@ int open_file_change_name(void)
  */
 int load_open_file(void)
 {
-
     if (!open_files)
        return 1;
 
@@ -633,27 +640,31 @@ int load_open_file(void)
     filename = mallocstrcpy(filename, open_files->filename);
     fileage = open_files->fileage;
     current = fileage;
+    filebot = open_files->filebot;
     totlines = open_files->file_totlines;
     totsize = open_files->file_totsize;
 
-    /* Unset the marker because nano can't (yet) handle marked text
-       flipping between open files */
-    UNSET(MARK_ISSET);
+    /* restore modification status */
+    if (open_files->file_flags & MODIFIED)
+       SET(MODIFIED);
+    else
+       UNSET(MODIFIED);
+
+#ifndef NANO_SMALL
+    /* restore marking status */
+    if (open_files->file_flags & MARK_ISSET) {
+       mark_beginbuf = open_files->file_mark_beginbuf;
+       mark_beginx = open_files->file_mark_beginx;
+       SET(MARK_ISSET);
+    } else
+       UNSET(MARK_ISSET);
+#endif
 
     /* restore full file position: line number, x-coordinate, y-
        coordinate, place we want */
     do_gotopos(open_files->file_lineno, open_files->file_current_x, open_files->file_current_y, open_files->file_placewewant);
 
-    /* restore the bottom of the file */
-    filebot = current;
-    while (filebot->next)
-       filebot = filebot->next;
-
-    /* set up modification status and update the titlebar */
-    if (open_files->file_modified)
-       SET(MODIFIED);
-    else
-       UNSET(MODIFIED);
+    /* update the titlebar */
     clearok(topwin, FALSE);
     titlebar(NULL);
 
@@ -811,7 +822,11 @@ int close_open_file(void)
     if (!open_files)
        return 1;
 
+    /* make sure open_files->fileage and fileage, and open_files->filebot
+       and filebot, are in sync; they might not be if lines have been cut
+       from the top or bottom of the file */
     open_files->fileage = fileage;
+    open_files->filebot = filebot;
 
     tmp = open_files;
     if (open_nextfile(1)) {
@@ -1203,7 +1218,7 @@ int write_file(char *name, int tmp, int append, int nonamechange)
     struct stat st, lst;
     char *realname = NULL;
 
-    if (!strcmp(name, "")) {
+    if (name[0] == '\0') {
        statusbar(_("Cancelled"));
        return -1;
     }
@@ -1224,8 +1239,9 @@ int write_file(char *name, int tmp, int append, int nonamechange)
 
 #ifndef DISABLE_OPERATINGDIR
     if (!tmp && operating_dir) {
-       /* if we're writing a temporary file, we're going outside the
-          operating directory, so skip the operating directory test */
+       /* if we're writing a temporary file, we're probably going
+          outside the operating directory, so skip the operating
+          directory test */
        if (check_operating_dir(realname, 0)) {
            statusbar(_("Can't write outside of %s"), operating_dir);
 
@@ -1634,21 +1650,8 @@ int do_writeout(char *path, int exiting, int append)
 #ifdef ENABLE_MULTIBUFFER
            /* if we're not about to exit, update the current entry in
               the open_files structure */
-           if (!exiting) {
-
-               /* first, if the filename was changed during the save,
-                  update the filename stored in the current entry, and
-                  then update the current entry */
-               if (strcmp(open_files->filename, filename)) {
-                   open_file_change_name();
-                   add_open_file(1);
-               }
-               else {
-
-                   /* otherwise, just update the current entry */
-                   add_open_file(1);
-               }
-           }
+           if (!exiting)
+               add_open_file(1);
 #endif
 
            display_main_list();
@@ -1825,7 +1828,7 @@ char **cwd_tab_completion(char *buf, int *num_matches)
     strcat(buf, "*");
 
     /* Okie, if there's a / in the buffer, strip out the directory part */
-    if (strcmp(buf, "") && strstr(buf, "/")) {
+    if (buf[0] != '\0' && strstr(buf, "/")) {
        dirName = charalloc(strlen(buf) + 1);
        tmp = buf + strlen(buf);
        while (*tmp != '/' && tmp != buf)
@@ -1988,7 +1991,7 @@ char *input_tab(char *buf, int place, int *lastWasTab, int *newplace, int *list)
 
            buf = nrealloc(buf, strlen(buf) + strlen(matches[0]) + 1);
 
-           if (strcmp(buf, "") && strstr(buf, "/")) {
+           if (buf[0] != '\0' && strstr(buf, "/")) {
                for (tmp = buf + strlen(buf); *tmp != '/' && tmp != buf;
                     tmp--);
                tmp++;
@@ -2025,7 +2028,7 @@ char *input_tab(char *buf, int place, int *lastWasTab, int *newplace, int *list)
            /* Check to see if all matches share a beginning, and, if so,
               tack it onto buf and then beep */
 
-           if (strcmp(buf, "") && strstr(buf, "/")) {
+           if (buf[0] != '\0' && strstr(buf, "/")) {
                for (tmp = buf + strlen(buf); *tmp != '/' && tmp != buf;
                     tmp--);
                tmp++;
@@ -2624,7 +2627,7 @@ char *do_browser(char *inpath)
     } while ((kbinput = wgetch(edit)) != NANO_EXIT_KEY);
     curs_set(1);
     blank_edit();
-    titlebar(NULL); 
+    titlebar(NULL);
     edit_refresh();
     kb = keypad_on(edit, kb);
 
diff --git a/move.c b/move.c
index b16f34213ae71371f8350cdd396c71c5eb084838..ba100ba66fb888fb6f5647c685ed6b69ec3da41b 100644 (file)
--- a/move.c
+++ b/move.c
@@ -113,12 +113,8 @@ 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);
-
-       if (current_x > strlen(current->next->data))
-           current_x = strlen(current->next->data);
     } else {
        UNSET(KEEP_CUTBUFFER);
        check_statblank();
@@ -193,9 +189,6 @@ int do_up(void)
     if (current->prev != NULL) {
        if (placewewant > 0)
            current_x = actual_x(current->prev, placewewant);
-
-       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 b9f361d9b11b2e40ad0f17b7e3382c319393a97b..618fc38a551a31b7e373352dea3fa7d6f4685140 100644 (file)
--- a/nano.1
+++ b/nano.1
@@ -130,9 +130,11 @@ Nano will try to dump the buffer into an emergency file in some cases.
 Mainly, this will happen if Nano receives a SIGHUP or runs out of
 memory, when it will write the buffer into a file named "nano.save" if the
 buffer didn't have a name already, or will add a ".save" suffix to the
-current filename. In multibuffer mode, nano will write all the open buffers to
-the respective emergency files. Nano will \fBnot\fP write this file if a
-previous one exists in the current directory.
+current filename. If an emergency file with that name already exists in
+the current directory, ".save" and a number (e.g. ".save.1") will be
+suffixed to the current filename in order to make it unique. In
+multibuffer mode, nano will write all the open buffers to the respective
+emergency files.
 .SH BUGS
 Please send any comments or bug reports to
 .br
index 654654fe112f09861919dd31317d8440f4508cfc..0cf2be418a64d591deef2ee7f42d7319dac85e1b 100644 (file)
@@ -88,6 +88,10 @@ Set the size (width) of a tab.
 
 <DD>
 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).
 <DT><B>-c (--const)</B>
 
 <DD>
@@ -171,9 +175,11 @@ Nano will try to dump the buffer into an emergency file in some cases.
 Mainly, this will happen if Nano receives a SIGHUP or runs out of
 memory, when it will write the buffer into a file named &quot;nano.save&quot; if the
 buffer didn't have a name already, or will add a &quot;.save&quot; suffix to the
-current filename. In multibuffer mode, nano will write all the open buffers to
-the respective emergency files. Nano will <B>not</B> write this file if a
-previous one exists in the current directory.
+current filename. If an emergency file with that name already exists in
+the current directory, &quot;.save&quot; and a number (e.g. &quot;.save.1&quot;) will be
+suffixed to the current filename in order to make it unique. In
+multibuffer mode, nano will write all the open buffers to the respective
+emergency files.
 <A NAME="lbAG">&nbsp;</A>
 <H2>BUGS</H2>
 
@@ -201,7 +207,7 @@ subject of &quot;subscribe&quot;.
 Chris Allegretta &lt;<A HREF="mailto:chrisa@asty.org">chrisa@asty.org</A>&gt;, et al (see AUTHORS and THANKS for
 details).
 This manual page was originally written by Jordi Mallach
-&lt;<A HREF="mailto:jordi@sindominio.net">jordi@sindominio.net</A>&gt;, for the Debian GNU/Linux system (but may be
+&lt;<A HREF="mailto:jordi@sindominio.net">jordi@sindominio.net</A>&gt;, for the Debian GNU system (but may be
 used by others).
 <P>
 
@@ -221,6 +227,6 @@ used by others).
 This document was created by
 <A HREF="http://localhost/cgi-bin/man/man2html">man2html</A>,
 using the manual pages.<BR>
-Time: 12:14:20 GMT, March 04, 2002
+Time: 19:17:30 GMT, May 08, 2002
 </BODY>
 </HTML>
diff --git a/nano.c b/nano.c
index 73bf5f60b6eb1f78e857faa2394bd9ed44d2eba2..1dc3639b2d55cf0da3275bb4b8f792e70acbb4ed 100644 (file)
--- a/nano.c
+++ b/nano.c
@@ -143,9 +143,14 @@ void die(char *msg, ...)
            /* if we already saved the file above (i. e. if it was the
               currently loaded file), don't save it again */
            if (tmp != open_files) {
+               /* make sure open_files->fileage and fileage, and
+                  open_files->filebot and filebot, are in sync; they
+                  might not be if lines have been cut from the top or
+                  bottom of the file */
                fileage = open_files->fileage;
+               filebot = open_files->filebot;
                /* save the file if it's been modified */
-               if (open_files->file_modified)
+               if (open_files->file_flags & MODIFIED)
                    die_save_file(open_files->filename);
            }
 
@@ -168,7 +173,7 @@ void die_save_file(char *die_filename)
     if (die_filename[0] == '\0') {
        name = "nano.save";
        ret = get_next_filename(name);
-       if (strcmp(ret, ""))
+       if (ret[0] != '\0')
            i = write_file(ret, 1, 0, 0);
        name = ret;
     }
@@ -177,7 +182,7 @@ void die_save_file(char *die_filename)
        strcpy(buf, die_filename);
        strcat(buf, ".save");
        ret = get_next_filename(buf);
-       if (strcmp(ret, ""))
+       if (ret[0] != '\0')
            i = write_file(ret, 1, 0, 0);
        name = ret;
        free(buf);
@@ -637,6 +642,7 @@ openfilestruct *make_new_opennode(openfilestruct * prevnode)
     newnode = nmalloc(sizeof(openfilestruct));
     newnode->filename = NULL;
     newnode->fileage = NULL;
+    newnode->filebot = NULL;
 
     newnode->prev = prevnode;
     newnode->next = NULL;
@@ -1267,7 +1273,7 @@ int do_backspace(void)
               line we're on now is NOT blank.  if it is blank we
               can just use IT for the magic line.   This is how Pico
               appears to do it, in any case */
-           if (strcmp(current->data, "")) {
+           if (current->data[0] != '\0') {
                new_magicline();
                fix_editbot();
            }
@@ -1297,7 +1303,7 @@ int do_delete(void)
     /* blbf -> blank line before filebot (see below) */
     int blbf = 0;
 
-    if (current->next == filebot && !strcmp(current->data, ""))
+    if (current->next == filebot && current->data[0] == '\0')
        blbf = 1;
 
     if (current_x != strlen(current->data)) {
@@ -1329,7 +1335,7 @@ int do_delete(void)
 
        /* Please see the comment in do_backspace if you don't understand
           this test */
-       if (current == filebot && strcmp(current->data, "")) {
+       if (current == filebot && current->data[0] != '\0') {
            new_magicline();
            fix_editbot();
            totsize++;
@@ -1407,7 +1413,7 @@ int do_int_spell_fix(char *word)
 
            search_last_line = FALSE;
 
-           if (strcmp(prevanswer,answer) != 0) {
+           if (strcmp(prevanswer, answer)) {
                j = i;
                do_replace_loop(prevanswer, fileage, &beginx_top, TRUE, &j);
            }
@@ -1475,7 +1481,6 @@ int do_int_speller(char *tempfile_name)
        }
        close(tempfile_fd);
 
-
        /* send spell's standard out to the pipe */
 
        if (dup2(in_fd[1], STDOUT_FILENO) != STDOUT_FILENO) {
@@ -1662,8 +1667,7 @@ int do_spell(void)
 
 #ifdef ENABLE_MULTIBUFFER
     /* update the current open_files entry before spell-checking, in case
-       any problems occur; the case of there being no open_files entries
-       is handled elsewhere (before we reach this point) */
+       any problems occur */
     add_open_file(1);
 #endif
 
@@ -3098,8 +3102,6 @@ int main(int argc, char *argv[])
     fprintf(stderr, _("Main: open file\n"));
 #endif
 
-    titlebar(NULL);
-
     /* Now we check to see if argv[optind] is non-null to determine if
        we're dealing with a new file or not, not argc == 1... */
     if (argv[optind] == NULL)
@@ -3107,6 +3109,8 @@ int main(int argc, char *argv[])
     else
        open_file(filename, 0, 0);
 
+    titlebar(NULL);
+
     if (startline > 0)
        do_gotoline(startline, 0);
     else
diff --git a/nano.h b/nano.h
index 799729c973e04e9f10be71963cecb218b3c973ac..985133121a272519ea5cfeb732323720a72dc98a 100644 (file)
--- a/nano.h
+++ b/nano.h
@@ -82,9 +82,18 @@ typedef struct openfilestruct {
     struct openfilestruct *next;       /* Next node */
     struct openfilestruct *prev;       /* Previous node */
     struct filestruct *fileage;        /* Current file */
+    struct filestruct *filebot;        /* Current file's last line */
+#ifndef NANO_SMALL
+    struct filestruct *file_mark_beginbuf;
+                               /* Current file's beginning marked line */
+    int file_mark_beginx;      /* Current file's beginning marked line's
+                                  x-coordinate position */
+#endif
     int file_current_x;                /* Current file's x-coordinate position */
     int file_current_y;                /* Current file's y-coordinate position */
-    int file_modified;         /* Current file's modification status */
+    int file_flags;            /* Current file's flags: modification
+                                  status (and marking status, if
+                                  available) */
     int file_placewewant;      /* Current file's place we want */
     int file_totlines;         /* Current file's total number of lines */
     long file_totsize;         /* Current file's total size */
index e2cea61c3ad97b52bc6e3683cdc41c8090e3534b..b9d0431678b8a5ce6b2007b759a9bfc4ce7e6d63 100644 (file)
@@ -9,7 +9,7 @@ Release         : %{rel}
 Copyright      : GPL
 Group          : Console/Editors
 URL            : http://www.nano-editor.org
-Source         : http://www.nano-editor.org/dist/v1.1/%{name}/%{name}-%{ver}.tar.gz
+Source         : http://www.nano-editor.org/dist/v1.1/%{name}-%{ver}.tar.gz
 BuildRoot      : /var/tmp/%{name}-buildroot
 Requires       : ncurses
 
diff --git a/proto.h b/proto.h
index 56a8f3427c4414cd5b9f19ed560c5a06f9519e6c..9b81de6a684017deb4345ceeeff04471123abf9c 100644 (file)
--- a/proto.h
+++ b/proto.h
@@ -132,11 +132,11 @@ int do_cut_text(void);
 int do_uncut_text(void);
 int no_help(void);
 int renumber_all(void);
-int open_file(char *filename, int insert, int quiet);
+int open_file(const char *filename, int insert, int quiet);
 int do_insertfile(int loading_file);
 int num_of_digits(int n);
 int open_pipe(char *command);
-int read_file(FILE *f, char *filename, int quiet);
+int read_file(FILE *f, const char *filename, int quiet);
 
 #ifdef ENABLE_MULTIBUFFER
 int add_open_file(int update);
index 243cad2bf3293b0b3c49a51964f25b9f82cf5583..765e5d16de4a5837daabe3dd29890afdf6bb06e9 100644 (file)
--- a/rcfile.c
+++ b/rcfile.c
@@ -24,6 +24,8 @@
 #include <string.h>
 #include <stdio.h>
 #include <errno.h>
+#include <unistd.h>
+#include <pwd.h>
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <fcntl.h>
@@ -546,9 +548,7 @@ void do_rcfile(void)
     char *unable = _("Unable to open ~/.nanorc file, %s");
     struct stat fileinfo;
     FILE *rcstream;
-
-    if (getenv("HOME") == NULL)
-       return;
+    struct passwd *userage;
 
     nanorc = charalloc(strlen(SYSCONFDIR) + 10);
     sprintf(nanorc, "%s/nanorc", SYSCONFDIR);
@@ -562,10 +562,21 @@ void do_rcfile(void)
            fclose(rcstream);
        }
 
-    nanorc = charalloc(strlen(getenv("HOME")) + 10);
-    sprintf(nanorc, "%s/.nanorc", getenv("HOME"));
-
     lineno = 0;
+
+    /* Determine home directory using getpwent(), don't rely on $HOME */
+    for (userage = getpwent(); userage != NULL
+        && userage->pw_uid != geteuid(); userage = getpwent())
+       ;
+
+    if (userage == NULL) {
+       rcfile_error(_("I can't find my home directory!  Wah!"));
+       return;
+    }
+
+    nanorc = charalloc(strlen(userage->pw_dir) + 10);
+    sprintf(nanorc, "%s/.nanorc", userage->pw_dir);
+
     if (stat(nanorc, &fileinfo) == -1) {
 
        /* Abort if the file doesn't exist and there's some other kind
index fdb025d47b416df7cd540dbc481bfc1d7715cb3f..851fd244512c397c06e5cb5a79d2a03b4badb222 100644 (file)
--- a/search.c
+++ b/search.c
@@ -56,11 +56,11 @@ void search_init_globals(void)
 {
     if (last_search == NULL) {
        last_search = charalloc(1);
-       last_search[0] = 0;
+       last_search[0] = '\0';
     }
     if (last_replace == NULL) {
        last_replace = charalloc(1);
-       last_replace[0] = 0;
+       last_replace[0] = '\0';
     }
 }
 
@@ -82,7 +82,7 @@ int search_init(int replacing)
     search_init_globals();
 
     buf = charalloc(strlen(last_search) + 5);
-    buf[0] = 0;
+    buf[0] = '\0';
 
 
     /* Clear the backupstring if we've changed from Pico mode to regular
@@ -123,7 +123,7 @@ int search_init(int replacing)
        }
     }
     else
-       strcpy(buf, "");
+       buf[0] = '\0';
 
     /* This is now one simple call.  It just does a lot */
     i = statusq(0, replacing ? replace_list : whereis_list, backupstring,
@@ -247,10 +247,9 @@ int past_editbuff; /* findnextstr() is now searching lines not displayed */
 filestruct *findnextstr(int quiet, int bracket_mode, filestruct * begin, int beginx,
                        char *needle)
 {
-    filestruct *fileptr;
+    filestruct *fileptr = current;
     char *searchstr, *rev_start = NULL, *found = NULL;
     int current_x_find = 0;
-    fileptr = current;
 
     past_editbuff = 0;
 
@@ -278,6 +277,7 @@ filestruct *findnextstr(int quiet, int bracket_mode, filestruct * begin, int beg
                return NULL;
            }
 
+           update_line(fileptr, 0);
            fileptr = fileptr->next;
 
            if (fileptr == editbot)
@@ -286,12 +286,12 @@ filestruct *findnextstr(int quiet, int bracket_mode, filestruct * begin, int beg
            /* EOF reached ?, wrap around once */
            if (fileptr == NULL) {
                if (bracket_mode)               /* don't wrap if looking for bracket match */
-                  return NULL;
+                   return NULL;
                fileptr = fileage;
                past_editbuff = 1;
                if (!quiet) {
-                  statusbar(_("Search Wrapped"));
-               SET(DISABLE_CURPOS);
+                   statusbar(_("Search Wrapped"));
+                   SET(DISABLE_CURPOS);
                }
            }
 
@@ -340,6 +340,7 @@ filestruct *findnextstr(int quiet, int bracket_mode, filestruct * begin, int beg
                return NULL;
            }
 
+           update_line(fileptr, 0);
            fileptr = fileptr->prev;
 
            if (fileptr == edittop->prev)
@@ -436,7 +437,7 @@ int do_search(void)
     }
 
     /* The sneaky user deleted the previous search string */
-    if (!ISSET(PICO_MODE) && !strcmp(answer, "")) {
+    if (!ISSET(PICO_MODE) && answer[0] == '\0') {
        statusbar(_("Search Cancelled"));
        search_abort();
        return 0;
@@ -445,7 +446,7 @@ int do_search(void)
      /* If answer is now == "", then PICO_MODE is set.  So, copy
        last_search into answer... */
 
-    if (!strcmp(answer, ""))
+    if (answer[0] == '\0')
        answer = mallocstrcpy(answer, last_search);
     else
        last_search = mallocstrcpy(last_search, answer);
@@ -604,7 +605,7 @@ int do_replace_loop(char *prevanswer, filestruct *begin, int *beginx,
 
     switch (*i) {
     case -1:                           /* Aborted enter */
-       if (strcmp(last_replace, ""))
+       if (last_replace[0] != '\0')
            answer = mallocstrcpy(answer, last_replace);
        statusbar(_("Replace Cancelled"));
        replace_abort();
@@ -620,7 +621,7 @@ int do_replace_loop(char *prevanswer, filestruct *begin, int *beginx,
         }
     }
 
-    if (ISSET(PICO_MODE) && !strcmp(answer, ""))
+    if (ISSET(PICO_MODE) && answer[0] == '\0')
        answer = mallocstrcpy(answer, last_replace);
 
     last_replace = mallocstrcpy(last_replace, answer);
@@ -739,7 +740,7 @@ int do_replace(void)
     }
 
     /* Again, there was a previous string, but they deleted it and hit enter */
-    if (!ISSET(PICO_MODE) && !strcmp(answer, "")) {
+    if (!ISSET(PICO_MODE) && answer[0] == '\0') {
        statusbar(_("Replace Cancelled"));
        replace_abort();
        return 0;
@@ -747,7 +748,7 @@ int do_replace(void)
 
      /* If answer is now == "", then PICO_MODE is set.  So, copy
        last_search into answer (and prevanswer)... */
-    if (!strcmp(answer, "")) {
+    if (answer[0] == '\0') {
        answer = mallocstrcpy(answer, last_search);
        prevanswer = mallocstrcpy(prevanswer, last_search);
     } else {
@@ -757,7 +758,7 @@ int do_replace(void)
 
     if (ISSET(PICO_MODE)) {
        buf = charalloc(strlen(last_replace) + 5);
-       if (strcmp(last_replace, "")) {
+       if (last_replace[0] != '\0') {
            if (strlen(last_replace) > (COLS / 3)) {
                strncpy(buf, last_replace, COLS / 3);
                sprintf(&buf[COLS / 3 - 1], "...");
@@ -857,7 +858,6 @@ int do_gotoline_void(void)
 #if (defined ENABLE_MULTIBUFFER || !defined DISABLE_SPELLER)
 void do_gotopos(int line, int pos_x, int pos_y, int pos_placewewant)
 {
-
     /* since do_gotoline() resets the x-coordinate but not the
        y-coordinate, set the coordinates up this way */
     current_y = pos_y;
@@ -877,7 +877,6 @@ void do_gotopos(int line, int pos_x, int pos_y, int pos_placewewant)
 #endif
 
 #if !defined(NANO_SMALL) && defined(HAVE_REGEX_H)
-
 int do_find_bracket(void)
 {
     char ch_under_cursor, wanted_ch;
diff --git a/winio.c b/winio.c
index 6883d23c1d52bd604f82952505e5b01a3f99860a..9a9fe83da75b661d85862694323c45fb403dc214 100644 (file)
--- a/winio.c
+++ b/winio.c
@@ -91,7 +91,6 @@ int xpt(filestruct * fileptr, int index)
     return tabs;
 }
 
-
 /* Return the actual place on the screen of current->data[current_x], which 
    should always be > current_x */
 int xplustabs(void)
@@ -99,7 +98,6 @@ int xplustabs(void)
     return xpt(current, current_x);
 }
 
-
 /* Return what current_x should be, given xplustabs() for the line, 
  * given a start position in the filestruct's data */
 int actual_x_from_start(filestruct * fileptr, int xplus, int start)
@@ -111,19 +109,20 @@ int actual_x_from_start(filestruct * fileptr, int xplus, int start)
 
     for (i = start; tot <= xplus && fileptr->data[i] != 0; i++, tot++)
        if (fileptr->data[i] == NANO_CONTROL_I) {
-           if (tot % tabsize == 0)
-               tot++;
-           else
+           if (tot % tabsize != 0)
                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)
+       else if (fileptr->data[i] < 32 || fileptr->data[i] == 127) {
+           i++;
            tot += 2;
+       }
 
 #ifdef DEBUG
     fprintf(stderr, _("actual_x_from_start for xplus=%d returned %d\n"),
            xplus, i);
 #endif
+
     return i - start;
 }
 
@@ -151,7 +150,7 @@ int strnlenpt(char *buf, int size)
        } else if (buf[i] & 0x80)
            /* Make 8 bit chars only 1 column! */
            ;
-       else if (buf[i] < 32)
+       else if (buf[i] < 32 || buf[i] == 127)
            tabs++;
     }
 
@@ -163,7 +162,6 @@ int strlenpt(char *buf)
     return strnlenpt(buf, strlen(buf));
 }
 
-
 /* resets current_y, based on the position of current, and puts the cursor at 
    (current_y, current_x) */
 void reset_cursor(void)
@@ -510,7 +508,7 @@ int nanogetstr(int allowtabs, char *buf, char *def, shortcut *s,
     free(inputbuf);
 
     /* In pico mode, just check for a blank answer here */
-    if (((ISSET(PICO_MODE)) && !strcmp(answer, "")))
+    if (ISSET(PICO_MODE) && answer[0] == '\0')
        return -2;
     else
        return 0;
@@ -546,7 +544,7 @@ void titlebar(char *path)
 
     namelen = strlen(what);
 
-    if (!strcmp(what, ""))
+    if (what[0] == '\0')
        mvwaddstr(topwin, 0, COLS / 2 - 6, _("New Buffer"));
     else {
        if (namelen > space) {
@@ -567,7 +565,8 @@ void titlebar(char *path)
     }
     if (ISSET(MODIFIED))
        mvwaddstr(topwin, 0, COLS - 10, _("Modified"));
-
+    else if (ISSET(VIEW_MODE))
+       mvwaddstr(topwin, 0, COLS - 10, _("View"));
 
 #ifdef ENABLE_COLOR
     color_off(topwin, COLOR_TITLEBAR);
@@ -1170,7 +1169,7 @@ void update_line(filestruct * fileptr, int index)
 
     fileptr->data[pos] = '\0';
 
-    /* Now, Paint the line */
+    /* Now, paint the line */
     if (current == fileptr && index > COLS - 2) {
        /* This handles when the current line is beyond COLS */
        /* It requires figuring out what page we're on      */