From bf66fbc8e2380717c1fab860cfc60c78582839dd Mon Sep 17 00:00:00 2001 From: Denis Vlasenko Date: Thu, 21 Dec 2006 13:23:14 +0000 Subject: [PATCH] introduce LONE_CHAR (optimized strcmp with one-char string) --- coreutils/Kbuild | 3 +++ coreutils/cat.c | 22 +++++++++++++--------- coreutils/diff.c | 2 +- coreutils/echo.c | 4 ++-- coreutils/expr.c | 2 +- coreutils/test.c | 10 ++++++---- e2fsprogs/blkid/devname.c | 4 ++-- e2fsprogs/chattr.c | 7 ++++--- e2fsprogs/ext2fs/ismounted.c | 2 +- e2fsprogs/fsck.c | 4 ++-- include/libbb.h | 6 +++++- init/init.c | 5 +++-- libbb/correct_password.c | 5 ++--- miscutils/last.c | 2 +- networking/inetd.c | 2 +- networking/libiproute/ipaddress.c | 2 +- shell/ash.c | 2 +- 17 files changed, 49 insertions(+), 35 deletions(-) diff --git a/coreutils/Kbuild b/coreutils/Kbuild index cfb508d81..55f19b4ca 100644 --- a/coreutils/Kbuild +++ b/coreutils/Kbuild @@ -10,6 +10,7 @@ lib-y:= lib-$(CONFIG_BASENAME) += basename.o lib-$(CONFIG_CAL) += cal.o lib-$(CONFIG_CAT) += cat.o +lib-$(CONFIG_LESS) += cat.o # less uses it if stdout isn't a tty lib-$(CONFIG_CATV) += catv.o lib-$(CONFIG_CHGRP) += chgrp.o chown.o lib-$(CONFIG_CHMOD) += chmod.o @@ -28,6 +29,7 @@ lib-$(CONFIG_DIRNAME) += dirname.o lib-$(CONFIG_DOS2UNIX) += dos2unix.o lib-$(CONFIG_DU) += du.o lib-$(CONFIG_ECHO) += echo.o +lib-$(CONFIG_ASH) += echo.o # used by ash lib-$(CONFIG_ENV) += env.o lib-$(CONFIG_EXPR) += expr.o lib-$(CONFIG_FALSE) += false.o @@ -65,6 +67,7 @@ lib-$(CONFIG_SYNC) += sync.o lib-$(CONFIG_TAIL) += tail.o lib-$(CONFIG_TEE) += tee.o lib-$(CONFIG_TEST) += test.o +lib-$(CONFIG_ASH) += test.o # used by ash lib-$(CONFIG_TOUCH) += touch.o lib-$(CONFIG_TR) += tr.o lib-$(CONFIG_TRUE) += true.o diff --git a/coreutils/cat.c b/coreutils/cat.c index a95980552..db4d33dc5 100644 --- a/coreutils/cat.c +++ b/coreutils/cat.c @@ -11,20 +11,12 @@ /* http://www.opengroup.org/onlinepubs/007904975/utilities/cat.html */ #include "busybox.h" -#include -int cat_main(int argc, char **argv) +int bb_cat(char **argv) { FILE *f; int retval = EXIT_SUCCESS; - getopt32(argc, argv, "u"); - - argv += optind; - if (!*argv) { - *--argv = "-"; - } - do { f = fopen_or_warn_stdin(*argv); if (f) { @@ -39,3 +31,15 @@ int cat_main(int argc, char **argv) return retval; } + +int cat_main(int argc, char **argv) +{ + getopt32(argc, argv, "u"); + + argv += optind; + if (!*argv) { + *--argv = "-"; + } + + return bb_cat(argv); +} diff --git a/coreutils/diff.c b/coreutils/diff.c index 887679a0a..a49d5195a 100644 --- a/coreutils/diff.c +++ b/coreutils/diff.c @@ -1079,7 +1079,7 @@ static char **get_dir(char *path) dp = warn_opendir(path); while ((ep = readdir(dp))) { - if ((!strcmp(ep->d_name, "..")) || (!strcmp(ep->d_name, "."))) + if (!strcmp(ep->d_name, "..") || LONE_CHAR(ep->d_name, '.')) continue; add_to_dirlist(ep->d_name, NULL, NULL, 0); } diff --git a/coreutils/echo.c b/coreutils/echo.c index 99063ae52..0c8eac3bc 100644 --- a/coreutils/echo.c +++ b/coreutils/echo.c @@ -29,7 +29,7 @@ #include #include "busybox.h" -int bb_echo(int ATTRIBUTE_UNUSED argc, char **argv) +int bb_echo(char **argv) { #ifndef CONFIG_FEATURE_FANCY_ECHO #define eflag '\\' @@ -114,7 +114,7 @@ just_echo: int echo_main(int argc, char** argv) { - (void)bb_echo(argc, argv); + (void)bb_echo(argv); fflush_stdout_and_exit(EXIT_SUCCESS); } diff --git a/coreutils/expr.c b/coreutils/expr.c index 191473446..51e553dc6 100644 --- a/coreutils/expr.c +++ b/coreutils/expr.c @@ -136,7 +136,7 @@ static int null(VALUE * v) if (v->type == integer) return v->u.i == 0; else /* string: */ - return v->u.s[0] == '\0' || strcmp(v->u.s, "0") == 0; + return v->u.s[0] == '\0' || LONE_CHAR(v->u.s, '0'); } /* Coerce V to a string value (can't fail). */ diff --git a/coreutils/test.c b/coreutils/test.c index ebb4f9086..d3d760467 100644 --- a/coreutils/test.c +++ b/coreutils/test.c @@ -175,14 +175,16 @@ int bb_test(int argc, char **argv) { int res; - if (strcmp(argv[0], "[") == 0) { - if (strcmp(argv[--argc], "]")) { + if (LONE_CHAR(argv[0], '[')) { + --argc; + if (NOT_LONE_CHAR(argv[argc], ']')) { bb_error_msg("missing ]"); return 2; } argv[argc] = NULL; } else if (strcmp(argv[0], "[[") == 0) { - if (strcmp(argv[--argc], "]]")) { + --argc; + if (strcmp(argv[argc], "]]")) { bb_error_msg("missing ]]"); return 2; } @@ -578,6 +580,6 @@ static int is_a_group_member(gid_t gid) int test_main(int argc, char **argv) { - exit(bb_test(argc, argv)); + return bb_test(argc, argv); } diff --git a/e2fsprogs/blkid/devname.c b/e2fsprogs/blkid/devname.c index d69000be7..3d11734d5 100644 --- a/e2fsprogs/blkid/devname.c +++ b/e2fsprogs/blkid/devname.c @@ -189,7 +189,7 @@ static void lvm_probe_all(blkid_cache cache) struct dirent *lv_iter; vg_name = vg_iter->d_name; - if (!strcmp(vg_name, ".") || !strcmp(vg_name, "..")) + if (LONE_CHAR(vg_name, '.') || !strcmp(vg_name, "..")) continue; vdirname = xmalloc(vg_len + strlen(vg_name) + 8); sprintf(vdirname, "%s/%s/LVs", VG_DIR, vg_name); @@ -203,7 +203,7 @@ static void lvm_probe_all(blkid_cache cache) char *lv_name, *lvm_device; lv_name = lv_iter->d_name; - if (!strcmp(lv_name, ".") || !strcmp(lv_name, "..")) + if (LONE_CHAR(lv_name, '.') || !strcmp(lv_name, "..")) continue; lvm_device = xmalloc(vg_len + strlen(vg_name) + diff --git a/e2fsprogs/chattr.c b/e2fsprogs/chattr.c index 4c341627e..4848e1e1a 100644 --- a/e2fsprogs/chattr.c +++ b/e2fsprogs/chattr.c @@ -157,9 +157,10 @@ skip_setflags: static int chattr_dir_proc(const char *dir_name, struct dirent *de, void *private EXT2FS_ATTR((unused))) { - /*if (strcmp(de->d_name, ".") && strcmp(de->d_name, "..")) {*/ - if (de->d_name[0] == '.' && (de->d_name[1] == '\0' || \ - (de->d_name[1] == '.' && de->d_name[2] == '\0'))) { + /*if (strcmp(de->d_name, ".") || strcmp(de->d_name, "..")) {*/ + if (de->d_name[0] == '.' + && (!de->d_name[1] || (de->d_name[1] == '.' && !de->d_name[2])) + ) { char *path = concat_subpath_file(dir_name, de->d_name); if (path) { change_attributes(path); diff --git a/e2fsprogs/ext2fs/ismounted.c b/e2fsprogs/ext2fs/ismounted.c index cace7715c..d943f1185 100644 --- a/e2fsprogs/ext2fs/ismounted.c +++ b/e2fsprogs/ext2fs/ismounted.c @@ -144,7 +144,7 @@ static errcode_t check_mntent_file(const char *mtab_file, const char *file, * read/write, since if the root is mounted read/only, the * contents of /etc/mtab may not be accurate. */ - if (!strcmp(mnt->mnt_dir, "/")) { + if (LONE_CHAR(mnt->mnt_dir, '/')) { is_root: #define TEST_FILE "/.ismount-test-file" *mount_flags |= EXT2_MF_ISROOT; diff --git a/e2fsprogs/fsck.c b/e2fsprogs/fsck.c index 3b01c1021..da66250f1 100644 --- a/e2fsprogs/fsck.c +++ b/e2fsprogs/fsck.c @@ -1080,7 +1080,7 @@ static int check_all(void) */ if (!parallel_root) { for (fs = filesys_info; fs; fs = fs->next) { - if (!strcmp(fs->mountpt, "/")) + if (LONE_CHAR(fs->mountpt, '/')) break; } if (fs) { @@ -1099,7 +1099,7 @@ static int check_all(void) */ if (skip_root) for (fs = filesys_info; fs; fs = fs->next) - if (!strcmp(fs->mountpt, "/")) + if (LONE_CHAR(fs->mountpt, '/')) fs->flags |= FLAG_DONE; while (not_done_yet) { diff --git a/include/libbb.h b/include/libbb.h index 7dc7abd7f..2fd54e789 100644 --- a/include/libbb.h +++ b/include/libbb.h @@ -263,6 +263,8 @@ extern char *xasprintf(const char *format, ...) __attribute__ ((format (printf, //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]) +#define LONE_CHAR(s,c) ((s)[0] == (c) && !(s)[1]) +#define NOT_LONE_CHAR(s,c) ((s)[0] != (c) || (s)[1]) /* dmalloc will redefine these to it's own implementation. It is safe * to have the prototypes here unconditionally. */ @@ -386,7 +388,9 @@ extern void bb_vperror_msg(const char *s, va_list p); extern void bb_vinfo_msg(const char *s, va_list p); -extern int bb_echo(int argc, char** argv); +/* applets which are useful from another applets */ +extern int bb_cat(char** argv); +extern int bb_echo(char** argv); extern int bb_test(int argc, char** argv); #ifndef BUILD_INDIVIDUAL diff --git a/init/init.c b/init/init.c index 213a5c149..bc53feeae 100644 --- a/init/init.c +++ b/init/init.c @@ -1047,8 +1047,9 @@ int init_main(int argc, char **argv) } /* Check if we are supposed to be in single user mode */ - if (argc > 1 && (!strcmp(argv[1], "single") || - !strcmp(argv[1], "-s") || !strcmp(argv[1], "1"))) { + if (argc > 1 + && (!strcmp(argv[1], "single") || !strcmp(argv[1], "-s") || LONE_CHAR(argv[1], '1')) + ) { /* Start a shell on console */ new_init_action(RESPAWN, bb_default_login_shell, ""); } else { diff --git a/libbb/correct_password.c b/libbb/correct_password.c index fd7e0b56c..d031b2109 100644 --- a/libbb/correct_password.c +++ b/libbb/correct_password.c @@ -40,15 +40,14 @@ int correct_password(const struct passwd *pw) char *unencrypted, *encrypted, *correct; #ifdef CONFIG_FEATURE_SHADOWPASSWDS - if (!strcmp(pw->pw_passwd, "x") || !strcmp(pw->pw_passwd, "*")) { + if (LONE_CHAR(pw->pw_passwd, 'x') || LONE_CHAR(pw->pw_passwd, '*')) { struct spwd *sp = getspnam(pw->pw_name); if (!sp) bb_error_msg_and_die("no valid shadow password"); correct = sp->sp_pwdp; - } - else + } else #endif correct = pw->pw_passwd; diff --git a/miscutils/last.c b/miscutils/last.c index 668f0c17d..fd1033bf7 100644 --- a/miscutils/last.c +++ b/miscutils/last.c @@ -44,7 +44,7 @@ int last_main(int argc, char **argv) bb_perror_msg_and_die("short read"); } - if (strncmp(ut.ut_line, "~", 1) == 0) { + if (ut.ut_line[0] == '~') { if (strncmp(ut.ut_user, "shutdown", 8) == 0) ut.ut_type = SHUTDOWN_TIME; else if (strncmp(ut.ut_user, "reboot", 6) == 0) diff --git a/networking/inetd.c b/networking/inetd.c index 4856b11ae..7c89be28f 100644 --- a/networking/inetd.c +++ b/networking/inetd.c @@ -759,7 +759,7 @@ static servtab_t *getconfigent(void) while (nsep != NULL) { nsep->se_checked = 1; if (nsep->se_family == AF_INET) { - if (!strcmp(nsep->se_hostaddr, "*")) + if (LONE_CHAR(nsep->se_hostaddr, '*')) nsep->se_ctrladdr_in.sin_addr.s_addr = INADDR_ANY; else if (!inet_aton(nsep->se_hostaddr, &nsep->se_ctrladdr_in.sin_addr)) { struct hostent *hp; diff --git a/networking/libiproute/ipaddress.c b/networking/libiproute/ipaddress.c index 9fb08e6ba..e6130e4d7 100644 --- a/networking/libiproute/ipaddress.c +++ b/networking/libiproute/ipaddress.c @@ -678,7 +678,7 @@ static int ipaddr_modify(int cmd, int argc, char **argv) if (brd_len) { duparg("broadcast", *argv); } - if (strcmp(*argv, "+") == 0) { + if (LONE_CHAR(*argv, '+')) { brd_len = -1; } else if (LONE_DASH(*argv)) { diff --git a/shell/ash.c b/shell/ash.c index 97f0d6bef..591e0a658 100644 --- a/shell/ash.c +++ b/shell/ash.c @@ -8172,7 +8172,7 @@ exitcmd(int argc, char **argv) static int echocmd(int argc, char **argv) { - return bb_echo(argc, argv); + return bb_echo(argv); } #endif -- 2.25.1