use fast string formatting routines
authorJann Horn <jannhorn@googlemail.com>
Mon, 12 Nov 2012 16:43:31 +0000 (17:43 +0100)
committerJann Horn <jannhorn@googlemail.com>
Mon, 12 Nov 2012 16:43:31 +0000 (17:43 +0100)
compile
listdir.c

diff --git a/compile b/compile
index 68ca0e5..251fa4a 100755 (executable)
--- a/compile
+++ b/compile
@@ -1,6 +1,7 @@
 #!/bin/bash
 for cgi in login checkstatus listdir; do
-  diet gcc -O3 -std=gnu99 -Wall -Werror -g -o $cgi $cgi.c cgistuff.c hex.c -lcrypt
+  echo -e "\ncompiling $cgi.c..."
+  diet gcc -O3 -std=gnu99 -Wall -Werror -g -o $cgi $cgi.c cgistuff.c hex.c -lcrypt -lowfat
   sudo chown root:root $cgi
   sudo chmod u+s $cgi
 done
index bfbd47c..9f1afda 100644 (file)
--- a/listdir.c
+++ b/listdir.c
@@ -10,6 +10,7 @@
 #include <stdio.h>
 #include <errno.h>
 #include <sys/stat.h>
+#include <fmt.h>
 
 int main() {
   FASTOUTPUT
@@ -47,14 +48,21 @@ int main() {
   
   // send one line per file
   struct dirent *dent;
-  char encfilename[NAME_MAX*2+1];
+  char linedata[NAME_MAX*2+1+FMT_ULONG+1+FMT_ULONG+1];
   while ((dent = readdir(dir)) != NULL) {
-    size_t name_len = strlen(dent->d_name);
-    hex(encfilename, (unsigned char *)dent->d_name, name_len);
-    encfilename[name_len*2] = 0;
     struct stat st;
     // if we can't really see the file anyway, skip it
     if (lstat(dent->d_name, &st)) continue;
-    printf("%s %lu %u\n", encfilename, (unsigned long)st.st_size, (unsigned int)st.st_mode);
+    //printf("%s %lu %u\n", encfilename, (unsigned long)st.st_size, (unsigned int)st.st_mode);
+    size_t name_len = strlen(dent->d_name);
+    hex(linedata, (unsigned char *)dent->d_name, name_len);
+    char *p = linedata+name_len*2;
+    *(p++) = ' ';
+    p += fmt_ulong(p, (unsigned long)st.st_size);
+    *(p++) = ' ';
+    p += fmt_ulong(p, (unsigned int)st.st_mode);
+    *(p++) = '\n';
+    *p = 0;
+    fputs(linedata, stdout);
   }
 }