diff options
author | Steve Price <steve@FreeBSD.org> | 1996-09-22 02:28:36 +0000 |
---|---|---|
committer | Steve Price <steve@FreeBSD.org> | 1996-09-22 02:28:36 +0000 |
commit | 6bf3beb134d3a2ad82485eff0afab2ee26f0ac69 (patch) | |
tree | a2c9ef65b1d82123e4257224bc26b25928f7c74a /usr.bin/make | |
parent | 2e66d503c6f1ff39ed550d8405d7c92ac545a744 (diff) | |
download | src-6bf3beb134d3a2ad82485eff0afab2ee26f0ac69.tar.gz src-6bf3beb134d3a2ad82485eff0afab2ee26f0ac69.zip |
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
Notes
Notes:
svn path=/head/; revision=18456
Diffstat (limited to 'usr.bin/make')
-rw-r--r-- | usr.bin/make/buf.c | 25 | ||||
-rw-r--r-- | usr.bin/make/buf.h | 1 | ||||
-rw-r--r-- | usr.bin/make/parse.c | 80 |
3 files changed, 61 insertions, 45 deletions
diff --git a/usr.bin/make/buf.c b/usr.bin/make/buf.c index a4ecaf676369..68315e75c8a0 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 3eb9b68f2d15..169e004f3aaf 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 f99f186990a3..4e06ce45b80c 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; } |