diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2015-10-21 09:34:09 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2015-10-21 09:34:09 +0000 |
commit | a76fdea9fc923583461ee9149120a677fe6a8bae (patch) | |
tree | e32da41d359126f5ccc7bff7f5431fa76276b8a4 /parse.y | |
parent | 5fe691934438438e33cde5890bc3b6696537e538 (diff) | |
download | ruby-a76fdea9fc923583461ee9149120a677fe6a8bae.tar.gz |
parse.y: magic comment w/o indicators
* parse.y (parser_magic_comment): allow a sole magic comment without
indicators, neither other non-space comments. [Feature #8976]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@52208 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'parse.y')
-rw-r--r-- | parse.y | 25 |
1 files changed, 19 insertions, 6 deletions
@@ -6978,6 +6978,7 @@ magic_comment_marker(const char *str, long len) static int parser_magic_comment(struct parser_params *parser, const char *str, long len) { + int indicator = 0; VALUE name = 0, val = 0; const char *beg, *end, *vbeg, *vend; #define str_copy(_s, _p, _n) ((_s) \ @@ -6986,10 +6987,13 @@ parser_magic_comment(struct parser_params *parser, const char *str, long len) : (void)((_s) = STR_NEW((_p), (_n)))) if (len <= 7) return FALSE; - if (!(beg = magic_comment_marker(str, len))) return FALSE; - if (!(end = magic_comment_marker(beg, str + len - beg))) return FALSE; - str = beg; - len = end - beg - 3; + if (!!(beg = magic_comment_marker(str, len))) { + if (!(end = magic_comment_marker(beg, str + len - beg))) + return FALSE; + indicator = TRUE; + str = beg; + len = end - beg - 3; + } /* %r"([^\\s\'\":;]+)\\s*:\\s*(\"(?:\\\\.|[^\"])*\"|[^\"\\s;]+)[\\s;]*" */ while (len > 0) { @@ -7017,7 +7021,10 @@ parser_magic_comment(struct parser_params *parser, const char *str, long len) } for (end = str; len > 0 && ISSPACE(*str); str++, --len); if (!len) break; - if (*str != ':') continue; + if (*str != ':') { + if (!indicator) return FALSE; + continue; + } do str++; while (--len > 0 && ISSPACE(*str)); if (!len) break; @@ -7038,7 +7045,13 @@ parser_magic_comment(struct parser_params *parser, const char *str, long len) for (vbeg = str; len > 0 && *str != '"' && *str != ';' && !ISSPACE(*str); --len, str++); vend = str; } - while (len > 0 && (*str == ';' || ISSPACE(*str))) --len, str++; + if (indicator) { + while (len > 0 && (*str == ';' || ISSPACE(*str))) --len, str++; + } + else { + while (len > 0 && (ISSPACE(*str))) --len, str++; + if (len) return FALSE; + } n = end - beg; str_copy(name, beg, n); |