|
|
1.1 root 1: #ifndef PADS_H
2: #define PADS_H
3:
4: typedef unsigned short Attrib;
5: #define PADS_VERSION 0x851021 /* YYMMDD */
6: #define CARTE 0x80
7: #define NUMERIC 1
8: #undef major
9: #undef minor
10: #ifndef PADS_TERM
11: int strlen(char*),
12: strcmp(char*,char*),
13: read(int,char*,int),
14: write(int,char*,int),
15: ioctl(int,int ...);
16: char *strcpy(char*,char*),
17: *sbrk(int);
18:
19: #define PRINTF_TYPES char * ...
20: #define PRINTF_ARGS char *fmt ...
21: #define FMT(i) ( ((int*)&fmt)[i] )
22: #define PRINTF_COPY\
23: (fmt?fmt:""), FMT(1),FMT(2),FMT(3),FMT(4),FMT(5),FMT(6),FMT(7),FMT(8)
24:
25: #ifdef TRACE
26: #define OK(x) if( !ok() ) PadsError(__SRC__);
27: #define VOK if( !ok() ) PadsError(__SRC__);
28: #define IF_LIVE(x) { if( x ) PadsError(__SRC__); } if(0)
29: #define SRCFILE(f) static __SRC__ = f;
30: typedef int (*PFI)();
31: PFI trace_fcn(char*,int), trace_ptr;
32: #define trace (!(trace_ptr=trace_fcn(__SRC__,__LINE__))) ? 0 : (*trace_ptr)
33: #else
34: #define OK(x) { if( !ok() ) return x; }
35: #define VOK { if( !ok() ) return ; }
36: #define IF_LIVE(x) if( x )
37: #define SRCFILE(f)
38: #define trace if( 0 )
39: #endif
40:
41: class Index {
42: public:
43: unsigned char major;
44: unsigned char minor;
45: Index() { major = minor = 0; }
46: Index(int i) { major = i>>8; minor = i&0xFF; }
47: Index(int j, int n ) { major = j; minor = n; }
48: short sht(); /* don't inline sht() - sht() etc */
49: int null();
50: };
51: extern Index ZIndex;
52: class Carte {
53: public:
54: unsigned char size; /* host.size != term.size */
55: unsigned char attrib;
56: unsigned char items;
57: unsigned char width;
58: struct Index bin[1];
59: Carte() {};
60: };
61: #else
62: typedef unsigned short Index;
63: #define MJR(i) ((i)>>8)
64: #define MNR(i) ((i)&0xFF)
65: typedef struct Carte Carte;
66: typedef enum Protocol Protocol;
67: struct Carte {
68: unsigned char size; /* host.size != term.size */
69: unsigned char attrib;
70: short width;
71: Index bin[1];
72: };
73: #endif
74:
75: #define SELECTLINE ((Attrib)0x0001)
76: #define SORTED ((Attrib)0x0002)
77: #define ACCEPT_KBD ((Attrib)0x0004)
78: #define FOLD ((Attrib)0x0008)
79: #define TRUNCATE ((Attrib)0x0010)
80: #define USERCLOSE ((Attrib)0x0020)
81: #define DONT_CUT ((Attrib)0x0040)
82: #define FLUSHLINE ((Attrib)0x0080) /* should not be required */
83: #define FAKELINE ((Attrib)0x0100)
84: #define USERCUT ((Attrib)0x0200)
85: #define DONT_CLOSE ((Attrib)0x0400)
86: #define NO_TILDE ((Attrib)0x0800)
87: #define DONT_DIRTY ((Attrib)0x1000)
88:
89: #ifndef PADS_TERM
90: char *sf(PRINTF_TYPES);
91: char *PadsInit(char* = 0);
92: void PadsServe(long = 0);
93: void NewHelp();
94: void NewPadStats();
95: class PadRcv;
96: typedef void (PadRcv::*Action)(...);
97: void Pick(char*,Action,long);
98: long UniqueKey();
99: Index NumericRange(short,short);
100: void PadsWarn(PRINTF_TYPES);
101: //extern char *TapTo;
102: void PadsError(PRINTF_TYPES);
103:
104: class PadRcv { friend Remote; friend Pad;
105: short oid;
106: short magic;
107: int isvalid();
108: public:
109: PadRcv();
110: ~PadRcv();
111: void invalidate();
112: virtual int disc();
113: virtual char *kbd(char*);
114: virtual char *help();
115: virtual void numeric(long);
116: virtual void userclose();
117: virtual void cycle();
118: virtual void linereq(long,Attrib=0);
119: virtual int accept(Action);
120: virtual void usercut();
121: };
122:
123: class Pad {
124: PadRcv *_object;
125: char *_name;
126: char *_banner;
127: Attrib _attributes;
128: long _lines;
129: void termop(enum Protocol);
130: long errorkey;
131: void nameorbanner(enum Protocol, PRINTF_TYPES);
132: public:
133: int ok();
134: Pad(PadRcv *);
135: ~Pad();
136: void alarm(short=0);
137: void banner(PRINTF_TYPES);
138: void clear();
139: void dump();
140: void error(PRINTF_TYPES);
141: void insert(class Line&);
142: void insert(long, Attrib, PadRcv*, Index, PRINTF_TYPES);
143: void insert(long, Attrib, PadRcv*, class Menu&, PRINTF_TYPES);
144: void insert(long, Attrib, PRINTF_TYPES);
145: void insert(long, PRINTF_TYPES);
146: void lines(long);
147: void makecurrent();
148: void makegap(long,long);
149: void menu(Index);
150: void menu(class Menu&);
151: void name(PRINTF_TYPES);
152: void options(Attrib, Attrib=0);
153: void tabs(short);
154: void removeline(long);
155: void createline(long,long);
156: void createline(long);
157: };
158:
159: class Line {
160: public:
161: int ok();
162: Line();
163: PadRcv *object;
164: char *text;
165: long key;
166: Attrib attributes;
167: Index carte;
168: };
169: class IList {
170: friend Menu;
171: Index index;
172: IList *next;
173: public:
174: IList(Index i, IList *n) { index = i; next = n; }
175: };
176:
177: class Item {
178: public:
179: char *text;
180: Action action;
181: long opand;
182: Item(char*,Action,long);
183: Item(); /* ever used ? */
184: };
185: class Menu {
186: IList *list;
187: int size;
188: void dump();
189: public:
190: Menu();
191: ~Menu();
192: Menu( char*, Action=0, long=0 );
193: Index index( char* =0, Action=0, long=0 );
194: void first( char*, Action=0, long=0 );
195: void first( Index );
196: void last( char*, Action=0, long=0 );
197: void last( Index );
198: void sort( char*, Action=0, long=0 );
199: void sort( Index );
200: };
201:
202: class Binary {
203: public:
204: Binary *left;
205: Binary *right;
206: Index index;
207: Binary() {}
208: };
209:
210: class Cache {
211: friend ItemCache;
212: friend CarteCache;
213: Binary *root;
214: Index current;
215: Index SIZE;
216: public:
217: Cache(unsigned char,unsigned char);
218: int ok();
219: };
220:
221: class ItemCache : public Cache {
222: Item ***cache;
223: public:
224: ItemCache();
225: Index place(Item);
226: Item *take(Index);
227: };
228:
229: class CarteCache : public Cache {
230: Carte ***cache;
231: public:
232: CarteCache();
233: Index place(Carte*);
234: Carte *take(Index);
235: Index numeric(short,short);
236: void cartelimits(Carte*);
237: };
238:
239: extern ItemCache *ICache;
240: extern CarteCache *CCache;
241: #endif
242:
243: #define CARTESIZE(s) (sizeof(Carte) + (s)*sizeof(Index))
244:
245: enum Protocol {
246: P_UCHAR = 1,
247: P_SHORT = 2,
248: P_LONG = 4,
249:
250: P_CACHEOP = 0x10,
251: P_I_DEFINE = 0x11,
252: P_I_CACHE = 0x12,
253: P_C_DEFINE = 0x13,
254: P_C_CACHE = 0x14,
255:
256: P_STRING = 0x20,
257: P_INDEX = 0x21,
258:
259: P_PADDEF = 0x30,
260: P_ATTRIBUTE = 0x31,
261: P_BANNER = 0x32,
262: P_CARTE = 0x33,
263: P_LINES = 0x34,
264: P_NAME = 0x35,
265: P_TABS = 0x36,
266:
267: P_PADOP = 0x40,
268: P_ACTION = 0x41,
269: P_ALARM = 0x42,
270: P_CLEAR = 0x43,
271: P_CYCLE = 0x44,
272: P_DELETE = 0x45,
273: P_KBDSTR = 0x46,
274: P_LINE = 0x47,
275: P_LINEREQ = 0x48,
276: P_MAKECURRENT = 0x49,
277: P_MAKEGAP = 0x4A,
278: P_NEXTLINE = 0x4B,
279: P_NUMERIC = 0x4C,
280: P_USERCLOSE = 0x4D,
281: P_CREATELINE = 0x4E,
282: P_REMOVELINE = 0x4F,
283:
284: P_HOSTSTATE = 0x50,
285: P_BUSY = 0x51,
286: P_IDLE = 0x52,
287:
288: P_USERCUT = 0x5F,
289:
290: P_PICK = 0x60,
291:
292: P_HELPSTR = 0x70,
293: P_SHELL = 0x71,
294:
295: P_VERSION = 0x80,
296: };
297:
298: #ifdef PADS_TERM
299: long RcvLong();
300: short RcvShort();
301: unsigned char RcvUChar();
302: char *RcvString();
303:
304: void SendLong();
305: void SendShort();
306: void SendUChar();
307: void SendString();
308: #else
309: #include <CC/stdio.h>
310: FILE *Popen(char*,char*);
311: int Pclose(FILE*);
312:
313: class Remote {
314: public:
315: int fd;
316: int pktbase;
317: int pktsize;
318: unsigned char writebuffer[2048];
319:
320: long shiftin(int);
321: void shiftout(int, long);
322: int writesize;
323: void err(char * = 0);
324: int get();
325: void checkproto(int p);
326: void put(char c);
327: void proto(int p);
328:
329: long rcvlong();
330: short rcvshort();
331: unsigned char rcvuchar();
332: PadRcv *rcvobj();
333:
334: void sendlong(long);
335: void sendobj(PadRcv*);
336: void sendshort(short);
337: void senduchar(unsigned char);
338: char *rcvstring(char*);
339: void sendstring(char*);
340:
341: void pktstart(char);
342: void pktend();
343: void pktflush();
344:
345: void share();
346:
347: Remote(char*);
348: Remote(int);
349: };
350:
351: extern Remote *R;
352:
353: #endif
354: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.