1 /* ukcprog.h -- Declarations for UKC programmers' library routines. */
2 
3 /*  Copyright 1993  Godfrey Paul, University of Kent at Canterbury.
4  *
5  *  You can do what you like with this source code as long as
6  *  you don't try to make money out of it and you include an
7  *  unaltered copy of this message (including the copyright).
8  */
9 
10 /* $Id: ukcprog.h,v 1.36 1996/04/10 10:27:17 mtr Exp $ UKC */
11 
12 #ifndef UKCPROG_H_DEFINED
13 #define UKCPROG_H_DEFINED
14 
15 #ifdef __cplusplus
16 extern "C" {
17 #endif
18 
19 #if defined(__GNUC__) && __GNUC_MINOR >= 2
20 #define UKCPROG__NORETURN	 __attribute__((__noreturn__))
21 #else
22 #define UKCPROG__NORETURN
23 #endif
24 
25 #ifdef __STDC__
26 #ifndef PROTO
27 #define PROTO(a)	a
28 #endif	/* !PROTO */
29 
30 typedef void *voidptr;
31 typedef const void *constvoidptr;
32 
33 #include <stddef.h>	/* needed for size_t */
34 
35 #else /* !__STDC__ */
36 
37 #include <sys/types.h>	/* size_t for old C */
38 
39 #ifndef PROTO
40 #define PROTO(a)	()
41 #endif	/* !PROTO */
42 
43 /*  Patch up for things that are missing without ANSI C. */
44 #ifndef const
45 #define const
46 #endif
47 #ifndef volatile
48 #define volatile
49 #endif
50 #ifndef signed
51 #define signed
52 #endif
53 
54 typedef char *voidptr;
55 typedef char *constvoidptr;
56 
57 #endif /* !__STDC__ */
58 
59 /*  Defining boolean type.  This might cause problems for some ...  */
60 #ifndef FALSE
61 #define FALSE	0
62 #endif
63 #ifndef TRUE
64 #define TRUE	1
65 #endif
66 #ifndef bool
67 #define bool int
68 #endif
69 
70 /*  Macro to get control characters (works for ASCII only).  */
71 #define CONTROL(c)	((c) & 0x1f)
72 
73 /*  Define NULL - this avoids having the whole of stdio.h */
74 #ifndef NULL
75 #define NULL 0
76 #endif
77 
78 /*  Macro to concatenate two or three names.  */
79 #ifdef CAT
80 #undef CAT
81 #endif /* CAT */
82 
83 #if defined(__STDC__) && !defined(VMS)
84 #define CAT(a,b)	a ## b
85 #define CAT3(a,b,c)	a ## b ## c
86 #else
87 #define _IDENT(a) a
88 #define CAT(a,b) _IDENT(a)b
89 #define CAT3(a,b,c) CAT(a,b)c
90 #endif
91 
92 /* from panic.c */
93 typedef void (*panic_handler_t) PROTO((const char *message));
94 
95 panic_handler_t install_panic_handler PROTO((panic_handler_t handler));
96 
97 void panic PROTO((const char *message)) UKCPROG__NORETURN;
98 
99 
100 /* from e_malloc.c */
101 voidptr e_malloc PROTO((size_t size));
102 
103 
104 /* from e_realloc.c */
105 voidptr e_realloc PROTO((voidptr old, size_t size));
106 
107 
108 /* from strsave.c */
109 char *strsave PROTO((const char *s));
110 
111 
112 /* from config.c */
113 char *config_trim_line PROTO((char *line));
114 
115 #ifdef UKC_WANT_FORMF_CHECKS
116 #define FORMF_ARGS(fpos, argpos)   __attribute__((format(printf, fpos, argpos)))
117 #else
118 
119 #ifdef VMS
120 /*  The VMS C compiler with /STANDARD=PORTABLE complains about unused
121  *  arguments in macros.  This grossness is to shut it up.
122  */
123 #define FORMF_ARGS(fpos, apos) ; extern int CAT(__ukc,fpos), CAT(__ukc,apos)
124 #else
125 #define FORMF_ARGS(fpos, argpos)	/* nothing */
126 #endif
127 
128 #endif
129 
130 /* from formf.c */
131 #ifdef __STDC__
132 #include <stdarg.h>	/* nasty, but needed for prototype */
133 #endif
134 
135 char *formf PROTO((char *buffer_space, int buffer_size,
136 			const char *format, va_list args));
137 
138 
139 /* from errf.c */
140 typedef void (*errf_ofunc_t) PROTO((const char *string));
141 
142 errf_ofunc_t errf_set_ofunc PROTO((errf_ofunc_t func));
143 const char *errf_set_prefix PROTO((const char *prefix));
144 const char *errf_get_prefix PROTO((void));
145 void errf_set_progname PROTO((const char *progname));
146 const char *errf_get_progname PROTO((void));
147 void errf_usage PROTO((const char *usage));
148 
149 void errf PROTO((const char *fmt, ...)) FORMF_ARGS(1, 2);
150 char *strf PROTO((const char *fmt, ...)) FORMF_ARGS(1, 2);
151 void strnf PROTO((char *buf, size_t bufsize, const char *fmt, ...))
152 							FORMF_ARGS(3, 4);
153 
154 /* from log.c */
155 #define LG_ALL	0	/* lowest priority */
156 #define LG_DEBUG 1	/* debugging messages */
157 #define LG_INFO	5	/* information messages */
158 #define LG_ERR	9	/* error messages */
159 #define LG_LOG	10	/* highest priority; messages from the logger */
160 
161 int logf_set_ofile PROTO((const char *filename, const char *prefix));
162 void logf PROTO((int level, const char *fmt, ...)) FORMF_ARGS(2, 3);
163 int logf_set_level PROTO((int new_level));
164 void logf_errf_ofunc PROTO((const char *str));
165 
166 /* from fpgetline.c
167  *
168  * Only include this prototype if stdio.h has been #included already.
169  * This is to mandating the inclusion of stdio.h unless fpgetline()
170  * is required.
171  */
172 #ifdef EOF
173 char *fpgetline PROTO((FILE *fp));
174 #endif
175 
176 
177 /* from alloc.c */
178 
179 typedef struct alloc_pool_s alloc_pool_t;
180 typedef struct alloc_mark_s alloc_mark_t;
181 
182 /*  Backwards compatibility.
183  */
184 typedef alloc_pool_t *alloc_id_t;
185 typedef alloc_mark_t *alloc_mark_id_t;
186 
187 alloc_pool_t *alloc_create_pool PROTO((void));
188 void alloc_free_pool PROTO((alloc_pool_t *ap));
189 void alloc_reset_pool PROTO((alloc_pool_t *ap));
190 
191 /*  Various forms of allocation.  alloc() aligns like malloc,
192  *  allocstr() doesn't.  alloc_strdup() is like strdup() but
193  *  used allocstr() rather than malloc().  All of the preceding
194  *  calls panic if they run out memory.  alloc_ck() and allocstr_ck()
195  *  are like alloc() and allocstr() except that they return NULL
196  *  rather than panicking if memory runs out.
197  */
198 voidptr alloc PROTO((alloc_pool_t *ap, size_t nbytes));
199 char *allocstr PROTO((alloc_pool_t *ap, size_t nbytes));
200 voidptr alloc_ck PROTO((alloc_pool_t *ap, size_t nbytes));
201 char *allocstr_ck PROTO((alloc_pool_t *ap, size_t nbytes));
202 char *alloc_strdup PROTO((alloc_pool_t *ap, const char *s));
203 
204 /*  Control - set and clear debug flags both globally and per-pool.
205  *  If the debug flag is set new memory is initialised to garbage
206  *  and set to (different) garbage when a pool is freed.
207  */
208 bool alloc_set_default_debug_flag PROTO((bool val));
209 bool alloc_set_debug_flag PROTO((alloc_pool_t *ap, bool val));
210 
211 /*  alloc_mark() returns an alloc_mark_id that represents the current
212  *  state of the alloc pool.  alloc_release() releases any memory
213  *  allocated since the alloc_mark() call.
214  */
215 alloc_mark_t *alloc_mark PROTO((alloc_pool_t *ap));
216 void alloc_release PROTO((alloc_pool_t *ap, alloc_mark_t *am));
217 
218 
219 /* from ssplit.c */
220 
221 char **ssplit PROTO((const char *line, const char *delimiters));
222 
223 /* from ip.c */
224 
225 #ifdef IPPROTO_TCP
226 int get_host_addr PROTO((const char *hostname, struct in_addr *p_addr));
227 int get_service_port PROTO((const char *servname, int *p_port));
228 #endif
229 
230 /* from ebuf.c */
231 
232 typedef struct ebuf_s ebuf_t;
233 
234 void ebuf_reset PROTO((ebuf_t *eb));
235 ebuf_t *ebuf_create PROTO((bool errors_are_fatal));
236 ebuf_t *ebuf_start PROTO((ebuf_t *ebuf, bool errors_are_fatal));
237 int ebuf_add PROTO((ebuf_t *eb, constvoidptr buf, size_t count));
238 int ebuf_addstr PROTO((ebuf_t *eb, const char *str));
239 voidptr ebuf_get PROTO((ebuf_t *eb, int *p_len));
240 void ebuf_free PROTO((ebuf_t *eb));
241 
242 /* from sccsdata.c */
243 const char *ukcprog_version PROTO((void));
244 
245 #ifdef __cplusplus
246 }
247 #endif
248 
249 #endif	/* !UKCPROG_H_DEFINED */
250