nl: new applet; also implement cat -nb (similar functionality to nl)

function                                             old     new   delta
nl_main                                                -     201    +201
print_numbered_lines                                   -     115    +115
cat_main                                              36     149    +113
static.nl_longopts                                     -     106    +106
packed_usage                                       31081   31182    +101
applet_main                                         1488    1492      +4
applet_names                                        2575    2578      +3
applet_suid                                           93      94      +1
applet_install_loc                                   186     187      +1
------------------------------------------------------------------------------
(add/remove: 4/0 grow/shrink: 6/0 up/down: 645/0)             Total: 645 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
diff --git a/coreutils/cat.c b/coreutils/cat.c
index 6597888..4169d95 100644
--- a/coreutils/cat.c
+++ b/coreutils/cat.c
@@ -15,15 +15,31 @@
 
 //applet:IF_CAT(APPLET_NOFORK(cat, cat, BB_DIR_BIN, BB_SUID_DROP, cat))
 
-//kbuild:lib-$(CONFIG_CAT)     += cat.o
+//kbuild:lib-$(CONFIG_CAT) += cat.o
+// For -n:
+//kbuild:lib-$(CONFIG_CAT) += nl.o
 
 /* BB_AUDIT SUSv3 compliant */
 /* http://www.opengroup.org/onlinepubs/007904975/utilities/cat.html */
 
 //usage:#define cat_trivial_usage
-//usage:       "[FILE]..."
+//usage:       "[-n] [FILE]..."
 //usage:#define cat_full_usage "\n\n"
 //usage:       "Concatenate FILEs and print them to stdout"
+//usage:     "\n	-n	Number output lines"
+/*
+  Longopts not implemented yet:
+     --number-nonblank    number nonempty output lines, overrides -n
+     --number             number all output lines
+  Not implemented yet:
+  -A, --show-all           equivalent to -vET
+  -e                       equivalent to -vE
+  -E, --show-ends          display $ at end of each line
+  -s, --squeeze-blank      suppress repeated empty output lines
+  -t                       equivalent to -vT
+  -T, --show-tabs          display TAB characters as ^I
+  -v, --show-nonprinting   use ^ and M- notation, except for LFD and TAB
+*/
 //usage:
 //usage:#define cat_example_usage
 //usage:       "$ cat /proc/uptime\n"
@@ -61,7 +77,26 @@
 int cat_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
 int cat_main(int argc UNUSED_PARAM, char **argv)
 {
-	getopt32(argv, "u");
+	struct number_state ns;
+	unsigned opt;
+
+	/* -u is ignored */
+	opt = getopt32(argv, "nbu");
 	argv += optind;
-	return bb_cat(argv);
+	if (!(opt & 3)) /* no -n or -b */
+		return bb_cat(argv);
+
+	if (!*argv)
+		*--argv = (char*)"-";
+	ns.width = 6;
+	ns.start = 1;
+	ns.inc = 1;
+	ns.sep = "\t";
+	ns.empty_str = "\n";
+	ns.all = !(opt & 2); /* -n without -b */
+	ns.nonempty = (opt & 2); /* -b (with or without -n) */
+	do {
+		print_numbered_lines(&ns, *argv);
+	} while (*++argv);
+	fflush_stdout_and_exit(EXIT_SUCCESS);
 }