diff --git a/doc/scanimage.man b/doc/scanimage.man index 12d870db6..59b6c9e5a 100644 --- a/doc/scanimage.man +++ b/doc/scanimage.man @@ -11,6 +11,8 @@ scanimage - scan an image .RB [ --accept-md5-only ] .RB [ -h | --help ] .RB [ -L | --list-devices ] +.RB [ -f | --formatted-device-list +.IR format ] .RB [ -T | --test ] .RB [ -v | --verbose ] .RB [ -V | --version ] @@ -95,6 +97,27 @@ name. You may need to consult your system administrator to find out the names of such devices. .PP The +.B -f +or +.B --formatted-device-list +option works similar to --list-devices, but requires a format string. +scanimage replaces the placeholders +.B %d %v %m %t %i +with the device name, vendor name, model name, scanner type and an index +number respectively. The command +.PP +.RS +scanimage -f "scanner number %i device %d is a %t, model %m, produced by %v" +.PP +.RE +will produce something like: +.PP +.RS +scanner number 0 device sharp:/dev/sg1 is a flatbed scanner, model JX250 +SCSI, produced by SHARP +.PP +.RE +The .B -T or .B --test diff --git a/frontend/scanimage.c b/frontend/scanimage.c index 1d27ad58a..5df0c34ce 100644 --- a/frontend/scanimage.c +++ b/frontend/scanimage.c @@ -75,6 +75,7 @@ Image; static struct option basic_options[] = { {"device-name", required_argument, NULL, 'd'}, {"list-devices", no_argument, NULL, 'L'}, + {"formatted-device-list", required_argument, NULL, 'f'}, {"help", no_argument, NULL, 'h'}, {"verbose", no_argument, NULL, 'v'}, {"test", no_argument, NULL, 'T'}, @@ -92,7 +93,7 @@ static struct option basic_options[] = { #define OUTPUT_PNM 0 #define OUTPUT_TIFF 1 -#define BASE_OPTSTRING "d:hLvVTb" +#define BASE_OPTSTRING "d:hLf:vVTb" #define STRIP_HEIGHT 256 /* # lines we increment image height */ static struct option *all_options; @@ -1466,8 +1467,9 @@ main (int argc, char **argv) accept_only_md5_auth = 1; break; case 'L': + case 'f': { - int i; + int i = 0; status = sane_get_devices (&device_list, SANE_FALSE); if (status != SANE_STATUS_GOOD) @@ -1477,13 +1479,89 @@ main (int argc, char **argv) exit (1); } - for (i = 0; device_list[i]; ++i) - { - printf ("device `%s' is a %s %s %s\n", - device_list[i]->name, device_list[i]->vendor, - device_list[i]->model, device_list[i]->type); + if (ch == 'L') + { + for (i = 0; device_list[i]; ++i) + { + printf ("device `%s' is a %s %s %s\n", + device_list[i]->name, device_list[i]->vendor, + device_list[i]->model, device_list[i]->type); + } } - if (i == 0) + else + { + int i = 0, n = 0, maxarg = 8; + char *percent; + char *start, *fmt; + const char **arglist = malloc(8 * sizeof(char**)); + if (arglist == 0) + { + printf("no enough memory\n"); + exit(1); + } + + fmt = malloc(strlen(optarg)); + if (fmt == 0) + { + printf("no enough memory\n"); + exit(1); + } + + for (i = 0; device_list[i]; ++i) + { + n = 0; + strcpy(fmt, optarg); + start = fmt; + while( (percent = strchr(start, '%')) ) + { + percent++; + if (percent) + { + if (n >= maxarg) + { + maxarg = 2 * maxarg; + arglist = realloc(arglist, maxarg * sizeof(char**)); + if (arglist == 0) + { + printf("no enough memory\n"); + exit(1); + } + } + switch (*percent) + { + case 'd': + arglist[n++] = device_list[i]->name; + *percent = 's'; + break; + case 'v': + arglist[n++] = device_list[i]->vendor; + *percent = 's'; + break; + case 'm': + arglist[n++] = device_list[i]->model; + *percent = 's'; + break; + case 't': + arglist[n++] = device_list[i]->type; + *percent = 's'; + break; + case 'i': + arglist[n++] = (char *) i; + break; + case '%': + break; + default: + printf("unkonwn format specifier %%%c\n", *percent); + } + percent++; + } + start = percent; + } + vprintf(fmt, arglist); + } + } + + if (i == 0 && ch != 'f') printf ("\nNo scanners were identified. If you were expecting " "something different,\ncheck that the scanner is plugged " "in, turned on and detected by the\nsane-find-scanner tool "