/* Bahamut IRCd - include/confparse.h
 * Copyright (c) 2004, Aaron Wiebe
 *
 * Apply the GPL here.
 */

/* $Id: confparse.h,v 1.3 2005/07/09 20:18:49 tux316 Exp $ */

/* our structures */

typedef struct TopConf tConf;
typedef struct SubConf sConf;
typedef struct ConfVar cVar;

/* our top level conf options */
struct TopConf
{
    char *tok;              /* our token string             */
    unsigned int   flag;    /* our token flag               */
    unsigned int   nest;    /* tokens we allow to nest here */
    sConf       *subtok;  /* sub-tokens allowed in here   */
    int         (*func) (); /* function to call to add this */
};

/* sub-token options */
struct SubConf
{
    char *tok;              /* our token string             */
    unsigned long  flag;    /* our token flag               */
    unsigned int   var;     /* our variable type            */
};

struct ConfVar
{
    sConf   *type;
    char    *value;
    int      loaded;        /* 1 - identified.  
                             * 2 - variable loaded
                             * 3 - delimited cleared */
};

/* tokens allowing subtokens */

#define CONFT_GLOBAL    "GLOBAL"
#define CONFF_GLOBAL                0x000001
#define CONFT_OPTIONS   "OPTIONS"
#define CONFF_OPTIONS               0x000002
#define CONFT_CLASS     "CLASS"
#define CONFF_CLASS                 0x000004
#define CONFT_ALLOW     "ALLOW"
#define CONFF_ALLOW                 0x000008
#define CONFT_OPER      "OPER"
#define CONFF_OPER                  0x000010
#define CONFT_CONNECT   "CONNECT"
#define CONFF_CONNECT               0x000020
#define CONFT_RESTRICT  "RESTRICT"
#define CONFF_RESTRICT              0x000040
#define CONFT_SUPER     "SUPER"
#define CONFF_SUPER                 0x000080
#define CONFT_KILL      "KILL"
#define CONFF_KILL                  0x000100
#define CONFT_ADMIN     "ADMIN"
#define CONFF_ADMIN                 0x000200
#define CONFT_PORT      "PORT"
#define CONFF_PORT                  0x000400
#define CONFT_MODULES   "MODULES"
#define CONFF_MODULES               0x000800
#define CONFT_ELMER     "ELMER"
#define CONFF_ELMER                 0x002000
#define CONFT_SSL       "SSL"
#define CONFF_SSL                   0x001000



/* subtokens */

#define SCONFT_NAME     "NAME"
#define SCONFF_NAME                 0x000001
#define SCONFT_INFO     "INFO"
#define SCONFF_INFO                 0x000002
#define SCONFT_DPASS    "DPASS"
#define SCONFF_DPASS                0x000004
#define SCONFT_RPASS    "RPASS"
#define SCONFF_RPASS                0x000008
#define SCONFT_PINGFREQ "PINGFREQ"
#define SCONFF_PINGFREQ             0x000010
#define SCONFT_CONNFREQ "CONNFREQ"
#define SCONFF_CONNFREQ             0x000020
#define SCONFT_MAXUSERS "MAXUSERS"
#define SCONFF_MAXUSERS             0x000040
#define SCONFT_MAXSENDQ "MAXSENDQ"
#define SCONFF_MAXSENDQ             0x000080
#define SCONFT_CLASS     "CLASS"
#define SCONFF_CLASS                0x000100
#define SCONFT_HOST     "HOST"
#define SCONFF_HOST                 0x000200
#define SCONFT_PORT     "PORT"
#define SCONFF_PORT                 0x000800
#define SCONFT_PASSWD   "PASSWD"
#define SCONFF_PASSWD               0x001000
#define SCONFT_ACCESS   "ACCESS"
#define SCONFF_ACCESS               0x002000
#define SCONFT_BIND     "BIND"
#define SCONFF_BIND                 0x004000
#define SCONFT_APASSWD  "APASSWD"
#define SCONFF_APASSWD              0x008000
#define SCONFT_CPASSWD  "CPASSWD"
#define SCONFF_CPASSWD              0x010000
#define SCONFT_FLAGS    "FLAGS"
#define SCONFF_FLAGS                0x020000
#define SCONFT_REASON   "REASON"
#define SCONFF_REASON               0x040000
#define SCONFT_TYPE     "TYPE"
#define SCONFF_TYPE                 0x080000
#define SCONFT_MASK     "MASK"
#define SCONFF_MASK                 0x100000
#define SCONFT_IPMASK   "IPMASK"
#define SCONFF_IPMASK               0x200000

#define SCONFF_STRING               0x800000    /* allow freeform strings */

/* subtoken aliases */

#define SCONFT_MAXCLONE     "MAXCLONES"
#define SCONFT_MAXLINKS     "MAXLINKS"

/* these are the strings for options ONLY */

#define OPTT_NETNAME    "NETWORK_NAME"
#define OPTF_NETNAME                0x000002
#define OPTT_STAFFADDY  "STAFF_ADDRESS"
#define OPTF_STAFFADDY              0x000004
#define OPTT_SERVNAME   "SERVICES_NAME"
#define OPTF_SERVNAME               0x000010
#define OPTT_MAXCHAN    "MAXCHANNELS"
#define OPTF_MAXCHAN                0x000020
#define OPTT_WGMONHOST  "WGMONHOST"
#define OPTF_WGMONHOST              0x000040
#define OPTT_WGMONURL   "WGMONURL"
#define OPTF_WGMONURL               0x000080
#define OPTT_NKLINEADDY "NETWORK_KLINE"
#define OPTF_NKLINEADDY             0x000100
#define OPTT_LKLINEADDY "LOCAL_KLINE"
#define OPTF_LKLINEADDY             0x000200
#define OPTT_CRYPTPASS  "CRYPT_OPER_PASS"
#define OPTF_CRYPTPASS              0x000400
#define OPTT_SMOTD      "SHORT_MOTD"
#define OPTF_SMOTD                  0x000800
#define OPTT_SERVTYPE   "SERVTYPE"
#define OPTF_SERVTYPE               0x001000
#define OPTT_STATSNAME  "STATS_NAME"
#define OPTF_STATSNAME              0x002000
#define OPTT_TSMAXDELTA "TS_MAX_DELTA"
#define OPTF_TSMAXDELTA             0x004000
#define OPTT_TSWARNDELTA "TS_WARN_DELTA"
#define OPTF_TSWARNDELTA            0x008000
#define OPTT_NSREGURL   "NSHELPURL"
#define OPTF_NSREGURL               0x010000
#define OPTT_SHOWLINKS  "SHOW_LINKS"
#define OPTF_SHOWLINKS              0x020000
#define OPTT_SPLITOPOK  "ALLOW_SPLIT_OPS"
#define OPTF_SPLITOPOK              0x040000
#define OPTT_LCLONES    "LOCAL_CLONES"
#define OPTF_LCLONES                0x080000
#define OPTT_GCLONES    "GLOBAL_CLONES"
#define OPTF_GCLONES                0x100000
#define OPTT_DOMAIN     "HOST_DOMAIN"
#define OPTF_DOMAIN                 0x1000000
#define OPTT_HOSTPREFIX "HOST_PREFIX"
#define OPTF_HOSTPREFIX             0x2000000
#define OPTT_AUTOUMODEV "AUTO_UMODE_V"
#define OPTF_AUTOUMODEV             0x4000000
#define OPTT_AUTOUMODER "AUTO_UMODE_R"
#define OPTF_AUTOUMODER             0x8000000
#define OPTT_HIDDENSERVNAME    "HIDDENSERVNAME"
#define OPTF_HIDDENSERVNAME         0x10000000
#define OPTT_HIDDENSERVDESC    "HIDDENSERVDESC"
#define OPTF_HIDDENSERVDESC         0x20000000
#define OPTT_BOTCLASS         "BOT_CLASS"
#define OPTF_BOTCLASS              0x200000
#define OPTT_HELPCHAN             "HELPCHAN"
#define OPTF_HELPCHAN              0x300000
#define OPTT_WEBSITE             "WEBSITE"
#define OPTF_WEBSITE              0x400000
#define OPTT_AUP                 "AUP"
#define OPTF_AUP                  0x500000
#define OPTT_RQUIT                "rquit"
#define OPTF_RQUIT                  0x00800000



/* module block definitions */

#define MBTT_PATH       "PATH"
#define MBTF_PATH                   0x0001
#define MBTT_AUTOLOAD   "AUTOLOAD"
#define MBTF_AUTOLOAD               0x0002
#define MBTT_OPTLOAD    "OPTLOAD"
#define MBTF_OPTLOAD                0x0004

/* our variable types */

/* ssl block definitions */

#define SSTT_CERTIFICATE  "CERTIFICATE"
#define SSTF_CERTIFICATE            0x0001
#define SSTT_KEYFILE      "KEYFILE"
#define SSTF_KEYFILE                0x0002
#define SSTT_UMODEZ       "allow_umodez"
#define SSTF_UMODEZ                 0x0004


/* elmer block */

#ifdef TOYS
#define EETT_STRING        "STRING"
#define EETF_STRING                 0x0001
#define EETT_TRANSLATE     "TRANSLATE"
#define EETF_TRANSLATE              0x0002
#endif

#define VARTYPE_INT     0x0001  /* integers             */
#define VARTYPE_STRING  0x0002  /* freeform strings     */
#define VARTYPE_NAME    0x0004  /* non-free name        */
#define VARTYPE_NONE    0x0008  /* doesnt take any var  */

/* functions for parsing variables into appropriate variables */

#ifdef CONF_TABS

sConf confglobtab[] =
{
    {SCONFT_NAME, SCONFF_NAME, VARTYPE_NAME},
    {SCONFT_INFO, SCONFF_INFO, VARTYPE_STRING},
    {SCONFT_DPASS, SCONFF_DPASS, VARTYPE_NAME},
    {SCONFT_RPASS, SCONFF_RPASS, VARTYPE_NAME},
    {(char *) 0, 0, 0}
};

sConf confopttab[] =
{
    {OPTT_NETNAME, OPTF_NETNAME, VARTYPE_NAME},
    {OPTT_SERVNAME, OPTF_SERVNAME, VARTYPE_NAME},
    {OPTT_STATSNAME, OPTF_STATSNAME, VARTYPE_NAME},
    {OPTT_MAXCHAN, OPTF_MAXCHAN, VARTYPE_INT},
    {OPTT_WGMONHOST, OPTF_WGMONHOST, VARTYPE_NAME},
    {OPTT_WGMONURL, OPTF_WGMONURL, VARTYPE_NAME},
    {OPTT_NKLINEADDY, OPTF_NKLINEADDY, VARTYPE_NAME},
    {OPTT_LKLINEADDY, OPTF_LKLINEADDY, VARTYPE_NAME},
    {OPTT_CRYPTPASS, OPTF_CRYPTPASS, VARTYPE_NONE},
    {OPTT_SMOTD, OPTF_SMOTD, VARTYPE_NONE},
    {OPTT_SERVTYPE, OPTF_SERVTYPE, VARTYPE_NAME},
    {OPTT_TSMAXDELTA, OPTF_TSMAXDELTA, VARTYPE_INT},
    {OPTT_TSWARNDELTA, OPTF_TSWARNDELTA, VARTYPE_INT},
    {OPTT_STAFFADDY, OPTF_STAFFADDY, VARTYPE_NAME},
    {OPTT_NSREGURL, OPTF_NSREGURL, VARTYPE_NAME},
    {OPTT_SHOWLINKS, OPTF_SHOWLINKS, VARTYPE_NONE},
    {OPTT_SPLITOPOK, OPTF_SPLITOPOK, VARTYPE_NONE},
    {OPTT_LCLONES, OPTF_LCLONES, VARTYPE_NAME},
    {OPTT_GCLONES, OPTF_GCLONES, VARTYPE_NAME},
    {OPTT_DOMAIN, OPTF_DOMAIN, VARTYPE_NAME},
    {OPTT_HOSTPREFIX, OPTF_HOSTPREFIX, VARTYPE_NAME},
    {OPTT_AUTOUMODEV, OPTF_AUTOUMODEV, VARTYPE_NONE},
    {OPTT_AUTOUMODER, OPTF_AUTOUMODER, VARTYPE_NONE},
    {OPTT_HIDDENSERVNAME, OPTF_HIDDENSERVNAME, VARTYPE_NAME},
    {OPTT_HIDDENSERVDESC, OPTF_HIDDENSERVDESC, VARTYPE_STRING},
    {OPTT_BOTCLASS, OPTF_BOTCLASS, VARTYPE_NAME},
    {OPTT_HELPCHAN, OPTF_HELPCHAN, VARTYPE_NAME},
    {OPTT_WEBSITE, OPTF_WEBSITE, VARTYPE_NAME},
    {OPTT_AUP, OPTF_AUP, VARTYPE_NAME},
    {OPTT_RQUIT, OPTF_RQUIT, VARTYPE_NONE},
    {(char *) 0, 0, 0}
};

sConf confmoduletab[] =
{
    {MBTT_PATH, MBTF_PATH, VARTYPE_NAME},
    {MBTT_AUTOLOAD, MBTF_AUTOLOAD, VARTYPE_NAME},
    {MBTT_OPTLOAD, MBTF_OPTLOAD, VARTYPE_NAME},
    {(char *) 0, 0, 0}
};

sConf confssltab[] =
{
    {SSTT_CERTIFICATE, SSTF_CERTIFICATE, VARTYPE_NAME},
    {SSTT_KEYFILE, SSTF_KEYFILE, VARTYPE_NAME},
    {SSTT_UMODEZ, SSTF_UMODEZ, VARTYPE_NONE},
    {(char *) 0, 0, 0}
};

sConf confclasstab[] =
{
    {SCONFT_NAME, SCONFF_NAME, VARTYPE_NAME},
    {SCONFT_PINGFREQ, SCONFF_PINGFREQ, VARTYPE_INT},
    {SCONFT_CONNFREQ, SCONFF_CONNFREQ, VARTYPE_INT},
    {SCONFT_MAXCLONE, SCONFF_CONNFREQ, VARTYPE_NAME},
    {SCONFT_MAXUSERS, SCONFF_MAXUSERS, VARTYPE_INT},
    {SCONFT_MAXLINKS, SCONFF_MAXUSERS, VARTYPE_INT},
    {SCONFT_MAXSENDQ, SCONFF_MAXSENDQ, VARTYPE_INT},
    {(char *) 0, 0, 0}
};

sConf confallowtab[] =
{
    {SCONFT_HOST, SCONFF_HOST, VARTYPE_NAME},
    {SCONFT_IPMASK, SCONFF_IPMASK, VARTYPE_NAME},
    {SCONFT_PORT, SCONFF_PORT, VARTYPE_INT},
    {SCONFT_PASSWD, SCONFF_PASSWD, VARTYPE_NAME},
    {SCONFT_CLASS, SCONFF_CLASS, VARTYPE_NAME},
    {SCONFT_FLAGS, SCONFF_FLAGS, VARTYPE_NAME},
    {(char *) 0, 0, 0}
};

sConf confopertab[] =
{
    {SCONFT_NAME, SCONFF_NAME, VARTYPE_NAME},
    {SCONFT_HOST, SCONFF_HOST, VARTYPE_NAME},
    {SCONFT_PASSWD, SCONFF_PASSWD, VARTYPE_NAME},
    {SCONFT_ACCESS, SCONFF_ACCESS, VARTYPE_NAME},
    {SCONFT_CLASS, SCONFF_CLASS, VARTYPE_NAME},
    {(char *) 0, 0, 0}
};

sConf confconnecttab[] =
{
    {SCONFT_NAME, SCONFF_NAME, VARTYPE_NAME},
    {SCONFT_HOST, SCONFF_HOST, VARTYPE_NAME},
    {SCONFT_BIND, SCONFF_BIND, VARTYPE_NAME},
    {SCONFT_APASSWD, SCONFF_APASSWD, VARTYPE_NAME},
    {SCONFT_CPASSWD, SCONFF_CPASSWD, VARTYPE_NAME},
    {SCONFT_FLAGS, SCONFF_FLAGS, VARTYPE_NAME},
    {SCONFT_PORT, SCONFF_PORT, VARTYPE_INT},
    {SCONFT_CLASS, SCONFF_CLASS, VARTYPE_NAME},
    {(char *) 0, 0, 0}
};

sConf confrestricttab[] =
{
    {SCONFT_REASON, SCONFF_REASON, VARTYPE_STRING},
    {SCONFT_TYPE, SCONFF_TYPE, VARTYPE_NAME},
    {SCONFT_MASK, SCONFF_MASK, VARTYPE_NAME},
    {(char *) 0, 0, 0}
};

sConf confkilltab[] =
{
    {SCONFT_REASON, SCONFF_REASON, VARTYPE_STRING},
    {SCONFT_MASK, SCONFF_MASK, VARTYPE_NAME},
    {(char *) 0, 0, 0}
};

sConf confporttab[] =
{
    {SCONFT_PORT, SCONFF_PORT, VARTYPE_INT},
    {SCONFT_BIND, SCONFF_BIND, VARTYPE_NAME},
    {SCONFT_IPMASK, SCONFF_IPMASK, VARTYPE_NAME},
    {SCONFT_TYPE, SCONFF_TYPE, VARTYPE_NAME},
    {(char *) 0, 0, 0}
};


sConf confopentab[] =
{
    {0,SCONFF_STRING,0},
    {(char *) 0, 0, 0}
};

#ifdef TOYS

sConf confelmertab[] =
{
    {EETT_STRING, EETF_STRING, VARTYPE_STRING},
    {EETT_TRANSLATE, EETF_TRANSLATE, VARTYPE_STRING},
	{(char *) 0, 0, 0}
};

#endif


extern int confadd_global(cVar **, int);
extern int confadd_options(cVar **, int);
extern int confadd_class(cVar **, int);
extern int confadd_allow(cVar **, int);
extern int confadd_oper(cVar **, int);
extern int confadd_connect(cVar **, int);
extern int confadd_restrict(cVar **, int);
extern int confadd_super(cVar **, int);
extern int confadd_kill(cVar **, int);
extern int confadd_admin(cVar **, int);
extern int confadd_port(cVar **, int);
extern int confadd_modules(cVar **, int);
extern int confadd_ssl(cVar **, int);
#ifdef TOYS
extern int confadd_elmer(cVar **, int);
#endif

struct TopConf tconftab[] = 
{
    {CONFT_GLOBAL, CONFF_GLOBAL, CONFF_ADMIN, confglobtab, confadd_global},
    {CONFT_OPTIONS, CONFF_OPTIONS, 0, confopttab, confadd_options},
    {CONFT_CLASS, CONFF_CLASS, 0, confclasstab, confadd_class},
    {CONFT_ALLOW, CONFF_ALLOW, 0, confallowtab, confadd_allow},
    {CONFT_OPER, CONFF_OPER, 0, confopertab, confadd_oper},
    {CONFT_CONNECT, CONFF_CONNECT, 0, confconnecttab, confadd_connect},
    {CONFT_RESTRICT, CONFF_RESTRICT, 0, confrestricttab, confadd_restrict},
    {CONFT_KILL, CONFF_KILL, 0, confkilltab, confadd_kill},
    {CONFT_ADMIN, CONFF_ADMIN, 0, confopentab, confadd_admin},
    {CONFT_SUPER, CONFF_SUPER, 0, confopentab, confadd_super},
    {CONFT_PORT, CONFF_PORT, 0, confporttab, confadd_port},
    {CONFT_MODULES, CONFF_MODULES, 0, confmoduletab, confadd_modules},
    {CONFT_SSL, CONFF_SSL, 0, confssltab, confadd_ssl},
#ifdef TOYS
    {CONFT_ELMER, CONFF_ELMER, 0, confelmertab, confadd_elmer},
#endif
	
    {(char *) 0, 0, 0, 0}
};


#endif


syntax highlighted by Code2HTML, v. 0.9.1