// $Id: interface.h,v 1.54 2008/08/26 13:42:24 lynx Exp $ // vim:syntax=lpc:ts=8 #define _INCLUDE_INTERFACE_H // let's stay compatible for a while // -> if we want to do so, we got to check for the LDMUD version. 3.2.9 doesn't // get it. //#if __VERSION_MAJOR__ == 3 && __VERSION_MINOR__ > 2 # define SAVE_FORMAT 0 //#endif #ifndef __psyclpc__ # define DRIVER_VERSION "ldmud/" __VERSION__ #else # define DRIVER_VERSION "psyclpc/" __VERSION__ # define hex2int(HEX) to_int("0x"+ HEX) #endif // driver abstraction kit -- abstraction layer from driver details #pragma combine_strings #if DEBUG > 0 # pragma verbose_errors //#else //# pragma no_verbose_errors #endif // [-1] vs [<1] syntax kludge #define char_from_end(WHAT, NUMBER) WHAT[< NUMBER] #define slice_from_end(WHAT,FROM,TO) WHAT[FROM ..< TO] #define next_input_to(CALLBACK) input_to(CALLBACK, INPUT_IGNORE_BANG) #if __EFUN_DEFINED__(strstr) // rexxism: is small an abbreviation of big? # define abbrev(SMALL, BIG) (strstr(BIG, SMALL) == 0) // the same thing at the tail of the string # define trail(SMALL, BIG) (strstr(BIG, SMALL, -strlen(SMALL)) != -1) #else # define abbrev(SMALL, BIG) (SMALL == BIG[0..strlen(SMALL)-1]) # define trail(SMALL, BIG) (SMALL == BIG[= 0) #endif // to_string behaves differently with ldmud.. sigh #define o2s(any) ((objectp(any)?"/":"")+to_string(any)) // object to http URL (without http://host:port) conversion macros #define object2url(ob) replace( stringp(ob)?ob:("/"+to_string(ob)), "#", "," ) #define url2object(ob) replace( ob, ",", "#" ) #define file_name(ob) object_name(ob) // see net/library for verbose version of this function #if 1 # define is_formal(n) ((index(n,':')!=-1||index(n,'.')!=-1) && n) #else # define is_formal(n) ((index(n,':')!=-1||index(n,'@')!=-1) && n) #endif #define lower_uniform(n) (is_formal(n) && lower_case(n)) // nosave? static? volatile. only for variables, not methods! // another nice word for the opposite of persistent would be "shed" #define volatile nosave #define persistent // every lpc dialect has its own foreach syntax. aint that cute? #define each(ITERATOR, LIST) foreach(ITERATOR : LIST) #define mapeach(KEY, VALUE, MAPPING) foreach(KEY, VALUE : MAPPING) #define array(TYPE) TYPE * // the simple concept of the caller isn't so simple in lpc #define caller (extern_call() ? previous_object() : this_object()) // a pike compatible closure syntax.. using a macro.. ain't that smarty? #define CLOSURE(args, tcontext, context, code) function mixed args code // pike's varargs syntax requires me to do some tricks here #define vaclosure closure #define vamapping mapping #define vastring string #define vaobject object #define vamixed mixed #define vaint int // extracts hh:mm:ss format from ctime output #define hhmmss(CTIME) CTIME[11..18] // extracts hh:mm format from ctime output (for idle times) #define hhmm(CTIME) CTIME[11..15] // typical timestamp string: hhmm or iso-date if older than 24 hours #define time_or_date(TS) \ (time() - TS > 24*60*60 ? isotime(TS, 0) : hhmm(ctime( TS ))) #if __EFUN_DEFINED__(convert_charset) # ifdef TRANSLIT // TRANSLIT has no effect whatsoever. grrr! # define iconv(s, FROM, TO) (s = convert_charset(s, FROM, TO +"//TRANSLIT")) # else # define iconv(s, FROM, TO) { \ string itmp; \ if (catch(itmp = convert_charset(s, FROM, TO); nolog)) {\ P1(("catch! iconv %O %O in %O\n", FROM, TO, ME)) \ } else s = itmp; \ } # endif #else # define iconv(s, FROM, TO) # define convert_charset(s, FROM, TO) (s) #endif #define AMOUNT_SOCKETS sizeof(users()) #ifdef DEBUG # if DEBUG > 0 // enables you to output useful things like in your P1() etc. # define DEBUG_TRACE debug_info(DINFO_TRACE, DIT_STR_CURRENT) # else # define DEBUG_TRACE "(DEBUG_TRACE disabled: DEBUG level below 1)" # endif #endif // some ldmud versions previous to 610 have a problem with digest-md5 //#if __VERSION_MAJOR__ < 4 && __VERSION_MICRO__ < 611 //# echo Warning: Your driver is so old, it cannot do DIGEST-MD5 //# define _flag_disable_authentication_digest_MD5 //#endif