3e414273aa34756cd5a7084b9e2a31407fba1e4a
max
  Sun Oct 6 10:50:20 2013 -0700
adding -h flag to calc for more readable numbers
diff --git src/utils/calc/calc.c src/utils/calc/calc.c
index 8ead619..7cf0a31 100644
--- src/utils/calc/calc.c
+++ src/utils/calc/calc.c
@@ -1,41 +1,80 @@
 /* calc - Little command line calculator. */
 #include "common.h"
 #include "linefile.h"
 #include "hash.h"
 #include "cheapcgi.h"
 #include "dystring.h"
+#include "options.h"
 
+bool humanReadable = FALSE;
 
 void usage()
 /* Explain usage and exit. */
 {
 errAbort(
   "calc - Little command line calculator\n"
   "usage:\n"
   "   calc this + that * theOther / (a + b)\n"
+  "Options:\n"
+  "  -h - output as human-readable numbers, with m=millions, g=billions, etc\n"
   );
 }
 
+static struct optionSpec options[] = {
+   {"h", OPTION_BOOLEAN},
+   {NULL, 0},
+};
+
 void calc(int wordCount, char *words[])
 /* calc - Little command line calculator. */
 {
 struct dyString *dy = newDyString(128);
 int i;
 
 for (i=0; i<wordCount; ++i)
     {
     if (i != 0)
         dyStringAppend(dy, " ");
     dyStringAppend(dy, words[i]);
     }
-printf("%s = %f\n", dy->string, doubleExp(dy->string));
+
+double result = doubleExp(dy->string);
+
+if (!humanReadable)
+    {
+    printf("%s = %f\n", dy->string, result);
+    return;
+    }
+
+// make human readable 
+char* resQual = "";
+int intRes = 0;
+if (result>1E12)
+    {
+    intRes = round(result/1E12);
+    resQual = "t";
     }
+else if (result>1E9)
+    {
+    intRes = round(result/1E9);
+    resQual = "g";
+    }
+else if (result>1E6)
+    {
+    intRes = round(result/1E6);
+    resQual = "m";
+    }
+printf("%s = %d%s\n", dy->string, intRes, resQual);
+}
+
 
 int main(int argc, char *argv[])
 /* Process command line. */
 {
+optionInit(&argc, argv, options);
 if (argc < 2)
     usage();
+humanReadable = optionExists("h");
 calc(argc-1, argv+1);
 return 0;
 }