sane-project-backends/sanei/test_wire.c

240 wiersze
5.4 KiB
C

#include "../include/sane/config.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/fcntl.h>
#include "../include/sane/sane.h"
#include "../include/sane/sanei.h"
#include "../include/sane/sanei_wire.h"
#include "../include/sane/sanei_codec_ascii.h"
#include "../include/sane/sanei_codec_bin.h"
static Wire w;
static SANE_Word dpi_word_list[] =
{
4, /* # of elements */
3, 30, 300, -600
};
static SANE_String_Const mode_list[] =
{
"Lineart", "Grayscale", "Color", 0
};
static char *program_name;
static char *default_codec = "bin";
static char *default_outfile = "test_wire.out";
static int
usage (int code)
{
if (code == 0)
{
printf ("Usage: %s [OPTION]...\n\
\n\
Test the SANE wire manipulation library.\n\
\n\
--codec=CODEC set the codec [default=%s]\n\
--help display this message and exit\n\
-o, --output=FILE set the output file [default=%s]\n\
--readonly do not create FILE, just read it\n\
--version print version information\n\
\n\
Valid CODECs are: `ascii' `bin'\n",
program_name, default_codec, default_outfile);
}
else
{
fprintf (stderr, "Type ``%s --help'' for more information.\n",
program_name);
}
exit (code);
}
int
main (int argc, char ** argv)
{
SANE_Option_Descriptor desc[2], *desc_ptr;
SANE_Word len;
char *codec = default_codec;
char *outfile = default_outfile;
int readonly = 0;
program_name = argv[0];
argv ++;
while (*argv != 0)
{
if (!strcmp (*argv, "--codec"))
{
if (argv[1] == 0)
{
fprintf (stderr, "%s: option `%s' requires an argument\n",
program_name, *argv);
usage (1);
}
argv ++;
codec = *argv;
}
else if (!strncmp (*argv, "--codec=", 8))
{
codec = *argv + 8;
}
else if (!strcmp (*argv, "--help"))
{
usage (0);
}
else if (!strcmp (*argv, "-o") || !strcmp (*argv, "--output"))
{
if (argv[1] == 0)
{
fprintf (stderr, "%s: option `%s' requires an argument\n",
program_name, *argv);
usage (1);
}
argv ++;
outfile = *argv;
}
else if (!strncmp (*argv, "--output=", 9))
{
outfile = *argv + 9;
}
else if (!strcmp (*argv, "--readonly"))
{
readonly = 1;
}
else if (!strcmp (*argv, "--version"))
{
printf ("test_wire (%s) %s\n", PACKAGE, VERSION);
exit (0);
}
else if (**argv == '-')
{
fprintf (stderr, "%s: unrecognized option `%s'\n",
program_name, *argv);
usage (1);
}
else
{
fprintf (stderr, "%s: too many arguments\n", program_name);
}
argv ++;
}
if (!strcmp (codec, "bin"))
sanei_w_init (&w, sanei_codec_bin_init);
else if (!strcmp (codec, "ascii"))
sanei_w_init (&w, sanei_codec_ascii_init);
else
{
fprintf (stderr, "%s: unknown codec type `%s'\n", program_name, codec);
usage (1);
}
desc[0].name = "resolution";
desc[0].title = 0;
desc[0].desc = "Determines scan resolution in dots/inch (\"DPI\").";
desc[0].type = SANE_TYPE_FIXED;
desc[0].unit = SANE_UNIT_DPI;
desc[0].size = sizeof (SANE_Word);
desc[0].cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT;
desc[0].constraint_type = SANE_CONSTRAINT_WORD_LIST;
desc[0].constraint.word_list = dpi_word_list;
desc[1].name = "mode";
desc[1].title ="Scan Mode";
desc[1].desc = "Determines scan mode.";
desc[1].type = SANE_TYPE_STRING;
desc[1].unit = SANE_UNIT_NONE;
desc[1].size = 10;
desc[1].cap = (SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT
| SANE_CAP_AUTOMATIC);
desc[1].constraint_type = SANE_CONSTRAINT_STRING_LIST;
desc[1].constraint.string_list = mode_list;
{
int flags;
if (readonly)
{
printf ("reading %s output from %s\n", codec, outfile);
flags = O_RDONLY;
}
else
{
printf ("creating %s\n", outfile);
flags = O_RDWR | O_CREAT | O_TRUNC;
}
w.io.fd = open (outfile, flags, 0666);
if (w.io.fd < 0)
{
perror (outfile);
return -1;
}
}
w.io.read = read;
w.io.write = readonly ? 0 : write;
if (!readonly)
{
sanei_w_set_dir (&w, WIRE_ENCODE);
w.status = 0;
len = NELEMS(desc);
desc_ptr = desc;
sanei_w_array (&w, &len, (void **) &desc_ptr,
(WireCodecFunc) sanei_w_option_descriptor,
sizeof (desc[0]));
if (w.status == 0)
printf ("%s encode successful\n", codec);
else
fprintf (stderr, "%s: %s encode error %d: %s\n",
codec, program_name, w.status, strerror (w.status));
printf ("%s output written to %s\n", codec, outfile);
}
sanei_w_set_dir (&w, WIRE_DECODE);
w.status = 0;
if (!readonly)
{
printf ("reading %s output from %s\n", codec, outfile);
lseek (w.io.fd, 0, SEEK_SET);
}
sanei_w_array (&w, &len, (void **) &desc_ptr,
(WireCodecFunc) sanei_w_option_descriptor, sizeof (desc[0]));
if (w.status == 0)
printf ("%s decode successful\n", codec);
else
fprintf (stderr, "%s: %s decode error %d: %s\n",
program_name, codec, w.status, strerror (w.status));
sanei_w_set_dir (&w, WIRE_FREE);
w.status = 0;
sanei_w_array (&w, &len, (void **) &desc_ptr,
(WireCodecFunc) sanei_w_option_descriptor, sizeof (desc[0]));
if (w.status == 0)
printf ("free successful\n");
else
fprintf (stderr, "%s: free error %d: %s\n",
program_name, w.status, strerror (w.status));
close (w.io.fd);
return 0;
}