зеркало из https://github.com/github/ruby.git
* ruby.c (moreswitches): splits option string and passes arguments.
* ruby.c (proc_options): checks if allowed in RUBYOPT. * ruby.c (process_options): allows long style options in RUBYOPT. * ruby.c (load_file_internal): ditto in shebang. [ruby-dev:36979] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@20053 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
Родитель
2db25b6ba0
Коммит
5cdd7f52cc
10
ChangeLog
10
ChangeLog
|
@ -1,3 +1,13 @@
|
||||||
|
Thu Oct 30 10:34:20 2008 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||||
|
|
||||||
|
* ruby.c (moreswitches): splits option string and passes arguments.
|
||||||
|
|
||||||
|
* ruby.c (proc_options): checks if allowed in RUBYOPT.
|
||||||
|
|
||||||
|
* ruby.c (process_options): allows long style options in RUBYOPT.
|
||||||
|
|
||||||
|
* ruby.c (load_file_internal): ditto in shebang. [ruby-dev:36979]
|
||||||
|
|
||||||
Thu Oct 30 09:31:45 2008 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
Thu Oct 30 09:31:45 2008 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||||
|
|
||||||
* encoding.c (rb_locale_encoding): makes an alias for locale.
|
* encoding.c (rb_locale_encoding): makes an alias for locale.
|
||||||
|
|
189
ruby.c
189
ruby.c
|
@ -514,27 +514,53 @@ process_sflag(struct cmdline_options *opt)
|
||||||
|
|
||||||
NODE *rb_parser_append_print(VALUE, NODE *);
|
NODE *rb_parser_append_print(VALUE, NODE *);
|
||||||
NODE *rb_parser_while_loop(VALUE, NODE *, int, int);
|
NODE *rb_parser_while_loop(VALUE, NODE *, int, int);
|
||||||
static int proc_options(int argc, char **argv, struct cmdline_options *opt);
|
static int proc_options(int argc, char **argv, struct cmdline_options *opt, int envopt);
|
||||||
|
|
||||||
static char *
|
static void
|
||||||
moreswitches(const char *s, struct cmdline_options *opt)
|
moreswitches(const char *s, struct cmdline_options *opt, int envopt)
|
||||||
{
|
{
|
||||||
int argc;
|
int argc, i;
|
||||||
char *argv[3];
|
char **argv, *p;
|
||||||
const char *p = s;
|
const char *ap = 0;
|
||||||
|
VALUE argstr, argary;
|
||||||
|
|
||||||
argc = 2;
|
while (ISSPACE(*s)) s++;
|
||||||
argv[0] = argv[2] = 0;
|
if (!*s) return;
|
||||||
while (*s && !ISSPACE(*s))
|
argstr = rb_str_tmp_new(strlen(s) + 2);
|
||||||
s++;
|
argary = rb_str_tmp_new(0);
|
||||||
argv[1] = ALLOCA_N(char, s - p + 2);
|
|
||||||
argv[1][0] = '-';
|
p = RSTRING_PTR(argstr);
|
||||||
strncpy(argv[1] + 1, p, s - p);
|
*p++ = ' ';
|
||||||
argv[1][s - p + 1] = '\0';
|
strcpy(p, s);
|
||||||
proc_options(argc, argv, opt);
|
ap = 0;
|
||||||
while (*s && ISSPACE(*s))
|
rb_str_cat(argary, (char *)&ap, sizeof(ap));
|
||||||
s++;
|
while (*p) {
|
||||||
return (char *)s;
|
ap = p;
|
||||||
|
rb_str_cat(argary, (char *)&ap, sizeof(ap));
|
||||||
|
while (*p && !ISSPACE(*p)) ++p;
|
||||||
|
if (!*p) break;
|
||||||
|
*p++ = '\0';
|
||||||
|
while (ISSPACE(*p)) ++p;
|
||||||
|
}
|
||||||
|
argc = RSTRING_LEN(argary) / sizeof(ap);
|
||||||
|
ap = 0;
|
||||||
|
rb_str_cat(argary, (char *)&ap, sizeof(ap));
|
||||||
|
argv = (char **)RSTRING_PTR(argary);
|
||||||
|
|
||||||
|
while ((i = proc_options(argc, argv, opt, envopt)) > 1 && (argc -= i) > 0) {
|
||||||
|
argv += i;
|
||||||
|
if (**argv != '-') {
|
||||||
|
*--*argv = '-';
|
||||||
|
}
|
||||||
|
if ((*argv)[1]) {
|
||||||
|
++argc;
|
||||||
|
--argv;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* get rid of GC */
|
||||||
|
rb_str_resize(argary, 0);
|
||||||
|
rb_str_resize(argstr, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define NAME_MATCH_P(name, str, len) \
|
#define NAME_MATCH_P(name, str, len) \
|
||||||
|
@ -619,7 +645,7 @@ set_external_encoding_once(struct cmdline_options *opt, const char *e, int elen)
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
proc_options(int argc, char **argv, struct cmdline_options *opt)
|
proc_options(int argc, char **argv, struct cmdline_options *opt, int envopt)
|
||||||
{
|
{
|
||||||
int n, argc0 = argc;
|
int n, argc0 = argc;
|
||||||
const char *s;
|
const char *s;
|
||||||
|
@ -635,14 +661,17 @@ proc_options(int argc, char **argv, struct cmdline_options *opt)
|
||||||
reswitch:
|
reswitch:
|
||||||
switch (*s) {
|
switch (*s) {
|
||||||
case 'a':
|
case 'a':
|
||||||
|
if (envopt) goto noenvopt;
|
||||||
opt->do_split = Qtrue;
|
opt->do_split = Qtrue;
|
||||||
s++;
|
s++;
|
||||||
goto reswitch;
|
goto reswitch;
|
||||||
|
|
||||||
case 'p':
|
case 'p':
|
||||||
|
if (envopt) goto noenvopt;
|
||||||
opt->do_print = Qtrue;
|
opt->do_print = Qtrue;
|
||||||
/* through */
|
/* through */
|
||||||
case 'n':
|
case 'n':
|
||||||
|
if (envopt) goto noenvopt;
|
||||||
opt->do_loop = Qtrue;
|
opt->do_loop = Qtrue;
|
||||||
s++;
|
s++;
|
||||||
goto reswitch;
|
goto reswitch;
|
||||||
|
@ -654,6 +683,7 @@ proc_options(int argc, char **argv, struct cmdline_options *opt)
|
||||||
goto reswitch;
|
goto reswitch;
|
||||||
|
|
||||||
case 'y':
|
case 'y':
|
||||||
|
if (envopt) goto noenvopt;
|
||||||
opt->yydebug = 1;
|
opt->yydebug = 1;
|
||||||
s++;
|
s++;
|
||||||
goto reswitch;
|
goto reswitch;
|
||||||
|
@ -696,34 +726,40 @@ proc_options(int argc, char **argv, struct cmdline_options *opt)
|
||||||
goto reswitch;
|
goto reswitch;
|
||||||
|
|
||||||
case 'c':
|
case 'c':
|
||||||
|
if (envopt) goto noenvopt;
|
||||||
opt->do_check = Qtrue;
|
opt->do_check = Qtrue;
|
||||||
s++;
|
s++;
|
||||||
goto reswitch;
|
goto reswitch;
|
||||||
|
|
||||||
case 's':
|
case 's':
|
||||||
|
if (envopt) goto noenvopt;
|
||||||
forbid_setid("-s");
|
forbid_setid("-s");
|
||||||
opt->sflag = 1;
|
opt->sflag = 1;
|
||||||
s++;
|
s++;
|
||||||
goto reswitch;
|
goto reswitch;
|
||||||
|
|
||||||
case 'h':
|
case 'h':
|
||||||
|
if (envopt) goto noenvopt;
|
||||||
usage(origarg.argv[0]);
|
usage(origarg.argv[0]);
|
||||||
rb_exit(EXIT_SUCCESS);
|
rb_exit(EXIT_SUCCESS);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'l':
|
case 'l':
|
||||||
|
if (envopt) goto noenvopt;
|
||||||
opt->do_line = Qtrue;
|
opt->do_line = Qtrue;
|
||||||
rb_output_rs = rb_rs;
|
rb_output_rs = rb_rs;
|
||||||
s++;
|
s++;
|
||||||
goto reswitch;
|
goto reswitch;
|
||||||
|
|
||||||
case 'S':
|
case 'S':
|
||||||
|
if (envopt) goto noenvopt;
|
||||||
forbid_setid("-S");
|
forbid_setid("-S");
|
||||||
opt->do_search = Qtrue;
|
opt->do_search = Qtrue;
|
||||||
s++;
|
s++;
|
||||||
goto reswitch;
|
goto reswitch;
|
||||||
|
|
||||||
case 'e':
|
case 'e':
|
||||||
|
if (envopt) goto noenvopt;
|
||||||
forbid_setid("-e");
|
forbid_setid("-e");
|
||||||
if (!*++s) {
|
if (!*++s) {
|
||||||
s = argv[1];
|
s = argv[1];
|
||||||
|
@ -753,11 +789,13 @@ proc_options(int argc, char **argv, struct cmdline_options *opt)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'i':
|
case 'i':
|
||||||
|
if (envopt) goto noenvopt;
|
||||||
forbid_setid("-i");
|
forbid_setid("-i");
|
||||||
ruby_set_inplace_mode(s + 1);
|
ruby_set_inplace_mode(s + 1);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'x':
|
case 'x':
|
||||||
|
if (envopt) goto noenvopt;
|
||||||
opt->xflag = Qtrue;
|
opt->xflag = Qtrue;
|
||||||
s++;
|
s++;
|
||||||
if (*s && chdir(s) < 0) {
|
if (*s && chdir(s) < 0) {
|
||||||
|
@ -767,6 +805,7 @@ proc_options(int argc, char **argv, struct cmdline_options *opt)
|
||||||
|
|
||||||
case 'C':
|
case 'C':
|
||||||
case 'X':
|
case 'X':
|
||||||
|
if (envopt) goto noenvopt;
|
||||||
s++;
|
s++;
|
||||||
if (!*s) {
|
if (!*s) {
|
||||||
s = argv[1];
|
s = argv[1];
|
||||||
|
@ -781,13 +820,16 @@ proc_options(int argc, char **argv, struct cmdline_options *opt)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'F':
|
case 'F':
|
||||||
|
if (envopt) goto noenvopt;
|
||||||
if (*++s) {
|
if (*++s) {
|
||||||
rb_fs = rb_reg_new(s, strlen(s), 0);
|
rb_fs = rb_reg_new(s, strlen(s), 0);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'E':
|
case 'E':
|
||||||
if (!*++s) goto next_encoding;
|
if (!*++s && (!--argc || !(s = *++argv))) {
|
||||||
|
rb_raise(rb_eRuntimeError, "missing argument for -E");
|
||||||
|
}
|
||||||
goto encoding;
|
goto encoding;
|
||||||
|
|
||||||
case 'U':
|
case 'U':
|
||||||
|
@ -847,6 +889,7 @@ proc_options(int argc, char **argv, struct cmdline_options *opt)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case '0':
|
case '0':
|
||||||
|
if (envopt) goto noenvopt;
|
||||||
{
|
{
|
||||||
int numlen;
|
int numlen;
|
||||||
int v;
|
int v;
|
||||||
|
@ -872,35 +915,36 @@ proc_options(int argc, char **argv, struct cmdline_options *opt)
|
||||||
goto switch_end;
|
goto switch_end;
|
||||||
}
|
}
|
||||||
s++;
|
s++;
|
||||||
if (strcmp("copyright", s) == 0)
|
|
||||||
|
# define is_option_end(c, allow_hyphen) \
|
||||||
|
(!(c) || (allow_hyphen && (c) == '-') || (c) == '=')
|
||||||
|
# define check_envopt(name, allow_envopt) \
|
||||||
|
((allow_envopt || !envopt) ? (void)0 : \
|
||||||
|
rb_raise(rb_eRuntimeError, "invalid switch in RUBYOPT: --" name))
|
||||||
|
# define need_argument(name, s) \
|
||||||
|
((*s++ ? !*s : (!--argc || !(s = *++argv))) ? \
|
||||||
|
rb_raise(rb_eRuntimeError, "missing argument for --" name) \
|
||||||
|
: (void)0)
|
||||||
|
# define is_option_with_arg(name, allow_hyphen, allow_envopt) \
|
||||||
|
(strncmp(name, s, n = sizeof(name) - 1) == 0 && is_option_end(s[n], allow_hyphen) ? \
|
||||||
|
(check_envopt(name, allow_envopt), s += n, need_argument(name, s), 1) : 0)
|
||||||
|
|
||||||
|
if (strcmp("copyright", s) == 0) {
|
||||||
|
if (envopt) goto noenvopt_long;
|
||||||
opt->copyright = 1;
|
opt->copyright = 1;
|
||||||
|
}
|
||||||
else if (strcmp("debug", s) == 0) {
|
else if (strcmp("debug", s) == 0) {
|
||||||
ruby_debug = Qtrue;
|
ruby_debug = Qtrue;
|
||||||
ruby_verbose = Qtrue;
|
ruby_verbose = Qtrue;
|
||||||
}
|
}
|
||||||
else if (strncmp("enable", s, n = 6) == 0 &&
|
else if (is_option_with_arg("enable", Qtrue, Qtrue)) {
|
||||||
(!s[n] || s[n] == '-' || s[n] == '=')) {
|
|
||||||
if ((s += n + 1)[-1] ? !*s : (!--argc || !(s = *++argv))) {
|
|
||||||
rb_raise(rb_eRuntimeError, "missing argument for --enable");
|
|
||||||
}
|
|
||||||
ruby_each_words(s, enable_option, &opt->disable);
|
ruby_each_words(s, enable_option, &opt->disable);
|
||||||
}
|
}
|
||||||
else if (strncmp("disable", s, n = 7) == 0 &&
|
else if (is_option_with_arg("disable", Qtrue, Qtrue)) {
|
||||||
(!s[n] || s[n] == '-' || s[n] == '=')) {
|
|
||||||
if ((s += n + 1)[-1] ? !*s : (!--argc || !(s = *++argv))) {
|
|
||||||
rb_raise(rb_eRuntimeError, "missing argument for --disable");
|
|
||||||
}
|
|
||||||
ruby_each_words(s, disable_option, &opt->disable);
|
ruby_each_words(s, disable_option, &opt->disable);
|
||||||
}
|
}
|
||||||
else if (strncmp("encoding", s, n = 8) == 0 && (!s[n] || s[n] == '=')) {
|
else if (is_option_with_arg("encoding", Qfalse, Qtrue)) {
|
||||||
char *p;
|
char *p;
|
||||||
s += n;
|
|
||||||
if (!*s++) {
|
|
||||||
next_encoding:
|
|
||||||
if (!--argc || !(s = *++argv)) {
|
|
||||||
rb_raise(rb_eRuntimeError, "missing argument for --encoding");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
encoding:
|
encoding:
|
||||||
p = strchr(s, ':');
|
p = strchr(s, ':');
|
||||||
if (p) {
|
if (p) {
|
||||||
|
@ -912,19 +956,23 @@ proc_options(int argc, char **argv, struct cmdline_options *opt)
|
||||||
else
|
else
|
||||||
set_external_encoding_once(opt, s, 0);
|
set_external_encoding_once(opt, s, 0);
|
||||||
}
|
}
|
||||||
else if (strcmp("version", s) == 0)
|
else if (strcmp("version", s) == 0) {
|
||||||
|
if (envopt) goto noenvopt_long;
|
||||||
opt->version = 1;
|
opt->version = 1;
|
||||||
|
}
|
||||||
else if (strcmp("verbose", s) == 0) {
|
else if (strcmp("verbose", s) == 0) {
|
||||||
opt->verbose = 1;
|
opt->verbose = 1;
|
||||||
ruby_verbose = Qtrue;
|
ruby_verbose = Qtrue;
|
||||||
}
|
}
|
||||||
else if (strcmp("yydebug", s) == 0)
|
else if (strcmp("yydebug", s) == 0) {
|
||||||
|
if (envopt) goto noenvopt_long;
|
||||||
opt->yydebug = 1;
|
opt->yydebug = 1;
|
||||||
else if (strncmp("dump", s, n = 4) == 0 && (!s[n] || s[n] == '=')) {
|
}
|
||||||
if (!(s += n + 1)[-1] && (!--argc || !(s = *++argv)) && *s != '-') break;
|
else if (is_option_with_arg("dump", Qfalse, Qfalse)) {
|
||||||
ruby_each_words(s, dump_option, &opt->dump);
|
ruby_each_words(s, dump_option, &opt->dump);
|
||||||
}
|
}
|
||||||
else if (strcmp("help", s) == 0) {
|
else if (strcmp("help", s) == 0) {
|
||||||
|
if (envopt) goto noenvopt_long;
|
||||||
usage(origarg.argv[0]);
|
usage(origarg.argv[0]);
|
||||||
rb_exit(EXIT_SUCCESS);
|
rb_exit(EXIT_SUCCESS);
|
||||||
}
|
}
|
||||||
|
@ -953,8 +1001,21 @@ proc_options(int argc, char **argv, struct cmdline_options *opt)
|
||||||
}
|
}
|
||||||
goto switch_end;
|
goto switch_end;
|
||||||
|
|
||||||
|
noenvopt:
|
||||||
|
/* "EIdvwWrKU" only */
|
||||||
|
rb_raise(rb_eRuntimeError, "invalid switch in RUBYOPT: -%c", *s);
|
||||||
|
break;
|
||||||
|
|
||||||
|
noenvopt_long:
|
||||||
|
rb_raise(rb_eRuntimeError, "invalid switch in RUBYOPT: --%s", s);
|
||||||
|
break;
|
||||||
|
|
||||||
case 0:
|
case 0:
|
||||||
break;
|
break;
|
||||||
|
# undef is_option_end
|
||||||
|
# undef check_envopt
|
||||||
|
# undef need_argument
|
||||||
|
# undef is_option_with_arg
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1002,7 +1063,7 @@ process_options(VALUE arg)
|
||||||
rb_encoding *enc, *lenc;
|
rb_encoding *enc, *lenc;
|
||||||
const char *s;
|
const char *s;
|
||||||
char fbuf[MAXPATHLEN];
|
char fbuf[MAXPATHLEN];
|
||||||
int i = proc_options(argc, argv, opt);
|
int i = proc_options(argc, argv, opt, 0);
|
||||||
int safe;
|
int safe;
|
||||||
|
|
||||||
argc -= i;
|
argc -= i;
|
||||||
|
@ -1015,40 +1076,7 @@ process_options(VALUE arg)
|
||||||
VALUE int_enc_name = opt->intern.enc.name;
|
VALUE int_enc_name = opt->intern.enc.name;
|
||||||
|
|
||||||
opt->src.enc.name = opt->ext.enc.name = opt->intern.enc.name = 0;
|
opt->src.enc.name = opt->ext.enc.name = opt->intern.enc.name = 0;
|
||||||
while (ISSPACE(*s))
|
moreswitches(s, opt, 1);
|
||||||
s++;
|
|
||||||
if (*s == 'T' || (*s == '-' && *(s + 1) == 'T')) {
|
|
||||||
int numlen;
|
|
||||||
int v = 1;
|
|
||||||
|
|
||||||
if (*s != 'T')
|
|
||||||
++s;
|
|
||||||
if (*++s) {
|
|
||||||
v = scan_oct(s, 2, &numlen);
|
|
||||||
if (numlen == 0)
|
|
||||||
v = 1;
|
|
||||||
}
|
|
||||||
rb_set_safe_level(v);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
while (s && *s) {
|
|
||||||
if (*s == '-') {
|
|
||||||
s++;
|
|
||||||
if (ISSPACE(*s)) {
|
|
||||||
do {
|
|
||||||
s++;
|
|
||||||
} while (ISSPACE(*s));
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!*s)
|
|
||||||
break;
|
|
||||||
if (!strchr("EIdvwWrKU", *s))
|
|
||||||
rb_raise(rb_eRuntimeError,
|
|
||||||
"invalid switch in RUBYOPT: -%c", *s);
|
|
||||||
s = moreswitches(s, opt);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (src_enc_name)
|
if (src_enc_name)
|
||||||
opt->src.enc.name = src_enc_name;
|
opt->src.enc.name = src_enc_name;
|
||||||
if (ext_enc_name)
|
if (ext_enc_name)
|
||||||
|
@ -1320,10 +1348,7 @@ load_file_internal(VALUE arg)
|
||||||
if (RSTRING_PTR(line)[RSTRING_LEN(line) - 2] == '\r')
|
if (RSTRING_PTR(line)[RSTRING_LEN(line) - 2] == '\r')
|
||||||
RSTRING_PTR(line)[RSTRING_LEN(line) - 2] = '\0';
|
RSTRING_PTR(line)[RSTRING_LEN(line) - 2] = '\0';
|
||||||
if ((p = strstr(p, " -")) != 0) {
|
if ((p = strstr(p, " -")) != 0) {
|
||||||
p++; /* skip space before `-' */
|
moreswitches(p + 1, opt, 0);
|
||||||
while (*p == '-') {
|
|
||||||
p = moreswitches(p + 1, opt);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* push back shebang for pragma may exist in next line */
|
/* push back shebang for pragma may exist in next line */
|
||||||
|
|
Загрузка…
Ссылка в новой задаче