/*
 * module.h
 *
 * $Id: module.h,v 1.83 2006-03-28 02:35:50 wcc Exp $
 */
/*
 * Copyright (C) 1997 Robey Pointer
 * Copyright (C) 1999 - 2006 Eggheads Development Team
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 */

#ifndef _EGG_MOD_MODULE_H
#define _EGG_MOD_MODULE_H

/* Just include *all* the include files...it's slower but EASIER */
#include "src/main.h"
#include "modvals.h"
#include "src/tandem.h"

/*
 * This file contains all the horrible stuff required to do the lookup
 * table for symbols, rather than getting the OS to do it, since most
 * OS's require all symbols resolved, this can cause a problem with
 * some modules.
 *
 * This is intimately related to the table in `modules.c'. Don't change
 * the files unless you have flamable underwear.
 *
 * Do not read this file whilst unless heavily sedated, I will not be
 * held responsible for mental break-downs caused by this file <G>
 */

#undef nmalloc
#undef nfree
#undef nrealloc
#undef feof
#undef user_malloc
#undef dprintf
#undef get_data_ptr
#undef wild_match
#undef wild_match_per
#undef maskhost
#undef maskban
#undef user_realloc
#undef Context
#undef ContextNote
#undef Assert

/* Compability functions. */
#ifdef egg_inet_aton
#  undef egg_inet_aton
#endif
#ifdef egg_vsnprintf
#  undef egg_vsnprintf
#endif
#ifdef egg_snprintf
#  undef egg_snprintf
#endif
#ifdef egg_memset
#  undef egg_memset
#endif
#ifdef egg_strcasecmp
#  undef egg_strcasecmp
#endif
#ifdef egg_strncasecmp
#  undef egg_strncasecmp
#endif

#if defined (__CYGWIN__) && !defined(STATIC)
#  define EXPORT_SCOPE  __declspec(dllexport)
#else
#  define EXPORT_SCOPE
#endif

/* Version checks for modules. */
#define EGG_IS_MIN_VER(ver)             ((ver) <= EGG_VERSION)
#define EGG_IS_MAX_VER(ver)             ((ver) >= EGG_VERSION)

/* Redefine for module-relevance */

/* 0 - 3 */
#define nmalloc(x) (((void *(*)())global[0])((x),MODULE_NAME,__FILE__,__LINE__))
#define nfree(x) (global[1]((x),MODULE_NAME,__FILE__,__LINE__))
#ifdef DEBUG_CONTEXT
#  define Context (global[2](__FILE__, __LINE__, MODULE_NAME))
#else
#  define Context {}
#endif
#define module_rename ((int (*)(char *, char *))global[3])
/* 4 - 7 */
#define module_register ((int (*)(char *, Function *, int, int))global[4])
#define module_find ((module_entry * (*)(char *,int,int))global[5])
#define module_depend ((Function *(*)(char *,char *,int,int))global[6])
#define module_undepend ((int(*)(char *))global[7])
/* 8 - 11 */
#define add_bind_table ((p_tcl_bind_list(*)(const char *,int,Function))global[8])
#define del_bind_table ((void (*) (p_tcl_bind_list))global[9])
#define find_bind_table ((p_tcl_bind_list(*)(const char *))global[10])
#define check_tcl_bind ((int (*) (p_tcl_bind_list,const char *,struct flag_record *,const char *, int))global[11])
/* 12 - 15 */
#define add_builtins ((int (*) (p_tcl_bind_list, cmd_t *))global[12])
#define rem_builtins ((int (*) (p_tcl_bind_list, cmd_t *))global[13])
#define add_tcl_commands ((void (*) (tcl_cmds *))global[14])
#define rem_tcl_commands ((void (*) (tcl_cmds *))global[15])
/* 16 - 19 */
#define add_tcl_ints ((void (*) (tcl_ints *))global[16])
#define rem_tcl_ints ((void (*) (tcl_ints *))global[17])
#define add_tcl_strings ((void (*) (tcl_strings *))global[18])
#define rem_tcl_strings ((void (*) (tcl_strings *))global[19])
/* 20 - 23 */
#define base64_to_int ((int (*) (char *))global[20])
#define int_to_base64 ((char * (*) (int))global[21])
#define int_to_base10 ((char * (*) (int))global[22])
#define simple_sprintf ((int (*)())global[23])
/* 24 - 27 */
#define botnet_send_zapf ((void (*)(int, char *, char *, char *))global[24])
#define botnet_send_zapf_broad ((void (*)(int, char *, char *, char *))global[25])
#define botnet_send_unlinked ((void (*)(int, char *, char *))global[26])
#define botnet_send_bye ((void(*)(void))global[27])
/* 28 - 31 */
#define botnet_send_chat ((void(*)(int,char*,char*))global[28])
#define botnet_send_filereject ((void(*)(int,char*,char*,char*))global[29])
#define botnet_send_filesend ((void(*)(int,char*,char*,char*))global[30])
#define botnet_send_filereq ((void(*)(int,char*,char*,char*))global[31])
/* 32 - 35 */
#define botnet_send_join_idx ((void(*)(int,int))global[32])
#define botnet_send_part_idx ((void(*)(int,char *))global[33])
#define updatebot ((void(*)(int,char*,char,int))global[34])
#define nextbot ((int (*)(char *))global[35])
/* 36 - 39 */
#define zapfbot ((void (*)(int))global[36])
#define n_free ((void (*)(void *,char *, int))global[37])
#define u_pass_match ((int (*)(struct userrec *,char *))global[38])
#define user_malloc(x) ((void *(*)(int,char *,int))global[39])(x,__FILE__,__LINE__)
/* 40 - 43 */
#define get_user ((void *(*)(struct user_entry_type *,struct userrec *))global[40])
#define set_user ((int(*)(struct user_entry_type *,struct userrec *,void *))global[41])
#define add_entry_type ((int (*) ( struct user_entry_type * ))global[42])
#define del_entry_type ((int (*) ( struct user_entry_type * ))global[43])
/* 44 - 47 */
#define get_user_flagrec ((void (*)(struct userrec *, struct flag_record *, const char *))global[44])
#define set_user_flagrec ((void (*)(struct userrec *, struct flag_record *, const char *))global[45])
#define get_user_by_host ((struct userrec * (*)(char *))global[46])
#define get_user_by_handle ((struct userrec *(*)(struct userrec *,char *))global[47])
/* 48 - 51 */
#define find_entry_type ((struct user_entry_type * (*) ( char * ))global[48])
#define find_user_entry ((struct user_entry * (*)( struct user_entry_type *, struct userrec *))global[49])
#define adduser ((struct userrec *(*)(struct userrec *,char*,char*,char*,int))global[50])
#define deluser ((int (*)(char *))global[51])
/* 52 - 55 */
#define addhost_by_handle ((void (*) (char *, char *))global[52])
#define delhost_by_handle ((int(*)(char *,char *))global[53])
#define readuserfile ((int (*)(char *,struct userrec **))global[54])
#define write_userfile ((void(*)(int))global[55])
/* 56 - 59 */
#define geticon ((char (*) (int))global[56])
#define clear_chanlist ((void (*)(void))global[57])
#define reaffirm_owners ((void (*)(void))global[58])
#define change_handle ((int(*)(struct userrec *,char*))global[59])
/* 60 - 63 */
#define write_user ((int (*)(struct userrec *, FILE *,int))global[60])
#define clear_userlist ((void (*)(struct userrec *))global[61])
#define count_users ((int(*)(struct userrec *))global[62])
#define sanity_check ((int(*)(int))global[63])
/* 64 - 67 */
#define break_down_flags ((void (*)(const char *,struct flag_record *,struct flag_record *))global[64])
#define build_flags ((void (*)(char *, struct flag_record *, struct flag_record *))global[65])
#define flagrec_eq ((int(*)(struct flag_record*,struct flag_record *))global[66])
#define flagrec_ok ((int(*)(struct flag_record*,struct flag_record *))global[67])
/* 68 - 71 */
#define shareout (*(Function *)(global[68]))
#define dprintf (global[69])
#define chatout (global[70])
#define chanout_but ((void(*)())global[71])
/* 72 - 75 */
#define check_validity ((int (*) (char *,Function))global[72])
#define list_delete ((int (*)( struct list_type **, struct list_type *))global[73])
#define list_append ((int (*) ( struct list_type **, struct list_type *))global[74])
#define list_contains ((int (*) (struct list_type *, struct list_type *))global[75])
/* 76 - 79 */
#define answer ((int (*) (int,char *,unsigned long *,unsigned short *,int))global[76])
#define getmyip ((IP (*) (void))global[77])
#define neterror ((void (*) (char *))global[78])
#define tputs ((void (*) (int, char *,unsigned int))global[79])
/* 80 - 83 */
#define new_dcc ((int (*) (struct dcc_table *, int))global[80])
#define lostdcc ((void (*) (int))global[81])
#define getsock ((int (*) (int))global[82])
#define killsock ((void (*) (int))global[83])
/* 84 - 87 */
#define open_listen ((int (*) (int *))global[84])
#define open_telnet_dcc ((int (*) (int,char *,char *))global[85])
#define get_data_ptr(x) ((void *(*)(int,char*,int))global[86])(x,__FILE__,__LINE__)
#define open_telnet ((int (*) (char *, int))global[87])
/* 88 - 91 */
#define check_tcl_event ((void * (*) (const char *))global[88])
#define my_memcpy ((void * (*) (void *, const void *, size_t))global[89])
#define my_atoul ((IP(*)(char *))global[90])
#define my_strcpy ((int (*)(char *, const char *))global[91])
/* 92 - 95 */
#define dcc (*(struct dcc_t **)global[92])
#define chanset (*(struct chanset_t **)(global[93]))
#define userlist (*(struct userrec **)global[94])
#define lastuser (*(struct userrec **)(global[95]))
/* 96 - 99 */
#define global_bans (*(maskrec **)(global[96]))
#define global_ign (*(struct igrec **)(global[97]))
#define password_timeout (*(int *)(global[98]))
#define share_greet (*(int *)global[99])
/* 100 - 103 */
#define max_dcc (*(int *)global[100])
#define require_p (*(int *)global[101])
#define ignore_time (*(int *)(global[102]))
/* was use_console_r <Wcc[02/02/03]> */
/* 104 - 107 */
#define reserved_port_min (*(int *)(global[104]))
#define reserved_port_max (*(int *)(global[105]))
#define raw_log (*(int *)(global[106]))
#define noshare (*(int *)(global[107]))
/* 108 - 111 */
/* 108: gban_total -- UNUSED (Eule) */
#define make_userfile (*(int*)global[109])
#define default_flags (*(int*)global[110])
#define dcc_total (*(int*)global[111])
/* 112 - 115 */
#define tempdir ((char *)(global[112]))
#define natip ((char *)(global[113]))
#define hostname ((char *)(global[114]))
#define origbotname ((char *)(global[115]))
/* 116 - 119 */
#define botuser ((char *)(global[116]))
#define admin ((char *)(global[117]))
#define userfile ((char *)global[118])
#define ver ((char *)global[119])
/* 120 - 123 */
#define notify_new ((char *)global[120])
#define helpdir ((char *)global[121])
#define Version ((char *)global[122])
#define botnetnick ((char *)global[123])
/* 124 - 127 */
#define DCC_CHAT_PASS (*(struct dcc_table *)(global[124]))
#define DCC_BOT (*(struct dcc_table *)(global[125]))
#define DCC_LOST (*(struct dcc_table *)(global[126]))
#define DCC_CHAT (*(struct dcc_table *)(global[127]))
/* 128 - 131 */
#define interp (*(Tcl_Interp **)(global[128]))
#define now (*(time_t*)global[129])
#define findanyidx ((int (*)(int))global[130])
#define findchan ((struct chanset_t *(*)(char *))global[131])
/* 132 - 135 */
#define cmd_die (global[132])
#define days ((void (*)(time_t,time_t,char *))global[133])
#define daysago ((void (*)(time_t,time_t,char *))global[134])
#define daysdur ((void (*)(time_t,time_t,char *))global[135])
/* 136 - 139 */
#define ismember ((memberlist * (*) (struct chanset_t *, char *))global[136])
#define newsplit ((char *(*)(char **))global[137])
#define splitnick ((char *(*)(char **))global[138])
#define splitc ((void (*)(char *,char *,char))global[139])
/* 140 - 143 */
#define addignore ((void (*) (char *, char *, char *,time_t))global[140])
#define match_ignore ((int (*)(char *))global[141])
#define delignore ((int (*)(char *))global[142])
#define fatal (global[143])
/* 144 - 147 */
#define xtra_kill ((void (*)(struct user_entry *))global[144])
#define xtra_unpack ((void (*)(struct userrec *, struct user_entry *))global[145])
#define movefile ((int (*) (char *, char *))global[146])
#define copyfile ((int (*) (char *, char *))global[147])
/* 148 - 151 */
#define do_tcl ((void (*)(char *, char *))global[148])
#define readtclprog ((int (*)(const char *))global[149])
#define get_language ((char *(*)(int))global[150])
#define def_get ((void *(*)(struct userrec *, struct user_entry *))global[151])
/* 152 - 155 */
#define makepass ((void (*) (char *))global[152])
#define wild_match ((int (*)(const char *, const char *))global[153])
#define _maskhost ((void (*)(const char *, char *, int))global[154])
#define show_motd ((void(*)(int))global[155])
/* 156 - 159 */
#define tellhelp ((void(*)(int, char *, struct flag_record *, int))global[156])
#define showhelp ((void(*)(char *, char *, struct flag_record *, int))global[157])
#define add_help_reference ((void(*)(char *))global[158])
#define rem_help_reference ((void(*)(char *))global[159])
/* 160 - 163 */
#define touch_laston ((void (*)(struct userrec *,char *,time_t))global[160])
#define add_mode ((void (*)(struct chanset_t *,char,char,char *))(*(Function**)(global[161])))
#define rmspace ((void (*)(char *))global[162])
#define in_chain ((int (*)(char *))global[163])
/* 164 - 167 */
#define add_note ((int (*)(char *,char*,char*,int,int))global[164])
#define del_lang_section ((int(*)(char *))global[165])
#define detect_dcc_flood ((int (*) (time_t *,struct chat_info *,int))global[166])
#define flush_lines ((void(*)(int,struct chat_info*))global[167])
/* 168 - 171 */
#define expected_memory ((int(*)(void))global[168])
#define tell_mem_status ((void(*)(char *))global[169])
#define do_restart (*(int *)(global[170]))
#define check_tcl_filt ((const char *(*)(int, const char *))global[171])
/* 172 - 175 */
#define add_hook(a,b) (((void (*) (int, Function))global[172])(a,b))
#define del_hook(a,b) (((void (*) (int, Function))global[173])(a,b))
#define H_dcc (*(p_tcl_bind_list *)(global[174]))
#define H_filt (*(p_tcl_bind_list *)(global[175]))
/* 176 - 179 */
#define H_chon (*(p_tcl_bind_list *)(global[176]))
#define H_chof (*(p_tcl_bind_list *)(global[177]))
#define H_load (*(p_tcl_bind_list *)(global[178]))
#define H_unld (*(p_tcl_bind_list *)(global[179]))
/* 180 - 183 */
#define H_chat (*(p_tcl_bind_list *)(global[180]))
#define H_act (*(p_tcl_bind_list *)(global[181]))
#define H_bcst (*(p_tcl_bind_list *)(global[182]))
#define H_bot (*(p_tcl_bind_list *)(global[183]))
/* 184 - 187 */
#define H_link (*(p_tcl_bind_list *)(global[184]))
#define H_disc (*(p_tcl_bind_list *)(global[185]))
#define H_away (*(p_tcl_bind_list *)(global[186]))
#define H_nkch (*(p_tcl_bind_list *)(global[187]))
/* 188 - 191 */
#define USERENTRY_BOTADDR (*(struct user_entry_type *)(global[188]))
#define USERENTRY_BOTFL (*(struct user_entry_type *)(global[189]))
#define USERENTRY_HOSTS (*(struct user_entry_type *)(global[190]))
#define USERENTRY_PASS (*(struct user_entry_type *)(global[191]))
/* 192 - 195 */
#define USERENTRY_XTRA (*(struct user_entry_type *)(global[192]))
#define user_del_chan ((void(*)(char *))(global[193]))
#define USERENTRY_INFO (*(struct user_entry_type *)(global[194]))
#define USERENTRY_COMMENT (*(struct user_entry_type *)(global[195]))
/* 196 - 199 */
#define USERENTRY_LASTON (*(struct user_entry_type *)(global[196]))
#define putlog (global[197])
#define botnet_send_chan ((void(*)(int,char*,char*,int,char*))global[198])
#define list_type_kill ((void(*)(struct list_type *))global[199])
/* 200 - 203 */
#define logmodes ((int(*)(char *))global[200])
#define masktype ((const char *(*)(int))global[201])
#define stripmodes ((int(*)(char *))global[202])
#define stripmasktype ((const char *(*)(int))global[203])
/* 204 - 207 */
#define sub_lang ((void(*)(int,char *))global[204])
#define online_since (*(int *)(global[205]))
#define cmd_loadlanguage ((int (*)(struct userrec *,int,char *))global[206])
#define check_dcc_attrs ((int (*)(struct userrec *,int))global[207])
/* 208 - 211 */
#define check_dcc_chanattrs ((int (*)(struct userrec *,char *,int,int))global[208])
#define add_tcl_coups ((void (*) (tcl_coups *))global[209])
#define rem_tcl_coups ((void (*) (tcl_coups *))global[210])
#define botname ((char *)(global[211]))
/* 212 - 215 */
/* 212: remove_gunk() -- UNUSED (drummer) */
#define check_tcl_chjn ((void (*) (const char *,const char *,int,char,int,const char *))global[213])
#define sanitycheck_dcc ((int (*)(char *, char *, char *, char *))global[214])
#define isowner ((int (*)(char *))global[215])
/* 216 - 219 */
/* 216: min_dcc_port -- UNUSED (guppy) */
/* 217: max_dcc_port -- UNUSED (guppy) */
#define rfc_casecmp ((int(*)(char *, char *))(*(Function**)(global[218])))
#define rfc_ncasecmp ((int(*)(char *, char *, int *))(*(Function**)(global[219])))
/* 220 - 223 */
#define global_exempts (*(maskrec **)(global[220]))
#define global_invites (*(maskrec **)(global[221]))
/* 222: ginvite_total -- UNUSED (Eule) */
/* 223: gexempt_total -- UNUSED (Eule) */
/* 224 - 227 */
#define H_event (*(p_tcl_bind_list *)(global[224]))
#define use_exempts (*(int *)(global[225]))     /* drummer/Jason */
#define use_invites (*(int *)(global[226]))     /* drummer/Jason */
#define force_expire (*(int *)(global[227]))    /* Rufus */
/* 228 - 231 */
#define add_lang_section ((void(*)(char *))global[228])
#define user_realloc(x,y) ((void *(*)(void *,int,char *,int))global[229])((x),(y),__FILE__,__LINE__)
#define nrealloc(x,y) (((void *(*)())global[230])((x),(y),MODULE_NAME,__FILE__,__LINE__))
#define xtra_set ((int(*)(struct userrec *,struct user_entry *, void *))global[231])
/* 232 - 235 */
#ifdef DEBUG_CONTEXT
#  define ContextNote(note) (global[232](__FILE__, __LINE__, MODULE_NAME, note))
#else
#  define ContextNote(note)     do {    } while (0)
#endif
#ifdef DEBUG_ASSERT
#  define Assert(expr)          do {                                    \
        if (!(expr))                                                    \
                (global[233](__FILE__, __LINE__, MODULE_NAME));         \
} while (0)
#else
#  define Assert(expr)  do {    } while (0)
#endif
#define allocsock ((int(*)(int sock,int options))global[234])
#define call_hostbyip ((void(*)(IP, char *, int))global[235])
/* 236 - 239 */
#define call_ipbyhost ((void(*)(char *, IP, int))global[236])
#define iptostr ((char *(*)(IP))global[237])
#define DCC_DNSWAIT (*(struct dcc_table *)(global[238]))
#define hostsanitycheck_dcc ((int(*)(char *, char *, IP, char *, char *))global[239])
/* 240 - 243 */
#define dcc_dnsipbyhost ((void (*)(char *))global[240])
#define dcc_dnshostbyip ((void (*)(IP))global[241])
#define changeover_dcc ((void (*)(int, struct dcc_table *, int))global[242])
#define make_rand_str ((void (*) (char *, int))global[243])
/* 244 - 247 */
#define protect_readonly (*(int *)(global[244]))
#define findchan_by_dname ((struct chanset_t *(*)(char *))global[245])
#define removedcc ((void (*) (int))global[246])
#define userfile_perm (*(int *)global[247])
/* 248 - 251 */
#define sock_has_data ((int(*)(int, int))global[248])
#define bots_in_subtree ((int (*)(tand_t *))global[249])
#define users_in_subtree ((int (*)(tand_t *))global[250])
#define egg_inet_aton ((int (*)(const char *cp, struct in_addr *addr))global[251])
/* 252 - 255 */
#define egg_snprintf (global[252])
#define egg_vsnprintf ((int (*)(char *, size_t, const char *, va_list))global[253])
#define egg_memset ((void *(*)(void *, int, size_t))global[254])
#define egg_strcasecmp ((int (*)(const char *, const char *))global[255])
/* 256 - 259 */
#define egg_strncasecmp ((int (*)(const char *, const char *, size_t))global[256])
#define is_file ((int (*)(const char *))global[257])
#define must_be_owner (*(int *)(global[258]))
#define tandbot (*(tand_t **)(global[259]))
/* 260 - 263 */
#define party (*(party_t **)(global[260]))
#define open_address_listen ((int (*)(IP addr, int *port))global[261])
#define str_escape ((char *(*)(const char *, const char, const char))global[262])
#define strchr_unescape ((char *(*)(char *, const char, register const char))global[263])
/* 264 - 267 */
#define str_unescape ((void (*)(char *, register const char))global[264])
#define egg_strcatn ((int (*)(char *dst, const char *src, size_t max))global[265])
#define clear_chanlist_member ((void (*)(const char *nick))global[266])
#define fixfrom ((char *(*)(char *))global[267])
/* 268 - 271 */
/* Please don't modify socklist directly, unless there's no other way.
 * Its structure might be changed, or it might be completely removed,
 * so you can't rely on it without a version-check.
 */
#define socklist (*(struct sock_list **)global[268])
#define sockoptions ((int (*)(int, int, int))global[269])
#define flush_inbuf ((int (*)(int))global[270])
#define kill_bot ((void (*)(char *, char *))global[271])
/* 272 - 275 */
#define quit_msg ((char *)(global[272]))
#define module_load ((char *(*)(char *))global[273])
#define module_unload ((char *(*)(char *, char *))global[274])
#define parties (*(int *)global[275])
/* 276 - 279 */
#define tell_bottree ((void (*)(int, int))global[276])
#define MD5_Init ((void (*)(MD5_CTX *))global[277])
#define MD5_Update ((void (*)(MD5_CTX *, void *, unsigned long))global[278])
#define MD5_Final ((void (*)(unsigned char *, MD5_CTX *))global[279])
/* 280 - 283 */
#define wild_match_per ((int (*)(const char *, const char *))global[280])
#define killtransfer ((void(*)(int))global[281])
#define write_ignores ((int (*)(FILE *, int))global[282])
#define copy_to_tmp (*(int *)(global[283]))
/* 284 - 287 */
#define quiet_reject (*(int *)(global[284]))
#define file_readable ((int (*) (char *))global[285])
/* IPv6 leftovers: 286 */
/* IPv6 leftovers: 287 */
/* 288 - 291 */
/* IPv6 leftovers: 288 */
#define strip_mirc_codes ((void (*)(int, char *))global[289])
#define check_ansi ((int (*) (char *))global[290])
#define oatoi ((int (*) (const char *))global[291])
/* 292 - 295 */
#define str_isdigit ((int (*) (const char *))global[292])
#define remove_crlf ((void (*)(char **))global[293])

/* hostmasking */
#define maskhost(a,b) _maskhost((a),(b),1)
#define maskban(a,b) _maskhost((a),(b),0)

/* This is for blowfish module, couldnt be bothered making a whole new .h
 * file for it ;)
 */
#ifndef MAKING_ENCRYPTION
# define encrypt_string(a, b)                                          \
        (((char *(*)(char *,char*))encryption_funcs[4])(a,b))
# define decrypt_string(a, b)                                          \
        (((char *(*)(char *,char*))encryption_funcs[5])(a,b))
#endif

#endif /* _EGG_MOD_MODULE_H */
