man: code shrink
authorDenis Vlasenko <vda.linux@googlemail.com>
Sat, 5 Jul 2008 08:38:41 +0000 (08:38 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Sat, 5 Jul 2008 08:38:41 +0000 (08:38 -0000)
function                                             old     new   delta
man_main                                             725     765     +40
show_manpage                                         112       -    -112
------------------------------------------------------------------------------
(add/remove: 0/1 grow/shrink: 1/0 up/down: 40/-112)           Total: -72 bytes

miscutils/man.c

index 20172f6b25e7b07d0468a7e1d8bde6f91823420a..509ae96bd9ddd1fae0212148da75d4b9eb6fb543 100644 (file)
@@ -23,6 +23,10 @@ echo ".pl \n(nlu+10"
 
 */
 
+/* Trick gcc to reuse "cat" string. */
+#define STR_catNULmanNUL "cat\0man"
+#define STR_cat          "cat\0man"
+
 static int run_pipe(const char *unpacker, const char *pager, char *man_filename, int cat)
 {
        char *cmd;
@@ -61,7 +65,7 @@ static int show_manpage(const char *pager, char *man_filename, int cat)
                return 1;
 
        man_filename[len - 3] = '\0'; /* ".gz" -> "" */
-       if (run_pipe("cat", pager, man_filename, cat))
+       if (run_pipe(STR_cat, pager, man_filename, cat))
                return 1;
 
        return 0;
@@ -147,28 +151,22 @@ int man_main(int argc ATTRIBUTE_UNUSED, char **argv)
                                        char *next_sect = strchrnul(cur_sect, ':');
                                        int sect_len = next_sect - cur_sect;
                                        char *man_filename;
-                                       int found_here;
-
-                                       /* Search for cat page first */
-                                       man_filename = xasprintf("%.*s/%s%.*s/%s.%.*s" ".bz2",
-                                                       path_len, cur_path,
-                                                       "cat",
-                                                       sect_len, cur_sect,
-                                                       *argv,
-                                                       sect_len, cur_sect);
-                                       found_here = show_manpage(pager, man_filename, 1);
-                                       free(man_filename);
-                                       if (!found_here) {
+                                       int cat0man1 = 0;
+
+                                       /* Search for cat, then man page */
+                                       while (cat0man1 < 2) {
+                                               int found_here;
                                                man_filename = xasprintf("%.*s/%s%.*s/%s.%.*s" ".bz2",
-                                                       path_len, cur_path,
-                                                       "man",
-                                                       sect_len, cur_sect,
-                                                       *argv,
-                                                       sect_len, cur_sect);
-                                               found_here = show_manpage(pager, man_filename, 0);
+                                                               path_len, cur_path,
+                                                               STR_catNULmanNUL + cat0man1 * 4,
+                                                               sect_len, cur_sect,
+                                                               *argv,
+                                                               sect_len, cur_sect);
+                                               found_here = show_manpage(pager, man_filename, cat0man1);
+                                               found |= found_here;
+                                               cat0man1 += found_here + 1;
                                                free(man_filename);
                                        }
-                                       found |= found_here;
 
                                        if (found && !(opt & OPT_a))
                                                goto next_arg;