summaryrefslogtreecommitdiffstats
path: root/usr.bin/make
diff options
context:
space:
mode:
authorsteve <steve@FreeBSD.org>1996-09-22 02:28:36 +0000
committersteve <steve@FreeBSD.org>1996-09-22 02:28:36 +0000
commita43b707795a51c0af5320d933cbf0d274a3661b4 (patch)
treea2c9ef65b1d82123e4257224bc26b25928f7c74a /usr.bin/make
parent29accf9e0f060860daa99411dc2966ee23229fb5 (diff)
downloadFreeBSD-src-a43b707795a51c0af5320d933cbf0d274a3661b4.zip
FreeBSD-src-a43b707795a51c0af5320d933cbf0d274a3661b4.tar.gz
Fix for PR# 1095, make's continuation line handling buggy
when used with .elif. Additional fixes include: - fix continuation line handling when using .for - plug up a memory leak
Diffstat (limited to 'usr.bin/make')
-rw-r--r--usr.bin/make/buf.c25
-rw-r--r--usr.bin/make/buf.h1
-rw-r--r--usr.bin/make/parse.c80
3 files changed, 61 insertions, 45 deletions
diff --git a/usr.bin/make/buf.c b/usr.bin/make/buf.c
index a4ecaf6..68315e7 100644
--- a/usr.bin/make/buf.c
+++ b/usr.bin/make/buf.c
@@ -434,3 +434,28 @@ Buf_Destroy (buf, freeData)
}
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;
+}
diff --git a/usr.bin/make/buf.h b/usr.bin/make/buf.h
index 3eb9b68..169e004 100644
--- a/usr.bin/make/buf.h
+++ b/usr.bin/make/buf.h
@@ -76,5 +76,6 @@ void Buf_Discard __P((Buffer, int));
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 */
diff --git a/usr.bin/make/parse.c b/usr.bin/make/parse.c
index f99f186..4e06ce4 100644
--- a/usr.bin/make/parse.c
+++ b/usr.bin/make/parse.c
@@ -2009,54 +2009,44 @@ ParseSkipLine(skip)
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");
+ Buf_Destroy(buf, TRUE);
+ 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;
}
OpenPOWER on IntegriCloud