'env' and 'basename' refactored
authorTryn Mirell <tryn@mirell.org>
Fri, 20 Jan 2012 06:02:37 +0000 (00:02 -0600)
committerTryn Mirell <tryn@mirell.org>
Fri, 20 Jan 2012 06:02:37 +0000 (00:02 -0600)
toys/basename.c
toys/env.c

index b5ace42..8ac7e8c 100644 (file)
@@ -7,7 +7,7 @@
  * See http://opengroup.org/onlinepubs/9699919799/utilities/basename.html
 
 
-USE_BASENAME(NEWTOY(basename, NULL, TOYFLAG_USR|TOYFLAG_BIN))
+USE_BASENAME(NEWTOY(basename, "<1>2", TOYFLAG_USR|TOYFLAG_BIN))
 
 config BASENAME
        bool "basename"
@@ -22,40 +22,23 @@ config BASENAME
 
 void basename_main(void)
 {
-    char *arg, *suffix, *base;
-    int arglen;
-
-    arg = toys.optargs[0];
-    suffix = toys.optargs[1];
-
-    // return null string if nothing provided
-    if (!arg) return; 
-
-    arglen = strlen(arg);
-    // handle the case where we only have single slash
-    if (arglen == 1 && arg[0] == '/') {
-        puts("/");
-        return;
+    char *arg = toys.optargs[0], *suffix = toys.optargs[1], *base;
+
+    while ((base = strrchr(arg, '/'))) {
+        if (base == arg) break;
+        if (!base[1]) *base = 0;
+        else {
+            base++;
+            break;
+        }
     }
 
-    // remove trailing slash
-    if (arg[arglen - 1] == '/') {
-        arg[arglen - 1] = 0;
-    }
-
-    // get everything past the last /
-    base = strrchr(arg, '/');
-
     if (!base) base = arg;
-    else base++;
-   
-    // handle the case where we have all slashes
-    if (base[0] == 0) base = "/";  
     
     // chop off the suffix if provided
     if (suffix) {
-        strstr(base, suffix)[0] = 0;
+        char *s = strstr(base, suffix);
+        if (s && s != base) *s = 0;
     }
 
     puts(base);
index b05f892..0a1dd3e 100644 (file)
@@ -1,13 +1,14 @@
 /* vi: set sw=4 ts=4:
  * env.c
 
-USE_ENV(NEWTOY(env, "^?i", TOYFLAG_USR|TOYFLAG_BIN))
+USE_ENV(NEWTOY(env, "^i", TOYFLAG_USR|TOYFLAG_BIN))
 
 config ENV
        bool "env"
        default n
        help
-        
+        usage: env [-i] [FOO=BAR...] [command [option...]]
+
         Set the environment for command invocation
 */
 
@@ -19,20 +20,19 @@ void env_main(void)
 {
     char **ev;
     char **command = NULL;
-
+    char *del = "=";
+    
     if (toys.optflags & 1) clearenv();
     
     for (ev = toys.optargs; *ev != NULL; ev++) {
-        char *env = NULL, *val = NULL;
-        char *del = "=";
+        char *env, *val = NULL;
         
         env = strtok(*ev, del);
         
-        if (env != NULL) val = strtok(NULL, del);
+        if (env) val = strtok(NULL, del);
         
-        if (val != NULL) {
-            setenv(env, val, 1);
-        } else {
+        if (val) setenv(env, val, 1);
+        else {
             command = ev;
             break;
         }
@@ -40,13 +40,8 @@ void env_main(void)
     
     if (!command) {
         char **ep;
-        if (environ) {
-            for (ep = environ; *ep != NULL; ep++)
-                xputs(*ep);
-            return;
-        }
-    } else {
-        execvp(*command, command);
-    }
-
+        for (ep = environ; *ep; ep++)
+            xputs(*ep);
+        return;
+    } else execvp(*command, command);
 }