Date: Sun, 14 Sep 2014 16:46:30 +0000 (UTC) From: Jilles Tjoelker <jilles@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r271593 - in head/bin/sh: . tests/parser Message-ID: <201409141646.s8EGkUHg004428@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: jilles Date: Sun Sep 14 16:46:30 2014 New Revision: 271593 URL: http://svnweb.freebsd.org/changeset/base/271593 Log: sh: Remove arbitrary length limit on << EOF markers. This also simplifies the code. Added: head/bin/sh/tests/parser/heredoc12.0 (contents, props changed) Modified: head/bin/sh/input.c head/bin/sh/input.h head/bin/sh/parser.c head/bin/sh/tests/parser/Makefile Modified: head/bin/sh/input.c ============================================================================== --- head/bin/sh/input.c Sun Sep 14 16:27:49 2014 (r271592) +++ head/bin/sh/input.c Sun Sep 14 16:46:30 2014 (r271593) @@ -116,33 +116,6 @@ resetinput(void) } -/* - * Read a line from the script. - */ - -char * -pfgets(char *line, int len) -{ - char *p = line; - int nleft = len; - int c; - - while (--nleft > 0) { - c = pgetc_macro(); - if (c == PEOF) { - if (p == line) - return NULL; - break; - } - *p++ = c; - if (c == '\n') - break; - } - *p = '\0'; - return line; -} - - /* * Read a character from the script, returning PEOF on end of file. Modified: head/bin/sh/input.h ============================================================================== --- head/bin/sh/input.h Sun Sep 14 16:27:49 2014 (r271592) +++ head/bin/sh/input.h Sun Sep 14 16:46:30 2014 (r271593) @@ -48,7 +48,6 @@ struct alias; struct parsefile; void resetinput(void); -char *pfgets(char *, int); int pgetc(void); int preadbuffer(void); int preadateof(void); Modified: head/bin/sh/parser.c ============================================================================== --- head/bin/sh/parser.c Sun Sep 14 16:27:49 2014 (r271592) +++ head/bin/sh/parser.c Sun Sep 14 16:46:30 2014 (r271593) @@ -66,7 +66,6 @@ __FBSDID("$FreeBSD$"); * Shell command parser. */ -#define EOFMARKLEN 79 #define PROMPTLEN 128 /* values of checkkwd variable */ @@ -718,7 +717,6 @@ parsefname(void) if (n->type == NHERE) { struct heredoc *here = heredoc; struct heredoc *p; - int i; if (quoteflag == 0) n->type = NXHERE; @@ -727,7 +725,7 @@ parsefname(void) while (*wordtext == '\t') wordtext++; } - if (! noexpand(wordtext) || (i = strlen(wordtext)) == 0 || i > EOFMARKLEN) + if (! noexpand(wordtext)) synerror("Illegal eof marker for << redirection"); rmescapes(wordtext); here->eofmark = wordtext; @@ -953,28 +951,27 @@ struct tokenstate */ static int -checkend(int c, const char *eofmark, char *line, size_t sizeof_line, - int striptabs) +checkend(int c, const char *eofmark, int striptabs) { if (striptabs) { while (c == '\t') c = pgetc(); } if (c == *eofmark) { - if (pfgets(line, sizeof_line) != NULL) { - const char *p, *q; + int c2; + const char *q; - p = line; - for (q = eofmark + 1 ; *q && *p == *q ; p++, q++); - if ((*p == '\0' || *p == '\n') && *q == '\0') { - c = PEOF; - if (*p == '\n') { - plinno++; - needprompt = doprompt; - } - } else { - pushstring(line, strlen(line), NULL); + for (q = eofmark + 1; c2 = pgetc(), *q != '\0' && c2 == *q; q++) + ; + if ((c2 == PEOF || c2 == '\n') && *q == '\0') { + c = PEOF; + if (c2 == '\n') { + plinno++; + needprompt = doprompt; } + } else { + pungetc(); + pushstring(eofmark + 1, q - (eofmark + 1), NULL); } } return (c); @@ -1316,7 +1313,6 @@ readtoken1(int firstc, char const *initi int c = firstc; char *out; int len; - char line[EOFMARKLEN + 1]; struct nodelist *bqlist; int quotef; int newvarnest; @@ -1340,7 +1336,7 @@ readtoken1(int firstc, char const *initi loop: { /* for each line, until end of word */ if (eofmark) /* set c to PEOF if at end of here document */ - c = checkend(c, eofmark, line, sizeof(line), striptabs); + c = checkend(c, eofmark, striptabs); for (;;) { /* until end of line or end of word */ CHECKSTRSPACE(4, out); /* permit 4 calls to USTPUTC */ @@ -2032,7 +2028,7 @@ expandstr(const char *ps) parser_temp = NULL; setinputstring(ps, 1); doprompt = 0; - readtoken1(pgetc(), DQSYNTAX, "\n\n", 0); + readtoken1(pgetc(), DQSYNTAX, "", 0); if (backquotelist != NULL) error("Command substitution not allowed here"); Modified: head/bin/sh/tests/parser/Makefile ============================================================================== --- head/bin/sh/tests/parser/Makefile Sun Sep 14 16:27:49 2014 (r271592) +++ head/bin/sh/tests/parser/Makefile Sun Sep 14 16:46:30 2014 (r271593) @@ -54,6 +54,7 @@ FILES+= heredoc8.0 FILES+= heredoc9.0 FILES+= heredoc10.0 FILES+= heredoc11.0 +FILES+= heredoc12.0 FILES+= no-space1.0 FILES+= no-space2.0 FILES+= only-redir1.0 Added: head/bin/sh/tests/parser/heredoc12.0 ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/bin/sh/tests/parser/heredoc12.0 Sun Sep 14 16:46:30 2014 (r271593) @@ -0,0 +1,47 @@ +# $FreeBSD$ + +failures=0 + +check() { + if ! eval "[ $* ]"; then + echo "Failed: $*" + : $((failures += 1)) + fi +} + +longmark=`printf %01000d 4` +longmarkstripped=`printf %0999d 0` + +check '"$(cat <<'"$longmark +$longmark"' +echo yes)" = "yes"' + +check '"$(cat <<\'"$longmark +$longmark"' +echo yes)" = "yes"' + +check '"$(cat <<'"$longmark +yes +$longmark"' +)" = "yes"' + +check '"$(cat <<\'"$longmark +yes +$longmark"' +)" = "yes"' + +check '"$(cat <<'"$longmark +$longmarkstripped +$longmark. +$longmark"' +)" = "'"$longmarkstripped +$longmark."'"' + +check '"$(cat <<\'"$longmark +$longmarkstripped +$longmark. +$longmark"' +)" = "'"$longmarkstripped +$longmark."'"' + +exit $((failures != 0))
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201409141646.s8EGkUHg004428>