From 6bf3beb134d3a2ad82485eff0afab2ee26f0ac69 Mon Sep 17 00:00:00 2001 From: Steve Price Date: Sun, 22 Sep 1996 02:28:36 +0000 Subject: [PATCH] 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 --- usr.bin/make/buf.c | 25 +++++++++++++++ usr.bin/make/buf.h | 1 + usr.bin/make/parse.c | 72 +++++++++++++++++++------------------------- 3 files changed, 57 insertions(+), 41 deletions(-) diff --git a/usr.bin/make/buf.c b/usr.bin/make/buf.c index a4ecaf67636..68315e75c8a 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 3eb9b68f2d1..169e004f3aa 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 f99f186990a..4e06ce45b80 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++; + do { + Buf_Discard(buf, lineLength); + lastc = '\0'; - lastc = c; - c = ParseReadc (); - } - } + while (((c = ParseReadc()) != '\n' || lastc == '\\') + && c != EOF) { + if (c == '\n') { + Buf_ReplaceLastByte(buf, (Byte)' '); + lineno++; - if (c == EOF) { - Parse_Error (PARSE_FATAL, "Unclosed conditional/for loop"); - return ((char *)NULL); - } + while ((c = ParseReadc()) == ' ' || c == '\t'); - /* - * 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++; + if (c == EOF) + break; + } - Buf_AddByte (buf, (Byte)'\0'); - line = (char *)Buf_GetAll (buf, &lineLength); - Buf_Destroy (buf, FALSE); + 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; }