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