#ifndef _MERC_H #define _MERC_H /*************************************************************************** * Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, * * Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe. * * * * Merc Diku Mud improvments copyright (C) 1992, 1993 by Michael * * Chastain, Michael Quan, and Mitchell Tse. * * * * In order to use any part of this Merc Diku Mud, you must comply with * * both the original Diku license in 'license.doc' as well the Merc * * license in 'license.txt'. In particular, you may not remove either of * * these copyright notices. * * * * Much time and thought has gone into this software and you are * * benefitting. We hope that you share your changes too. What goes * * around, comes around. * ***************************************************************************/ /********************************************************** * Function defs, and other stuff * **********************************************************/ #define args(args) args #define DECLARE_ACNT_FUN(cmd) AC_CMD cmd #define ACCOUNT_COMMAND(cmd) void cmd(ACCOUNT *pAcnt, char *argument ) #include <list> #include <mysql/mysql.h> /********************************************************** * Short scalar types. * * Diavolo reports AIX compiler has bugs with short types.* **********************************************************/ typedef short int sh_int; class CodeBlob; extern std::list<CodeBlob *> codeList; /********************************************************** * Bool definitions for not C++ users * **********************************************************/ #ifndef __cplusplus typedef int bool; #define true 1 #define false 0 #endif /********************************************************** * Standardise ending character for File I/O * **********************************************************/ #define END_CHAR "$" /********************************************************** * Global Variables * **********************************************************/ /****************************************** * String and memory management parameters* ******************************************/ #define MAX_KEY_HASH 1024 #define MAX_STRING_LENGTH 4096 #define MAX_INPUT_LENGTH 1500 #define MSL MAX_STRING_LENGTH #define MIL MAX_INPUT_LENGTH /****************************************** * Game parameters. * ******************************************/ #define PULSE_PER_SECOND 4 #define MAX_ACNT_LEVEL 5 /****************************************** * Connection states for Accounts * ******************************************/ #define CON_GET_ACCOUNT_NAME 9 #define CON_CHECK_ACCOUNT_PASSWORD 10 #define CON_CONFIRM_ACCOUNT_NAME 11 #define CON_GET_ACCOUNT_PASSWORD 12 #define CON_CONFIRM_ACCOUNT_PASSWORD 13 #define CON_ACCOUNT_MENU 14 #define CON_OOC_CHAT 15 #define CON_ASK_RECONNECT 16 #define CON_GET_MUD 17 #define CON_GET_URL 18 /****************************************** * Values for asprintf * ******************************************/ #define TO_CHAR 0 #define NOTCHAR_WORLD 1 #define NOTVICT_WORLD 2 #define TO_VICT 3 #define TO_WORLD 4 #define NOTARGET_WORLD 5 /****************************************** * Log types * ******************************************/ #define LOG_BUG 0 #define LOG_SITE 1 #define LOG_CMD 2 #define LOG_TYPO 3 #define LOG_BANS 4 #define LOG_MAX 5 /****************************************** * OBJ declaration for Command Interpreter* ******************************************/ #define DIR_OBJ 0 #define INDIR_OBJ 1 #define CMDOBJ_MAX 2 /****************************************** * Structure ID's * ******************************************/ #define CHID 0 #define OBJID 1 #define ACNTID 3 #define MAX_STRUCT_ID 4 /********************************************************** * Bit Vector Variables * **********************************************************/ /****************************************** * Common Flags Bits * ******************************************/ #define COMMON_AFK 0 #define COMMON_BANNED 1 #define COMMON_LINKDEAD 2 #define COMMON_MAX 3 /****************************************** * Channel Flags Bits * ******************************************/ #define CHANNEL_MAX 11 /********************************************************** * Structure types. * **********************************************************/ typedef struct descriptor_data DESCRIPTOR_DATA; typedef struct account_data ACCOUNT; typedef struct accnt_cmd_data ACNT_CMD; typedef void AC_CMD args( (ACCOUNT *pAcnt, char *argument ) ); /********************************************************** * Structure Types * **********************************************************/ /****************************************** * Structure for Log types with file path * ******************************************/ struct log_type { int log_value; char *string; char *path; }; /****************************************** * Structure Definition for Colour * ******************************************/ struct colour_type { char * name; char * symbol; char * code; }; /****************************************** * Structure for Account command functions* ******************************************/ struct acnt_cmdfun_type { char *name; AC_CMD *do_fun; }; /****************************************** * Descriptor (channel) structure. * ******************************************/ struct descriptor_data { DESCRIPTOR_DATA *next; DESCRIPTOR_DATA *snoop_by; ACCOUNT *account; char *host; sh_int descriptor; sh_int connected; bool fcommand; char inbuf[4 * MAX_INPUT_LENGTH]; char incomm[MAX_INPUT_LENGTH]; char inlast[MAX_INPUT_LENGTH]; int repeat; char *showstr_head; char *showstr_point; char *outbuf; int outsize; int outtop; int pagelen; void *pEdit; char **pString; /* OLC */ }; class Topic; class Post; class Channel; class Buffer; /****************************************** * One Account * ******************************************/ struct account_data { ACCOUNT * next; DESCRIPTOR_DATA * desc; char * name; char * password; char * afk_string; int level; int struct_id; int common_flags[COMMON_MAX]; int nest; char * read; bool editing; int channel[CHANNEL_MAX]; AC_CMD * lastfun; int lastTID[CHANNEL_MAX]; char * mud; char * url; int initLogin; int bufPos; int bufEnd; Buffer * buffer; char * custPost; char * custReply; char * custTopic; ACCOUNT * reply; std::list<Topic *> ignore[CHANNEL_MAX]; char * genChanPrefix(Post *post, Topic *topic = NULL); void addIgnore(Topic *topic, int ); void remIgnore(Topic *topic, int ); bool isIgnoring(Topic *topic, int ); bool canSend(Topic *topic, Channel *channl); void page(); void sendChanHelp(); void showIgnore(Channel *); void showLocked(Channel *); }; /****************************************** * One Account Command * ******************************************/ struct accnt_cmd_data { char * name; AC_CMD * do_fun; ACNT_CMD * next; int level; }; /****************************************** * One Attendant * ******************************************/ class Attendant { public: char *name; char *mud; char *url; }; /****************************************** * One buffer * ******************************************/ class Buffer { public: std::list<std::string *> lines; int pos; int finish; bool isBlob; void Empty(); void Send(ACCOUNT *pAcnt); void Add(char *fmt, ... ); void AddBlob(char *); }; /****************************************** * One Code Blob * ******************************************/ class CodeBlob { public: int id; char *blob; char *language; char *poster; char *subject; int viewed; Buffer *buffer; //This shall be the buffer everyone looks at. //Should speed it up a bit. CodeBlob(MYSQL_ROW row); static CodeBlob *find(int id) { std::list<CodeBlob *>::iterator i; for( i = codeList.begin() ; i != codeList.end() ; ++i ) { if(id == (*i)->id) return (*i); } return NULL; } }; /********************************************************** * Macro's * **********************************************************/ /****************************************** * Utility macros. * ******************************************/ #define UMIN(a, b) ((a) < (b) ? (a) : (b)) #define UMAX(a, b) ((a) > (b) ? (a) : (b)) #define URANGE(a, b, c) ((b) < (a) ? (a) : ((b) > (c) ? (c) : (b))) #define LOWER(c) ((c) >= 'A' && (c) <= 'Z' ? (c)+'a'-'A' : (c)) #define UPPER(c) ((c) >= 'a' && (c) <= 'z' ? (c)+'A'-'a' : (c)) /****************************************** * Account Macro's * ******************************************/ #define ACNT_LEVEL(wAcnt) ( (wAcnt)->level ) #define INIT_BUFFER(pAcnt) \ if(!(pAcnt)->buffer) \ { pAcnt->buffer = new Buffer(); \ pAcnt->buffer->pos = 0; \ } #define CUSTREPLY "{r[{WT{D:{W%t{r][{WP{D:{W%p{r]{W In reply to {D%R{r[{WP{D:{W%r{r] {W%A {Dsays{r:{W" #define CUSTPOST "{r[{WT{D:{W%t{r][{WP{D:{W%p{r] {W%A{D says{r:{W" #define CUSTTOPIC "{W%a has started a new topic{r[{WT{D:{W%t{r]{D: {W%T" /****************************************** * Character Macro's * ******************************************/ /****************************************** * File I/O Macro's for reading. * ******************************************/ #define IREAD(sKey, sPtr) \ { \ if (!strcasecmp(sKey, word)) \ { \ int sValue = fread_number(fp); \ sPtr = sValue; \ continue; \ } \ } #define SREAD(sPtr) \ { \ char *sValue = fread_string(fp); \ free_string(sPtr); \ sPtr = str_dup(sValue); \ } /****************************************** * Bit Macro's * ******************************************/ #define IS_SET(bArry, bit) ( ( (bArry[(bit)]) ) ) #define SET_BIT(bArry, bit) ( ( (bArry[(bit)]) = true ) ) #define UNSET_BIT(bArry, bit ) ( ( (bArry[(bit)]) = false ) ) #define TOGGLE_BIT(bArry, bit ) ( ( (bArry[(bit)]) ? UNSET_BIT((bArry), (bit)) : SET_BIT((bArry), (bit) ) ) ) /********************************************************** * Global Lists * **********************************************************/ extern DESCRIPTOR_DATA * descriptor_list; extern DESCRIPTOR_DATA * descriptor_free; extern ACCOUNT * account_list; extern time_t current_time; extern ACNT_CMD * acnt_cmd_list; extern ACNT_CMD * acnt_cmd_last; extern std::list<Attendant *> attendant_list; /****************************************** *global Booliens for the Copyover Code * ******************************************/ extern bool iCopyover; //A bool to tell if the muds in copyover mode for the new process extern bool oCopyover; //A bool to tell if the muds in copyover mode for the old process extern bool dCopyover; //A bool for the copyover.done file /****************************************** * Greet String * ******************************************/ extern char *help_greeting; /********************************************************** * Our function prototypes. * * One big lump ... this is every function in Merc. * **********************************************************/ #define DD DESCRIPTOR_DATA #define AC ACNT_CMD /****************************************** * account.c * ******************************************/ ACCOUNT * load_account args((DESCRIPTOR_DATA *d, char *name)); void send_accnt_menu args((ACCOUNT *pAcnt )); void account_gen args((DESCRIPTOR_DATA *d, char *arg )); void interp_acnt_cmd args((ACCOUNT *pAcnt, char *argument )); void load_accnt_cmds args(()); AC_CMD * acntdofun_lookup args(( const char *name )); void save_account args((ACCOUNT *pAcnt )); ACCOUNT * get_account args(( const char *name )); void reconnect_account (ACCOUNT *pAcnt ); bool check_reconnect (ACCOUNT *pAcnt ); /****************************************** * colour.c * ******************************************/ char * colour_string args(( const char *txt )); /****************************************** * comm.c * ******************************************/ void close_socket args((DESCRIPTOR_DATA * dclose)); void write_to_buffer args((DESCRIPTOR_DATA * d, const char *txt, int length)); void show_string args((DESCRIPTOR_DATA * d, char *input)); char * capitalize args(( const char *str )); bool file_exists args(( const char *path )); void logfp args((int log_value, char *fmt, ... )); void acnt_act args((ACCOUNT *ch, void *vo, int to_flag, char *fmt, ... )); void copyover_loop args(()); bool check_parse_name args((char *name)); void recover_accounts args(()); void ptc args((ACCOUNT *ch, char *fmt, ...)); void seperateArgs(char *string, char *arg1, char *arg2); void disarmString(char *); void addAttendant(ACCOUNT *pAcnt); void infoChan(char *txt, ...); /****************************************** * db.c * ******************************************/ void boot_db args((void)); void * alloc_mem args((int sMem)); void * alloc_perm args((int sMem)); void free_mem args((void *pMem, int sMem)); char * str_dup args((const char *str)); void free_string args((char *pstr)); void tail_chain args((void)); int fread_number args(( FILE *fp )); char * fread_string args(( FILE *fp )); char * fread_word args(( FILE *fp )); bool str_prefix args(( const char *astr, const char *bstr )); bool is_number args((char *arg)); char * one_argument args((char *argument, char *arg_first)); void load_greet args(()); void fread_to_eol args(( FILE *fp )); /****************************************** * htmlParser.c * ******************************************/ char *readTillTag(char *tag, char *blob); char *grabNextEntity(char *blob, char *tag, char prelim); char *parseHtmlString(char *blob); /****************************************** * recycle.c * ******************************************/ DD * copyover_desc args((void)); ACCOUNT * account_new args(()); void free_account args((ACCOUNT *pAcnt )); void free_acnt_cmd args((ACNT_CMD *cmd)); AC * acnt_cmd_new args(()); /****************************************** * string.c * ******************************************/ void string_append args(( ACCOUNT *ch, char **pString )); void string_add args(( ACCOUNT *ch, char *argument )); char * string_replace( char * orig, char * old, char * snew ); #undef DD #undef AC /********************************************************** * File path declarations (For File I/O) * **********************************************************/ #define DATA_DIR "../data/" //General Data dir. #define CMD_DIR "cmd/" //Command directory. In Data Directory #define ACNT_CMD_FILE "cmd.accnt" //Command file for Accounts. #define EXE_FILE "../src/tor" //The execution file #define ACCOUNT_DIR "../account/" //Account Directory #endif