summaryrefslogtreecommitdiff
path: root/testsuite/sanei/test_wire.c
diff options
context:
space:
mode:
Diffstat (limited to 'testsuite/sanei/test_wire.c')
-rw-r--r--testsuite/sanei/test_wire.c236
1 files changed, 236 insertions, 0 deletions
diff --git a/testsuite/sanei/test_wire.c b/testsuite/sanei/test_wire.c
new file mode 100644
index 0000000..e8388c4
--- /dev/null
+++ b/testsuite/sanei/test_wire.c
@@ -0,0 +1,236 @@
+#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;
+}