commit cf0a0fc940b33a9213993448e2d2d8cf217108b0
Author:     Roberto E. Vargas Caballero <[email protected]>
AuthorDate: Fri Jan 1 17:40:34 2016 +0100
Commit:     sin <[email protected]>
CommitDate: Sat Jan 2 09:46:48 2016 +0000

    ed: Fix error introduced in b19d708
    
    This patch introduced init() function, which removed the initialization
    code of savfname in doread, but this is incorrect, because savfname
    can be initialized with a r command if savfname is empty.

diff --git a/ed.c b/ed.c
index 5369d60..1ecd0d9 100644
--- a/ed.c
+++ b/ed.c
@@ -702,7 +702,7 @@ chkprint(int flag)
 }
 
 static char *
-getfname(void)
+getfname(char comm)
 {
        int c;
        char *bp;
@@ -721,6 +721,8 @@ getfname(void)
                error("file name too long");
        } else {
                *bp = '\0';
+               if (savfname[0] == '\0' || comm == 'e' || comm == 'f')
+                       strcpy(savfname, fname);
                return fname;
        }
        return NULL; /* not reached */
@@ -1015,7 +1017,7 @@ subst(int nth)
 static void
 docmd(void)
 {
-       char *s, cmd;
+       char cmd;
        int rep = 0, c, line3, num, trunc;
 
 repeat:
@@ -1073,13 +1075,13 @@ repeat:
                trunc = 1;
        case 'W':
                deflines(nextln(0), lastln);
-               dowrite(getfname(), trunc);
+               dowrite(getfname(cmd), trunc);
                break;
        case 'r':
                if (nlines > 1)
                        goto bad_address;
                deflines(lastln, lastln);
-               doread(getfname());
+               doread(getfname(cmd));
                break;
        case 'd':
                chkprint(1);
@@ -1190,10 +1192,11 @@ repeat:
        case 'f':
                if (nlines > 0)
                        goto unexpected;
-               if (!strcmp(s = getfname(), savfname))
-                       puts(savfname);
+               if (back(input()) != '\n')
+                       getfname(cmd);
                else
-                       strcpy(savfname, s);
+                       puts(savfname);
+               chkprint(0);
                break;
        case 'E':
                modflag = 0;
@@ -1202,7 +1205,7 @@ repeat:
                        goto unexpected;
                if (modflag)
                        goto modified;
-               strcpy(savfname, getfname());
+               getfname(cmd);
                setscratch();
                deflines(curln, curln);
                doread(savfname);

Reply via email to