mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
parse.y: function parser_mixed_error & parser_mixed_escape
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@66919 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
7e68efbc95
commit
6375c68f88
1 changed files with 25 additions and 18 deletions
43
parse.y
43
parse.y
|
@ -5684,6 +5684,26 @@ parser_update_heredoc_indent(struct parser_params *p, int c)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
parser_mixed_error(struct parser_params *p, rb_encoding *enc1, rb_encoding *enc2)
|
||||||
|
{
|
||||||
|
static const char mixed_msg[] = "%s mixed within %s source";
|
||||||
|
const char *n1 = rb_enc_name(enc1), *n2 = rb_enc_name(enc2);
|
||||||
|
const size_t len = sizeof(mixed_msg) - 4 + strlen(n1) + strlen(n2);
|
||||||
|
char *errbuf = ALLOCA_N(char, len);
|
||||||
|
snprintf(errbuf, len, mixed_msg, n1, n2);
|
||||||
|
yyerror0(errbuf);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
parser_mixed_escape(struct parser_params *p, const char *beg, rb_encoding *enc1, rb_encoding *enc2)
|
||||||
|
{
|
||||||
|
const char *pos = p->lex.pcur;
|
||||||
|
p->lex.pcur = beg;
|
||||||
|
parser_mixed_error(p, enc1, enc2);
|
||||||
|
p->lex.pcur = pos;
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
tokadd_string(struct parser_params *p,
|
tokadd_string(struct parser_params *p,
|
||||||
int func, int term, int paren, long *nest,
|
int func, int term, int paren, long *nest,
|
||||||
|
@ -5691,25 +5711,12 @@ tokadd_string(struct parser_params *p,
|
||||||
{
|
{
|
||||||
int c;
|
int c;
|
||||||
rb_encoding *enc = 0;
|
rb_encoding *enc = 0;
|
||||||
char *errbuf = 0;
|
bool erred = false;
|
||||||
static const char mixed_msg[] = "%s mixed within %s source";
|
|
||||||
|
|
||||||
#define mixed_error(enc1, enc2) if (!errbuf) { \
|
#define mixed_error(enc1, enc2) \
|
||||||
size_t len = sizeof(mixed_msg) - 4; \
|
(void)(erred || (parser_mixed_error(p, enc1, enc2), erred = true))
|
||||||
len += strlen(rb_enc_name(enc1)); \
|
#define mixed_escape(beg, enc1, enc2) \
|
||||||
len += strlen(rb_enc_name(enc2)); \
|
(void)(erred || (parser_mixed_escape(p, beg, enc1, enc2), erred = true))
|
||||||
errbuf = ALLOCA_N(char, len); \
|
|
||||||
snprintf(errbuf, len, mixed_msg, \
|
|
||||||
rb_enc_name(enc1), \
|
|
||||||
rb_enc_name(enc2)); \
|
|
||||||
yyerror0(errbuf); \
|
|
||||||
}
|
|
||||||
#define mixed_escape(beg, enc1, enc2) do { \
|
|
||||||
const char *pos = p->lex.pcur; \
|
|
||||||
p->lex.pcur = (beg); \
|
|
||||||
mixed_error((enc1), (enc2)); \
|
|
||||||
p->lex.pcur = pos; \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
while ((c = nextc(p)) != -1) {
|
while ((c = nextc(p)) != -1) {
|
||||||
if (p->heredoc_indent > 0) {
|
if (p->heredoc_indent > 0) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue