Initial import, non-compilable, stripped down m1d/common.[ch] version.
[vblib.git] / vblib.h
1 #ifndef _M1D_COMMON_H
2 #define _M1D_COMMON_H 1
3
4 #include <string.h>
5 #include <ctype.h>
6 #include <slang.h>
7 #include <sys/time.h>
8 #include <unistd.h>
9 #include <termios.h>
10 #include <sys/poll.h>
11 #include <setjmp.h>
12
13 /********************************
14  * Configuration section follows
15  */
16
17 //#define PSTR_16BIT
18 #define INLINE_PUTGETCHAR
19 //#define FATALSIG_INSANE
20
21 #define VB_DEFSIZE 256 //>=min of n in vsnprintf()
22 #define VB_MAXSIZE 128*1024 //recommended limit, not hard (probably)
23
24 #define CHAT_CMD_MAXPARS 10
25
26 /*
27  * Configuration section ends
28  ****************************/
29
30 #define strncpydst(d,s) strncpy(d,s,sizeof(d))
31 #ifdef NDEBUG
32 #undef DEBUG
33 #endif
34 #ifdef DEBUG
35 #define dbg(msg...) fprintf(stderr, ##msg)
36 #else
37 #define dbg(msg...)
38 #endif
39
40 #ifndef max
41 #define max(a,b) ((a)>(b)?(a):(b))
42 #endif
43 #ifndef min
44 #define min(a,b) ((a)<(b)?(a):(b))
45 #endif
46 #ifndef __NORETURN
47 #define __NORETURN __attribute__((__noreturn__))
48 #endif
49
50 #define NELEM(a) (sizeof((a))/sizeof(*(a)))
51 #define XRAWDIGITI(n) ((n)-'0'-((n)>='A'?'A'-('9'+1):0))
52 #define XRAWDIGITO(n) ((n)+'0'+((n)>=0xA?'A'-('9'+1):0))
53 #define PK __attribute__((packed))
54
55 extern const int safesigs[];
56
57 struct varbufnode {
58         struct varbufnode *next;
59         size_t size;
60         char buf[0];
61         };
62 struct varbuf {
63 #ifndef NDEBUG
64         struct varbuf *checknext; //MUST be first in the struct
65 #endif
66         struct varbufnode *f,*l;
67         size_t done,free;
68         };
69
70 #define VBNSIZEL(vb,vbn) ((vbn)->size-((vb)->l==(vbn)?(vb)->free:0))
71 #define VBNSTART(vb,vbn)              ((vb)->f==(vbn)?(vb)->done:0)
72 #define VBNSIZE(vb,vbn) (VBNSIZEL((vb),(vbn))-VBNSTART((vb),(vbn)))
73
74 #define VBEMPTY(vb) (!(vb)->f || ((vb)->l==(vb)->f&&(vb)->l->size==(vb)->free))
75
76 #ifndef NDEBUG
77 extern void vbcheck(struct varbuf *vb);
78 extern void vbsanity(void);
79 #else
80 #define vbcheck(vb)
81 #define vbsanity()
82 #endif
83
84 #ifdef VBDEBUG
85 extern void vbdebug(struct varbuf *vb,const char *msg);
86 #else
87 #define vbdebug(vb,msg) vbcheck(vb)
88 #endif
89
90 struct chat_cmdtab {
91         const char *name;
92         const unsigned char npars;
93         void (*fnc)(void);
94         const char *help;
95 };
96
97 #define VBMEM_REM  (1<<0)
98 #define VBMEM_ZERO (1<<1)
99
100 extern void chk(const void *p);
101
102 extern struct varbufnode *vbnnew(size_t sugsize);
103 extern void vbgrow(struct varbuf *vb,size_t sugsize);
104 extern void vbinit(struct varbuf *vb);
105 extern struct varbufnode *vbremone(struct varbuf *vb);
106 extern void vbclear(struct varbuf *vb);
107 extern void vbrem(struct varbuf *vb);
108 extern size_t vbsize(struct varbuf *vb,size_t maxsize);
109 extern void vbwrite(struct varbuf *vb,const void *buf,size_t count);
110 extern size_t vbputstring(struct varbuf *vb,const char *s);
111 extern ssize_t vbwritefd(struct varbuf *vb,int fd);
112 extern size_t vbpeek(struct varbuf *vb,ssize_t offs,void *buf,size_t count);
113 #define vbread(vbp,buf,count) vbpeek(vbp,-1,buf,count)
114 extern ssize_t vbchrn(struct varbuf *vb,ssize_t offs,char c,char dir);
115 extern ssize_t vbreadfd(struct varbuf *vb,int fd);
116 extern char *vbgetline(struct varbuf *vb,char term);
117 extern size_t chkvsprintf(char **sp,const char *fmt,va_list ap);
118 extern size_t vbvprintf(struct varbuf *vb,const char *fmt,va_list ap,char remlf) __attribute__((format(printf,2,0)));
119 extern size_t vbprintf(struct varbuf *vb,const char *fmt,...) __attribute__((format(printf,2,3)));
120 extern void vbpstrputstring(struct varbuf *vb,const char *s);
121 extern void vbpstrprintf(struct varbuf *vb,const char *fmt,...) __attribute__((format(printf,2,3)));
122 extern char *vbpstrread(struct varbuf *vb);
123 extern size_t vbcopy(struct varbuf *vbd,struct varbuf *vbs,ssize_t count);
124 extern unsigned short vbxsum(struct varbuf *vb);
125 extern char vbremlast(struct varbuf *vb);
126 extern void vbdrop(struct varbuf *vb,size_t len);
127 extern void vbgetlinef(struct varbuf *vb,FILE *f);
128 extern ssize_t vbcopyline(struct varbuf *vbd,struct varbuf *vbs);
129 extern char vbdropline(struct varbuf *vb);
130 extern char *vbmemorize(struct varbuf *vb,unsigned flg,size_t *sizep);
131 extern char *vbstringify(struct varbuf *vb,char rem);
132 extern void chat_proccmd(const char *who,char *buf);
133 extern void crfilter(char *sr);
134 extern char *gmctime(time_t tm);
135 extern unsigned char *bitshuffle(unsigned char *dst,unsigned char dstb,const unsigned char *src,unsigned char srcb,size_t bits,char lr);
136 extern char *enbase64(char *dst,const unsigned char *src,size_t bits);
137 extern unsigned char *debase64(unsigned char *dst,const char *src,size_t *dstlp);
138
139 extern char vbnexact,quiet_null;
140
141 extern struct varbuf *chat_vbout;
142 extern int chat_cmdpar;
143 extern char *chat_cmdpars[CHAT_CMD_MAXPARS];
144 extern const struct chat_cmdtab chat_cmdtable[];
145
146 extern const char *signames[];
147 extern void abortsignal(int signo);
148
149 #define VBCHKSIZE(vb,size) (vbsize((vb),(size))>=(size))
150
151 #define GENVARBUFP(argmid) \
152         extern void vbput##argmid(struct varbuf *vb,const argmid arg); \
153         extern char vbget##argmid(struct varbuf *vb,argmid *argp);
154
155 #ifndef INLINE_PUTGETCHAR
156 GENVARBUFP(char)
157 #endif
158 GENVARBUFP(short)
159 GENVARBUFP(int)
160
161 #undef GENVARBUFP
162
163 #ifdef INLINE_PUTGETCHAR
164 static inline void vbputchar(struct varbuf *vb,const char arg) __attribute__((unused));
165 static inline void vbputchar(struct varbuf *vb,const char arg)
166 {
167         vbcheck(vb);
168         if (vb->free) vb->l->buf[vb->l->size-(vb->free--)]=arg;
169         else vbwrite(vb,&arg,sizeof(arg));
170 }
171
172 static inline char vbgetchar(struct varbuf *vb,char *argp) __attribute__((unused));
173 static inline char vbgetchar(struct varbuf *vb,char *argp)
174 {
175         vbcheck(vb);
176         if (vb->f && vb->done+1<VBNSIZEL(vb,vb->f)) { *argp=vb->f->buf[vb->done++]; return(1); }
177         else return vbread(vb,argp,sizeof(*argp));
178 }
179 #endif
180
181 #endif /* !_M1D_COMMON_H */