#ifndef _M1D_COMMON_H #define _M1D_COMMON_H 1 #include #include #include #include #include #include #include #include /******************************** * Configuration section follows */ /* * PSTR_16BIT: whether PSTR strings should be preceded * by 16-bit or 8-bit length (thus also limiting the maximum * allowed length of PSTR string) */ //#define PSTR_16BIT /* * INLINE_PUTGETCHAR: inline vb{put,get}char() */ #define INLINE_PUTGETCHAR /* * FATALSIG_INSANE: if defined, no vbcheck()s are done after some fatal * signal has been caught as the data structures may be corrupted * already thereafter */ //#define FATALSIG_INSANE /* * HAVE_PTHREAD: vbcheck() serialization between threds * Please note that VB library in general is NOT multithreading safe. */ //#define HAVE_PTHREAD /* * VB_DEFSIZE: Default size of buffer of "vb" object. Large sizes may * slow down vbcopy() significantly. */ #define VB_DEFSIZE 256 //>=min of n in vsnprintf() /* * LOGF_FGETS_BUF: Buffer size for vbgetlinef(), doesn't hard limit anything, * it has only performance impact. */ #define LOGF_FGETS_BUF VB_DEFSIZE /* * VB_MAXSIZE: Maximum size of one "vbn" segment to prevent circular * use of "vb" to eat up the whole memory. It doesn't limit the maximum * data storage of "vb" object in no way, it has only performance impact. */ #define VB_MAXSIZE 128*1024 //recommended limit, not hard (probably) /* * CHAT_CMD_MAXPARS: Size of chat_cmdpars[] array, maximum # of parameters * a user command can have during chat_proccmd() parse. */ #define CHAT_CMD_MAXPARS 10 /* * Configuration section ends ****************************/ #ifndef VB_LOG #define VB_LOG(lev,msg...) fprintf(stderr,VB_LOG_##lev ##msg) #endif #ifndef VB_FATAL #define VB_FATAL(lev,msg...) do { VB_LOG(lev, ##msg); exit(EXIT_FAILURE); } while (0) #endif #define VB_LOG_DEBUG "VB_Debug: " #define VB_LOG_ERR "VB_Error: " #define VB_LOG_CRIT "VB_Critical: " #define strncpydst(d,s) strncpy(d,s,sizeof(d)) #ifdef NDEBUG #undef DEBUG #endif #ifdef DEBUG #define dbg(msg...) fprintf(stderr, ##msg) #else #define dbg(msg...) #endif #ifndef max #define max(a,b) ((a)>(b)?(a):(b)) #endif #ifndef min #define min(a,b) ((a)<(b)?(a):(b)) #endif #ifndef __NORETURN #define __NORETURN __attribute__((__noreturn__)) #endif #define NELEM(a) (sizeof((a))/sizeof(*(a))) #define XRAWDIGITI(n) ((n)-'0'-((n)>='A'?'A'-('9'+1):0)) #define XRAWDIGITO(n) ((n)+'0'+((n)>=0xA?'A'-('9'+1):0)) #define PK __attribute__((packed)) extern const int safesigs[]; struct varbufnode { struct varbufnode *next; size_t size; char buf[0]; }; struct varbuf { #ifndef NDEBUG struct varbuf *checknext; //MUST be first in the struct #endif struct varbufnode *f,*l; size_t done,free; }; #define VBNSIZEL(vb,vbn) ((vbn)->size-((vb)->l==(vbn)?(vb)->free:0)) #define VBNSTART(vb,vbn) ((vb)->f==(vbn)?(vb)->done:0) #define VBNSIZE(vb,vbn) (VBNSIZEL((vb),(vbn))-VBNSTART((vb),(vbn))) #define VBEMPTY(vb) (!(vb)->f || ((vb)->l==(vb)->f&&(vb)->l->size==(vb)->free)) #ifndef NDEBUG extern void vbcheck(struct varbuf *vb); extern void vbsanity(void); #else #define vbcheck(vb) #define vbsanity() #endif #ifdef VBDEBUG extern void vbdebug(struct varbuf *vb,const char *msg); #else #define vbdebug(vb,msg) vbcheck(vb) #endif struct chat_cmdtab { const char *name; const unsigned char npars; void (*fnc)(void); const char *help; }; #define VBMEM_REM (1<<0) #define VBMEM_ZERO (1<<1) extern void chk(const void *p); extern struct varbufnode *vbnnew(size_t sugsize); extern void vbgrow(struct varbuf *vb,size_t sugsize); extern void vbinit(struct varbuf *vb); extern struct varbufnode *vbremone(struct varbuf *vb); extern void vbclear(struct varbuf *vb); extern void vbrem(struct varbuf *vb); extern size_t vbsize(struct varbuf *vb,size_t maxsize); extern void vbwrite(struct varbuf *vb,const void *buf,size_t count); extern size_t vbputstring(struct varbuf *vb,const char *s); extern ssize_t vbwritefd(struct varbuf *vb,int fd); extern size_t vbpeek(struct varbuf *vb,ssize_t offs,void *buf,size_t count); #define vbread(vbp,buf,count) vbpeek(vbp,-1,buf,count) extern ssize_t vbchrn(struct varbuf *vb,ssize_t offs,char c,char dir); extern ssize_t vbreadfd(struct varbuf *vb,int fd); extern char *vbgetline(struct varbuf *vb,char term); extern size_t chkvsprintf(char **sp,const char *fmt,va_list ap); extern size_t vbvprintf(struct varbuf *vb,const char *fmt,va_list ap,char remlf) __attribute__((format(printf,2,0))); extern size_t vbprintf(struct varbuf *vb,const char *fmt,...) __attribute__((format(printf,2,3))); extern void vbpstrputstring(struct varbuf *vb,const char *s); extern void vbpstrprintf(struct varbuf *vb,const char *fmt,...) __attribute__((format(printf,2,3))); extern char *vbpstrread(struct varbuf *vb); extern size_t vbcopy(struct varbuf *vbd,struct varbuf *vbs,ssize_t count); extern unsigned short vbxsum(struct varbuf *vb); extern char vbremlast(struct varbuf *vb); extern void vbdrop(struct varbuf *vb,size_t len); extern void vbgetlinef(struct varbuf *vb,FILE *f); extern ssize_t vbcopyline(struct varbuf *vbd,struct varbuf *vbs); extern char vbdropline(struct varbuf *vb); extern char *vbmemorize(struct varbuf *vb,unsigned flg,size_t *sizep); extern char *vbstringify(struct varbuf *vb,char rem); extern void chat_proccmd(const char *who,char *buf); extern void crfilter(char *sr); extern char *gmctime(time_t tm); extern unsigned char *bitshuffle(unsigned char *dst,unsigned char dstb,const unsigned char *src,unsigned char srcb,size_t bits,char lr); extern char *enbase64(char *dst,const unsigned char *src,size_t bits); extern unsigned char *debase64(unsigned char *dst,const char *src,size_t *dstlp); extern char vbnexact,quiet_null; extern struct varbuf *chat_vbout; extern int chat_cmdpar; extern char *chat_cmdpars[CHAT_CMD_MAXPARS]; extern const struct chat_cmdtab chat_cmdtable[]; extern const char *signames[]; extern void abortsignal(int signo); #define VBCHKSIZE(vb,size) (vbsize((vb),(size))>=(size)) #define GENVARBUFP(argmid) \ extern void vbput##argmid(struct varbuf *vb,const argmid arg); \ extern char vbget##argmid(struct varbuf *vb,argmid *argp); #ifndef INLINE_PUTGETCHAR GENVARBUFP(char) #endif GENVARBUFP(short) GENVARBUFP(int) #undef GENVARBUFP #ifdef INLINE_PUTGETCHAR static inline void vbputchar(struct varbuf *vb,const char arg) __attribute__((unused)); static inline void vbputchar(struct varbuf *vb,const char arg) { vbcheck(vb); if (vb->free) vb->l->buf[vb->l->size-(vb->free--)]=arg; else vbwrite(vb,&arg,sizeof(arg)); } static inline char vbgetchar(struct varbuf *vb,char *argp) __attribute__((unused)); static inline char vbgetchar(struct varbuf *vb,char *argp) { vbcheck(vb); if (vb->f && vb->done+1f)) { *argp=vb->f->buf[vb->done++]; return(1); } else return vbread(vb,argp,sizeof(*argp)); } #endif #endif /* !_M1D_COMMON_H */