Moin, At Sat, 15 Jan 2005 10:10:14 +0900, Florian Growrote in [ruby-core:04237]: > >>If you can think of any problems that ignoring trailing carriage returns > >>would cause, please tell me. Thanks. > > > > Traling CR of a long option is already ignored. > > > > [ruby.c patch] > > Hm, does this ignore \r in options or did you just fix the error message? Ignores \r at the end of a short option. > If it ignores \r in options it probably ought to ignore it generally by > removing it from ARGV. (There's cases where no options is specified and > the invocation would be "ruby \r file") It would be impossible to tell if an option comes from shebang line or command line till the script file will get read, I gueses. So -I/-C/-X/-r options might have problems.
Index: ruby.c =================================================================== RCS file: /cvs/ruby/src/ruby/ruby.c,v retrieving revision 1.94 diff -U2 -p -r1.94 ruby.c --- ruby.c 24 Sep 2004 05:53:41 -0000 1.94 +++ ruby.c 15 Jan 2005 03:21:15 -0000 @@ -444,4 +444,11 @@ proc_options(argc, argv) int verbose = 0; VALUE e_script = Qfalse; + char *nocr = 0; + int len; +#define STRIP_CR(s) (nocr || !(len = strlen(s)) || \ + (s)[len - 1] != '\r' ? (s) : \ + ((nocr = ALLOCA_N(char, len))[len - 1] = 0, \ + MEMCPY(nocr, (s), char, len - 1), \ + nocr)) if (argc == 0) return; @@ -450,7 +457,8 @@ proc_options(argc, argv) for (argc--,argv++; argc > 0; argc--,argv++) { - if (argv[0][0] != '-' || !argv[0][1]) break; + s = STRIP_CR(argv[0]); + if (s[0] != '-' || !s[1]) break; - s = argv[0]+1; + ++s; reswitch: switch (*s) { @@ -553,5 +561,5 @@ proc_options(argc, argv) if (script == 0) script = "-e"; } - rb_str_cat2(e_script, s); + rb_str_cat2(e_script, STRIP_CR(s)); rb_str_cat2(e_script, "\n"); break; @@ -563,5 +571,5 @@ proc_options(argc, argv) } else if (argv[1]) { - add_modules(argv[1]); + add_modules(STRIP_CR(argv[1])); argc--,argv++; } @@ -586,5 +594,5 @@ proc_options(argc, argv) s++; if (!*s) { - s = argv[1]; + s = STRIP_CR(argv[1]); argc--,argv++; } @@ -629,5 +637,5 @@ proc_options(argc, argv) ruby_incpush(s); else if (argv[1]) { - ruby_incpush(argv[1]); + ruby_incpush(STRIP_CR(argv[1])); argc--,argv++; } @@ -654,5 +662,5 @@ proc_options(argc, argv) case '-': - if (!s[1] || (s[1] == '\r' && !s[2])) { + if (!s[1]) { argc--,argv++; goto switch_end; @@ -685,6 +693,18 @@ proc_options(argc, argv) default: - fprintf(stderr, "%s: invalid option -%c (-h will show valid options)\n", - origargv[0], *s); + if (ISSPACE(*s)) { + do s++; while (ISSPACE(*s)); + goto reswitch; + } + else { + const char *format; + if (ISPRINT(*s)) { + format = "%s: invalid option -%c (-h will show valid options)\n"; + } + else { + format = "%s: invalid option -\\%03o (-h will show valid options)\n"; + } + fprintf(stderr, format, origargv[0], (int)(unsigned char)*s); + } exit(2); @@ -746,5 +766,5 @@ proc_options(argc, argv) } else { - script = argv[0]; + script = STRIP_CR(argv[0]); if (script[0] == '\0') { script = "-"; @@ -754,11 +774,12 @@ proc_options(argc, argv) script = 0; + s = STRIP_CR(argv[0]); if (path) { - script = dln_find_file(argv[0], path); + script = dln_find_file(s, path); } if (!script) { - script = dln_find_file(argv[0], getenv(PATH_ENV)); + script = dln_find_file(s, getenv(PATH_ENV)); } - if (!script) script = argv[0]; + if (!script) script = s; script = ruby_sourcefile = rb_source_filename(script); script_node = NEW_BEGIN(0);
-- Nobu Nakada