last_patch89 from vodz:

Manuel,

    I rewrite bb_getopt_ulflags() function for more universal usage.
    My version support now:
    - options with arguments (optional arg as GNU extension also)
    - complementaly and/or incomplementaly and/or incongruously and/or list
    options
    - long_opt (all applets may have long option, add supporting is trivial)
    This realisation full compatibile from your version.
    Code size grow 480 bytes, but only coreutils/* over compensate this size
    after using new function. Last patch reduced over 800 bytes and not full
    applied to all. "mkdir" and "mv" applets have long_opt now for demonstrate
    trivial addition support long_opt with usage new bb_getopt_ulflags().
    Complementaly and/or incomplementaly and/or incongruously and/or list options
    logic is not trivial, but new "cut" and "grep" applets using this logic
    for examples with full demostrating. New "grep" applet reduced over 300
    bytes.

    Mark,
    Also. I removed bug from "grep" applet.
    $ echo a b | busybox grep -e a b
    a b
    a b
    But right is printing one only.

    --w
    vodz
This commit is contained in:
Eric Andersen
2003-06-20 09:01:58 +00:00
parent dfce3536ac
commit 8876fb2f59
19 changed files with 592 additions and 533 deletions

View File

@ -31,10 +31,21 @@
#include <dirent.h>
#include <errno.h>
#include <stdlib.h>
#include <getopt.h>
#include "busybox.h"
#include "libcoreutils/coreutils.h"
static const char *fmt = "cannot overwrite %sdirectory with %sdirectory";
static const struct option mv_long_options[] = {
{ "interactive", 0, NULL, 'i' },
{ "force", 0, NULL, 'f' },
{ 0, 0, 0, 0 }
};
static const char mv_getopt_short_option[] = "fi";
#define OPT_FILEUTILS_FORCE 1
#define OPT_FILEUTILS_INTERACTIVE 2
static const char fmt[] = "cannot overwrite %sdirectory with %sdirectory";
extern int mv_main(int argc, char **argv)
{
@ -44,20 +55,12 @@ extern int mv_main(int argc, char **argv)
const char *dest;
int dest_exists;
int source_exists;
int opt;
int flags = 0;
unsigned long flags;
int status = 0;
while ((opt = getopt(argc, argv, "fi")) > 0) {
flags &= ~(FILEUTILS_INTERACTIVE | FILEUTILS_FORCE);
if (opt == 'i') {
flags |= FILEUTILS_INTERACTIVE;
} else if (opt == 'f') {
flags |= FILEUTILS_FORCE;
} else {
bb_show_usage();
}
}
bb_applet_long_options = mv_long_options;
bb_opt_complementaly = "f-i:i-f";
flags = bb_getopt_ulflags(argc, argv, mv_getopt_short_option);
if (optind + 2 > argc)
bb_show_usage();
@ -77,8 +80,7 @@ extern int mv_main(int argc, char **argv)
}
do {
dest = concat_path_file(last,
bb_get_last_path_component(*argv));
dest = concat_path_file(last, bb_get_last_path_component(*argv));
if ((dest_exists = cp_mv_stat(dest, &dest_stat)) < 0) {
goto RET_1;
@ -86,9 +88,9 @@ extern int mv_main(int argc, char **argv)
DO_MOVE:
if (dest_exists && !(flags & FILEUTILS_FORCE) &&
if (dest_exists && !(flags & OPT_FILEUTILS_FORCE) &&
((access(dest, W_OK) < 0 && isatty(0)) ||
(flags & FILEUTILS_INTERACTIVE))) {
(flags & OPT_FILEUTILS_INTERACTIVE))) {
if (fprintf(stderr, "mv: overwrite `%s'? ", dest) < 0) {
goto RET_1; /* Ouch! fprintf failed! */
}