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]