inline strcmp(s, "-") [actually macro-ize it for now - gcc is too stupid]
diff --git a/archival/bunzip2.c b/archival/bunzip2.c
index 757001f..a6cd176 100644
--- a/archival/bunzip2.c
+++ b/archival/bunzip2.c
@@ -23,7 +23,7 @@
/* Set input filename and number */
filename = argv[optind];
- if ((filename) && (filename[0] != '-') && (filename[1] != '\0')) {
+ if (filename && NOT_LONE_DASH(filename)) {
/* Open input file */
src_fd = xopen(filename, O_RDONLY);
} else {
diff --git a/archival/gunzip.c b/archival/gunzip.c
index e24401c..c5deec3 100644
--- a/archival/gunzip.c
+++ b/archival/gunzip.c
@@ -58,7 +58,7 @@
optind++;
- if (old_path == NULL || strcmp(old_path, "-") == 0) {
+ if (old_path == NULL || LONE_DASH(old_path)) {
src_fd = STDIN_FILENO;
opt |= GUNZIP_OPT_STDOUT;
USE_DESKTOP(opt &= ~GUNZIP_OPT_VERBOSE;)
diff --git a/archival/gzip.c b/archival/gzip.c
index c9b6753..7124e9b 100644
--- a/archival/gzip.c
+++ b/archival/gzip.c
@@ -1201,7 +1201,7 @@
char *path = NULL;
clear_bufs();
- if (strcmp(argv[i], "-") == 0) {
+ if (LONE_DASH(argv[i])) {
time_stamp = 0;
inFileNum = STDIN_FILENO;
outFileNum = STDOUT_FILENO;
diff --git a/archival/tar.c b/archival/tar.c
index 79c3595..ba7cb0f 100644
--- a/archival/tar.c
+++ b/archival/tar.c
@@ -851,7 +851,7 @@
flags = O_RDONLY;
}
- if (tar_filename[0] == '-' && !tar_filename[1]) {
+ if (LONE_DASH(tar_filename)) {
tar_handle->src_fd = fileno(tar_stream);
tar_handle->seek = seek_by_read;
} else {
diff --git a/archival/uncompress.c b/archival/uncompress.c
index 3c78961..4611790 100644
--- a/archival/uncompress.c
+++ b/archival/uncompress.c
@@ -25,7 +25,7 @@
int src_fd;
int dst_fd;
- if (strcmp(compressed_file, "-") == 0) {
+ if (LONE_DASH(compressed_file)) {
src_fd = STDIN_FILENO;
flags |= GUNZIP_TO_STDOUT;
} else {
diff --git a/archival/unlzma.c b/archival/unlzma.c
index 46fbefd..20c4ff2 100644
--- a/archival/unlzma.c
+++ b/archival/unlzma.c
@@ -26,7 +26,7 @@
/* Set input filename and number */
filename = argv[optind];
- if (filename && (filename[0] != '-') && (filename[1] != '\0')) {
+ if (filename && NOT_LONE_DASH(filename)) {
/* Open input file */
src_fd = xopen(filename, O_RDONLY);
} else {
diff --git a/archival/unzip.c b/archival/unzip.c
index 8b1c281..f553eef 100644
--- a/archival/unzip.c
+++ b/archival/unzip.c
@@ -187,11 +187,10 @@
}
/* Open input file */
- if (strcmp("-", src_fn) == 0) {
+ if (LONE_DASH(src_fn)) {
src_fd = STDIN_FILENO;
/* Cannot use prompt mode since zip data is arriving on STDIN */
overwrite = (overwrite == o_prompt) ? o_never : overwrite;
-
} else {
static const char *const extn[] = {"", ".zip", ".ZIP"};
int orig_src_fn_len = strlen(src_fn);
diff --git a/coreutils/cut.c b/coreutils/cut.c
index a538e3d..a72b2c2 100644
--- a/coreutils/cut.c
+++ b/coreutils/cut.c
@@ -168,6 +168,8 @@
opt_complementary = "b--bcf:c--bcf:f--bcf";
getopt32(argc, argv, optstring, &sopt, &sopt, &sopt, <ok);
+// argc -= optind;
+ argv += optind;
if (!(option_mask32 & (CUT_OPT_BYTE_FLGS | CUT_OPT_CHAR_FLGS | CUT_OPT_FIELDS_FLGS)))
bb_error_msg_and_die("expected a list of bytes, characters, or fields");
if (option_mask32 & BB_GETOPT_ERROR)
@@ -262,22 +264,21 @@
qsort(cut_lists, nlists, sizeof(struct cut_list), cmpfunc);
}
- /* argv[(optind)..(argc-1)] should be names of file to process. If no
+ /* argv[0..argc-1] should be names of file to process. If no
* files were specified or '-' was specified, take input from stdin.
* Otherwise, we process all the files specified. */
- if (argv[optind] == NULL
- || (argv[optind][0] == '-' && argv[optind][1] == '\0')) {
+ if (argv[0] == NULL || LONE_DASH(argv[0])) {
cut_file(stdin);
} else {
FILE *file;
- for (; optind < argc; optind++) {
- file = fopen_or_warn(argv[optind], "r");
+ do {
+ file = fopen_or_warn(argv[0], "r");
if (file) {
cut_file(file);
fclose(file);
}
- }
+ } while (*++argv);
}
if (ENABLE_FEATURE_CLEAN_UP)
free(cut_lists);
diff --git a/coreutils/diff.c b/coreutils/diff.c
index 0df9989..887679a 100644
--- a/coreutils/diff.c
+++ b/coreutils/diff.c
@@ -904,19 +904,19 @@
if (S_ISDIR(stb1.st_mode) != S_ISDIR(stb2.st_mode))
return (S_ISDIR(stb1.st_mode) ? D_MISMATCH1 : D_MISMATCH2);
- if (strcmp(file1, "-") == 0 && strcmp(file2, "-") == 0)
+ if (LONE_DASH(file1) && LONE_DASH(file2))
goto closem;
f1 = stdin;
if (flags & D_EMPTY1)
f1 = xfopen(bb_dev_null, "r");
- else if (file1[0] != '-' || file1[1]) /* not "-" */
+ else if (NOT_LONE_DASH(file1))
f1 = xfopen(file1, "r");
f2 = stdin;
if (flags & D_EMPTY2)
f2 = xfopen(bb_dev_null, "r");
- else if (file2[0] != '-' || file2[1]) /* not "-" */
+ else if (NOT_LONE_DASH(file2))
f2 = xfopen(file2, "r");
i = files_differ(f1, f2, flags);
@@ -1212,12 +1212,12 @@
bb_error_msg("missing filename");
bb_show_usage();
}
- if (argv[0][0] == '-' && !argv[0][1]) { /* "-" */
+ if (LONE_DASH(argv[0])) {
fstat(STDIN_FILENO, &stb1);
gotstdin = 1;
} else
xstat(argv[0], &stb1);
- if (argv[1][0] == '-' && !argv[1][1]) { /* "-" */
+ if (LONE_DASH(argv[1])) {
fstat(STDIN_FILENO, &stb2);
gotstdin = 1;
} else
diff --git a/coreutils/env.c b/coreutils/env.c
index 2ce99b0..e4cad27 100644
--- a/coreutils/env.c
+++ b/coreutils/env.c
@@ -58,7 +58,7 @@
opt = getopt32(argc, argv, "+iu:", &unset_env);
argv += optind;
- if (*argv && (argv[0][0] == '-') && !argv[0][1]) {
+ if (*argv && LONE_DASH(argv[0])) {
opt |= 1;
++argv;
}
diff --git a/coreutils/md5_sha1_sum.c b/coreutils/md5_sha1_sum.c
index e8d3a15..6fe1b02 100644
--- a/coreutils/md5_sha1_sum.c
+++ b/coreutils/md5_sha1_sum.c
@@ -39,7 +39,7 @@
void (*final)(void*, void*);
src_fd = STDIN_FILENO;
- if (filename[0] != '-' || filename[1]) { /* not "-" */
+ if (NOT_LONE_DASH(filename)) {
src_fd = open(filename, O_RDONLY);
if (src_fd < 0) {
bb_perror_msg("%s", filename);
@@ -120,7 +120,7 @@
}
pre_computed_stream = stdin;
- if (file_ptr[0] != '-' || file_ptr[1]) { /* not "-" */
+ if (NOT_LONE_DASH(file_ptr)) {
pre_computed_stream = xfopen(file_ptr, "r");
}
diff --git a/coreutils/sort.c b/coreutils/sort.c
index c23bf9c..c37810f 100644
--- a/coreutils/sort.c
+++ b/coreutils/sort.c
@@ -310,7 +310,7 @@
/* Open input files and read data */
for (i = argv[optind] ? optind : optind-1; argv[i]; i++) {
fp = stdin;
- if (i >= optind && (argv[i][0] != '-' || argv[i][1]))
+ if (i >= optind && NOT_LONE_DASH(argv[i]))
fp = xfopen(argv[i], "r");
for (;;) {
line = GET_LINE(fp);
diff --git a/coreutils/sum.c b/coreutils/sum.c
index 93f4e22..68a8578 100644
--- a/coreutils/sum.c
+++ b/coreutils/sum.c
@@ -18,9 +18,6 @@
/* 1 if any of the files read were the standard input */
static int have_read_stdin;
-/* make a little more readable and avoid using strcmp for just 2 bytes */
-#define IS_STDIN(s) (s[0] == '-' && s[1] == '\0')
-
/* Calculate and print the rotated checksum and the size in 1K blocks
of file FILE, or of the standard input if FILE is "-".
If PRINT_NAME is >1, print FILE next to the checksum and size.
@@ -34,7 +31,7 @@
int ch; /* Each character read. */
int ret = 0;
- if (IS_STDIN(file)) {
+ if (LONE_DASH(file)) {
fp = stdin;
have_read_stdin++;
} else {
@@ -84,7 +81,7 @@
/* The sum of all the input bytes, modulo (UINT_MAX + 1). */
unsigned int s = 0;
- if (IS_STDIN(file)) {
+ if (LONE_DASH(file)) {
fd = 0;
have_read_stdin = 1;
} else {
@@ -103,7 +100,7 @@
release_and_ret:
bb_perror_msg(file);
RELEASE_CONFIG_BUFFER(buf);
- if (!IS_STDIN(file))
+ if (NOT_LONE_DASH(file))
close(fd);
return 0;
}
@@ -113,7 +110,7 @@
s += buf[bytes_read];
}
- if (!IS_STDIN(file) && close(fd) == -1)
+ if (NOT_LONE_DASH(file) && close(fd) == -1)
goto release_and_ret;
else
RELEASE_CONFIG_BUFFER(buf);
diff --git a/coreutils/tail.c b/coreutils/tail.c
index ed5ea14..4c3c3b9 100644
--- a/coreutils/tail.c
+++ b/coreutils/tail.c
@@ -176,8 +176,8 @@
}
do {
- if ((argv[i][0] == '-') && !argv[i][1]) {
- DO_STDIN:
+ if (LONE_DASH(argv[i])) {
+ DO_STDIN:
fds[nfiles] = STDIN_FILENO;
} else if ((fds[nfiles] = open(argv[i], O_RDONLY)) < 0) {
bb_perror_msg("%s", argv[i]);
diff --git a/coreutils/uudecode.c b/coreutils/uudecode.c
index 8b7de74..0651211 100644
--- a/coreutils/uudecode.c
+++ b/coreutils/uudecode.c
@@ -166,7 +166,7 @@
}
outname++;
}
- if (strcmp(outname, "-") == 0) {
+ if (LONE_DASH(outname)) {
dst_stream = stdout;
} else {
dst_stream = xfopen(outname, "w");
diff --git a/e2fsprogs/fsck.c b/e2fsprogs/fsck.c
index f0c1316..3b01c10 100644
--- a/e2fsprogs/fsck.c
+++ b/e2fsprogs/fsck.c
@@ -1249,8 +1249,8 @@
progress_fd = 0;
else
goto next_arg;
- } else if ((i+1) < argc &&
- !strncmp(argv[i+1], "-", 1) == 0) {
+ } else if ((i+1) < argc
+ && argv[i+1][0] != '-') {
progress_fd = string_to_int(argv[i]);
if (progress_fd < 0)
progress_fd = 0;
diff --git a/editors/sed.c b/editors/sed.c
index ac3d8d4..8d372ab 100644
--- a/editors/sed.c
+++ b/editors/sed.c
@@ -1235,9 +1235,7 @@
struct stat statbuf;
int nonstdoutfd;
- if (argv[i][0] == '-' && !argv[i][1]
- && !(opt & OPT_in_place)
- ) {
+ if (LONE_DASH(argv[i]) && !(opt & OPT_in_place)) {
add_input_file(stdin);
process_files();
continue;
diff --git a/include/libbb.h b/include/libbb.h
index 1d91a0a..fcd0dfa 100644
--- a/include/libbb.h
+++ b/include/libbb.h
@@ -255,6 +255,14 @@
extern char *xstrndup(const char *s, int n);
extern char *safe_strncpy(char *dst, const char *src, size_t size);
extern char *xasprintf(const char *format, ...) __attribute__ ((format (printf, 1, 2)));
+// gcc-4.1.1 still isn't good enough at optimizing it
+// (+200 bytes compared to macro)
+//static ATTRIBUTE_ALWAYS_INLINE
+//int LONE_DASH(const char *s) { return s[0] == '-' && !s[1]; }
+//static ATTRIBUTE_ALWAYS_INLINE
+//int NOT_LONE_DASH(const char *s) { return s[0] != '-' || s[1]; }
+#define LONE_DASH(s) ((s)[0] == '-' && !(s)[1])
+#define NOT_LONE_DASH(s) ((s)[0] != '-' || (s)[1])
/* dmalloc will redefine these to it's own implementation. It is safe
* to have the prototypes here unconditionally. */
diff --git a/libbb/wfopen_input.c b/libbb/wfopen_input.c
index 3da855f..7a11dac 100644
--- a/libbb/wfopen_input.c
+++ b/libbb/wfopen_input.c
@@ -22,7 +22,7 @@
if (filename != bb_msg_standard_input
&& filename[0]
- && (filename[0] != '-' || filename[1])
+ && NOT_LONE_DASH(filename)
) {
fp = fopen_or_warn(filename, "r");
}
diff --git a/loginutils/getty.c b/loginutils/getty.c
index a85e523..5ceaefc 100644
--- a/loginutils/getty.c
+++ b/loginutils/getty.c
@@ -239,7 +239,7 @@
/* Set up new standard input, unless we are given an already opened port. */
- if (strcmp(tty, "-")) {
+ if (NOT_LONE_DASH(tty)) {
struct stat st;
int fd;
diff --git a/loginutils/su.c b/loginutils/su.c
index a23ee93..046457b 100644
--- a/loginutils/su.c
+++ b/loginutils/su.c
@@ -14,25 +14,29 @@
char *opt_shell = 0;
char *opt_command = 0;
char *opt_username = "root";
- char **opt_args = 0;
struct passwd *pw;
uid_t cur_uid = getuid();
const char *tty;
char *old_user;
flags = getopt32(argc, argv, "mplc:s:", &opt_command, &opt_shell);
+ argc -= optind;
+ argv -= optind;
#define SU_OPT_mp (3)
#define SU_OPT_l (4)
- if (optind < argc && argv[optind][0] == '-' && argv[optind][1] == 0) {
+ if (argc && LONE_DASH(argv[0])) {
flags |= SU_OPT_l;
- ++optind;
+ argc--;
+ argv++;
}
/* get user if specified */
- if (optind < argc) opt_username = argv [optind++];
-
- if (optind < argc) opt_args = argv + optind;
+ if (argc) {
+ opt_username = argv[0];
+// argc--;
+ argv++;
+ }
if (ENABLE_SU_SYSLOG) {
/* The utmp entry (via getlogin) is probably the best way to identify
@@ -84,7 +88,7 @@
USE_SELINUX(set_current_security_context(NULL);)
/* Never returns */
- run_shell(opt_shell, flags & SU_OPT_l, opt_command, (const char**)opt_args);
+ run_shell(opt_shell, flags & SU_OPT_l, opt_command, (const char**)argv);
return EXIT_FAILURE;
}
diff --git a/miscutils/crontab.c b/miscutils/crontab.c
index 39d3aae..d442272 100644
--- a/miscutils/crontab.c
+++ b/miscutils/crontab.c
@@ -51,7 +51,7 @@
i = 1;
if (ac > 1) {
- if (av[1][0] == '-' && av[1][1] == 0) {
+ if (LONE_DASH(av[1])) {
option = REPLACE;
++i;
} else if (av[1][0] != '-') {
diff --git a/networking/ftpgetput.c b/networking/ftpgetput.c
index 223d243..dff8944 100644
--- a/networking/ftpgetput.c
+++ b/networking/ftpgetput.c
@@ -132,7 +132,7 @@
do_continue = 0;
}
- if ((local_path[0] == '-') && (local_path[1] == '\0')) {
+ if (LONE_DASH(local_path)) {
fd_local = STDOUT_FILENO;
do_continue = 0;
}
@@ -212,9 +212,8 @@
fd_data = xconnect_ftpdata(server, buf);
/* get the local file */
- if ((local_path[0] == '-') && (local_path[1] == '\0')) {
- fd_local = STDIN_FILENO;
- } else {
+ fd_local = STDIN_FILENO;
+ if (NOT_LONE_DASH(local_path)) {
fd_local = xopen(local_path, O_RDONLY);
fstat(fd_local, &sbuf);
diff --git a/networking/libiproute/ipaddress.c b/networking/libiproute/ipaddress.c
index 2a267fe..9fb08e6 100644
--- a/networking/libiproute/ipaddress.c
+++ b/networking/libiproute/ipaddress.c
@@ -681,7 +681,7 @@
if (strcmp(*argv, "+") == 0) {
brd_len = -1;
}
- else if (strcmp(*argv, "-") == 0) {
+ else if (LONE_DASH(*argv)) {
brd_len = -2;
} else {
get_addr(&addr, *argv, req.ifa.ifa_family);
diff --git a/networking/tftp.c b/networking/tftp.c
index 64d376f..a62c5d8 100644
--- a/networking/tftp.c
+++ b/networking/tftp.c
@@ -530,7 +530,7 @@
if ((localfile == NULL && remotefile == NULL) || (argv[optind] == NULL))
bb_show_usage();
- if (localfile == NULL || strcmp(localfile, "-") == 0) {
+ if (localfile == NULL || LONE_DASH(localfile)) {
fd = (cmd == tftp_cmd_get) ? STDOUT_FILENO : STDIN_FILENO;
} else {
fd = open(localfile, flags, 0644); /* fail below */
diff --git a/networking/wget.c b/networking/wget.c
index 19bf8f8..fbdbf62 100644
--- a/networking/wget.c
+++ b/networking/wget.c
@@ -217,7 +217,7 @@
/*
* Determine where to start transfer.
*/
- if (fname_out[0] == '-' && !fname_out[1]) {
+ if (LONE_DASH(fname_out)) {
output_fd = 1;
opt &= ~WGET_OPT_CONTINUE;
}
diff --git a/shell/ash.c b/shell/ash.c
index 3a9998f..8ba4cb8 100644
--- a/shell/ash.c
+++ b/shell/ash.c
@@ -2315,7 +2315,7 @@
dest = *argptr;
if (!dest)
dest = bltinlookup(homestr);
- else if (dest[0] == '-' && dest[1] == '\0') {
+ else if (LONE_DASH(dest)) {
dest = bltinlookup("OLDPWD");
flags |= CD_PRINT;
}
@@ -8889,7 +8889,7 @@
argptr++;
if ((c = *p++) == '-') {
val = 1;
- if (p[0] == '\0' || (p[0] == '-' && p[1] == '\0')) {
+ if (p[0] == '\0' || LONE_DASH(p)) {
if (!cmdline) {
/* "-" means turn off -x and -v */
if (p[0] == '\0')
@@ -9114,7 +9114,7 @@
goto out;
}
optnext++;
- if (p[0] == '-' && p[1] == '\0') /* check for "--" */
+ if (LONE_DASH(p)) /* check for "--" */
goto atend;
}
@@ -9232,7 +9232,7 @@
if (p == NULL || *p != '-' || *++p == '\0')
return '\0';
argptr++;
- if (p[0] == '-' && p[1] == '\0') /* check for "--" */
+ if (LONE_DASH(p)) /* check for "--" */
return '\0';
}
c = *p++;
@@ -9825,7 +9825,7 @@
if (is_digit(text[0]) && text[1] == '\0')
n->ndup.dupfd = digit_val(text[0]);
- else if (text[0] == '-' && text[1] == '\0')
+ else if (LONE_DASH(text))
n->ndup.dupfd = -1;
else {
@@ -11650,7 +11650,7 @@
sh_error("%s: bad trap", *ap);
INTOFF;
if (action) {
- if (action[0] == '-' && action[1] == '\0')
+ if (LONE_DASH(action))
action = NULL;
else
action = savestr(action);
@@ -12257,7 +12257,7 @@
INTOFF;
lvp = ckmalloc(sizeof (struct localvar));
- if (name[0] == '-' && name[1] == '\0') {
+ if (LONE_DASH(name)) {
char *p;
p = ckmalloc(sizeof(optlist));
lvp->text = memcpy(p, optlist, sizeof(optlist));
diff --git a/shell/msh.c b/shell/msh.c
index 492d3cf..45ca3df 100644
--- a/shell/msh.c
+++ b/shell/msh.c
@@ -1001,7 +1001,7 @@
DBGPRINTF7(("NEWFILE: opening %s\n", s));
- if (strcmp(s, "-") != 0) {
+ if (NOT_LONE_DASH(s)) {
DBGPRINTF(("NEWFILE: s is %s\n", s));
f = open(s, 0);
if (f < 0) {