xargs: fix -e default to match newer GNU xargs, add SUS mandated -E.
authorDenis Vlasenko <vda.linux@googlemail.com>
Mon, 4 Aug 2008 21:30:55 +0000 (21:30 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Mon, 4 Aug 2008 21:30:55 +0000 (21:30 -0000)
 closes bug 4414

findutils/xargs.c
testsuite/xargs.tests

index 92d01f7b61ffe2df5c98566d32956389617bb82a..f22d089ca6e2fe155791c5adbc32682601704856 100644 (file)
@@ -355,20 +355,22 @@ enum {
        OPTBIT_UPTO_NUMBER,
        OPTBIT_UPTO_SIZE,
        OPTBIT_EOF_STRING,
+       OPTBIT_EOF_STRING1,
        USE_FEATURE_XARGS_SUPPORT_CONFIRMATION(OPTBIT_INTERACTIVE,)
        USE_FEATURE_XARGS_SUPPORT_TERMOPT(     OPTBIT_TERMINATE  ,)
        USE_FEATURE_XARGS_SUPPORT_ZERO_TERM(   OPTBIT_ZEROTERM   ,)
 
-       OPT_VERBOSE     = 1<<OPTBIT_VERBOSE    ,
-       OPT_NO_EMPTY    = 1<<OPTBIT_NO_EMPTY   ,
-       OPT_UPTO_NUMBER = 1<<OPTBIT_UPTO_NUMBER,
-       OPT_UPTO_SIZE   = 1<<OPTBIT_UPTO_SIZE  ,
-       OPT_EOF_STRING  = 1<<OPTBIT_EOF_STRING ,
-       OPT_INTERACTIVE = USE_FEATURE_XARGS_SUPPORT_CONFIRMATION((1<<OPTBIT_INTERACTIVE)) + 0,
-       OPT_TERMINATE   = USE_FEATURE_XARGS_SUPPORT_TERMOPT(     (1<<OPTBIT_TERMINATE  )) + 0,
-       OPT_ZEROTERM    = USE_FEATURE_XARGS_SUPPORT_ZERO_TERM(   (1<<OPTBIT_ZEROTERM   )) + 0,
+       OPT_VERBOSE     = 1 << OPTBIT_VERBOSE    ,
+       OPT_NO_EMPTY    = 1 << OPTBIT_NO_EMPTY   ,
+       OPT_UPTO_NUMBER = 1 << OPTBIT_UPTO_NUMBER,
+       OPT_UPTO_SIZE   = 1 << OPTBIT_UPTO_SIZE  ,
+       OPT_EOF_STRING  = 1 << OPTBIT_EOF_STRING , /* GNU: -e[<param>] */
+       OPT_EOF_STRING1 = 1 << OPTBIT_EOF_STRING1, /* SUS: -E<param> */
+       OPT_INTERACTIVE = USE_FEATURE_XARGS_SUPPORT_CONFIRMATION((1 << OPTBIT_INTERACTIVE)) + 0,
+       OPT_TERMINATE   = USE_FEATURE_XARGS_SUPPORT_TERMOPT(     (1 << OPTBIT_TERMINATE  )) + 0,
+       OPT_ZEROTERM    = USE_FEATURE_XARGS_SUPPORT_ZERO_TERM(   (1 << OPTBIT_ZEROTERM   )) + 0,
 };
-#define OPTION_STR "+trn:s:e::" \
+#define OPTION_STR "+trn:s:e::E:" \
        USE_FEATURE_XARGS_SUPPORT_CONFIRMATION("p") \
        USE_FEATURE_XARGS_SUPPORT_TERMOPT(     "x") \
        USE_FEATURE_XARGS_SUPPORT_ZERO_TERM(   "0")
@@ -376,8 +378,6 @@ enum {
 int xargs_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
 int xargs_main(int argc, char **argv)
 {
-       static const char const_eof_str[] ALIGN1 = "_";
-
        char **args;
        int i, n;
        xlist_t *list = NULL;
@@ -387,7 +387,7 @@ int xargs_main(int argc, char **argv)
        int n_max_arg;
        size_t n_chars = 0;
        long orig_arg_max;
-       const char *eof_str = const_eof_str;
+       const char *eof_str = NULL;
        unsigned opt;
        size_t n_max_chars;
 #if ENABLE_FEATURE_XARGS_SUPPORT_ZERO_TERM
@@ -396,10 +396,12 @@ int xargs_main(int argc, char **argv)
 #define read_args process_stdin
 #endif
 
-       opt = getopt32(argv, OPTION_STR, &max_args, &max_chars, &eof_str);
+       opt = getopt32(argv, OPTION_STR, &max_args, &max_chars, &eof_str, &eof_str);
 
-       /* -e without optional param? */
-       if ((opt & OPT_EOF_STRING) && eof_str == const_eof_str)
+       /* -E ""? You may wonder why not just omit -E?
+        * This is used for portability:
+        * old xargs was using "_" as default for -E / -e */
+       if ((opt & OPT_EOF_STRING1) && eof_str[0] == '\0')
                eof_str = NULL;
 
        if (opt & OPT_ZEROTERM)
index e041d592e5b15170af1001260b5fc15ccc75d6f8..36524499e62d101d9b24217dfaf128dd9a108b8e 100755 (executable)
@@ -6,14 +6,24 @@
 
 # testing "test name" "command" "expected result" "file input" "stdin"
 
-testing "xargs stops on underscore" \
-       "xargs" \
+testing "xargs -E _ stops on underscore" \
+       "xargs -E _" \
        "a\n" \
        "" "a\n_\nb\n"
 
+testing "xargs -E ''" \
+       "xargs -E ''" \
+       "a _ b\n" \
+       "" "a\n_\nb\n"
+
 testing "xargs -e without param" \
        "xargs -e" \
        "a _ b\n" \
        "" "a\n_\nb\n"
 
+testing "xargs does not stop on underscore ('new' GNU behavior)" \
+       "xargs" \
+       "a _ b\n" \
+       "" "a\n_\nb\n"
+
 exit $FAILCOUNT