From 468aea2d8800cc0496383616d82d7c957ae8bc50 Mon Sep 17 00:00:00 2001 From: Denis Vlasenko Date: Tue, 1 Apr 2008 14:47:57 +0000 Subject: shells: do not frocibly enable test, echo and kill _applets_, just build relevant source and use xxx_main functions. build system: add a special case when we have exactly one applet enabled (makes "true", "false", "basename" REALLY tiny). getopt32: do not use stdio. function old new delta getopt32 1385 1412 +27 make_device 1187 1200 +13 basename_main 120 127 +7 tcpudpsvd_main 1922 1926 +4 testcmd 5 - -5 echocmd 5 - -5 fuser_main 1243 1231 -12 ------------------------------------------------------------------------------ (add/remove: 0/2 grow/shrink: 4/1 up/down: 51/-22) Total: 29 bytes --- coreutils/Kbuild | 3 +++ coreutils/basename.c | 11 ++++++----- coreutils/echo.c | 4 +--- 3 files changed, 10 insertions(+), 8 deletions(-) (limited to 'coreutils') diff --git a/coreutils/Kbuild b/coreutils/Kbuild index b9ed0d7..253eb6d 100644 --- a/coreutils/Kbuild +++ b/coreutils/Kbuild @@ -30,6 +30,7 @@ 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_HUSH) += echo.o # used by hush lib-$(CONFIG_ENV) += env.o lib-$(CONFIG_EXPR) += expr.o lib-$(CONFIG_EXPAND) += expand.o @@ -72,6 +73,8 @@ 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_HUSH) += test.o # used by hush +lib-$(CONFIG_MSH) += test.o # used by msh lib-$(CONFIG_TOUCH) += touch.o lib-$(CONFIG_TR) += tr.o lib-$(CONFIG_TRUE) += true.o diff --git a/coreutils/basename.c b/coreutils/basename.c index d536a1b..ed23779 100644 --- a/coreutils/basename.c +++ b/coreutils/basename.c @@ -37,15 +37,16 @@ int basename_main(int argc, char **argv) /* It should strip slash: /abc/def/ -> def */ s = bb_get_last_path_component_strip(*++argv); + m = strlen(s); if (*++argv) { n = strlen(*argv); - m = strlen(s); if ((m > n) && ((strcmp)(s+m-n, *argv) == 0)) { - s[m-n] = '\0'; + m -= n; + s[m] = '\0'; } } - puts(s); - - return fflush(stdout); + /* puts(s) will do, but we can do without stdio this way: */ + s[m++] = '\n'; + return full_write(STDOUT_FILENO, s, m) == m; } diff --git a/coreutils/echo.c b/coreutils/echo.c index fd6c950..6e25db6 100644 --- a/coreutils/echo.c +++ b/coreutils/echo.c @@ -27,10 +27,8 @@ /* This is a NOFORK applet. Be very careful! */ -/* argc is unused, but removing it precludes compiler from - * using call -> jump optimization */ +/* NB: can be used by shell even if not enabled as applet */ -int echo_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; int echo_main(int argc ATTRIBUTE_UNUSED, char **argv) { const char *arg; -- cgit v1.1