Stat cleanup.

lib: rename format_mode() to mode_to_string() (echoing string_to_mode), make it
take a normal char * argument.

stat: collapse big switch/case statements that only have one line each
into if/else staircase (much fewer lines of code). Remove return type
(other stat implementations print ? for unknown escapes, so do that here).
Inline do_stat() and do_statfs(). Set default string in normal local
variable "format". Remove unnecessary struct d. Restructure stat logic to
"if (flagf && !statfs()) else if (!flagf && !stat()) else perror_msg();"
Teach %N to add -> symlink. Judicious use of putchar() instead of xputc to
let FILE * do its job collating output.
diff --git a/lib/lib.c b/lib/lib.c
index 7b0cf1a..af820e2 100644
--- a/lib/lib.c
+++ b/lib/lib.c
@@ -1205,13 +1205,13 @@
   error_exit("bad mode '%s'", modestr);
 }
 
-// Format a mode for ls and stat
-void format_mode(char (*buf)[11], mode_t mode)
+// Format access mode into a drwxrwxrwx string
+void mode_to_string(mode_t mode, char *buf)
 {
   char c, d;
   int i, bit;
 
-  (*buf)[10]=0;
+  buf[10]=0;
   for (i=0; i<9; i++) {
     bit = mode & (1<<i);
     c = i%3;
@@ -1219,7 +1219,7 @@
       c = "tss"[d];
       if (!bit) c &= ~0x20;
     } else c = bit ? "xwr"[c] : '-';
-    (*buf)[9-i] = c;
+    buf[9-i] = c;
   }
 
   if (S_ISDIR(mode)) c = 'd';
@@ -1229,7 +1229,7 @@
   else if (S_ISFIFO(mode)) c = 'p';
   else if (S_ISSOCK(mode)) c = 's';
   else c = '-';
-  **buf = c;
+  *buf = c;
 }
 
 char* make_human_readable(unsigned long long size, unsigned long unit)