1 /* maa.h -- Header file for visible libmaa functions
2  * Created: Sun Nov 19 13:21:21 1995 by faith@dict.org
3  * Copyright 1994-1998, 2002 Rickard E. Faith (faith@dict.org)
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining
6  * a copy of this software and associated documentation files (the
7  * "Software"), to deal in the Software without restriction, including
8  * without limitation the rights to use, copy, modify, merge, publish,
9  * distribute, sublicense, and/or sell copies of the Software, and to
10  * permit persons to whom the Software is furnished to do so, subject to
11  * the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be
14  * included in all copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20  * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21  * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22  * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23  *
24  */
25 
26 #ifndef _MAA_H_
27 #define _MAA_H_
28 
29 #include <stdio.h>
30 #include <stdarg.h>
31 
32 #ifndef __GNUC__
33 #define __attribute__(x)
34 #endif
35 
36 				/* If MAA_MAGIC is non-zero, important
37                                    structures will be tagged with a magic
38                                    number which will be checked for
39                                    integrity at each access.  This uses up
40                                    more memory, and is slightly slower, but
41                                    helps debugging quite a bit. */
42 #ifndef MAA_MAGIC
43 #define MAA_MAGIC 1
44 #endif
45 
46 #if MAA_MAGIC
47 #define HSH_MAGIC               0x01020304
48 #define HSH_MAGIC_FREED         0x10203040
49 #define SET_MAGIC               0x02030405
50 #define SET_MAGIC_FREED         0x20304050
51 #define LST_MAGIC               0x03040506
52 #define LST_MAGIC_FREED         0x30405060
53 #define MEM_STRINGS_MAGIC       0x23232323
54 #define MEM_STRINGS_MAGIC_FREED 0x32323232
55 #define MEM_OBJECTS_MAGIC       0x42424242
56 #define MEM_OBJECTS_MAGIC_FREED 0x24242424
57 #define ARG_MAGIC               0xfeedbead
58 #define ARG_MAGIC_FREED         0xefdeebda
59 #define PR_MAGIC                0x0bad7734
60 #define PR_MAGIC_FREED          0xb0da7743
61 #define SL_LIST_MAGIC           0xabcdef01
62 #define SL_LIST_MAGIC_FREED     0xbadcfe10
63 #define SL_ENTRY_MAGIC          0xacadfeed
64 #define SL_ENTRY_MAGIC_FREED    0xcadaefde
65 #endif
66 
67 /* version.c */
68 
69 extern const char *maa_revision_string;
70 
71 
72 /* maa.c */
73 
74 #define MAA_MEMORY (3U<<30|1<<29) /* Print memory usage statistics at exit */
75 #define MAA_TIME   (3U<<30|1<<28) /* Print timer information at exit       */
76 #define MAA_PR     (3U<<30|1<<27) /* Debug process routines                */
77 #define MAA_SL     (3U<<30|1<<26) /* Debug skip list routines              */
78 #define MAA_PARSE  (3U<<30|1<<25) /* Debug parsing                         */
79 #define MAA_SRC    (3U<<30|1<<24) /* Source library                        */
80 
81 extern void       maa_init(const char *programName);
82 extern void       maa_shutdown(void);
83 extern int        maa_version_major(void);
84 extern int        maa_version_minor( void);
85 extern int        maa_version_teeny(void);
86 extern const char *maa_version(void);
87 
88 /* xmalloc.c */
89 extern void *xmalloc(size_t size);
90 extern void *xcalloc(size_t num, size_t size);
91 extern void *xrealloc(void *pt, size_t size);
92 extern void xfree(void *pt);
93 extern char *xstrdup(const char *s);
94 
95 /* bit.c */
96 extern void bit_set(unsigned long *flags, int bit);
97 extern void bit_clr(unsigned long *flags, int bit);
98 extern int  bit_tst(unsigned long *flags, int bit);
99 extern int  bit_cnt(unsigned long *flags);
100 
101 /* prime.c */
102 
103 extern int           prm_is_prime(unsigned int value);
104 extern unsigned long prm_next_prime(unsigned int start);
105 
106 /* hash.c */
107 
108 typedef void *hsh_HashTable;
109 typedef void *hsh_Position;
110 
111 typedef struct hsh_Stats {
112 	unsigned long size;		 /* Size of table */
113 	unsigned long resizings;	 /* Number of resizings */
114 	unsigned long entries;	 /* Total entries in table */
115 	unsigned long buckets_used;	 /* Number of hash buckets in use */
116 	unsigned long singletons;	 /* Number of length one lists */
117 	unsigned long maximum_length; /* Maximum list length */
118 
119 	unsigned long retrievals;	 /* Total number of retrievals */
120 	unsigned long hits;		 /* Number of retrievals from top of a list */
121 	unsigned long misses;	 /* Number of unsuccessful retrievals */
122 } *hsh_Stats;
123 
124 extern hsh_HashTable hsh_create(unsigned long (*hash)(const void *),
125 								int (*compare)(const void *, const void *));
126 extern void          hsh_destroy(hsh_HashTable table);
127 extern int           hsh_insert(hsh_HashTable table,
128 								const void *key, const void *datum );
129 extern int           hsh_delete(hsh_HashTable table, const void *key);
130 extern const void    *hsh_retrieve(hsh_HashTable table, const void *key);
131 extern int           hsh_iterate(hsh_HashTable table,
132 								 int (*iterator)(const void *key,
133 												 const void *datum));
134 extern int           hsh_iterate_arg(
135 	hsh_HashTable table,
136 	int (*iterator)(const void *key,
137 					const void *datum, void *arg),
138 	void *arg);
139 extern hsh_Stats     hsh_get_stats(hsh_HashTable table);
140 extern void          hsh_print_stats(hsh_HashTable table, FILE *stream);
141 extern unsigned long hsh_string_hash(const void *key);
142 extern unsigned long hsh_pointer_hash(const void *key);
143 extern int           hsh_string_compare(const void *key1, const void *key2);
144 extern int           hsh_pointer_compare(const void *key1, const void *key2);
145 extern void          hsh_key_strings(hsh_HashTable);
146 
147 extern hsh_Position  hsh_init_position(hsh_HashTable table);
148 extern hsh_Position  hsh_next_position(hsh_HashTable table,
149 									   hsh_Position position);
150 extern void          *hsh_get_position(hsh_Position position, void **key);
151 extern int           hsh_readonly(hsh_HashTable table, int flag);
152 
153 #define HSH_POSITION_INIT(P,T)  ((P)=hsh_init_position(T))
154 #define HSH_POSITION_NEXT(P,T)  ((P)=hsh_next_position(T,P))
155 #define HSH_POSITION_OK(P)      (P)
156 #define HSH_POSITION_GET(P,K,D) ((D)=hsh_get_position(P,&K))
157 #define HSH_POSITION_GETKEY(P,K) (hsh_get_position(P,&K))
158 
159 /* iterate over all (key, datum) pairs, (K,D), in hash table T */
160 #define HSH_ITERATE(T,P,K,D)                                                 \
161    for (HSH_POSITION_INIT((P),(T));                                          \
162 	HSH_POSITION_OK(P) && (HSH_POSITION_GET((P),(K),(D)),1);             \
163 	HSH_POSITION_NEXT((P),(T)))
164 
165 /* iterate over all keys K, in hash table T */
166 #define HSH_ITERATE_KEYS(T,P,K)                                              \
167    for (HSH_POSITION_INIT((P),(T));                                          \
168 	HSH_POSITION_OK(P) && (HSH_POSITION_GETKEY((P),(K)),1);              \
169 	HSH_POSITION_NEXT((P),(T)))
170 
171 /* If the HSH_ITERATE loop is exited before all elements in the table are
172    seen, then HSH_ITERATE_END should be called.  Calling this function
173    after complete loops does no harm. */
174 #define HSH_ITERATE_END(T) hsh_readonly(T,0)
175 
176 
177 /* set.c */
178 
179 typedef void *set_Set;
180 typedef void *set_Position;
181 
182 typedef struct set_Stats{
183 	unsigned long size;		 /* Size of table */
184 	unsigned long resizings;	 /* Number of resizings */
185 	unsigned long entries;	 /* Total entries in table */
186 	unsigned long buckets_used;	 /* Number of hash buckets in use */
187 	unsigned long singletons;	 /* Number of length one lists */
188 	unsigned long maximum_length; /* Maximum list length */
189 
190 	unsigned long retrievals;	 /* Total number of retrievals */
191 	unsigned long hits;		 /* Number of retrievals from top of a list */
192 	unsigned long misses;	 /* Number of unsuccessful retrievals */
193 } *set_Stats;
194 
195 typedef unsigned long (*set_HashFunction)(const void *);
196 typedef int           (*set_CompareFunction)(const void *, const void *);
197 
198 extern set_Set             set_create(set_HashFunction hash,
199 									  set_CompareFunction compare);
200 extern set_HashFunction    set_get_hash(set_Set set);
201 extern set_CompareFunction set_get_compare(set_Set set);
202 extern void                set_destroy(set_Set set);
203 extern int                 set_insert(set_Set set, const void *elem);
204 extern int                 set_delete(set_Set set, const void *elem);
205 extern int                 set_member(set_Set set, const void *elem);
206 extern int                 set_iterate(set_Set set,
207 									   int (*iterator)(const void *key));
208 extern int                 set_iterate_arg(set_Set set,
209 										   int (*iterator)(const void *elem,
210 															void *arg),
211 										   void *arg);
212 extern set_Set             set_add(set_Set set1, set_Set set2);
213 extern set_Set             set_del(set_Set set1, set_Set set2);
214 extern set_Set             set_union(set_Set set1, set_Set set2);
215 extern set_Set             set_inter(set_Set set1, set_Set set2);
216 extern set_Set             set_diff(set_Set set1, set_Set set2);
217 extern int                 set_equal(set_Set set1, set_Set set2);
218 extern set_Stats           set_get_stats(set_Set set);
219 extern void                set_print_stats(set_Set set, FILE *stream);
220 extern int                 set_count(set_Set set);
221 extern set_Position        set_init_position(set_Set set);
222 extern set_Position        set_next_position(set_Set set,
223 											 set_Position position);
224 extern void                *set_get_position(set_Position position);
225 extern int                 set_readonly(set_Set set, int flag);
226 
227 #define SET_POSITION_INIT(P,S) ((P)=set_init_position(S))
228 #define SET_POSITION_NEXT(P,S) ((P)=set_next_position(S,P))
229 #define SET_POSITION_OK(P)     (P)
230 #define SET_POSITION_GET(P,E)  ((E)=set_get_position(P))
231 
232 /* iterate over all entries E in set S */
233 #define SET_ITERATE(S,P,E)                                                   \
234    for (SET_POSITION_INIT((P),(S));                                          \
235 	SET_POSITION_OK(P) && (SET_POSITION_GET((P),(E)),1);                 \
236 	SET_POSITION_NEXT((P),(S)))
237 
238 /* If the SET_ITERATE loop is exited before all elements in the set are
239    seen, then SET_ITERATE_END should be called.  Calling this function
240    after complete loops does no harm. */
241 #define SET_ITERATE_END(S) set_readonly(S,0)
242 
243 /* stack.c */
244 
245 typedef void *stk_Stack;
246 
247 extern stk_Stack stk_create(void);
248 extern void      stk_destroy(stk_Stack stack);
249 extern void      stk_push(stk_Stack stack, void *datum);
250 extern void      *stk_pop(stk_Stack stack);
251 extern void      *stk_top(stk_Stack stack);
252 extern int       stk_isempty(stk_Stack stack);
253 
254 /* list.c */
255 
256 typedef void *lst_List;
257 typedef void *lst_Position;
258 
259 extern lst_List     lst_create(void);
260 extern void         lst_destroy(lst_List list);
261 extern void         lst_append(lst_List list, const void *datum);
262 extern void         lst_push(lst_List list, const void *datum);
263 extern void         *lst_pop(lst_List list );
264 extern void         *lst_top(lst_List list );
265 extern void         *lst_nth_get(lst_List list, unsigned int n);
266 extern void         lst_nth_set(lst_List list, unsigned int n,
267 								const void *datum);
268 extern int          lst_member(lst_List list, const void *datum);
269 extern unsigned int lst_length(lst_List list );
270 extern int          lst_iterate(lst_List list,
271 								int (*iterator)(const void *datum));
272 extern int          lst_iterate_arg(lst_List list,
273 				     int (*iterator)(const void *datum,
274 									 void *arg),
275 									void *arg);
276 extern void         lst_truncate(lst_List list, unsigned int length);
277 extern void         lst_truncate_position(lst_List list,
278 					   lst_Position position);
279 extern lst_Position lst_init_position(lst_List list);
280 extern lst_Position lst_last_position(lst_List list);
281 extern lst_Position lst_next_position(lst_Position position);
282 extern lst_Position lst_nth_position( lst_List list, unsigned int n);
283 extern void         *lst_get_position(lst_Position position);
284 extern void         lst_set_position(lst_Position position,
285 									 const void *datum);
286 extern void         lst_dump(lst_List list);
287 extern void         _lst_shutdown(void);
288 extern long int     lst_total_allocated(void);
289 
290 #define LST_POSITION_INIT(P,L) ((P)=lst_init_position(L))
291 #define LST_POSITION_NEXT(P)   ((P)=lst_next_position(P))
292 #define LST_POSITION_OK(P)     (P)
293 #define LST_POSITION_GET(P,E)  ((E)=lst_get_position(P))
294 
295 /* iterate over all entries E in list L */
296 #define LST_ITERATE(L,P,E)                                                  \
297    for (LST_POSITION_INIT((P),(L));                                         \
298         LST_POSITION_OK(P) && (LST_POSITION_GET((P),(E)),1);                \
299         LST_POSITION_NEXT(P))
300 
301 /* iterate over all entries in lists L1 and L2 */
302 #define LST_ITERATE2(L1,L2,P1,P2,E1,E2)                                      \
303    for (LST_POSITION_INIT((P1),(L1)), LST_POSITION_INIT((P2),(L2));          \
304 	LST_POSITION_OK(P1) && LST_POSITION_OK(P2)                           \
305 	   && (LST_POSITION_GET((P1),(E1)),LST_POSITION_GET((P2),(E2)),1);   \
306 	LST_POSITION_NEXT(P1), LST_POSITION_NEXT(P2))
307 
308 /* error.c */
309 
310 extern void       err_set_program_name(const char *programName);
311 extern const char *err_program_name(void);
312 extern void       err_fatal(const char *routine, const char *format, ...)
313 	__attribute__((noreturn,format(printf, 2, 3)));
314 extern void       err_fatal_errno(const char *routine,
315 								  const char *format, ...)
316 	__attribute__((noreturn,format(printf, 2, 3)));
317 
318 extern void       err_warning(const char *routine, const char *format, ...)
319 	__attribute__((format(printf, 2, 3)));
320 
321 extern void       err_internal(const char *routine, const char *format, ...)
322 	__attribute__((noreturn,format(printf, 2, 3)));
323 
324 /* memory.c */
325 
326 typedef void *mem_String;
327 typedef void *mem_Object;
328 
329 typedef struct mem_StringStats {
330 	int count;			/* Number of strings or objects */
331 	int bytes;			/* Number of bytes allocated */
332 } *mem_StringStats;
333 
334 typedef struct mem_ObjectStats {
335 	int total;			/* Total objects requested */
336 	int used;			/* Total currently in use */
337 	int reused;			/* Total reused  */
338 	int size;			/* Size of each object */
339 } *mem_ObjectStats;
340 
341 extern mem_String      mem_create_strings(void);
342 extern void            mem_destroy_strings(mem_String info);
343 extern const char      *mem_strcpy(mem_String info, const char *string);
344 extern const char      *mem_strncpy(mem_String info,
345 									const char *string,
346 									int len);
347 extern void            mem_grow(mem_String info,
348 								const char *string,
349 								int len);
350 extern const char      *mem_finish(mem_String info);
351 extern mem_StringStats mem_get_string_stats(mem_String info);
352 extern void            mem_print_string_stats(mem_String info, FILE *stream);
353 
354 extern mem_Object      mem_create_objects(int size);
355 extern void            mem_destroy_objects(mem_Object info);
356 extern void            *mem_get_object(mem_Object info);
357 extern void            *mem_get_empty_object(mem_Object info);
358 extern void            mem_free_object(mem_Object info, void *obj);
359 extern mem_ObjectStats mem_get_object_stats(mem_Object info);
360 extern void            mem_print_object_stats(mem_Object info, FILE *stream);
361 
362 /* string.c */
363 
364 typedef void *str_Pool;
365 typedef hsh_Position str_Position;
366 
367 typedef struct str_Stats {
368 	int count;			/* Number of strings created */
369 	int bytes;			/* Number of bytes allocated */
370 	int retrievals;		/* Total number of retrievals */
371 	int hits;			/* Number of retrievals from top of a list */
372 	int misses;			/* Number of unsuccessful retrievals */
373 } *str_Stats;
374 
375 extern str_Pool   str_pool_create(void);
376 extern void       str_pool_destroy(str_Pool pool);
377 extern int        str_pool_exists(str_Pool pool, const char *s);
378 extern const char *str_pool_find(str_Pool pool, const char *s);
379 extern const char *str_pool_copy(str_Pool pool, const char *s);
380 extern const char *str_pool_copyn(str_Pool pool, const char *s, int length);
381 extern void       str_pool_grow(str_Pool pool, const char *s, int length);
382 extern const char *str_pool_finish(str_Pool pool);
383 extern str_Stats  str_pool_get_stats(str_Pool pool);
384 extern void       str_pool_print_stats(str_Pool pool, FILE *stream);
385 
386 extern str_Position  str_pool_init_position(str_Pool table);
387 extern str_Position  str_pool_next_position(
388 	str_Pool table, str_Position position);
389 extern void str_pool_get_position(
390 	str_Position position,
391 	char const *const *key);
392 #define str_pool_readonly(pool, flag) hsh_readonly ((pool), (flag))
393 
394 extern int        str_pool_iterate(
395 	str_Pool pool,
396 	int (*iterator)( const char *s ) );
397 extern int        str_pool_iterate_arg(
398 	str_Pool pool,
399 	int (*iterator)( const char *s, void *arg ),
400 	void *arg );
401 
402 #define STR_POSITION_INIT(P,T)  ((P)=str_pool_init_position(T))
403 #define STR_POSITION_NEXT(P,T)  ((P)=str_pool_next_position(T,P))
404 #define STR_POSITION_OK(P)      (P)
405 #define STR_POSITION_GET(P,K)   (str_pool_get_position(P,&K), K)
406 
407 /* iterate over all keys (K) in string pool T */
408 #define STR_ITERATE(T,P,K)                                                   \
409    for (STR_POSITION_INIT((P),(T));                                          \
410 	STR_POSITION_OK(P) && (STR_POSITION_GET((P),(K)),1);                 \
411 	STR_POSITION_NEXT((P),(T)))
412 
413 /* If the STR_ITERATE loop is exited before all elements in the table are
414    seen, then STR_ITERATE_END should be called.  Calling this function
415    after complete loops does no harm. */
416 #define STR_ITERATE_END(T) str_readonly(T,0)
417 
418 extern int        str_exists(const char *s);
419 extern const char *str_find(const char *s);
420 extern const char *str_findn(const char *s, int length);
421 extern const char *str_copy(const char *s);
422 extern const char *str_copyn(const char *s, int length);
423 extern void       str_grow(const char *s, int length);
424 extern const char *str_finish(void);
425 extern const char *str_unique(const char *prefix);
426 extern void       str_destroy(void);
427 extern str_Stats  str_get_stats(void);
428 extern void       str_print_stats(FILE *stream);
429 
430 /* debug.c */
431 
432 typedef unsigned long int dbg_Type;
433 
434 extern void           dbg_register(dbg_Type flag, const char *name);
435 extern void           _dbg_register(dbg_Type flag, const char *name);
436 extern void           dbg_destroy(void);
437 extern void           dbg_set(const char *name);
438 extern void           dbg_set_flag(dbg_Type flag);
439 extern void           dbg_unset_flag(dbg_Type flag);
440 extern int            dbg_test(dbg_Type flag);
441 extern void           dbg_list(FILE *stream);
442 
443 #define PRINTF(flag,arg)  if (dbg_test(flag)) { log_info arg; }
444 
445 /* flags.c */
446 
447 typedef unsigned long int flg_Type;
448 
449 extern void           flg_register(flg_Type flag, const char *name);
450 extern void           flg_destroy(void);
451 extern void           flg_set(const char *name);
452 extern int            flg_test(flg_Type flag);
453 extern void           flg_list(FILE *stream);
454 extern const          char *flg_name(flg_Type flag);
455 
456 /* timer.c */
457 
458 extern void   tim_start(const char *name);
459 extern void   tim_stop(const char *name);
460 extern void   tim_reset(const char *name);
461 extern double tim_get_real(const char *name);
462 extern double tim_get_user(const char *name);
463 extern double tim_get_system(const char *name);
464 extern void   tim_print_timer(FILE *str, const char *name);
465 extern void   tim_print_timers(FILE *str);
466 extern void   _tim_shutdown(void);
467 
468 /* arg.c */
469 
470 #define ARG_NO_ESCAPE 0x0001	/* Backslashed are not escape characters */
471 #define ARG_NO_QUOTE  0x0002	/* Don't use quote marks for quoting */
472 
473 typedef void *arg_List;
474 
475 extern arg_List   arg_create(void);
476 extern void       arg_destroy(arg_List arg);
477 extern arg_List   arg_add(arg_List arg, const char *string);
478 extern arg_List   arg_addn(arg_List arg, const char *string, int length);
479 extern void       arg_grow(arg_List arg, const char *string, int length);
480 extern arg_List   arg_finish(arg_List arg);
481 extern const char *arg_get(arg_List arg, int item);
482 extern int        arg_count(arg_List arg);
483 extern void       arg_get_vector(arg_List arg, int *argc, char ***argv);
484 extern arg_List   arg_argify(const char *string, int quoteStyle);
485 
486 /* pr.c */
487 
488 #define PR_USE_STDIN        0x00000001
489 #define PR_USE_STDOUT       0x00000002
490 #define PR_USE_STDERR       0x00000004
491 #define PR_CREATE_STDIN     0x00000010
492 #define PR_CREATE_STDOUT    0x00000020
493 #define PR_CREATE_STDERR    0x00000040
494 #define PR_STDERR_TO_STDOUT 0x00000100
495 
496 extern int  pr_open(const char *command, int flags,
497 					int *infd, int *outfd, int *errfd);
498 extern int  pr_close_nowait(int fd);
499 extern int  pr_close(int fd);
500 extern int  pr_wait(int pid);
501 extern void _pr_shutdown(void);
502 extern int  pr_spawn(const char *command);
503 int pr_readwrite(int in, int out,
504 				 const char *inBuffer, int inLen,
505 				 char *outBuffer, int outMaxLen);
506 int pr_filter(const char *command,
507 			  const char *inBuffer, int inLen,
508 			  char *outBuffer, int outMaxLen);
509 
510 /* sl.c */
511 
512 typedef void *sl_List;
513 typedef int (*sl_Iterator)(const void *datum);
514 typedef int (*sl_IteratorArg)(const void *datum, void *arg);
515 
516 extern sl_List    sl_create( int (*compare)(const void *key1,
517 											const void *key2),
518 							 const void *(*key)(const void *datum),
519 							 const char *(*print)(const void *datum) );
520 extern void       sl_destroy(sl_List list);
521 extern void       _sl_shutdown(void);
522 extern void       sl_insert(sl_List list, const void *datum);
523 extern void       sl_delete(sl_List list, const void *datum);
524 extern const void *sl_find(sl_List list, const void *key);
525 extern int        sl_iterate(sl_List list, sl_Iterator f);
526 extern int        sl_iterate_arg(sl_List list, sl_IteratorArg f, void *arg);
527 extern void       _sl_dump(sl_List list);
528 
529 /* text.c */
530 
531 extern const char * txt_soundex(const char *string);
532 extern void txt_soundex2(
533 	const char *string,
534 	char *result /* five chars */);
535 
536 /* base64.c */
537 
538 extern const char    *b64_encode(unsigned long val);
539 extern unsigned long b64_decode(const char *val);
540 extern unsigned long b64_decode_buf(const char *val, size_t len);
541 
542 /* base26.c */
543 
544 extern const char    *b26_encode(unsigned long val);
545 extern unsigned long b26_decode(const char *val);
546 
547 /* source.c */
548 
549 typedef void *src_Type;
550 
551 typedef struct src_Stats {
552 	int lines_used;		/* Lines used */
553 	int lines_allocated;		/* Lines allocated */
554 	int lines_bytes;		/* Bytes required to store lines */
555 	int tokens_total;		/* Tokens used */
556 	int tokens_reused;		/* Tokens reused */
557 	int tokens_size;		/* Size of a token information object */
558 } *src_Stats;
559 
560 extern void       src_create(void);
561 extern void       src_destroy(void);
562 extern const char *src_line(const char *line, int len);
563 extern void       src_new_file(const char *filename);
564 extern void       src_new_line(int line);
565 extern void       src_advance(int length);
566 extern void       src_cpp_line(const char *line, int length);
567 extern src_Type   src_get(int length);
568 extern const char *src_filename(src_Type source);
569 extern int        src_linenumber(src_Type source);
570 extern int        src_offset(src_Type source);
571 extern int        src_length(src_Type source);
572 extern const char *src_source_line(src_Type source);
573 extern void       src_parse_error(FILE *stream, src_Type source,
574 								  const char *message);
575 extern void       src_print_error(FILE *stream, src_Type source,
576 								  const char *format, ...);
577 extern void       src_print_message(FILE *str, src_Type source,
578 									const char *format, ...);
579 extern void       src_print_line(FILE *stream, src_Type source);
580 extern src_Stats  src_get_stats(void);
581 extern void       src_print_stats(FILE *stream);
582 
583 /* parse-concrete.c */
584 
585 extern void   prs_register_concrete(const char *symbol,
586 									const char *concrete);
587 extern const  char *prs_concrete(const char *symbol);
588 extern void   _prs_shutdown(void);
589 
590 /* log.c */
591 #define LOG_OPTION_FULL    1
592 #define LOG_OPTION_NO_FULL 2
593 
594 extern void       log_syslog(const char *ident);
595 extern void       log_set_facility(const char *facility);
596 extern const char *log_get_facility(void);
597 extern void       log_option(int option);
598 extern void       log_file(const char *ident, const char *filename);
599 extern void       log_stream(const char *ident, FILE *stream);
600 extern void       log_close(void);
601 extern void       log_error_va(const char *routine,
602 							   const char *format, va_list ap);
603 extern void       log_error(const char *routine, const char *format, ...);
604 extern void       log_info_va(const char *format, va_list ap);
605 extern void       log_info(const char *format, ...);
606 
607 #endif
608