diff --git a/util-linux/more.c b/util-linux/more.c
index 821427d..d5711aa 100644
--- a/util-linux/more.c
+++ b/util-linux/more.c
@@ -1,3 +1,4 @@
+/* vi: set sw=4 ts=4: */
 /*
  * Mini more implementation for busybox
  *
@@ -45,19 +46,20 @@
 #      define stty(fd,argp) tcsetattr(fd,TCSANOW,argp)
 #endif
 
-    FILE *cin;
-    struct termios initial_settings, new_settings;
+FILE *cin;
+struct termios initial_settings, new_settings;
 
-    void gotsig(int sig) { 
-	    stty(fileno(cin), &initial_settings);
-	    fprintf(stdout, "\n");
-	    exit( TRUE);
-    }
+void gotsig(int sig)
+{
+	stty(fileno(cin), &initial_settings);
+	fprintf(stdout, "\n");
+	exit(TRUE);
+}
 #endif
 
 
 
-#define TERMINAL_WIDTH	79	/* not 80 in case terminal has linefold bug */
+#define TERMINAL_WIDTH	79		/* not 80 in case terminal has linefold bug */
 #define TERMINAL_HEIGHT	24
 
 
@@ -72,118 +74,121 @@
 
 extern int more_main(int argc, char **argv)
 {
-    int c, lines=0, input=0;
-    int next_page=0;
-    struct stat st;	
-    FILE *file;
+	int c, lines = 0, input = 0;
+	int next_page = 0;
+	struct stat st;
+	FILE *file;
+
 #ifdef BB_FEATURE_AUTOWIDTH
-    struct winsize win = {0,0};
+	struct winsize win = { 0, 0 };
 #endif
 
-    argc--;
-    argv++;
-
-    if ( argc > 0 && (strcmp(*argv,"--help")==0 || strcmp(*argv,"-h")==0) ) {
-	usage (more_usage);
-    }
-    do {
-	if (argc==0) {
-	    file = stdin;
-	}
-	else
-	    file = fopen(*argv, "r");
-
-	if (file == NULL) {
-	    perror(*argv);
-	    exit(FALSE);
-	}
-	fstat(fileno(file), &st);
-
-#ifdef BB_FEATURE_USE_TERMIOS
-	cin = fopen("/dev/tty", "r");
-	if (!cin)
-	    cin = fopen("/dev/console", "r");
-#ifdef USE_OLD_TERMIO
-	ioctl(fileno(cin),TCGETA,&initial_settings);
-#else
-	tcgetattr(fileno(cin),&initial_settings);
-#endif
-	new_settings = initial_settings;
-	new_settings.c_lflag &= ~ICANON;
-	new_settings.c_lflag &= ~ECHO;
-	stty(fileno(cin), &new_settings);
-
-#ifdef BB_FEATURE_AUTOWIDTH	
-	ioctl(fileno(stdout), TIOCGWINSZ, &win);
-	if (win.ws_row > 4) 
-	    terminal_height = win.ws_row - 2;
-	if (win.ws_col > 0) 
-	    terminal_width = win.ws_col - 1;
-#endif
-
-	(void) signal(SIGINT, gotsig);
-	(void) signal(SIGQUIT, gotsig);
-	(void) signal(SIGTERM, gotsig);
-
-#endif
-	while ((c = getc(file)) != EOF) {
-	    if ( next_page ) {
-		int len=0;
-		next_page = 0;
-		lines=0;
-		len = fprintf(stdout, "--More-- ");
-		if (file != stdin) {
-		    len += fprintf(stdout, "(%d%% of %ld bytes)", 
-			(int) (100*( (double) ftell(file) / (double) st.st_size )),
-			st.st_size);
-		}
-		len += fprintf(stdout, "%s",
-#ifdef BB_FEATURE_USE_TERMIOS
-			""
-#else
-			"\n"
-#endif
-			);
-
-		fflush(stdout);
-		input = getc( cin);
-
-#ifdef BB_FEATURE_USE_TERMIOS
-		/* Erase the "More" message */
-		while(--len >= 0)
-		    putc('\b', stdout);
-		while(++len <= terminal_width)
-		    putc(' ', stdout);
-		while(--len >= 0)
-		    putc('\b', stdout);
-		fflush(stdout);
-#endif
-
-	    }
-	    if (c == '\n' ) {
-		switch(input) {
-		    case 'q':
-			goto end;
-		    case '\n':
-			/* increment by just one line if we are at 
-			 * the end of this line*/
-			next_page = 1;
-			break;
-		}
-		if ( ++lines == terminal_height )
-		    next_page = 1;
-	    }
-	    putc(c, stdout);
-	}
-	fclose(file);
-	fflush(stdout);
-
+	argc--;
 	argv++;
-    } while (--argc > 0);
-end:
-#ifdef BB_FEATURE_USE_TERMIOS
-    gotsig(0);
-#endif	
-    exit(TRUE);
-}
 
+	if (argc > 0
+		&& (strcmp(*argv, "--help") == 0 || strcmp(*argv, "-h") == 0)) {
+		usage(more_usage);
+	}
+	do {
+		if (argc == 0) {
+			file = stdin;
+		} else
+			file = fopen(*argv, "r");
+
+		if (file == NULL) {
+			perror(*argv);
+			exit(FALSE);
+		}
+		fstat(fileno(file), &st);
+
+#ifdef BB_FEATURE_USE_TERMIOS
+		cin = fopen("/dev/tty", "r");
+		if (!cin)
+			cin = fopen("/dev/console", "r");
+#ifdef USE_OLD_TERMIO
+		ioctl(fileno(cin), TCGETA, &initial_settings);
+#else
+		tcgetattr(fileno(cin), &initial_settings);
+#endif
+		new_settings = initial_settings;
+		new_settings.c_lflag &= ~ICANON;
+		new_settings.c_lflag &= ~ECHO;
+		stty(fileno(cin), &new_settings);
+
+#ifdef BB_FEATURE_AUTOWIDTH
+		ioctl(fileno(stdout), TIOCGWINSZ, &win);
+		if (win.ws_row > 4)
+			terminal_height = win.ws_row - 2;
+		if (win.ws_col > 0)
+			terminal_width = win.ws_col - 1;
+#endif
+
+		(void) signal(SIGINT, gotsig);
+		(void) signal(SIGQUIT, gotsig);
+		(void) signal(SIGTERM, gotsig);
+
+#endif
+		while ((c = getc(file)) != EOF) {
+			if (next_page) {
+				int len = 0;
+
+				next_page = 0;
+				lines = 0;
+				len = fprintf(stdout, "--More-- ");
+				if (file != stdin) {
+					len += fprintf(stdout, "(%d%% of %ld bytes)",
+								   (int) (100 *
+										  ((double) ftell(file) /
+										   (double) st.st_size)),
+								   st.st_size);
+				}
+				len += fprintf(stdout, "%s",
+#ifdef BB_FEATURE_USE_TERMIOS
+							   ""
+#else
+							   "\n"
+#endif
+					);
+
+				fflush(stdout);
+				input = getc(cin);
+
+#ifdef BB_FEATURE_USE_TERMIOS
+				/* Erase the "More" message */
+				while (--len >= 0)
+					putc('\b', stdout);
+				while (++len <= terminal_width)
+					putc(' ', stdout);
+				while (--len >= 0)
+					putc('\b', stdout);
+				fflush(stdout);
+#endif
+
+			}
+			if (c == '\n') {
+				switch (input) {
+				case 'q':
+					goto end;
+				case '\n':
+					/* increment by just one line if we are at 
+					 * the end of this line*/
+					next_page = 1;
+					break;
+				}
+				if (++lines == terminal_height)
+					next_page = 1;
+			}
+			putc(c, stdout);
+		}
+		fclose(file);
+		fflush(stdout);
+
+		argv++;
+	} while (--argc > 0);
+  end:
+#ifdef BB_FEATURE_USE_TERMIOS
+	gotsig(0);
+#endif
+	exit(TRUE);
+}
