diff --git a/ChangeLog b/ChangeLog index c6bd52e..147765a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,8 @@ 2000-08-19 Bruno Haible + * src/options.cc (Options::print_options): Escape the arguments which + contain special characters. + * tests/c-parse.gperf: Updated from gcc-2.95.2/gcc/c-parse.gperf. * tests/objc.gperf: New file, from gcc-2.95.2/gcc/objc/objc.gperf. * tests/chill.gperf: New file, from gcc-2.95.2/gcc/ch/gperf. diff --git a/src/options.cc b/src/options.cc index 85fe275..0d0da1b 100644 --- a/src/options.cc +++ b/src/options.cc @@ -229,7 +229,50 @@ Options::print_options (void) printf ("/* Command-line: "); for (i = 0; i < argument_count; i++) - printf ("%s ", argument_vector[i]); + { + const char *arg = argument_vector[i]; + + /* Escape arg if it contains shell metacharacters. */ + if (*arg == '-') + { + putchar (*arg); + arg++; + if (*arg >= 'A' && *arg <= 'Z' || *arg >= 'a' && *arg <= 'z') + { + putchar (*arg); + arg++; + } + } + if (strpbrk (arg, "\t\n !\"#$&'()*;<>?[\\]`{|}~") != NULL) + { + if (strchr (arg, '\'') != NULL) + { + putchar ('"'); + for (; *arg; arg++) + { + if (*arg == '\"' || *arg == '\\' || *arg == '$') + putchar ('\\'); + putchar (*arg); + } + putchar ('"'); + } + else + { + putchar ('\''); + for (; *arg; arg++) + { + if (*arg == '\\') + putchar ('\\'); + putchar (*arg); + } + putchar ('\''); + } + } + else + printf ("%s", arg); + + printf (" "); + } printf (" */"); }