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