1 /* $Id: nhxdr.h,v 1.7 2003/10/25 18:06:00 j_ali Exp $ */ 2 /* Copyright (c) Slash'EM Development Team 2001-2003 */ 3 /* NetHack may be freely redistributed. See license for details. */ 4 5 #ifndef NHXDR_H 6 #define NHXDR_H 7 8 #ifndef FALSE 9 #define FALSE 0 10 #endif 11 12 #ifndef TRUE 13 #define TRUE 1 14 #endif 15 16 #ifndef MIN 17 #define MIN(a, b) ((a) <= (b) ? (a) : (b)) 18 #endif 19 20 #ifndef MAX 21 #define MAX(a, b) ((a) >= (b) ? (a) : (b)) 22 #endif 23 24 #ifndef NDECL 25 /* 26 * Assume an ANSI X3.159 compatible compiler 27 */ 28 #define NDECL(f) (f)(void) 29 #define FDECL(f, p) (f)p 30 #define VDECL(f, p) (f)p 31 #define CHAR_P int 32 #define SHORT_P int 33 #define BOOLEAN_P int 34 #endif 35 36 #define NHEXT_XDR_RNDUP(x) (((x) - 1 | 3) + 1) 37 38 typedef enum { nhext_xdr_false = 0, nhext_xdr_true = 1 } nhext_xdr_bool_t; 39 40 enum nhext_xdr_op { 41 NHEXT_XDR_ENCODE, NHEXT_XDR_DECODE, NHEXT_XDR_FREE, NHEXT_XDR_COUNT 42 }; 43 44 typedef struct nhext_xdr { 45 void *x_data; 46 enum nhext_xdr_op x_op; 47 nhext_xdr_bool_t (*x_write)(struct nhext_xdr *xdrs, const void *addr, 48 int size); 49 nhext_xdr_bool_t (*x_read)(struct nhext_xdr *xdrs, void *addr, int size); 50 void (*x_destroy)(struct nhext_xdr *xdrs); 51 unsigned int x_pos, x_size; 52 } NhExtXdr; 53 54 typedef struct NhExtIO_ NhExtIO; 55 typedef int (*nhext_io_func)(void *handle, void *buf, unsigned int len); 56 typedef struct NhExtNB_ NhExtNB; 57 58 #define E extern 59 60 E unsigned int FDECL(nhext_xdr_getpos, (NhExtXdr *)); 61 E nhext_xdr_bool_t FDECL(nhext_xdr_setpos, (NhExtXdr *, unsigned int)); 62 E void FDECL(nhext_xdr_free, (nhext_xdr_bool_t (*)(), char *)); 63 E void FDECL(nhext_xdrmem_create, (NhExtXdr *, char *, unsigned int, 64 enum nhext_xdr_op)); 65 E void FDECL(nhext_xdrio_create, (NhExtXdr *, NhExtIO *, enum nhext_xdr_op)); 66 67 #define nhext_xdr_destroy(xdrs) (*(xdrs)->x_destroy)(xdrs) 68 69 E nhext_xdr_bool_t FDECL(nhext_xdr_long, (NhExtXdr *, long *)); 70 E nhext_xdr_bool_t FDECL(nhext_xdr_u_long, (NhExtXdr *, unsigned long *)); 71 E nhext_xdr_bool_t FDECL(nhext_xdr_short, (NhExtXdr *, short *)); 72 E nhext_xdr_bool_t FDECL(nhext_xdr_u_short, (NhExtXdr *, unsigned short *)); 73 E nhext_xdr_bool_t FDECL(nhext_xdr_int, (NhExtXdr *, int *)); 74 E nhext_xdr_bool_t FDECL(nhext_xdr_u_int, (NhExtXdr *, unsigned int *)); 75 E nhext_xdr_bool_t FDECL(nhext_xdr_char, (NhExtXdr *, char *)); 76 E nhext_xdr_bool_t FDECL(nhext_xdr_u_char, (NhExtXdr *, unsigned char *)); 77 E nhext_xdr_bool_t FDECL(nhext_xdr_enum, (NhExtXdr *, int *)); 78 E nhext_xdr_bool_t FDECL(nhext_xdr_bool, (NhExtXdr *, nhext_xdr_bool_t *)); 79 E nhext_xdr_bool_t FDECL(nhext_xdr_string, (NhExtXdr *, char **, unsigned int)); 80 E nhext_xdr_bool_t FDECL(nhext_xdr_bytes, (NhExtXdr *, char **, unsigned int *, 81 unsigned int)); 82 E nhext_xdr_bool_t FDECL(nhext_xdr_wrapstring, (NhExtXdr *, char **)); 83 E nhext_xdr_bool_t FDECL(nhext_xdr_vector, (NhExtXdr *, char *, unsigned int, 84 unsigned int, nhext_xdr_bool_t (*)())); 85 E nhext_xdr_bool_t FDECL(nhext_xdr_array, (NhExtXdr *, char **, unsigned int *, 86 unsigned int, unsigned int, nhext_xdr_bool_t (*)())); 87 88 #define NHEXT_IO_RDONLY 1 89 #define NHEXT_IO_WRONLY 2 90 #define NHEXT_IO_NBLOCK 4 91 #define NHEXT_IO_NOAUTOFILL 8 92 #define NHEXT_IO_LINEBUF 16 /* Only honoured by text based calls */ 93 #define NHEXT_IO_SIMPLEBUFFER 32 94 #define NHEXT_IO_PENDING 64 95 96 #if __GNUC__ >= 3 || __GNUC__ == 2 && __GNUC_MINOR__ >= 5 97 #define NHEXT__PRINTF(p_fmt, p_arg0) \ 98 __attribute__((format(printf, p_fmt, p_arg0))) 99 #else 100 #define NHEXT__PRINTF(p_fmt, p_arg0) 101 #endif 102 103 E NhExtIO *FDECL(nhext_io_open, (nhext_io_func, void *, unsigned int)); 104 E int FDECL(nhext_io_close, (NhExtIO *)); 105 E unsigned int FDECL(nhext_io_getmode, (NhExtIO *)); 106 E void FDECL(nhext_io_setmode, (NhExtIO *, unsigned int)); 107 E void FDECL(nhext_io_setautofill_limit, (NhExtIO *, unsigned int)); 108 E void FDECL(nhext_io_setnbfunc, (NhExtIO *, nhext_io_func)); 109 E int FDECL(nhext_io_filbuf, (NhExtIO *, int)); 110 E int FDECL(nhext_io_getc, (NhExtIO *)); 111 E int FDECL(nhext_io_read, (NhExtIO *, char *, int)); 112 E char *FDECL(nhext_io_getpacket, (NhExtIO *, int *)); 113 E int FDECL(nhext_io_willblock, (NhExtIO *)); 114 E int FDECL(nhext_io_flush, (NhExtIO *)); 115 E int FDECL(nhext_io_fputc, (int, NhExtIO *)); 116 E int FDECL(nhext_io_write, (NhExtIO *, char *, int)); 117 E int FDECL(nhext_io_writet, (NhExtIO *, char *, int)); 118 #ifdef _STDARG_H 119 E int FDECL(nhext_io_vprintf, (NhExtIO *, char *, va_list)); 120 #endif 121 E int FDECL(nhext_io_printf, (NhExtIO *, char *, ...)) NHEXT__PRINTF(2, 3); 122 123 E NhExtNB *FDECL(nhext_nb_open, (nhext_io_func, void *)); 124 E int FDECL(nhext_nb_close, (NhExtNB *)); 125 E int FDECL(nhext_nb_read, (NhExtNB *, char *, int, int)); 126 127 #endif /* NHXDR_H */ 128