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