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]