1/** @file sanei_backend.h
2 * Compatibility header file for backends
3 *
4 * This file provides some defines for macros missing on some platforms.
5 * It also has the SANE API entry points. sanei_backend.h must be included
6 * by every backend.
7 *
8 * @sa sanei.h sanei_thread.h
9 */
10
11
12/** @name Compatibility macros
13 * @{
14 */
15#include <sane/sanei_debug.h>
16
17#if __STDC_VERSION__ >= 199901L
18/* __func__ is provided */
19#elif __GNUC__ >= 5
20/* __func__ is provided */
21#elif __GNUC__ >= 2
22# define __func__ __FUNCTION__
23#else
24# define __func__ "(unknown)"
25#endif
26
27#ifndef HAVE_OS2_H
28#include <fcntl.h>
29#ifndef O_NONBLOCK
30# ifdef O_NDELAY
31#  define O_NONBLOCK O_NDELAY
32# else
33#  ifdef FNDELAY
34#   define O_NONBLOCK FNDELAY    /* last resort */
35#  endif
36# endif
37#endif
38#endif /* HAVE_OS2_H */
39
40#include <limits.h>
41#ifndef PATH_MAX
42# define PATH_MAX 1024
43#endif
44
45#ifndef M_PI
46#define M_PI 3.14159265358979323846
47#endif
48
49#ifndef MM_PER_INCH
50#define MM_PER_INCH 25.4
51#endif
52
53#ifdef HAVE_SIGPROCMASK
54# define SIGACTION      sigaction
55#else
56
57/* Just enough backwards compatibility that we get by in the backends
58   without making handstands.  */
59# ifdef sigset_t
60#  undef sigset_t
61# endif
62# ifdef sigemptyset
63#  undef sigemptyset
64# endif
65# ifdef sigfillset
66#  undef sigfillset
67# endif
68# ifdef sigaddset
69#  undef sigaddset
70# endif
71# ifdef sigdelset
72#  undef sigdelset
73# endif
74# ifdef sigprocmask
75#  undef sigprocmask
76# endif
77# ifdef SIG_BLOCK
78#  undef SIG_BLOCK
79# endif
80# ifdef SIG_UNBLOCK
81#  undef SIG_UNBLOCK
82# endif
83# ifdef SIG_SETMASK
84#  undef SIG_SETMASK
85# endif
86
87# define sigset_t               int
88# define sigemptyset(set)       do { *(set) = 0; } while (0)
89# define sigfillset(set)        do { *(set) = ~0; } while (0)
90# define sigaddset(set,signal)  do { *(set) |= sigmask (signal); } while (0)
91# define sigdelset(set,signal)  do { *(set) &= ~sigmask (signal); } while (0)
92# define sigaction(sig,new,old) sigvec (sig,new,old)
93
94  /* Note: it's not safe to just declare our own "struct sigaction" since
95     some systems (e.g., some versions of OpenStep) declare that structure,
96     but do not implement sigprocmask().  Hard to believe, aint it?  */
97# define SIGACTION              sigvec
98# define SIG_BLOCK      1
99# define SIG_UNBLOCK    2
100# define SIG_SETMASK    3
101#endif /* !HAVE_SIGPROCMASK */
102/* @} */
103
104
105/** @name Declaration of entry points:
106 * @{
107 */
108#ifdef __cplusplus
109extern "C" {
110#endif
111
112extern SANE_Status ENTRY(init) (SANE_Int *, SANE_Auth_Callback);
113extern SANE_Status ENTRY(get_devices) (const SANE_Device ***, SANE_Bool);
114extern SANE_Status ENTRY(open) (SANE_String_Const, SANE_Handle *);
115extern const SANE_Option_Descriptor *
116  ENTRY(get_option_descriptor) (SANE_Handle, SANE_Int);
117extern SANE_Status ENTRY(control_option) (SANE_Handle, SANE_Int, SANE_Action,
118                                          void *, SANE_Word *);
119extern SANE_Status ENTRY(get_parameters) (SANE_Handle, SANE_Parameters *);
120extern SANE_Status ENTRY(start) (SANE_Handle);
121extern SANE_Status ENTRY(read) (SANE_Handle, SANE_Byte *, SANE_Int,
122                                SANE_Int *);
123extern SANE_Status ENTRY(set_io_mode) (SANE_Handle, SANE_Bool);
124extern SANE_Status ENTRY(get_select_fd) (SANE_Handle, SANE_Int *);
125extern void ENTRY(cancel) (SANE_Handle);
126extern void ENTRY(close) (SANE_Handle);
127extern void ENTRY(exit) (void);
128
129#ifdef __cplusplus
130} // extern "C"
131#endif
132
133#ifndef STUBS
134/* Now redirect sane_* calls to backend's functions: */
135
136#define sane_init(a,b)                  ENTRY(init) (a,b)
137#define sane_get_devices(a,b)           ENTRY(get_devices) (a,b)
138#define sane_open(a,b)                  ENTRY(open) (a,b)
139#define sane_get_option_descriptor(a,b) ENTRY(get_option_descriptor) (a,b)
140#define sane_control_option(a,b,c,d,e)  ENTRY(control_option) (a,b,c,d,e)
141#define sane_get_parameters(a,b)        ENTRY(get_parameters) (a,b)
142#define sane_start(a)                   ENTRY(start) (a)
143#define sane_read(a,b,c,d)              ENTRY(read) (a,b,c,d)
144#define sane_set_io_mode(a,b)           ENTRY(set_io_mode) (a,b)
145#define sane_get_select_fd(a,b)         ENTRY(get_select_fd) (a,b)
146#define sane_cancel(a)                  ENTRY(cancel) (a)
147#define sane_close(a)                   ENTRY(close) (a)
148#define sane_exit(a)                    ENTRY(exit) (a)
149#endif /* STUBS */
150/* @} */
151
152/** Internationalization for SANE backends
153 *
154 * Add SANE_I18N() to all texts that can be translated.
155 * E.g. out_txt = SANE_I18N("Hello");
156 */
157#ifndef SANE_I18N
158#define SANE_I18N(text) text
159#endif
160
161/** Option_Value union
162 *
163 * Convenience union to access option values given to the backend
164 */
165#ifndef SANE_OPTION
166typedef union
167{
168  SANE_Bool b;		/**< bool */
169  SANE_Word w;		/**< word */
170  SANE_Word *wa;	/**< word array */
171  SANE_String s;	/**< string */
172}
173Option_Value;
174#define SANE_OPTION 1
175#endif
176