more: fix tabs handling
authorDenys Vlasenko <vda.linux@googlemail.com>
Mon, 7 Mar 2011 01:01:52 +0000 (02:01 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Mon, 7 Mar 2011 01:01:52 +0000 (02:01 +0100)
function                                             old     new   delta
more_main                                            837     829      -8

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
util-linux/more.c

index c424a0e4b52af81dccbad7bd55e11142f55c84f8..7160b8b00b20dff4f85638379731e1bfb62e8bad 100644 (file)
@@ -113,9 +113,12 @@ int more_main(int argc UNUSED_PARAM, char **argv)
  loop_top:
                        if (input != 'r' && please_display_more_prompt) {
                                len = printf("--More-- ");
-                               if (st.st_size > 0) {
+                               if (st.st_size != 0) {
+                                       uoff_t d = (uoff_t)st.st_size / 100;
+                                       if (d == 0)
+                                               d = 1;
                                        len += printf("(%u%% of %"OFF_FMT"u bytes)",
-                                               (int) (ftello(file)*100 / st.st_size),
+                                               (int) ((uoff_t)ftello(file) / d),
                                                st.st_size);
                                }
                                fflush_all();
@@ -159,7 +162,7 @@ int more_main(int argc UNUSED_PARAM, char **argv)
                        /* Crudely convert tabs into spaces, which are
                         * a bajillion times easier to deal with. */
                        if (c == '\t') {
-                               spaces = CONVERTED_TAB_SIZE - 1;
+                               spaces = ((unsigned)~len) % CONVERTED_TAB_SIZE;
                                c = ' ';
                        }