Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 15 Sep 1996 17:18:30 -0500
From:      Steve Price <sprice@hiwaay.net>
To:        asami@cs.berkeley.edu
Cc:        hackers@freebsd.org, FreeBSD-gnats-submit@freebsd.org
Subject:   Re: bin/1095: make's continuation line handling buggy when used with .elif
Message-ID:  <323C80B6.15FB7483@hiwaay.net>

next in thread | raw e-mail | index | archive | help
Attached is a patch that fixes the problem pointed out in
bin/1095.

steve[~]$ cat > Makefile1
all:
.if defined(foo)
        @true
.elif !defined(foo) && !defined(foo)
        @echo ok
.else
        @echo not ok
.endif
steve[~]$ make -f Makefile1
ok
steve[~]$ cat > Makefile2
all:
.if defined(foo)
        @true
.else
.if !defined(foo) && \
        !defined(foo)
        @echo ok
.else
        @echo not ok
.endif
.endif
steve[~]$ make -f Makefile2
ok
steve[~]$ cat > Makefile3
all:
.if defined(foo)
        @true
.elif !defined(foo) && \
        !defined(foo)
        @echo ok
.else
        @echo not ok
.endif
steve[~]$ make -f Makefile3
ok
steve[~]$ 


Steve

Index: buf.c
===================================================================
RCS file: /u/FreeBSD/cvs/src/usr.bin/make/buf.c,v
retrieving revision 1.3
diff -u -r1.3 buf.c
--- buf.c	1995/05/30 06:31:48	1.3
+++ buf.c	1996/09/14 14:49:25
@@ -434,3 +434,28 @@
     }
     free ((char *)buf);
 }
+ 
+/*-
+ *-----------------------------------------------------------------------
+ * Buf_ReplaceLastByte --
+ *	Replace the last byte in a buffer.
+ *
+ * Results:
+ *	None.
+ *
+ * Side Effects:
+ *	If the buffer was empty intially, then a new byte will be added.
+ *	Otherwise, the last byte is overwritten.
+ *
+ *-----------------------------------------------------------------------
+ */
+void
+Buf_ReplaceLastByte (buf, byte)
+    Buffer buf;	/* buffer to augment */
+    Byte byte;	/* byte to be written */
+{
+    if (buf->inPtr == buf->outPtr)
+        Buf_AddByte(buf, byte);
+    else
+        *(buf->inPtr - 1) = byte;
+}
Index: buf.h
===================================================================
RCS file: /u/FreeBSD/cvs/src/usr.bin/make/buf.h,v
retrieving revision 1.2
diff -u -r1.2 buf.h
--- buf.h	1995/01/23 21:00:21	1.2
+++ buf.h	1996/09/14 14:36:19
@@ -76,5 +76,6 @@
 int Buf_Size __P((Buffer));
 Buffer Buf_Init __P((int));
 void Buf_Destroy __P((Buffer, Boolean));
+void Buf_ReplaceLastByte __P((Buffer, Byte));
 
 #endif /* _BUF_H */
Index: parse.c
===================================================================
RCS file: /u/FreeBSD/cvs/src/usr.bin/make/parse.c,v
retrieving revision 1.9
diff -u -r1.9 parse.c
--- parse.c	1996/09/12 03:03:25	1.9
+++ parse.c	1996/09/14 14:46:19
@@ -2009,54 +2009,43 @@
     int skip; 		/* Skip lines that don't start with . */
 {
     char *line;
-    int c, lastc = '\0', lineLength;
+    int c, lastc, lineLength = 0;
     Buffer buf;
 
-    c = ParseReadc();
+    buf = Buf_Init(MAKE_BSIZE);
 
-    if (skip) {
-	/*
-	 * Skip lines until get to one that begins with a
-	 * special char.
-	 */
-	while ((c != '.') && (c != EOF)) {
-	    while (((c != '\n') || (lastc == '\\')) && (c != EOF))
-	    {
-		/*
-		 * Advance to next unescaped newline
-		 */
-		if ((lastc = c) == '\n') {
-		    lineno++;
-		}
-		c = ParseReadc();
-	    }
-	    lineno++;
-
-	    lastc = c;
-	    c = ParseReadc ();
-	}
-    }
-
-    if (c == EOF) {
-	Parse_Error (PARSE_FATAL, "Unclosed conditional/for loop");
-	return ((char *)NULL);
-    }
-
-    /*
-     * Read the entire line into buf
-     */
-    buf = Buf_Init (MAKE_BSIZE);
-    if (c != '\n') {
-	do {
-	    Buf_AddByte (buf, (Byte)c);
-	    c = ParseReadc();
-	} while ((c != '\n') && (c != EOF));
-    }
-    lineno++;
-
-    Buf_AddByte (buf, (Byte)'\0');
-    line = (char *)Buf_GetAll (buf, &lineLength);
-    Buf_Destroy (buf, FALSE);
+    do {
+        Buf_Discard(buf, lineLength);
+        lastc = '\0';
+
+        while (((c = ParseReadc()) != '\n' || lastc == '\\')
+               && c != EOF) {
+            if (c == '\n') {
+                Buf_ReplaceLastByte(buf, (Byte)' ');
+                lineno++;
+
+                while ((c = ParseReadc()) == ' ' || c == '\t');
+
+                if (c == EOF)
+                    break;
+            }
+
+            Buf_AddByte(buf, (Byte)c);
+            lastc = c;
+        }
+
+        if (c == EOF) {
+            Parse_Error(PARSE_FATAL, "Unclosed conditional/for loop");
+            return((char *)NULL);
+        }
+
+        lineno++;
+        Buf_AddByte(buf, (Byte)c);
+        Buf_AddByte(buf, (Byte)'\0');
+        line = (char *)Buf_GetAll(buf, &lineLength);
+    } while (skip == 1 && line[0] != '.');
+
+    Buf_Destroy(buf, FALSE);
     return line;
 }



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?323C80B6.15FB7483>