Package: hylafax-server
Version: 2:4.3.0-1
Severity: wishlist

hi,

I need it, so hacked faxinfo(8) to offer more output formatting opts.
Specifically, I wanted a CSV row ready to stuff into a flat-file dB.
Also, this fixes aminor bug, ie non-0 exit code on error.

Pls see inline patch - sorry, no time to update man as well; also, I
left out CallID stuff from extra format for others that better knows it. 
WFM, shouldn't break anything.

-- paolo


#--[diff -u a/util/faxinfo.c++ b/util/faxinfo.c++]--------
--- a/util/faxinfo.c++  Fri May  5 22:32:47 2006
+++ b/util/faxinfo.c++  Mon Jun  5 09:06:53 2006
@@ -37,6 +37,7 @@
 #include "CallID.h"
 
 #include "port.h"
+#include "Sys.h"
 
 extern const char* fmtTime(time_t t);
 
@@ -78,33 +79,79 @@
     }
 }
 
+static void
+usage(char* appName)
+{
+  printf("Usage: %s [-hn] [-[C d|c d|r|0] file.tif\n", appName);
+    puts("       -h   help");
+    puts("       -n   don't print filename");
+    puts("       -C d format output as CSV with 'd' as field delimiter");
+    puts("       -c d like -C, but don't quote fields");
+    puts("       -0   like -c 0x0");
+    puts("       -Q q set 'q' as quoting char in -C -c");
+    puts("       -r   raw format, no 'label:', one per row fields");
+}
+
 int
 main(int argc, char** argv)
 {
     bool showFilename = true;
+    bool rawFormat = false;
+    bool csvFormat = false;
+    char csvChar = ',';
+    char csvQuote[2];
     const char* appName = argv[0];
+    int c;
 
-    if (argc > 2 && streq(argv[1], "-n")) {
-       showFilename = false;
-       argc--, argv++;
-    }
-    if (argc != 2) {
-       fprintf(stderr, "usage: %s [-n] file.tif\n", appName);
-       return (-1);
-    }
+    csvQuote[0] = csvQuote[1] = 0x0;
+    while ((c = getopt(argc, argv, "hnc:C:rQ:0")) != -1)
+      switch (c) {
+        case '?':
+        case 'h':
+         usage((char*)appName);
+         return (0);
+       case 'n':
+         showFilename = false;
+         break;
+       case 'r':
+         rawFormat = true;
+         csvFormat = false;
+         break;
+       case 'Q':
+         csvQuote[0] = optarg[0];
+         break;
+       case '0':
+         csvFormat = true;
+         csvChar = 0x0;
+         break;
+       case 'c':
+       case 'C':
+         csvFormat = true;
+         if (c == 'C') csvQuote[0] = '"';
+         csvChar = optarg[0];
+         break;
+       default:
+         usage((char*)appName);
+         return(-1);
+      }
+   /* if (argc != 2) {
+      printf("%u %c\n", argc, c);
+      usage((char*)appName);
+      return(-1);
+    }*/
     if (showFilename)
-       printf("%s:\n", argv[1]);
+       printf("%s:\n", argv[argc - 1]);
     TIFFSetErrorHandler(NULL);
     TIFFSetWarningHandler(NULL);
-    TIFF* tif = TIFFOpen(argv[1], "r");
+    TIFF* tif = TIFFOpen(argv[argc - 1], "r");
     if (tif == NULL) {
        printf("Could not open %s; either not TIFF or corrupted.\n", argv[1]);
-       return (0);
+       return (1);
     }
     bool ok = isFAXImage(tif);
     if (!ok) {
        printf("Does not look like a facsimile?\n");
-       return (0);
+       return (2);
     }
 
     Class2Params params;
@@ -167,6 +214,7 @@
     }
 #endif
     fxStr sender = "";
+    fxStr subaddr = "";
     CallID callid;
     if (TIFFGetField(tif, TIFFTAG_IMAGEDESCRIPTION, &cp)) {
        while (cp[0] != '\0' && cp[0] != '\n') {        // sender
@@ -187,12 +235,10 @@
        }
     } else
        sender = "<unknown>";
-    printf("%11s %s\n", "Sender:", (const char*) sender);
 #ifdef TIFFTAG_FAXSUBADDRESS
     if (TIFFGetField(tif, TIFFTAG_FAXSUBADDRESS, &cp)) {
-       fxStr subaddr(cp);
+       subaddr = cp;
        sanitize(subaddr);
-       printf("%11s %s\n", "SubAddr:", (const char*) subaddr);
     }
 #endif
     fxStr date;
@@ -234,31 +280,71 @@
     } while (TIFFReadDirectory(tif));
     TIFFClose(tif);
 
-    printf("%11s %u\n", "Pages:", npages);
+    char quality[31];
+    char page[61];
+    char TimeToRecv[31];
+    char ec[4];
+    
     if (params.vr == VR_NORMAL)
-       printf("%11s Normal\n", "Quality:");
+       strcpy(quality, "Normal");
     else if (params.vr == VR_FINE)
-       printf("%11s Fine\n", "Quality:");
+       strcpy(quality, "Fine");
     else if (params.vr == VR_R8)
-       printf("%11s Superfine\n", "Quality:");
+       strcpy(quality, "Superfine");
     else if (params.vr == VR_R16)
-       printf("%11s Hyperfine\n", "Quality:");
+       strcpy(quality, "Hyperfine");
     else
-       printf("%11s %u lines/inch\n", "Quality:", params.verticalRes());
+       snprintf(quality, 30, "%u lines/inch", params.verticalRes());
+
     PageSizeInfo* info = PageSizeInfo::getPageSizeBySize(w, h);
     if (info)
-       printf("%11s %s\n", "Page:", info->name());
+       strncpy(page, info->name(), 60);
     else
-       printf("%11s %u by %u\n", "Page:", params.pageWidth(), (u_int) h);
+       snprintf(page, 60, "%u by %u\n", params.pageWidth(), (u_int) h);
     delete info;
-    printf("%11s %s\n", "Received:", (const char*) date);
-    printf("%11s %s\n", "TimeToRecv:", time == 0 ? "<unknown>" : 
fmtTime(time));
-    printf("%11s %s\n", "SignalRate:", params.bitRateName());
-    printf("%11s %s\n", "DataFormat:", params.dataFormatName());
-    printf("%11s %s\n", "ErrCorrect:", params.ec == EC_DISABLE ? "No" : "Yes");
-    for (u_int i = 0; i < callid.size(); i++) {
+    strcpy(ec, params.ec == EC_DISABLE ? "No" : "Yes");
+    strncpy(TimeToRecv, time == 0 ? "<unknown>" : fmtTime(time), 30);
+      
+    if (rawFormat) {
+      puts((const char*) sender);
+      puts((const char*) subaddr);
+      printf("%u\n", npages);
+      puts(quality);
+      puts(page);
+      puts((const char*) date);
+      puts(TimeToRecv);
+      puts(params.bitRateName());
+      puts(params.dataFormatName());
+      puts(ec);
+    } else if (csvFormat) {
+      printf("%s%s%s%c%s%s%s%c%s%u%s%c%s%s%s%c%s%s%s%c"
+        "%s%s%s%c%s%s%s%c%s%s%s%c%s%s%s%c%s%s%s\n",
+        &csvQuote, (const char*) sender, &csvQuote, csvChar,
+        &csvQuote, (const char*) subaddr, &csvQuote, csvChar,
+        &csvQuote, npages, &csvQuote, csvChar,
+        &csvQuote, &quality, &csvQuote, csvChar,
+        &csvQuote, &page, &csvQuote, csvChar, 
+        &csvQuote, (const char*) date, &csvQuote, csvChar, 
+        &csvQuote, &TimeToRecv, &csvQuote, csvChar, 
+        &csvQuote, params.bitRateName(), &csvQuote, csvChar, 
+        &csvQuote, params.dataFormatName(), &csvQuote, csvChar, 
+        &csvQuote, &ec, &csvQuote, csvChar);
+    } else {
+      printf("%11s %s\n", "Sender:", (const char*) sender);
+      printf("%11s %s\n", "SubAddr:", (const char*) subaddr);
+      printf("%11s %u\n", "Pages:", npages);
+      printf("%11s %s\n", "Quality:", &quality);
+      printf("%11s %s\n", "Page:", &page);
+      printf("%11s %s\n", "Received:", (const char*) date);
+      printf("%11s %s\n", "TimeToRecv:", &TimeToRecv);
+      printf("%11s %s\n", "SignalRate:", params.bitRateName());
+      printf("%11s %s\n", "DataFormat:", params.dataFormatName());
+      printf("%11s %s\n", "ErrCorrect:", &ec);
+      for (u_int i = 0; i < callid.size(); i++) {
        // formatting will mess up if i gets bigger than one digit
        printf("%9s%u: %s\n", "CallID", i+1, (const char*) callid.id(i));
+      }
     }
     return (0);
 }
+
#---------------------------------------------------------

-- System Information
Debian Release: 3.0
Kernel Version: Linux npp 2.4.26-ss-fb-lm287 #1 Fri Jul 16 21:26:09 CEST 2004 
i686 unknown



-- 
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]

Reply via email to