/*************************************************************************
* TinyFugue - programmable mud client
* Copyright (C) 1996, 1997, 1998, 1999, 2002, 2003, 2004, 2005, 2006-2007 Ken Keys
*
* TinyFugue (aka "tf") is protected under the terms of the GNU
* General Public License. See the file "COPYING" for details.
************************************************************************/
/* $Id: globals.h,v 35000.78 2007/01/13 23:12:39 kkeys Exp $ */
#ifndef GLOBALS_H
#define GLOBALS_H
/*************************
* Global user variables *
*************************/
/* Note: order of arithmetic types defines how they are promoted */
typedef enum {
TYPE_ID = 0x00001, /* identifier */
TYPE_STR = 0x00002, /* String */
TYPE_ENUM = 0x00004, /* enumerated */
TYPE_POS = 0x00008, /* positive integer */
TYPE_INT = 0x00010, /* integer */
TYPE_DECIMAL = 0x00020, /* 32-bit integer + 6 decimal places */
TYPE_DTIME = 0x00040, /* duration time (seconds and microseconds) */
TYPE_ATIME = 0x00080, /* absolute time (seconds and microseconds) */
TYPE_FLOAT = 0x00100, /* double */
TYPE_FILE = 0x00200, /* tfile (internal use only) */
TYPE_FUNC = 0x00400, /* resolved ExprFunc (internal only) */
TYPE_CMD = 0x00800, /* resolved BuiltinCmd (internal only) */
TYPE_REGEX = 0x01000, /* STR: regular expression (internal only) */
TYPE_EXPR = 0x02000, /* STR: tf expression (internal only) */
TYPE_ATTR = 0x04000, /* STR: attributes (internal only) */
TYPE_REGMATCH = 0x08000, /* INT: result of regmatch() (internal only) */
TYPE_HMS = 0x10000 /* TIME: was in H:M:S form (internal only) */
} type_t;
/* numeric types */
#define TYPE_EXACTNUM (TYPE_INT | TYPE_DECIMAL | TYPE_DTIME | TYPE_ATIME)
#if NO_FLOAT
# define TYPE_NUM (TYPE_EXACTNUM)
#else
# define TYPE_NUM (TYPE_EXACTNUM | TYPE_FLOAT)
#endif
#define TYPES_BASIC \
( TYPE_ID | TYPE_STR | TYPE_ENUM | TYPE_POS | TYPE_NUM \
| TYPE_FILE | TYPE_FUNC | TYPE_CMD )
typedef union ValueUnion {
long ival; /* integer value (ENUM, POS, INT) */
double fval; /* float value (FLOAT) */
struct timeval tval; /* time value (DTIME, ATIME, DECIMAL) */
struct RegInfo *ri; /* compiled regexp (STR|REGEX) */
struct Program *prog; /* compiled expression (STR|EXPR) */
void *p; /* other pointer type (FILE, FUNC, CMD) */
unsigned int hash; /* hash value (ID) */
attr_t attr; /* attributes (STR|ATTR) */
struct Value *next; /* valpool pointer */
} ValueUnion;
/* Most types use the union for their value, and cache a string value in sval.
* A pure TYPE_STR does not use the union, but it does if type is or'd with
* TYPE_REGEX, TYPE_EXPR, or TYPE_ATTR.
*/
typedef struct Value {
const char *name; /* identifier name (must be first member!) */
type_t type;
int count; /* reference count */
conString *sval; /* string value (any type, not just STR) */
ValueUnion u;
} Value;
extern Value *val_zero, *val_one, *val_blank;
/* shareval is a func, not a macro, so it doesn't eval v twice */
static inline Value *shareval(Value *v) { v->count++; return v;}
#define newval() newval_fl(__FILE__, __LINE__)
#define newint(i) newint_fl(i, __FILE__, __LINE__)
#define newtime(s, u, type) newtime_fl(s, u, type, __FILE__, __LINE__)
#define newdecimal(s,u) newtime_fl(s, u, TYPE_DECIMAL, __FILE__, __LINE__)
#define newdtime(s, u) newtime_fl(s, u, TYPE_DTIME, __FILE__, __LINE__)
#define newatime(s, u) newtime_fl(s, u, TYPE_ATIME, __FILE__, __LINE__)
#define newfloat(f) newfloat_fl(f, __FILE__, __LINE__)
#define newid(id,l) newid_fl(id, l, __FILE__, __LINE__)
#define newstr(s,l) newstr_fl(s, l, __FILE__, __LINE__)
#define newSstr(S) newSstr_fl(S, __FILE__, __LINE__)
#define newptr(ptr) newptr_fl(ptr, __FILE__, __LINE__)
#define valval(val) valval_fl(val, __FILE__, __LINE__)
#define clearval(val) clearval_fl(val, __FILE__, __LINE__)
extern void clearval_fl(Value *val, const char *file, int line);
extern struct Value *newval_fl(const char *file, int line);
extern struct Value *newfloat_fl(double f, const char *file, int line);
extern struct Value *newint_fl(long i, const char *file, int line);
extern struct Value *newtime_fl(long s, long u, type_t type,
const char *file, int line);
extern struct Value *newSstr_fl(conString *S, const char *file, int line);
extern struct Value *newstr_fl(const char *s, int len,
const char *file, int line);
extern struct Value *newid_fl(const char *id, int len,
const char *file, int line);
extern struct Value *valval_fl(Value *val, const char *file, int line);
typedef struct Var Var;
typedef int (Toggler)(Var *var);
struct Var {
Value val; /* value (must be first member!) */
int flags;
conString *enumvec; /* list of valid enum values */
Toggler *func; /* called when value changes */
struct ListEntry *node; /* backpointer to node in list */
short statuses; /* # of status fields watching this var */
short statusfmts; /* # of status fields using this var as fmt */
short statusattrs; /* # of status fields using this var as attr */
};
enum Vars {
#define varcode(id, name, val, type, flags, enums, ival, uval, func) id,
#include "varlist.h"
#undef varcode
NUM_VARS
};
/* Convenient variable access.
* The get* macros are READONLY; use set* functions to change a value. The
* cast enforces readonly-ness in standard C (gcc needs -pedantic to warn).
*/
#ifdef WORLD_VARS
# define get_special_var(id) \
((xsock && xsock->world->special_var[(id)]) ? \
xsock->world->special_var[(id)] : \
&special_var[(id)])
#else
# define get_special_var(id) (&special_var[(id)])
#endif
#define strvar(id) (get_special_var(id)->val.sval)
#define intvar(id) (get_special_var(id)->val.u.ival)
#define timevar(id) (get_special_var(id)->val.u.tval)
#define attrvar(id) (get_special_var(id)->val.u.attr)
#define getattrvar(id) ((attr_t) attrvar(id))
#define gettimevar(id) (timevar(id))
#define getintvar(id) ((long) intvar(id))
#define getstrvar(id) ((conString*) strvar(id))
#define getstdvar(id) ((char*) (strvar(id) ? strvar(id)->data : NULL))
#define MAIL getstdvar(VAR_MAIL)
#define TERM getstdvar(VAR_TERM)
#define TFLIBDIR getstdvar(VAR_TFLIBDIR)
#define TFPATH getstdvar(VAR_TFPATH)
#define TFMAILPATH getstdvar(VAR_TFMAILPATH)
#define alert_attr getattrvar(VAR_alert_attr)
#define alert_time gettimevar(VAR_alert_time)
#define auto_fg getintvar(VAR_auto_fg)
#define background getintvar(VAR_background)
#define backslash getintvar(VAR_backslash)
#define bamf getintvar(VAR_bamf)
#define beep getintvar(VAR_beep)
#define bg_output getintvar(VAR_bg_output)
#define binary_eol getintvar(VAR_binary_eol)
#define borg getintvar(VAR_borg)
#define cecho getintvar(VAR_cecho)
#define cleardone getintvar(VAR_cleardone)
#define clearfull getintvar(VAR_clearfull)
#define clock_flag getintvar(VAR_clock)
#define defcompile getintvar(VAR_defcompile)
#define emulation getintvar(VAR_emulation)
#define error_attr getattrvar(VAR_error_attr)
#define expand_tabs getintvar(VAR_expand_tabs)
#define expnonvis getintvar(VAR_expnonvis)
#define gag getintvar(VAR_gag)
#define async_name getintvar(VAR_async_name)
#define async_conn getintvar(VAR_async_conn)
#define gpri getintvar(VAR_gpri)
#define hilite getintvar(VAR_hilite)
#define hiliteattr getattrvar(VAR_hiliteattr)
#define histsize getintvar(VAR_histsize)
#define hookflag getintvar(VAR_hook)
#define hpri getintvar(VAR_hpri)
#define iecho getintvar(VAR_iecho)
#define info_attr getattrvar(VAR_info_attr)
#define insert getintvar(VAR_insert)
#define interactive getintvar(VAR_interactive)
#define isize getintvar(VAR_isize)
#define istrip getintvar(VAR_istrip)
#define kbnum getstrvar(VAR_kbnum)
#define kecho getintvar(VAR_kecho)
#define keepalive getintvar(VAR_keepalive)
#define keypad getintvar(VAR_keypad)
#define kprefix getstrvar(VAR_kprefix)
#define login getintvar(VAR_login)
#define lpflag getintvar(VAR_lp)
#define lpquote getintvar(VAR_lpquote)
#define maildelay gettimevar(VAR_maildelay)
#define matching getintvar(VAR_matching)
#define max_hook getintvar(VAR_max_hook)
#define max_instr getintvar(VAR_max_instr)
#define max_kbnum getintvar(VAR_max_kbnum)
#define max_recur getintvar(VAR_max_recur)
#define max_trig getintvar(VAR_max_trig)
#define mccp getintvar(VAR_mccp)
#define mecho getintvar(VAR_mecho)
#define mecho_attr getattrvar(VAR_mecho_attr)
#define meta_esc getintvar(VAR_meta_esc)
#define more getintvar(VAR_more)
#define mprefix getstrvar(VAR_mprefix)
#define oldslash getintvar(VAR_oldslash)
#define optimize_user getintvar(VAR_optimize)
#define pedantic getintvar(VAR_pedantic)
#define prompt_wait gettimevar(VAR_prompt_wait)
#define proxy_host getstdvar(VAR_proxy_host)
#define proxy_port getstdvar(VAR_proxy_port)
#define process_time gettimevar(VAR_ptime)
#define qecho getintvar(VAR_qecho)
#define qprefix getstrvar(VAR_qprefix)
#define quietflag getintvar(VAR_quiet)
#define quitdone getintvar(VAR_quitdone)
#define redef getintvar(VAR_redef)
#define refreshtime getintvar(VAR_refreshtime)
#define scroll getintvar(VAR_scroll)
#define secho getintvar(VAR_secho)
#define shpause getintvar(VAR_shpause)
#define sigfigs getintvar(VAR_sigfigs)
#define snarf getintvar(VAR_snarf)
#define sockmload getintvar(VAR_sockmload)
#define sprefix getstrvar(VAR_sprefix)
#define status_attr getattrvar(VAR_stat_attr)
#define status_fields getstdvar(VAR_stat_fields)
#define status_height getintvar(VAR_stat_height)
#define status_pad getstdvar(VAR_stat_pad)
#define sub getintvar(VAR_sub)
#define tabsize getintvar(VAR_tabsize)
#define telopt getintvar(VAR_telopt)
#define textdiv getintvar(VAR_textdiv)
#define textdiv_str getstrvar(VAR_textdiv_str)
#define tfhost getstdvar(VAR_tfhost)
#define time_format getstrvar(VAR_time_format)
#define virtscreen getintvar(VAR_virtscreen)
#define warn_curly_re getintvar(VAR_warn_curly_re)
#define warn_def_B getintvar(VAR_warn_def_B)
#define warn_status getintvar(VAR_warn_status)
#define warning_attr getattrvar(VAR_warning_attr)
#define watchdog getintvar(VAR_watchdog)
#define watchname getintvar(VAR_watchname)
#define wordpunct getstdvar(VAR_wordpunct)
#define wrapflag getintvar(VAR_wrap)
#define wraplog getintvar(VAR_wraplog)
#define wrappunct getintvar(VAR_wrappunct)
#define wrapsize getintvar(VAR_wrapsize)
#define wrapspace getintvar(VAR_wrapspace)
/* visual is special: initial value of -1 indicates it was never explicitly
* set, but is still treated like "off".
*/
#define visual ((long)(getintvar(VAR_visual) > 0))
extern Var special_var[];
#define reset_kbnum() unsetvar(&special_var[VAR_kbnum])
#endif /* GLOBALS_H */
syntax highlighted by Code2HTML, v. 0.9.1