#ifndef __COMMANDS_H
#define __COMMANDS_H

struct cmd;
class htbl;

#include "autoconf.h"
#include "conn.h"
#include "hash.h"

/* work arounds for GCC 2.95.x compiler bug */
#ifdef __GNUC__
#   if __GNUC__ == 2
#       if __GNUC_MINOR__ == 95
#           define GCC_COMPILER_BUG
#       endif
#   endif
#endif

typedef int (conn::*cmd_handler_t)(int, int, char **);

struct cmd {
    const char * msg;                 /* the actual command */
    int id;                           /* numerical id */
    int req_flags;                    /* flags to match */
    int bad_flags;                    /* flags that we can't have */
#ifndef GCC_COMPILER_BUG
    /* pointer to handler function */
    cmd_handler_t handler;
#else
    int idx;
#endif
    const char * help;
};

extern const struct cmd command_table[];
extern const struct cmd incoming_command_table[];

#ifdef GCC_COMPILER_BUG
extern const cmd_handler_t handlers[];
#endif

class htbl : public __htbl
{
public:
    htbl(int buckets) : __htbl(buckets) { }

    int insert(const struct cmd * );
    /* int remove(struct cmd *); -- heh, we don't need one */
    const struct cmd * lookup(const char *, int);

};


/* Commands from clients */
enum {
    CMD_USER,   CMD_NICK,   CMD_PASS,   CMD_CONN,                   CMD_STATUS,
    CMD_KILL,   CMD_DIE,    CMD_REHASH, CMD_DIENOW,     CMD_CANCEL, CMD_HELP,
    CMD_INTERFACE,          CMD_VHOSTS, CMD_WRITE,      CMD_DETACH, CMD_REATTACH,
    CMD_DISCONNECT,         CMD_IDENT,                  CMD_LOG,
    CMD_DCCSEND,            CMD_MOTD,   CMD_QUIT,       CMD_EZBOUNCE,
    CMD_HASH,   CMD_PRIVMSG,            CMD_LOGIN,      CMD_SESSIONS,
    CMD_TRAFFIC,            CMD_WHOIS,  CMD_SET,        CMD_ECHO,   CMD_SAVE,
    CMD_TRACE,  CMD_ALLOWED,            CMD_RELOAD,     CMD_DEBUG,  CMD_ABOUT,
    CMD_VERSION,            CMD_CHATSEND,
    CMD_ZOMBIFY
};

/* Commands from irc server - checked when reattaching or connecting */
enum {
    INCOMING_003 = 100, INCOMING_004,       INCOMING_005,
    INCOMING_PRIVMSG,   INCOMING_MODE,      INCOMING_NICK,
    INCOMING_JOIN,      INCOMING_PART,      INCOMING_KICK,
    INCOMING_TOPIC,     INCOMING_NOTICE,    INCOMING_QUIT,
    INCOMING_PING,      INCOMING_PONG,      INCOMING_ERROR

};

#endif /* __COMMANDS_H */


syntax highlighted by Code2HTML, v. 0.9.1