summaryrefslogtreecommitdiff
path: root/parse.y
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-12-17 16:21:21 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-12-17 16:21:21 +0000
commitbf04c0946f8892e4d54553f0b06b8cc586c93281 (patch)
treec9af2f0a888ce98692807871b65ac15381578ec6 /parse.y
parent6ed9bdd463cd5365fdf91b94a8b9d83e7765ef8b (diff)
* parse.y (parser_encode_length): chomp eol style modifiers.
* parse.y (parser_magic_comment): ditto. * parse.y (set_file_encoding): ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@14277 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'parse.y')
-rw-r--r--parse.y32
1 files changed, 28 insertions, 4 deletions
diff --git a/parse.y b/parse.y
index 43d3864555..d4535c5929 100644
--- a/parse.y
+++ b/parse.y
@@ -5704,6 +5704,24 @@ lvar_defined_gen(struct parser_params *parser, ID id)
}
/* emacsen -*- hack */
+static int
+parser_encode_length(struct parser_params *parser, const char *name, int len)
+{
+ int nlen;
+
+ if (len > 5 && name[nlen = len - 5] == '-') {
+ if (rb_memcicmp(name + nlen + 1, "unix", 4) == 0)
+ return nlen;
+ }
+ if (len > 4 && name[nlen = len - 5] == '-') {
+ if (rb_memcicmp(name + nlen + 1, "dos", 3) == 0)
+ return nlen;
+ if (rb_memcicmp(name + nlen + 1, "mac", 3) == 0)
+ return nlen;
+ }
+ return len;
+}
+
static void
parser_set_encode(struct parser_params *parser, const char *name)
{
@@ -5715,6 +5733,7 @@ parser_set_encode(struct parser_params *parser, const char *name)
}
#ifndef RIPPER
+typedef int (*rb_magic_comment_length_t)(struct parser_params *parser, const char *name, int len);
typedef void (*rb_magic_comment_setter_t)(struct parser_params *parser, const char *name, const char *val);
static void
@@ -5728,11 +5747,12 @@ magic_comment_encoding(struct parser_params *parser, const char *name, const cha
struct magic_comment {
const char *name;
rb_magic_comment_setter_t func;
+ rb_magic_comment_length_t length;
};
static const struct magic_comment magic_comments[] = {
- {"coding", magic_comment_encoding},
- {"encoding", magic_comment_encoding},
+ {"coding", magic_comment_encoding, parser_encode_length},
+ {"encoding", magic_comment_encoding, parser_encode_length},
};
#endif
@@ -5839,7 +5859,11 @@ parser_magic_comment(struct parser_params *parser, const char *str, int len)
#ifndef RIPPER
do {
if (strncasecmp(p->name, RSTRING_PTR(name), n) == 0) {
- str_copy(val, vbeg, vend - vbeg);
+ n = vend - vbeg;
+ if (p->length) {
+ n = (*p->length)(parser, vbeg, n);
+ }
+ str_copy(val, vbeg, n);
(*p->func)(parser, RSTRING_PTR(name), RSTRING_PTR(val));
break;
}
@@ -5890,7 +5914,7 @@ set_file_encoding(struct parser_params *parser, const char *str, const char *sen
}
beg = str;
while ((*str == '-' || *str == '_' || ISALNUM(*str)) && ++str < send);
- s = rb_str_new(beg, str - beg);
+ s = rb_str_new(beg, parser_encode_length(parser, beg, str - beg));
parser_set_encode(parser, RSTRING_PTR(s));
rb_str_resize(s, 0);
}