1 /*
2  * Module/dll handling code written by Colten Edwards.
3  * Copyright 1997
4  */
5 
6 #ifndef _MODULE_H
7 #define _MODULE_H
8 
9 
10 /*
11  * if we change the table below, we change this module number to the
12  * current date.
13  */
14 #define MODULE_VERSION 011000
15 
16 #include "struct.h"
17 
18 typedef int (*Function_ptr)();
19 
20 #ifdef WANT_DLL
21 #ifdef HPUX
22 #include <dl.h>
23 #endif
24 
25 #define COMMAND_PROC	0x0001		/* New /command proc return void */
26 #define ALIAS_PROC	0x0002		/* new $alias proc return new_malloc'd string */
27 #define CTCP_PROC	0x0004		/* new ctcp proc return new_malloc'd string*/
28 #define VAR_PROC	0x0008		/* new variable no return */
29 #define HOOK_PROC	0x0010		/* new numeric proc
30 					 * return int 1 if we don't want client
31 					 * to also handle this.
32 					 * or 0  if we want client to handle
33 					 */
34 #define RAW_PROC	0x0020		/* new raw irc proc */
35 #define DCC_PROC	0x0040		/* add to dcc command list */
36 #define OUTPUT_PROC	0x0080		/* New output proc for all windows. */
37 #define WINDOW_PROC	0x0100		/* New window proc */
38 #define TABLE_PROC	0x8000		/* removing a global_table proc */
39 
40 #define INVALID_MODVERSION -1
41 
42 typedef int (Irc_PackageInitProc)  (IrcCommandDll **, Function_ptr *);
43 typedef char *(Irc_PackageVersionProc)  (IrcCommandDll **);
44 
45 typedef struct _function_table
46 {
47 	char	*name;
48 	char	*desc;
49 	int	id;
50 	int	flag;
51 	void	*func1;
52 	void	*func2;
53 } Function;
54 
55 typedef struct _package_installed {
56 	struct _package_installed *next;
57 	char    *name;
58 	char    *version;
59 
60 	int	major;
61 	int	minor;
62 	int	lock;
63 
64 #if defined(HPUX)
65 	shl_t handle;
66 #elif defined(__EMX__)
67 	HMODULE handle;
68 #elif defined(WINNT)
69 	HINSTANCE handle;
70 #else
71 	void	*handle;
72 #endif
73 	Irc_PackageInitProc *cleanup;
74 } Packages;
75 
76 Packages *find_module (char *);
77 int BX_add_module_proc (unsigned int, char *, char *, char *, int, int, void *, void *);
78 int remove_package (char *);
79 int BX_remove_module_proc (unsigned int, char *, char *, char *);
80 int add_module(unsigned int, Function *, char *);
81 
82 extern BuiltInDllFunctions *dll_functions;
83 #ifndef __hook_c
84 extern NumericFunction *dll_numeric_list;
85 #endif
86 extern IrcCommandDll *dll_commands;
87 extern CtcpEntryDll *dll_ctcp;
88 extern WindowDll *dll_window;
89 extern IrcVariableDll *dll_variable;
90 
91 
92 char *BX_get_dllstring_var(char *);
93 int BX_get_dllint_var(char *);
94 void BX_set_dllstring_var(char *, char *);
95 void BX_set_dllint_var(char *, unsigned int);
96 RawDll *find_raw_proc(char *, char **);
97 
98 int check_version(unsigned long);
99 #endif /* WANT_DLL */
100 
101 /*
102  * the order of this enum is extremely important. ie a module compiled
103  * on a differant order would fail miserably. So when adding to the list
104  * make sure and add to the end of the list.
105  */
106 
107 enum FUNCTION_VALUE
108 {
109 /* ircaux.c */
110 	MODULE_VERSION_CHECK,
111 /* output.c */
112 	PUT_IT,
113 	BITCHSAY,
114 	YELL,
115 	ADD_TO_LOG,
116 	VSNPRINTF,
117 	SNPRINTF,
118 	NEW_MALLOC,
119 	NEW_FREE,
120 	NEW_REALLOC,
121 	MALLOC_STRCPY,
122 	MALLOC_STRCAT,
123 	MALLOC_STR2CPY,
124 	M_3DUP,
125 	M_OPENDUP,
126 	M_S3CAT,
127 	M_S3CAT_S,
128 	M_3CAT,
129 	UPPER,
130 	LOWER,
131 	STRISTR,
132 	RSTRISTR,
133 	WORD_COUNT,
134 	REMOVE_TRAILING_SPACES,
135 	MY_STRICMP,
136 	MY_STRNICMP,
137 	MY_STRNSTR,
138 	CHOP,
139 	STRMCPY,
140 	STRMCAT,
141 	SCANSTR,
142 	EXPAND_TWIDDLE,
143 	CHECK_NICKNAME,
144 	SINDEX,
145 	RSINDEX,
146 	ISNUMBER,
147 	RFGETS,
148 	PATH_SEARCH,
149 	DOUBLE_QUOTE,
150 	IRCPANIC,
151 	END_STRCMP,
152 	BEEP_EM,
153 	UZFOPEN,
154 	FUNC_GET_TIME,
155 	TIME_DIFF,
156 	TIME_TO_NEXT_MINUTE,
157 	PLURAL,
158 	MY_CTIME,
159 	LTOA,
160 	STRFORMAT,
161 	MATCHINGBRACKET,
162 	PARSE_NUMBER,
163 	SPLITW,
164 	UNSPLITW,
165 	M_2DUP,
166 	M_E3CAT,
167 	CHECK_VAL,
168 	ON_OFF,
169 	STREXTEND,
170 	STRFILL,
171 	EMPTY_FUNC,
172 	REMOVE_BRACKETS,
173 	MY_ATOL,
174 	M_DUPCHAR,
175 	STREQ,
176 	STRIEQ,
177 	STRMOPENCAT,
178 	OV_STRCPY,
179 	STRIP_CONTROL,
180 	FIGURE_OUT_ADDRESS,
181 	STRNRCHR,
182 	MASK_DIGITS,
183 	CCSPAN,
184 	CHARCOUNT,
185 	STRPCAT,
186 	STRCPY_NOCOLORCODES,
187 	CRYPTIT,
188 	STRIPDEV,
189 	MANGLE_LINE,
190 	M_STRDUP,
191 	M_STRCAT_UES,
192 	M_STRNDUP,
193 	MALLOC_SPRINTF,
194 	M_SPRINTF,
195 	NEXT_ARG,
196 	NEW_NEXT_ARG,
197 	NEW_NEW_NEXT_ARG,
198 	LAST_ARG,
199 	NEXT_IN_COMMA_LIST,
200 	RANDOM_NUMBER,
201 
202 /* words.c */
203 	STRSEARCH,
204 	MOVE_TO_ABS_WORD,
205 	MOVE_WORD_REL,
206 	EXTRACT,
207 	EXTRACT2,
208 	WILD_MATCH,
209 /* network */
210 	CONNECT_BY_NUMBER,
211 	RESOLV,
212 	LOOKUP_HOST,
213 	LOOKUP_IP,
214 	HOST_TO_IP,
215 	IP_TO_HOST,
216 	ONE_TO_ANOTHER,
217 	SET_BLOCKING,
218 	SET_NON_BLOCKING,
219 
220 /* list.c */
221 	ADD_TO_LIST,
222 	ADD_TO_LIST_EXT,
223 	REMOVE_FROM_LIST_,
224 	REMOVE_FROM_LIST_EXT,
225 	REMOVEWILD_FROM_LIST,
226 	LIST_LOOKUP,
227 	LIST_LOOKUP_EXT,
228 	FIND_IN_LIST,
229 	FIND_IN_LIST_EXT,
230 /* alist.c */
231 	ADD_TO_ARRAY,
232 	REMOVE_FROM_ARRAY,
233 	ARRAY_POP,
234 	REMOVE_ALL_FROM_ARRAY,
235 	ARRAY_LOOKUP,
236 	FIND_ARRAY_ITEM,
237 	FIND_FIXED_ARRAY_ITEM,
238 
239 /* server.c */
240 	SEND_TO_SERVER,
241 	QUEUE_SEND_TO_SERVER,
242 	MY_SEND_TO_SERVER,
243 /* connecting to the server */
244 	GET_CONNECTED,
245 	CONNECT_TO_SERVER_BY_REFNUM,
246 	CLOSE_SERVER,
247 	IS_SERVER_CONNECTED,
248 	FLUSH_SERVER,
249 	SERVER_IS_CONNECTED,
250 	IS_SERVER_OPEN,
251 	CLOSE_ALL_SERVER,
252 /* server file reading */
253 	READ_SERVER_FILE,
254 	ADD_TO_SERVER_LIST,
255 	BUILD_SERVER_LIST,
256 	DISPLAY_SERVER_LIST,
257 	CREATE_SERVER_LIST,
258 	PARSE_SERVER_INFO,
259 	SERVER_LIST_SIZE,
260 /* misc server/nickname functions */
261 	FIND_SERVER_REFNUM,
262 	FIND_IN_SERVER_LIST,
263 	PARSE_SERVER_INDEX,
264 	SET_SERVER_REDIRECT,
265 	GET_SERVER_REDIRECT,
266 	CHECK_SERVER_REDIRECT,
267 	FUDGE_NICKNAME,
268 	RESET_NICKNAME,
269 /* various set server struct functions */
270 	SET_SERVER_COOKIE,
271 	SET_SERVER_FLAG,
272 	SET_SERVER_MOTD,
273 	SET_SERVER_OPERATOR,
274 	SET_SERVER_ITSNAME,
275 	SET_SERVER_VERSION,
276 	SET_SERVER_LAG,
277 	SET_SERVER_PASSWORD,
278 	SET_SERVER_NICKNAME,
279 	SET_SERVER2_8,
280 	SET_SERVER_AWAY,
281 /* various get server struct functions */
282 	GET_SERVER_COOKIE,
283 	GET_SERVER_NICKNAME,
284 	GET_SERVER_NAME,
285 	GET_SERVER_ITSNAME,
286 	GET_SERVER_MOTD,
287 	GET_SERVER_OPERATOR,
288 	GET_SERVER_VERSION,
289 	GET_SERVER_FLAG,
290 	GET_POSSIBLE_UMODES,
291 	GET_SERVER_PORT,
292 	GET_SERVER_LAG,
293 	GET_SERVER2_8,
294 	GET_UMODE,
295 	GET_SERVER_AWAY,
296 	GET_SERVER_NETWORK,
297 	GET_PENDING_NICKNAME,
298 	SERVER_DISCONNECT,
299 
300 	GET_SERVER_LIST,
301 	GET_SERVER_CHANNELS,
302 
303 	SET_SERVER_LAST_CTCP_TIME,
304 	GET_SERVER_LAST_CTCP_TIME,
305 	SET_SERVER_TRACE_FLAG,
306 	GET_SERVER_TRACE_FLAG,
307 	GET_SERVER_READ,
308 	GET_SERVER_LINKLOOK,
309 	SET_SERVER_LINKLOOK,
310 	GET_SERVER_LINKLOOK_TIME,
311 	SET_SERVER_LINKLOOK_TIME,
312 	GET_SERVER_TRACE_KILL,
313 	SET_SERVER_TRACE_KILL,
314 	ADD_SERVER_CHANNELS,
315 	SET_SERVER_CHANNELS,
316 	SEND_MSG_TO_CHANNELS,
317 	SEND_MSG_TO_NICKS,
318 	IS_SERVER_QUEUE,
319 /* glob.c */
320 	BSD_GLOB,
321 	BSD_GLOBFREE,
322 
323 	CONVERT_OUTPUT_FORMAT,
324 	UPDATE_CLOCK,
325 	BREAKARGS,
326 	PASTEARGS,
327 	USERAGE,
328 	SEND_TEXT,
329 	SET_LASTLOG_MSG_LEVEL,
330 	SPLIT_CTCP,
331 	RANDOM_STR,
332 	DCC_PRINTF,
333 
334 	MY_ENCRYPT,
335 	MY_DECRYPT,
336 	PREPARE_COMMAND,
337 	BUILD_STATUS,
338 	FUNC_LOAD,
339 
340 	HOOK,
341 /* irc.c */
342 	IRC_IO_FUNC,
343 	IRC_EXIT_FUNC,
344 /* alias.c */
345 	LOCK_STACK_FRAME,
346 	UNLOCK_STACK_FRAME,
347 
348 
349 /* input.c */
350 	FUNC_UPDATE_INPUT,
351 	CURSOR_TO_INPUT,
352 	SET_INPUT,
353 	GET_INPUT,
354 	SET_INPUT_PROMPT,
355 	GET_INPUT_PROMPT,
356 	ADDTABKEY,
357 	GETTABKEY,
358 	GETNEXTNICK,
359 	GETCHANNICK,
360 	LOOKUP_NICKCOMPLETION,
361 	ADD_COMPLETION_TYPE,
362 
363 /* module.c */
364 	ADD_MODULE_PROC,
365 	REMOVE_MODULE_PROC,
366 /* names.c */
367 	IS_CHANOP,
368 	IS_CHANNEL,
369 	MAKE_CHANNEL,
370 	IM_ON_CHANNEL,
371 	IS_ON_CHANNEL,
372 	ADD_CHANNEL,
373 	ADD_TO_CHANNEL,
374 	GET_CHANNEL_KEY,
375 	FUNC_RECREATE_MODE,
376 	FUNC_COMPRESS_MODES,
377 	FUNC_GOT_OPS,
378 	GET_CHANNEL_BANS,
379 	GET_CHANNEL_MODE,
380 	CLEAR_BANS,
381 	REMOVE_CHANNEL,
382 	REMOVE_FROM_CHANNEL,
383 	RENAME_NICK,
384 	GET_CHANNEL_OPER,
385 	GET_CHANNEL_HALFOP,
386 	FETCH_USERHOST,
387 	GET_CHANNEL_VOICE,
388 	CREATE_CHANNEL_LIST,
389 	FLUSH_CHANNEL_STATS,
390 	LOOKUP_CHANNEL,
391 
392 	FIND_NICKLIST_IN_CHANNELLIST,
393 	ADD_NICKLIST_TO_CHANNELLIST,
394 	NEXT_NICKLIST,
395 
396 	NEXT_NAMELIST,
397 	ADD_NAME_TO_GENERICLIST,
398 	FIND_NAME_IN_GENERICLIST,
399 	ADD_WHOWAS_USERHOST_CHANNEL,
400 	FIND_USERHOST_CHANNEL,
401 	NEXT_USERHOST,
402 	SORTED_NICKLIST,
403 	CLEAR_SORTED_NICKLIST,
404 	ADD_NAME_TO_FLOODLIST,
405 	FIND_NAME_IN_FLOODLIST,
406 	CLEAR_WHOWAS_HASH_TABLE,
407 	REMOVE_OLDEST_WHOWAS_HASHLIST,
408 
409 
410 /* cset.c fset.c vars.c */
411 	FGET_STRING_VAR,
412 	FSET_STRING_VAR,
413 	GET_WSET_STRING_VAR,
414 	SET_WSET_STRING_VAR,
415 	SET_CSET_INT_VAR,
416 	GET_CSET_INT_VAR,
417 	SET_CSET_STR_VAR,
418 	GET_CSET_STR_VAR,
419 	GET_DLLINT_VAR,
420 	SET_DLLINT_VAR,
421 	GET_DLLSTRING_VAR,
422 	SET_DLLSTRING_VAR,
423 	GET_INT_VAR,
424 	SET_INT_VAR,
425 	GET_STRING_VAR,
426 	SET_STRING_VAR,
427 
428 	ADD_TIMER,
429 	DELETE_TIMER,
430 	DELETE_ALL_TIMERS,
431 
432 /* sockets from misc.c */
433 	ADD_SOCKETREAD,
434 	ADD_SOCKETTIMEOUT,
435 	CLOSE_SOCKETREAD,
436 	GET_SOCKET,
437 	SET_SOCKETFLAGS,
438 	GET_SOCKETFLAGS,
439 	GET_SOCKETINFO,
440 	SET_SOCKETINFO,
441 	SET_SOCKETWRITE,
442 	CHECK_SOCKET,
443 	READ_SOCKETS,
444 	WRITE_SOCKETS,
445 	GET_MAX_FD,
446 	NEW_CLOSE,
447 	NEW_OPEN,
448 	DGETS,
449 
450 
451 /* screen.c */
452 	PREPARE_DISPLAY,
453 	ADD_TO_WINDOW,
454 	SKIP_INCOMING_MIRC,
455 	ADD_TO_SCREEN,
456 	SPLIT_UP_LINE,
457 	OUTPUT_LINE,
458 	OUTPUT_WITH_COUNT,
459 	SCROLL_WINDOW,
460 	CURSOR_NOT_IN_DISPLAY,
461 	CURSOR_IN_DISPLAY,
462 	IS_CURSOR_IN_DISPLAY,
463 	REPAINT_WINDOW,
464 	CREATE_NEW_SCREEN,
465 	CREATE_ADDITIONAL_SCREEN,
466 	KILL_SCREEN,
467 	XTERM_SETTITLE,
468 	ADD_WAIT_PROMPT,
469 	SKIP_CTL_C_SEQ,
470 	STRIP_ANSI,
471 
472 /* window.c */
473 	FREE_FORMATS,
474 	REMOVE_WINDOW_FROM_SCREEN,
475 	SET_SCREENS_CURRENT_WINDOW,
476 	NEW_WINDOW,
477 	DELETE_WINDOW,
478 	TRAVERSE_ALL_WINDOWS,
479 	ADD_TO_INVISIBLE_LIST,
480 	ADD_TO_WINDOW_LIST,
481 	RECALCULATE_WINDOW_POSITIONS,
482 	MOVE_WINDOW,
483 	RESIZE_WINDOW,
484 	REDRAW_ALL_WINDOWS,
485 	REBALANCE_WINDOWS,
486 	RECALCULATE_WINDOWS,
487 	UPDATE_ALL_WINDOWS,
488 	GOTO_WINDOW,
489 	HIDE_BX_WINDOW,
490 	FUNC_SWAP_LAST_WINDOW,
491 	FUNC_SWAP_NEXT_WINDOW,
492 	FUNC_SWAP_PREVIOUS_WINDOW,
493 	SHOW_WINDOW,
494 	GET_STATUS_BY_REFNUM,
495 	GET_WINDOW_BY_DESC,
496 	GET_WINDOW_BY_REFNUM,
497 	GET_VISIBLE_BY_REFNUM,
498 	GET_WINDOW_BY_NAME,
499 	FUNC_NEXT_WINDOW,
500 	FUNC_PREVIOUS_WINDOW,
501 	UPDATE_WINDOW_STATUS,
502 	UPDATE_ALL_STATUS,
503 	UPDATE_WINDOW_STATUS_ALL,
504 	STATUS_UPDATE,
505 	SET_PROMPT_BY_REFNUM,
506 	GET_PROMPT_BY_REFNUM,
507 	QUERY_NICK, /* DEFUNCT */
508 	QUERY_HOST, /* DEFUNCT */
509 	QUERY_CMD, /* DEFUNCT */
510 	GET_TARGET_BY_REFNUM,
511 	GET_TARGET_CMD_BY_REFNUM,
512 	GET_WINDOW_TARGET_BY_DESC,
513 	IS_CURRENT_CHANNEL,
514 	SET_CURRENT_CHANNEL_BY_REFNUM,
515 	GET_CURRENT_CHANNEL_BY_REFNUM,
516 	GET_REFNUM_BY_WINDOW,
517 	IS_BOUND_TO_WINDOW,
518 	GET_WINDOW_BOUND_CHANNEL,
519 	IS_BOUND_ANYWHERE,
520 	IS_BOUND,
521 	UNBIND_CHANNEL,
522 	GET_BOUND_CHANNEL,
523 	GET_WINDOW_SERVER,
524 	SET_WINDOW_SERVER,
525 	WINDOW_CHECK_SERVERS,
526 	CHANGE_WINDOW_SERVER,
527 	SET_LEVEL_BY_REFNUM,
528 	SET_SERVER_STAT_FLAG,
529 	GET_SERVER_STAT_FLAG,
530 	MESSAGE_TO,
531 	CLEAR_WINDOW,
532 	CLEAR_ALL_WINDOWS,
533 	CLEAR_WINDOW_BY_REFNUM,
534 	UNCLEAR_WINDOW_BY_REFNUM,
535 	SET_SCROLL_LINES,
536 	SET_CONTINUED_LINES,
537 	CURRENT_REFNUM,
538 	NUMBER_OF_WINDOWS_ON_SCREEN,
539 	SET_SCROLLBACK_SIZE,
540 	IS_WINDOW_NAME_UNIQUE,
541 	GET_NICKLIST_BY_WINDOW,
542 	SCROLLBACK_BACKWARDS_LINES,
543 	SCROLLBACK_FORWARDS_LINES,
544 	SCROLLBACK_FORWARDS,
545 	SCROLLBACK_BACKWARDS,
546 	SCROLLBACK_END,
547 	SCROLLBACK_START,
548 	SET_HOLD_MODE,
549 	UNHOLD_WINDOWS,
550 	FUNC_UNSTOP_ALL_WINDOWS,
551 	RESET_LINE_CNT,
552 	FUNC_TOGGLE_STOP_SCREEN,
553 	FLUSH_EVERYTHING_BEING_HELD,
554 	UNHOLD_A_WINDOW,
555 	RECALCULATE_WINDOW_CURSOR,
556 	MAKE_WINDOW_CURRENT,
557 	CLEAR_SCROLLBACK,
558 	SET_DISPLAY_TARGET,
559 	RESET_DISPLAY_TARGET,
560 	RESTORE_DISPLAY_TARGET,
561 	SAVE_DISPLAY_TARGET,
562 
563 	IS_OTHER_FLOOD,
564 	CHECK_FLOODING,
565 	FLOOD_PROT,
566 /* expr.c */
567 
568 	NEXT_UNIT,
569 	EXPAND_ALIAS,
570 	PARSE_INLINE,
571 	ALIAS_SPECIAL_CHAR,
572 	PARSE_LINE,
573 	PARSE_COMMAND_FUNC,
574 	MAKE_LOCAL_STACK,
575 	DESTROY_LOCAL_STACK,
576 
577 /* dcc.c */
578 	DCC_CREATE_FUNC,
579 	FIND_DCC_FUNC,
580 	ERASE_DCC_INFO,
581 	ADD_DCC_BIND,
582 	REMOVE_DCC_BIND,
583 	REMOVE_ALL_DCC_BINDS,
584 	GET_ACTIVE_COUNT,
585 	GET_NUM_QUEUE,
586 	ADD_TO_QUEUE,
587 	DCC_FILESEND,
588 	DCC_RESEND,
589 
590 /* who.c */
591 	WHOBASE,
592 	ISONBASE,
593 	USERHOSTBASE,
594 
595 	FIND_COMMAND_FUNC,
596 
597 
598 	NICKNAME,
599 	IRC_VERSION,
600 	FROM_SERVER,
601 	CONNECTED_TO_SERVER,
602 	PRIMARY_SERVER,
603 	PARSING_SERVER_INDEX,
604 	NOW,
605 	START_TIME,
606 	IDLE_TIME,
607 
608 	LOADING_GLOBAL,
609 	TARGET_WINDOW,
610 	CURRENT_WINDOW,
611 	INVISIBLE_LIST,
612 
613 	MAIN_SCREEN,
614 	LAST_INPUT_SCREEN,
615 	OUTPUT_SCREEN,
616 	SCREEN_LIST,
617 	IRCLOG_FP,
618 	DOING_NOTICE,
619 	LAST_SENT_MSG_BODY, /* NO LONGER USED */
620 	SENT_NICK, /* NO LONGER USED */
621 
622 	DLL_FUNCTIONS,
623 	DLL_NUMERIC,
624 	DLL_COMMANDS,
625 	DLL_VARIABLE,
626 	DLL_CTCP,
627 	DLL_WINDOW,
628 	WINDOW_DISPLAY,
629 	STATUS_UPDATE_FLAG,
630 	TABKEY_ARRAY,
631 	AUTOREPLY_ARRAY,
632 	IDENTD_SOCKET,
633 
634 	VAR_TCL_INTERP,
635         LASTCLICKLINEDATA,
636         CONTEXTX,
637         CONTEXTY,
638         GUIIPC,
639 	GUI_MUTEX_LOCK,
640 	GUI_MUTEX_UNLOCK,
641 
642 /* input output functions */
643 	SERV_OPEN_FUNC,
644 	SERV_INPUT_FUNC,
645 	SERV_OUTPUT_FUNC,
646 	SERV_CLOSE_FUNC,
647 	CHECK_EXT_MAIL_STATUS,
648 	CHECK_EXT_MAIL,
649 	DEFAULT_OUTPUT_FUNCTION,
650 	DEFAULT_STATUS_OUTPUT_FUNCTION,
651 
652 /* names.c */
653     IS_HALFOP,
654 
655 /* leave at the end */
656 	NUMBER_OF_GLOBAL_FUNCTIONS
657 };
658 
659 extern Function_ptr global_table[];
660 extern IrcCommand irc_command[];
661 
662 #endif
663