home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / oxcc1433.zip / SRC / OXBOW.H < prev    next >
C/C++ Source or Header  |  1995-11-05  |  70KB  |  2,337 lines

  1. /* OXBOW.H a conglomeration of .h files */
  2.  
  3. #include <setjmp.h>
  4.  
  5. #ifndef SUPPORT_LONG_LONG
  6. #define SUPPORT_LONG_LONG 1
  7. #endif
  8.  
  9. #ifndef SUPPORT_LONG_DOUBLE
  10. #define SUPPORT_LONG_DOUBLE 0
  11. #endif
  12.  
  13. #if SUPPORT_LONG_LONG
  14. #define _LONGLONG_ long long
  15. #else
  16. #define _LONGLONG_ double
  17. #endif
  18.  
  19. #ifdef __cplusplus
  20. extern "C" {
  21. #endif
  22.  
  23. enum evTypes {
  24. #undef defEvent
  25. #define defEvent(a,b) \
  26. a=b,
  27. #include <oxevents.h>
  28. };
  29.  
  30. #undef max
  31. #define max(a,b) \
  32. ({typedef _ta = (a), _tb = (b); \
  33. _ta _a = (a); _tb _b = (b); \
  34. _a > _b ? _a : _b; })
  35.  
  36. #undef min
  37. #define min(a,b) \
  38. ({typedef _ta = (a), _tb = (b); \
  39. _ta _a = (a); _tb _b = (b);\
  40. _a < _b ? _a : _b; })
  41.  
  42. #define ROUNDING(a,b) ((b-(a&(b-1)))&(b-1))
  43. #define ROUNDUP(a,b) a += ROUNDING(a,b)
  44. #define round_up(a,b) (a+ROUNDING(a,b))
  45. #define CALLER(a) (((unsigned*)&a)[-1])
  46.  
  47. typedef unsigned long SIZE_T;
  48.  
  49. /* CFF.H    -- user api include file for the cff library */
  50. #ifndef __ITEMH__
  51. #define __ITEMH__
  52. #if SUPPORT_LONG_LONG
  53. typedef unsigned long long  KeyItem;   /* type for a key's associated item */
  54. #else
  55. typedef double KeyItem;
  56. #endif
  57. #endif __ITEMH__
  58.  
  59. typedef union             /* 2 BYTES */
  60.     {
  61.         unsigned short val;
  62.         unsigned char b[2];
  63. } SVAL;
  64.  
  65. typedef union            /* 4 BYTES */
  66.     {
  67.     unsigned long a0;
  68.     void *a1;
  69.     struct
  70.         {
  71.         SVAL    lo_word;
  72.         SVAL    hi_word;
  73.         } a2;
  74.     struct
  75.         {
  76.             unsigned int pad :28;
  77.             unsigned int type :4;
  78.         } a3;
  79.     struct
  80.         {
  81.             unsigned char b[4];
  82.         } a4;
  83.     int a8;
  84.     short a9;
  85.     char a10;
  86.     float a11;
  87. } ADDR;
  88.  
  89. #ifndef __STORH__
  90. #define __STORH__
  91. typedef union _stor    /* 8 BYTES */
  92.     {
  93.     KeyItem item;
  94.     unsigned long    a0;
  95.     void *a1;
  96.     struct 
  97.     {
  98.         unsigned char b0 : 3;
  99.         unsigned char b1 : 1;
  100.         unsigned char b2 : 1;
  101.         unsigned char b3 : 1;
  102.         unsigned char b4 : 2;
  103.     } bits;
  104.     struct
  105.         {
  106.         unsigned short    lo_word;
  107.         unsigned short    hi_word;
  108.         unsigned int size :28;        /* in bytes or nibbles */
  109.         unsigned int type :4;        /* describes the STOR type */
  110.         } a2;
  111.     struct
  112.         {
  113.             short s0;
  114.             short s1;
  115.             short s2;
  116.             short s3;
  117.         } a3;
  118.     struct
  119.         {
  120.             unsigned long    s0;
  121.             unsigned long    s1;
  122.         } a4;
  123.     struct
  124.         {
  125.             long    s0;
  126.             long    s1;
  127.         } a4s;
  128.     struct
  129.         {
  130.             void    *a0;
  131.             void    *a1;
  132.         } a4a;
  133.     struct
  134.         {
  135.             unsigned char    b[8];
  136.         } a5;
  137.     struct
  138.         {
  139.             signed char    b[8];
  140.         } a5t;
  141. #if SUPPORT_LONG_LONG
  142.     struct
  143.         {
  144.             unsigned long long dupname :48;
  145.             unsigned long long dupid :16;
  146.         } a6;
  147. #endif
  148.     struct
  149.         {
  150.             unsigned int home : 30;
  151.             unsigned int full : 2;
  152.         } a7;
  153.     int a8;
  154.     short a9;
  155.     char a10;
  156.     float a11;
  157.     double a12;
  158. #if SUPPORT_LONG_LONG
  159.     long long a13;
  160.     unsigned long long a14;
  161. #endif
  162.     unsigned char    Uuchar;
  163.     char            Uchar;
  164.     unsigned short    Uushort;
  165.     short            Ushort;
  166.     unsigned int    Uuint;
  167.     int                Uint;
  168.     unsigned long     Uulong;
  169.     long            Ulong;
  170. #if SUPPORT_LONG_LONG
  171.     unsigned long long Uulonglong;
  172.     long long        Ulonglong;
  173. #endif
  174.     void *            Upointer;
  175.     float            Ufloat;
  176.     double            Udouble;
  177. } STOR, Item;
  178. #endif __STORH__
  179.  
  180. /* DEFINITIONS FOR "a2.type */
  181. #define STO_INACTIVE (0)
  182. #define STO_NIL  (1)
  183. #define STO_VALUE (2)    
  184. #define STO_CHUNK (3)
  185. #define STO_KEYINFO (4)
  186. #define STO_NILCHUNK (5)
  187. #define STO_COMPCHUNK (6)
  188. #define STO_ALLOCATED (7)
  189. #define STO_DELETED (8)    /* always ored with non zero */
  190. #define STOMASK (7)
  191.  
  192. typedef struct {
  193.     unsigned long    name;
  194.     unsigned short    xname;
  195.     unsigned short    id;
  196. } DupName;
  197.  
  198. typedef struct            /* 12 BYTES */
  199.     {
  200.         STOR c0;
  201.         ADDR c1;
  202.     } CAT;
  203. #define CATEXACT  (8)
  204. #define CATHASH (cat.c1.a0)
  205.  
  206. typedef struct    /* 20 bytes */
  207.     {
  208.         STOR    stor;
  209.         CAT        cat;
  210. } SDB;
  211.  
  212.  
  213. /* DEFINE CFF OPEN MODES */
  214.  
  215. #define F_RDONLY    (0x0001)
  216. #define F_WRONLY    (0x0002)
  217. #define F_RDWR        (0x0003)
  218. #define F_CREAT        (0x0004)
  219. #define F_TEMP        (0x0008)
  220. #define F_UNIQ        (0x0010)
  221. #define F_EXCL        (0x0020)
  222. #define F_BITMAP    (0x0040)
  223. #define F_TRUNC        (0x0080)
  224. #define F_APPEND    (0x0100)
  225. #define F_DELETING    (0x0200)
  226. #define F_FILEONLY    (0x0400)
  227. #define F_BIGDIR    (0x0800)
  228. #define F_HUGEDIR    (0x1000)
  229. #define F_SETUP        (0x4000)
  230. #define F_PARENTS    (0x4000)
  231. #define F_SORTED    (0x8000)
  232. #define F_UNTAGGED    (0x10000)
  233. #define F_STAT        (0x20000)    /* TRULY READONLY */
  234. #define F_TEXT        (0x40000)    /* DOS crap, default mode is binary */
  235. #define F_ZIPFILE    (0x80000)    /* compress the file aspect */
  236. #define F_ZIPDATA    (0x100000)    /* compress data chunks */
  237. #define F_TEMPFILE    (F_RDWR|F_CREAT|F_UNIQ|F_TEMP)
  238.  
  239. /* BUFFER RELEASE MODES */
  240. #define R_DIRTY        (0x80000000)
  241. #define R_CLEAN        (0x40000000)
  242. #define R_FLUSH        (0x20000000)
  243.  
  244. /* DEFINE SOME SYSTEM CALL VALUES */
  245. #define S_READBLK (1)
  246. #define S_WRITEBLK (2)
  247. #define S_GETSPACE (3)
  248. #define S_GIVESPACE (4)
  249. #define S_CLOSE (5)
  250. #define S_OPEN (6)
  251. #define S_CREATE (7)
  252. #define S_UNLINK (8)
  253. #define S_SEEK (9)
  254. #define S_FLUSH (10)
  255. #define S_CLOSETRUNC (11)
  256.  
  257. #define S_SET (0)
  258. #define S_CUR (1)
  259. #define S_END (2)
  260.  
  261. /* DEFINE CFF OBJECT PROPERTIES -- returned by cfobtype(void *something) */
  262. #define OB_SHARE    (0x00000001)
  263. #define OB_ISDIR    (0x00000002)
  264. #define OB_BMOK        (0x00000004)
  265. #define OB_SMOK        (0x00000008)
  266. #define OB_MEM        (0x00000010)
  267. #define OB_RAWDEV    (0x00000020)
  268. #define OB_CFILE    (0x00000040)
  269. #define OB_SETUP    (0x00000080)
  270. #define OB_FOD        (0x00000100)
  271. #define OB_ROOTDIR    (0x00000200)
  272. #define OB_DIRTY    (0x00000400)
  273. #define OB_DELCLOSE    (0x00000800)
  274. #define OB_WRITE    (0x00001000)
  275. #define OB_BITMAP    (0x00002000)
  276. #define OB_XFILE    (0x00004000)
  277. #define OB_ISNEW    (0x00008000)
  278. #define OB_SMEM        (0x00010000)
  279. #define OB_FILEONLY    (0x40000000)
  280. #define OB_HASHDIR    (0x20000000)
  281. #define OB_TREEDIR    (0x10000000)
  282. #define OB_UNTAGGED (0x08000000)
  283. #define OB_PREALLOC (0x01000000)
  284. #define OB_ZIPFILE    (0x00800000)
  285. #define OB_ZIPDATA    (0x00400000)
  286. #define OB_CHUNK    (0x00200000)
  287. #define OB_VALUE    (0x00100000)
  288.  
  289. #ifndef NULL
  290. #define NULL ((void *)0)
  291. #endif
  292.  
  293. #ifndef EOF
  294. #define EOF     (-1)
  295. #endif
  296.  
  297. #define YES     (1)
  298. #define NO      (0)
  299. #define OK      (1)
  300. #define NODUPS    (0)
  301. #define OKDUPS    (1)
  302. #define CNTDUPS (2)
  303. #define DUPNAMES (4)
  304.  
  305. #define PREALLOC1 (8)
  306. #define PREALLOC2 (16)
  307. #define PREALLOC3 (32)
  308.  
  309. #define ERROR   (-1)
  310. #define FOUND    (1)
  311. #define NOTFOUND (0)
  312. #define NONE    (-1)    /* no value */
  313. #define INVALID (-4)    /* invalid value */
  314. #define LESS    (-1)    /* a is less than b */
  315. #define EQUAL    (0)        /* a and b are equal */
  316. #define GREATER    (2)        /* a is greater than b */
  317. #define    BOI    (-2)        /* beginning of index */
  318. #define    EOI    (-3)        /* end of index */
  319.  
  320. typedef struct opninfo {
  321.     long initial_entries;
  322.     unsigned long bitmap_prealloc;
  323.     long data_prealloc;
  324. } OPNINFO;
  325.  
  326. typedef struct cfdirent {
  327.     int d_namlen;
  328.     char *d_name;
  329.     unsigned long d_bytesalloc;
  330.     unsigned long d_bytesused;
  331.     unsigned long d_mode;
  332.     unsigned long d_entrycnt;
  333.     unsigned long d_ino;
  334.     unsigned long d_mtime;
  335.     unsigned long d_ctime;
  336.     void *d_fpt;
  337. } CFDIRENT;
  338.  
  339. /* Function codes for the cfmisc instruction */
  340. enum CfMisc {
  341.     CF_ALLOC,CF_USED,CF_DEPTH,CF_MARK,CF_HEAD,CF_TAIL,CF_NEXT,
  342.     CF_PREV,CF_KEYLEN,CF_DATALEN,CF_MODBUFS,
  343.     CF_CURBUFS,CF_SETKEYCMP,CF_SETITEMCMP,CF_SETERRFUNC,
  344.     CF_LAZY,CF_VERYLAZY,CF_CLRLAZY,CF_ISNEW,CF_FLUSH,
  345.     CF_FILESIZE,CF_FILEALLOC,CF_PREALLOC,CF_ALIGNMENT,
  346.     CF_MAPSIZE,CF_ISSORTED,CF_KEY,CF_ITEM,CF_CREEP,
  347.     CF_SETPRINTFUNC,CF_DATA,CF_GETMARK,CF_SETMARK
  348. };
  349.  
  350. typedef struct cfstat {
  351.         unsigned long    st_smhead;
  352.         unsigned long    st_smtail;
  353.         unsigned short    st_id;
  354.         unsigned short    st_keysize;
  355.  
  356.         STOR           st_dups;
  357.         unsigned long  st_bmhead;
  358.         unsigned long  st_bmtail;
  359.         unsigned long  st_mode;
  360.         short st_uid;
  361.         short st_gid;
  362.         long  st_mtime;
  363.         long  st_ctime;
  364.  
  365.         unsigned long  st_highleaf;
  366.         unsigned long  st_size;
  367.         unsigned long  st_alloc;
  368.         unsigned long  st_entrycnt;
  369.         short            st_mapsize;
  370.         unsigned short st_dupids;
  371.  
  372.         long  st_atime;
  373.         long  st_filesize;
  374.         long  st_filealloc;
  375.         long  st_obtype;
  376.         unsigned int st_filedups;
  377.         long  st_ino;
  378.         short st_blksize;
  379.         short st_dev;
  380.         short st_nlink;
  381.         short st_rdev;
  382. } CFSTAT;
  383.  
  384. /* MODE BITS */
  385. #define M_AFMT        (0x30000000)
  386. #define M_ROOTDIR    (0x80000000)
  387. #define M_FILEONLY    (0x40000000)
  388. #define M_HASHDIR    (0x20000000)
  389. #define M_TREEDIR    (0x10000000)
  390. #define M_UNTAGGED    (0x08000000)
  391. #define M_BITMAP    (0x04000000)
  392. #define M_EXTRNFILE    (0x02000000)
  393. #define M_PREALLOC    (0x01000000)
  394. #define M_ZIPFILE    (0x00800000)
  395. #define M_ZIPDATA    (0x00400000)
  396. #define M_CHUNK        (0x00200000)
  397. #define M_VALUE        (0x00100000)
  398. #define M_IFMT        (0x0000F000)
  399. #define M_IFDIR        (0x00004000)
  400. #define M_IFIFO        (0x00002000)
  401. #define M_IFCHR        (0x00001000)
  402. #define M_IFBLK        (0x00003000)
  403. #define M_IFREG        (0x00008000)
  404. #define M_IREAD        (0x00000100)
  405. #define M_IWRITE    (0x00000080)
  406. #define M_IEXEC        (0x00000040)
  407.  
  408.  
  409. extern void *PERMCAT;
  410. extern void *PERMINFO;
  411. extern void *PERMFILE;
  412. extern void *MEMTEMP;
  413. #define MEMTMP MEMTEMP
  414.  
  415. extern char *cff_version;
  416. extern char *cff_copyright;
  417.  
  418.  
  419.  
  420. /* STDIO STUFF */
  421. #ifndef __STDIOH__
  422. #define __STDIOH__
  423.  
  424. #define __BUFSIZ_  (4096)
  425.  
  426. extern  struct  cf_iobuf {
  427.     int      _cnt;
  428.     char*    _ptr;
  429.     char*    _base;
  430.     int         _bufsiz;
  431.     short     _flag;
  432.     unsigned char     _file;
  433.     char     _sbuf;
  434. } cf_iob[];
  435. #endif /* __STDIOH__ */
  436.  
  437. #define cfstdin     (&cf_iob[0])
  438. #define cfstdout    (&cf_iob[1])
  439. #define cfstderr    (&cf_iob[2])
  440. #define cfstdaux    (&cf_iob[3])
  441. #define cfstdprn    (&cf_iob[4])
  442.  
  443. extern void *cf_filelist[];
  444.  
  445. typedef struct cf_iobuf cfFILE;
  446.  
  447. #define cf_IOFBF    (00000)
  448. #define cf_IOREAD   (00001)
  449. #define cf_IOWRT    (00002)
  450. #define cf_IONBF    (00004)
  451. #define cf_IOMYBUF  (00010)
  452. #define cf_IOEOF    (00020)
  453. #define cf_IOERR    (00040)
  454. #define cf_IOSTRG   (00100)
  455. #define cf_IOLBF    (00200)
  456. #define cf_IORW     (00400)
  457. #define cf_IOAPPEND (01000)
  458. #define cf_IOTEXT   (02000)  /* for MSDOS cr/lf style files */
  459.  
  460.  
  461. #define cfgetc(p) (--(p)->_cnt>=0 ? \
  462.   (int)(*(unsigned char*)(p)->_ptr++) : \
  463.   cf_filbuf(p))
  464. #define cfputc(x,p) (--(p)->_cnt>=0? \
  465.   ((int)((unsigned char)((*(p)->_ptr++=(unsigned)(x))))): \
  466.   cf_flsbuf((unsigned)(x),p))
  467.  
  468. #define cfclearerr(p) ((p)->_flag &= ~(cf_IOERR|cf_IOEOF))
  469. #define cfgetchar()   cfgetc(cfstdin)
  470. #define cfputchar(x)  cfputc(x,cfstdout)
  471. #define cffeof(p)     (((p)->_flag&cf_IOEOF)!=0)
  472. #define cfferror(p)   (((p)->_flag&cf_IOERR)!=0)
  473. #define cffileno(p)   (cf_filelist[(p)->_file])
  474.  
  475. int    cf_filbuf(cfFILE*);
  476. int    cf_flsbuf(unsigned, cfFILE*);
  477. int    cffclose(cfFILE*);
  478. cfFILE*  cffdopen(void *, const char*);
  479. int    cffflush(cfFILE*);
  480. int    cffgetc(cfFILE*);
  481. char*  cffgets(char*, int, cfFILE *);
  482. cfFILE*  cffopen(const char*, const char*);
  483. int    cffputc(int, cfFILE*);
  484. int    cffputs(const char*, cfFILE*);
  485. int    cffread(void*, int, int, cfFILE*);
  486. cfFILE*  cffreopen(const char*, const char*, cfFILE*);
  487. int    cffseek(cfFILE*, long, int);
  488. long   cfftell(cfFILE *);
  489. int    cffwrite(const void*, int, int, cfFILE*);
  490. char*  cfgets(char*);
  491. int    cfgetw(cfFILE*);
  492. int    cfputs(const char*);
  493. int    cfputw(int, cfFILE*);
  494. void   cfrewind(cfFILE*);
  495. int    cfsetbuf(cfFILE*, char*);
  496. int    cfsetbuffer(cfFILE*, char*, int);
  497. int    cfsetlinebuf(cfFILE*);
  498. int    cfsetvbuf(cfFILE*, char*, int, int);
  499. int    cfungetc(int, cfFILE*);
  500. int       cffgetpos(cfFILE*, long *);
  501. int       cffsetpos(cfFILE*, long *);
  502. cfFILE *cftmpfile(void);
  503. char   *cftmpnam(char *);
  504. char   *cftempnam(char *, char *);
  505. int    cfprintf(const char *fmt, ...);
  506. int    cfeprintf(const char *fmt, ...);
  507. int cfveprintf(const char *fmt, char *args);
  508. int cffprintf(cfFILE *iop, const char *fmt, ...);
  509. int cfsprintf(char *str, const char *fmt, ...);
  510. int cfvprintf(const char *fmt, char *args);
  511. int cfvvprintf(const char *fmt, char **args);
  512. int cfvfprintf(cfFILE *iop, const char *fmt, char *args);
  513. int cfvvfprintf(cfFILE *iop, const char *fmt, char **args);
  514. int cfvsprintf(char *str, const char *fmt, char *args);
  515. int cfvvsprintf(char *str, const char *fmt, char **args);
  516.  
  517. int cfsscanf(char *str, const char *fmt, ...);
  518. int cfvsscanf(char *str, const char *fmt, char **args);
  519. int cffscanf(cfFILE *iop, const char *fmt, ...);
  520. int cfvfscanf(cfFILE *iop, const char *fmt, char **args);
  521. int cfscanf(const char *fmt, ...);
  522. int cfvscanf(const char *fmt, char **args);
  523.  
  524. void cfinit(char *appname, int lbufpages, char *permfile);
  525. void cfexit();
  526. void cfport_settestflags(int flags);
  527.  
  528. void cfhash(const void *keyptr, int keysize, CAT *cat);
  529. long cfrdwr_object(void *handle, void *userbuffer, long amount, int mode);
  530. long cfseek(void *handle, long amount, int mode);
  531.  
  532. int cfkeycmp (void *keya, int lena, void *keyb, int lenb);
  533. int cflexical_keycmp (void *keya, int lena, void *keyb, int lenb);
  534. int cfitemcmp(void *itema, void *itemb);
  535.  
  536. void cfprintbitmaps(void *something);
  537. void cfprintentries(void *something);
  538. void *cfopen(const char *path, long mode, void *info);
  539. void *cfsubopen(void *handle, const char *name, long mode, void *info);
  540. void *cfopen_chunk(void *handle, void *item);
  541. void *cfmake_chunk(void *handle, void *key, int keylen, int size);
  542. void *cfdup(void *handle);
  543. void cfclose(void *handle);
  544. int cfunlink(void *something, ... );
  545. int cfstat(void *something, void *stbuf);
  546. int cfsubstat(void *handle,const char *name, void *stbuf);
  547. void *cfcopy(void *something_dst, void *something_src);
  548. long cfcopy_file(void *handle_dst, void *handle_src);
  549. int cfcopy_object(void *handle_dst, void *handle_src);
  550. void cftotalloc(void *something, unsigned long *used, unsigned long *alloc);
  551. long cffilesize(void *something);
  552. void *cflocalize(void *handle, void *item);
  553. void cfrelease(void *ptr, long mode);
  554.  
  555. #define cfread(a,b,c) \
  556. cfrdwr_object(a,b,c,S_READBLK)
  557. #define cfwrite(a,b,c) \
  558. cfrdwr_object(a,b,c,S_WRITEBLK)
  559.  
  560. int cfdef(const char *key, const char *def);
  561. int cfsysdef(const char *key, const char *def);
  562. int cfappdef(const char *key, const char *def);
  563. int cfundef(const char *key);
  564. int cfsysundef(const char *key); 
  565. int cfappundef(const char *key);
  566. int cftrn(const char *strn, char **newstrn);
  567. int cfpathtrn(const char *strn, char **newstrn);
  568. void cfflush(void *handle);
  569. void cfsync(void);
  570. int cftruncate(void *something, unsigned long size);
  571.  
  572. int cfqinsert(void *handle,const void *key, int len, void *item);
  573. int cfinsertx(void *handle,const void *key,int len,void *item,int dups,void *adup);
  574. #define cfinsert(handle,keyptr,keylen,itemptr) \
  575. cfinsertx(handle,keyptr,keylen,itemptr,NODUPS,NULL)
  576. #define cfinsert_dupnum(handle,keyptr,keylen,itemptr,dupnum) \
  577. cfinsertx(handle,keyptr,keylen,itemptr,OKDUPS,dupnum)
  578. #define cfinsert_dupname(handle,keyptr,keylen,itemptr,dupname) \
  579. cfinsertx(handle,keyptr,keylen,itemptr,DUPNAMES,dupname)
  580.  
  581. int cfqget(void *handle, const void *keyptr, int keylen, void *bufptr, int buflen);
  582. int cfqfind(void *handle, const void *keyptr, int keylen, Item *keyi, Item *dati);
  583. int cfqfindkey(void *handle, const void *keyptr, int keylen, Item *keyi);
  584. int cfqfinddat(void *handle, const void *keyptr, int keylen, Item *dati);
  585.  
  586. int cffindx(void *handle, const void *keyptr, int keylen, void *itemptr, void *adup);
  587. #define cffind(handle,key,len,item) \
  588. cffindx(handle,key,len,item,NULL)
  589. #define cffind_dupnum(handle,key,len,item,dupnum) \
  590. cffindx(handle,key,len,item,dupnum)
  591. #define cffind_dupname(handle,dupname,itemptr) \
  592. cffindx(handle,dupname,8,itemptr,(void *)0xffffffff)
  593. #define cfreinsert(handle,key,len,item) \
  594. cffindx(handle,key,-len,item,NULL)
  595. #define cfreinsert_dupnum(handle,key,len,item,dupnum) \
  596. cffindx(handle,key,-len,item,dupnum)
  597. #define cfreinsert_dupname(handle,key,len,itemptr,dupname) \
  598. cffindx(handle,dupname,-8,itemptr,(void *)0xffffffff)
  599.  
  600. int cffind_item(void *handle, const void *key, int keylen, void *itemptr);
  601. int cffind_mark(void *handle, void *itemptr);
  602.  
  603. #define cfdelete(a,b,c) \
  604. cfdelete_item(a,b,c,NULL)
  605. int cfdelete_item(void *handle, void *key, int keylen, void *itemptr);
  606. int cfdelete_dupnum(void *handle, void *key, int keylen, long dupnum);
  607. #define cfdelete_lastdupnum(a,b,c) \
  608. cfdelete_dupnum(a,b,c,-1)
  609. int cfdelete_dupname(void *handle, const void *key, int keylen, void *dupname);
  610. int cfdelete_lastdupname(void *handle, const void *key, int keylen);
  611. int cfdelete_alldupnames(void *handle, const void *key, int keylen);
  612. int cfdelete_alldupnums(void *handle, const void *key, int keylen);
  613. int cflastdupname(void *handle, const void *key, int keylen, void *dupname);
  614.  
  615. long cfpush_item(void *handle, void *itemptr);
  616. long cfpush_value(void *handle, unsigned long *value);
  617. long cfpush_data(void *handle, void *datptr, int datsize);
  618. long cfpop_item(void *handle, void *itemptr);
  619. long cfpop_value(void *handle, unsigned long *value);
  620. long cfpop_data(void *handle, void *datptr, int datsize);
  621. long cfstackdepth(void *handle);
  622.  
  623. long cfcountdups(void *handle, void *key, int keylen);
  624. long cfmisc(void *something, int func, ...);
  625.  
  626. void *cfopendir(const void *path);
  627. void cfclosedir(void *it);
  628. CFDIRENT *cfreaddir(void *it);
  629. CFDIRENT *cfreadfulldir(void *it);
  630. void cfrewinddir(void *it);
  631. void cftelldir(void *it, STOR *entry);
  632. void cfseekdir(void *it, STOR *entry);
  633. long cfentrycnt(void *something);
  634.  
  635. int cfseq_dupnum(void *handle, const void *key, int len, void *itemptr, int mode);
  636. #define cfhead_dupnum(a,b,c,d) cfseq_dupnum(a,b,c,d,CF_HEAD)
  637. #define cftail_dupnum(a,b,c,d) cfseq_dupnum(a,b,c,d,CF_TAIL)
  638. #define cfnext_dupnum(a,b,c,d) cfseq_dupnum(a,b,c,d,CF_NEXT)
  639. #define cfprev_dupnum(a,b,c,d) cfseq_dupnum(a,b,c,d,CF_PREV)
  640.  
  641. int cfseq_dupname(void *handle, void *key, int len, void *itemptr, int mode);
  642. #define cfhead_dupname(a,b,c,d) cfseq_dupname(a,b,c,d,CF_HEAD)
  643. #define cftail_dupname(a,b,c,d) cfseq_dupname(a,b,c,d,CF_TAIL)
  644. #define cfnext_dupname(a,b,c,d) cfseq_dupname(a,b,c,d,CF_NEXT)
  645. #define cfprev_dupname(a,b,c,d) cfseq_dupname(a,b,c,d,CF_PREV)
  646.  
  647.  
  648. #define cfdepth(a) \
  649. cfmisc(a, CF_DEPTH)
  650. #define cfmark(a) \
  651. cfmisc(a, CF_MARK)
  652. #define cfgetmark(a,b) \
  653. cfmisc(a, CF_GETMARK, b)
  654. #define cfsetmark(a,b) \
  655. cfmisc(a, CF_SETMARK, b)
  656. #define cfhead(a,b) \
  657. cfmisc(a, CF_HEAD, b)
  658. #define cftail(a,b) \
  659. cfmisc(a, CF_TAIL, b)
  660. #define cfnext(a,b) \
  661. cfmisc(a, CF_NEXT, b)
  662. #define cfprev(a,b) \
  663. cfmisc(a, CF_PREV, b)
  664. #define cfkeylen(a,b) \
  665. cfmisc(a, CF_KEYLEN, b)
  666. #define cfdatalen(a,b) \
  667. cfmisc(a, CF_DATALEN, b)
  668. #define cfbytesused(a) \
  669. cfmisc(a, CF_USED)
  670. #define cfbytesalloc(a) \
  671. cfmisc(a, CF_ALLOC)
  672. #define cfmodbufs(a) \
  673. cfmisc(NULL, CF_MODBUFS, a)
  674. #define cfcurbufs() \
  675. cfmisc(NULL, CF_CURBUFS)
  676. #define cfsetkeycmp(a,b) \
  677. cfmisc(a, CF_SETKEYCMP, b)
  678. #define cfsetitemcmp(a,b) \
  679. cfmisc(a, CF_SETITEMCMP, b)
  680. #define cfseterrfunc(a) \
  681. cfmisc(NULL, CF_SETERRFUNC, a)
  682. #define cfsetprintfunc(a) \
  683. cfmisc(NULL, CF_SETPRINTFUNC, a)
  684. #define cfisnew(a) \
  685. cfmisc(a,CF_ISNEW)
  686. #define cfsetverylazy(a) \
  687. cfmisc(a, CF_LAZY)
  688. #define cfsetlazy(a) \
  689. cfmisc(a, CF_VERYLAZY)
  690. #define cfclrlazy(a) \
  691. cfmisc(a, CF_CLRLAZY)
  692. #define cffilealloc(a) \
  693. cfmisc(a, CF_FILEALLOC)
  694. #define cfprealloc(a) \
  695. cfmisc(a, CF_PREALLOC)
  696. #define cfalignment(a) \
  697. cfmisc(a, CF_ALIGNMENT)
  698. #define cfmapsize(a) \
  699. cfmisc(a, CF_MAPSIZE)
  700. #define cfissorted(a) \
  701. cfmisc(a, CF_ISSORTED)
  702. #define cfkey(ccb,key,len) \
  703. cfmisc(ccb, CF_KEY, key, len)
  704. #define cfitem(ccb, item) \
  705. cfmisc(ccb, CF_ITEM, item)
  706. #define cfdata(ccb, buf, len) \
  707. cfmisc(ccb, CF_DATA, buf, len)
  708.  
  709. void cfpflags(char *name, void *handle);
  710. long cfobtype(void *handle);
  711. void *cfgetspace(void *handle, long amount, void *addr);
  712. int cfretspace(void *handle, void *addr);
  713.  
  714. void *cfputx(void *handle, const void *keyptr, int keylen, void *itemptr,
  715.                     int dupflg, void *adup, void *bufptr, long buflen);
  716. #define cfput(handle,key,len,buf,buflen,itemptr) \
  717. cfputx(handle,key,len,itemptr,NODUPS,NULL,buf,buflen)
  718. #define cfput_dupnum(handle,key,len,buf,buflen,itemptr,dupnum) \
  719. cfputx(handle,key,len,itemptr,OKDUPS,dupnum,buf,buflen)
  720. #define cfput_dupname(handle,key,len,buf,buflen,itemptr,dupname) \
  721. cfputx(handle,key,len,itemptr,DUPNAMES,dupname,buf,buflen)
  722. #define cfreput(handle,key,len,buf,buflen,itemptr) \
  723. cfputx(handle,key,len,itemptr,NODUPS,NULL,buf,-buflen)
  724. #define cfreput_dupnum(handle,key,len,buf,buflen,itemptr,dupnum) \
  725. cfputx(handle,key,len,itemptr,OKDUPS,dupnum,buf,-buflen)
  726. #define cfreput_dupname(handle,key,len,buf,buflen,itemptr,dupname) \
  727. cfputx(handle,key,len,itemptr,DUPNAMES,dupname,buf,-buflen)
  728.  
  729.  
  730. int cfgetx(void *handle, const void *keyptr, int keylen,
  731.                     void *bufptr, long buflen, void *adup);
  732. #define cfget(handle,key,len,buf,buflen) \
  733. cfgetx(handle,key,len,buf,buflen,NULL)
  734. #define cfget_dupnum(handle,key,len,buf,buflen,dupnum) \
  735. cfgetx(handle,key,len,buf,buflen,dupnum)
  736. #define cfget_dupname(handle,dupname,buf,buflen) \
  737. cfgetx(handle,dupname,8,buf,buflen,(void *)0xffffffff)
  738. int cfchdir(char *);
  739. void cfgetcwd(char *cwd, int size);
  740. int cfdozip(void *, int, void *, int, int);
  741. #define cfzip(dst,dsize,src,ssize)\
  742. cfdozip(dst,dsize,src,ssize,0)
  743. #define cfunzip(dst,dsize,src,ssize)\
  744. cfdozip(dst,dsize,src,ssize,-1)
  745.  
  746.  
  747. void *malloc(SIZE_T);
  748. void free(void *);
  749. unsigned mallocsize(const void *);
  750.  
  751. void *calloc(SIZE_T, SIZE_T);
  752. void *realloc(void *, SIZE_T);
  753. void *memalign(unsigned, unsigned);
  754. void *valloc(unsigned);
  755.  
  756. void *mallocC(long, unsigned);
  757. void *callocC(long, unsigned, unsigned);
  758. void *reallocC(long, void *, unsigned);
  759. void *vallocC(long, unsigned);
  760. void *memalignC(long, unsigned, unsigned);
  761. void freeC(long, void *);
  762. void freecat(long);
  763. void *cfmalloc(unsigned, STOR *);
  764. void cffree(STOR *);
  765. void cfmemrange(long category, unsigned int* min, unsigned int* max);
  766. void cftotrange(unsigned int* min, unsigned int* max);
  767. char *cf_find_file(const char *, char *);
  768. void cf_set_search_path(char *);
  769. char *cf_get_search_path(void);
  770.  
  771. extern unsigned long _oxlink_trace;
  772. int oxlink_init ();
  773. int oxlink_load_file (const char *);
  774. int oxlink_load_object(const char*);
  775. void * oxlink_find_symb (const char *);
  776. void *oxlink_find_bare_symb (const char *);
  777. void *oxlink_find_func (const char *);
  778. void *oxlink_find_bare_func (const char *);
  779. int oxlink_unload_file (const char *name, int force);
  780. int oxlink_unload_symb (const char *name, int force);
  781. int oxlink_unload_bare_symb (const char *name, int force);
  782. char **oxlink_list_undefined_sym (void);
  783. int oxlink_export_symb(const char *name, unsigned addr);
  784. int oxlink_export_bare_symb(const char *name, unsigned addr);
  785. int oxlink_unexport_symb(const char *);
  786. int oxlink_unexport_bare_symb(const char *);
  787. void oxlink_demand_load(void);
  788. void oxlink_use_library(const char *);
  789. void oxlink_nouse_library(const char *);
  790. void  *oxlink_resolve_symb(int symnum);
  791. void oxlink_trace(int level);
  792. char *oxlink_symname(int symnum);
  793. void *oxlink_rename_symb(const char *old, const char *new);
  794. int oxlink_rename_file(const char *old, const char *new);
  795. void *oxlink_load_symb(const char *symb, int dynlink);
  796. void *oxlink_load_bare_symb(const char *symb, int dynlink);
  797. int oxlink_scan_file(void *fhandle, void *thandle);
  798. void oxlink_load_thunk(int thunknum);
  799. int oxlink_prep_thunk(const char *symb);
  800. void oxlink_clear_bss(const char *filename);
  801. char *oxlink_file_of(const char *symb);
  802. char *oxlink_file_of_bare(const char *symb);
  803. void *oxlink_get_entry_struct(const char *filename);
  804.  
  805. void oxlink_lib_check(int dynlink);
  806. void oxlink_set_libtype(int type);
  807. void oxlink_set_libnum(int libnum); 
  808. char *oxlink_errstr(void);
  809.  
  810. int NewMallocCategory();
  811.  
  812. /* PATTERN MATCH FLAGS */
  813. #define P_LEADING_DOT    (0x1)
  814. #define P_IS_PATH        (0x2)
  815. #define P_PAT_PATH        (0x4)
  816. #define P_USES_ESCAPES    (0x8)
  817. #define P_PCDOS            (0x10)
  818.  
  819. int pattern_match (const char *pattern, const char *string, int flags);
  820. int check_for_pattern(const char *cp, int flags);
  821.  
  822. /* CTYPE DEFINITIONS */
  823.    
  824. #ifndef _CTYPE_
  825. #define _CTYPE_
  826.  
  827. #ifndef offsetof
  828. #define offsetof(type, member) ((unsigned) &((type *)0)->member)
  829. #endif
  830.  
  831. #define _mU (0x01)
  832. #define _mL (0x02)
  833. #define _mN (0x04)
  834. #define _mX (0x08)
  835. #define _mS (0x10)
  836. #define _mP (0x20)
  837. #define _mC (0x40)
  838. #define _mB (0x80)
  839.  
  840. extern  unsigned char      cfctype[];
  841.    
  842. #define isalpha(c)  (cfctype[(unsigned char) c]&(_mU|_mL))
  843. #define isupper(c)  (cfctype[(unsigned char) c]&_mU)
  844. #define islower(c)  (cfctype[(unsigned char) c]&_mL)
  845. #define isdigit(c)  (cfctype[(unsigned char) c]&_mN)
  846. #define isxdigit(c) (cfctype[(unsigned char) c]&(_mX|_mN))
  847. #define isspace(c)  (cfctype[(unsigned char) c]&_mS)
  848. #define ispunct(c)  (cfctype[(unsigned char) c]&_mP)
  849. #define isalnum(c)  (cfctype[(unsigned char) c]&(_mU|_mL|_mN))
  850. #define isprint(c)  (cfctype[(unsigned char) c]&(_mP|_mU|_mL|_mN|_mB))
  851. #define isgraph(c)  (cfctype[(unsigned char) c]&(_mP|_mU|_mL|_mN))
  852. #define iscntrl(c)  (cfctype[(unsigned char) c]&_mC)
  853. #define isascii(c)  ((unsigned char)(c)<=(0x7f))
  854.  
  855. #define toupper(c)  ({unsigned char _c = (unsigned char)(c); islower(_c) ? (_c-32) : _c; })
  856. #define tolower(c)  ({unsigned char _c = (unsigned char)(c); isupper(_c) ? (_c+32) : _c; })
  857. #define toascii(c)  ((c)&(0x7f))
  858.  
  859. #endif /* _CTYPE_ */
  860.  
  861. /* COS.H */
  862.  
  863. /* in cossys.o -- returns a 28 bit, very random, number */
  864. unsigned long strHash(char *str, int *len); /* ret length if 'len' nonnull */
  865. unsigned long charHash(char);        /* argument size is assumed 1 */
  866. unsigned long shortHash(short);        /* argument size is assumed 2 */
  867. unsigned long longHash();        /* argument size is assumed 4 */
  868. unsigned long longlongHash();    /* argument size is assumed 8 */
  869.  
  870. /*  object must be declared volatile because if the variable is kept in a
  871.     register, it may not be garbage collected  */
  872.  
  873. typedef void * vobject;        /* methods are defined to return vobject, avoids
  874.                                 gcc 'volatile' bug */
  875. #ifdef KERNEL
  876. typedef    struct    _object     * volatile object;
  877. #else
  878. typedef void * object;
  879. #endif
  880.  
  881. typedef    vobject    (*ofun)();    /* note that functions return 'vobject' */
  882. typedef int (*ifun)();
  883. typedef _LONGLONG_ (*llfun)();
  884.  
  885. void    InitCOS(void *);
  886. ofun    _FindMethod(object, object);        /* used internally only */
  887. ofun    _FindMethod2(object, object, int);    /* error if no find */
  888. ofun    _FindMethod3(object, object, int);    /* return nulfunc if no find */
  889. ofun    FindMethod(object, object, int);    /* return NULL if no find */
  890. vobject    FindMethodObject(object, object, int);
  891. vobject    _jumpToMethod(ofun f);
  892. _LONGLONG_ _callExtern(void *fp, void *sp, void *ap, int ac);
  893. _LONGLONG_ _callExtern1(void *fp, void *sp, void *ap, int ac);
  894. void    *GetIVptr(object, object);
  895. int    IsObj(object);
  896.  
  897. #define TRACE_DONT_CARE        0
  898. #define TRACE_OFF        1
  899. #define TRACE_ON        2
  900. #define TRACE_ALL        3
  901.  
  902.  
  903. #define _cat5_(a, b, c, d, e) a##b##c##d##e
  904. #define _5cat_(a, b, c, d, e) _cat5_(a, b, c, d, e)
  905. #define _cat4_(a, b, c) a##b##c##d
  906. #define _4cat_(a, b, c, d) _cat4_(a, b, c, d)
  907. #define _cat3_(a, b, c) a##b##c
  908. #define _3cat_(a, b, c) _cat3_(a, b, c)
  909. #define    _cat2_(a, b)    a##b
  910. #define _cat_(a, b)    _cat2_(a, b)
  911. #define CLASS_I        _cat_(CLASS, _i)
  912. #define CLASS_C        _cat_(CLASS, _c)
  913. #define CLASS_A        _cat_(CLASS, _a)
  914. #define Generic(x)    _cat_(x, _i)
  915. #define Genericm(x)    _cat_(g, Generic(x))
  916.  
  917. #define _cname2_(x)    #x
  918. #define _cname1_(x)    _cname2_(x)
  919. #define cName        _cname1_(CLASS)
  920.  
  921. #define _im2_(x)    Init##x##Class
  922. #define _im_(x)        _im2_(x)
  923. #define InitMethod    void    _im_(CLASS)
  924.  
  925.  
  926. #define ivType        struct    CLASS_I
  927. #define ivTypedef    typedef struct CLASS_I
  928. #define cvType        struct    CLASS_C
  929. #define cvTypedef    typedef struct CLASS_C
  930. #define instanceVars    ivType
  931. #define classVars    cvType
  932.  
  933. #define ivPtr(x)    ((ivType *) GetIVptr((x), CLASS))
  934. #define cvsPtr        ((cvType *) GetIVptr(CLASS, ClassOf(CLASS)))
  935. #define ivsPtr        ivPtr(self)
  936. #define accessCVs    cvType *cv = cvsPtr
  937. #define accessIVs    ivType *iv = ivsPtr
  938.  
  939. #ifdef KERNEL
  940. #define usesClass(c)    { if (c == NULL) Init##c##Class(); }
  941. #define iMethod(x)    gNew(Method, #x, CLASS, Genericm(x), x)
  942. #define cMethod(x)    gNew(Method, #x, ClassOf(CLASS), Genericm(x), x)
  943. #define iMethodFor(x,y)    gNew(Method, #y, CLASS, Generic(x), y)
  944. #define cMethodFor(x,y)    gNew(Method, #y, ClassOf(CLASS), Generic(x), y)
  945. #else
  946. #define usesClass(c)
  947. #define IMethod(x)    ({extern vobject Genericm(x); gNew(Method, #x, CLASS, Genericm(x), x);})
  948. #define CMethod(x)    ({extern vobject Genericm(x); gNew(Method, #x, ClassOf(CLASS), Genericm(x), x);})
  949. #define IMethodFor(x,y)    ({extern vobject Generic(x);gNew(Method, #y, CLASS, Generic(x), y);})
  950. #define CMethodFor(x,y)    ({extern vobject Generic(x);gNew(Method, #y, ClassOf(CLASS), Generic(x), y);})
  951. #define iMethod(x)    ({extern vobject Genericm(x); gNew(Method, #x, CLASS, Genericm(x), x);})
  952. #define cMethod(x)    ({extern vobject Genericm(x); gNew(Method, #x, ClassOf(CLASS), Genericm(x), x);})
  953. #define iMethodFor(x,y)    ({extern vobject Generic(x);gNew(Method, #y, CLASS, Generic(x), y);})
  954. #define cMethodFor(x,y)    ({extern vobject Generic(x);gNew(Method, #y, ClassOf(CLASS), Generic(x), y);})
  955. #endif
  956.  
  957. #define ivSize        sizeof(instanceVars)
  958. #define cvSize        sizeof(classVars)
  959.  
  960. #define ClassOf(x)    (vobject) *((object *) (x))
  961. #define method        static
  962. #define imethod        method
  963. #define cmethod        method
  964. #define END        (vobject) 0
  965.  
  966. #define IsInstanceOf(i,c)    (ClassOf(i) == (c))
  967. #define IsaMetaClass(x)        (ClassOf(x) == MetaClass)
  968. #define IsaClass(x)        (IsaMetaClass(ClassOf(x)) || IsaMetaClass(x))
  969.  
  970. #define EQ(a,b)        ((a) == (b))
  971. #define NEQ(a,b)    ((a) != (b))
  972.  
  973.  
  974.  
  975. #define tFindMethod(t, c, g, l)  (*(t (*)()) _FindMethod2(c, g, l))
  976.  
  977. #ifndef KERNEL
  978. #define super(g)    ({extern vobject Generic(g);(*_FindMethod2(CLASS, Generic(g), 2));})
  979. #define cSuper(g)    ({extern vobject Generic(g);(*_FindMethod2(ClassOf(CLASS), Generic(g), 2));})
  980. #define typedSuper(t,g)    ({extern vobject Generic(g);(*tFindMethod(t, ClassOf(self), Generic(g), 2));})
  981. #define mSuper(g,c) ({extern vobject Generic(g);(*_FindMethod2(c, Generic(g), 2));})
  982. #define mDirect(g,c) ({extern vobject Generic(g);(*_FindMethod2(c, Generic(g), 1));})
  983. #define mSuperNoError(g,c) ({extern vobject Generic(g);(*_FindMethod3(c, Generic(g), 2));})
  984. #define mDirectNoError(g,c) ({extern vobject Generic(g);(*_FindMethod3(c, Generic(g), 1));})
  985.  
  986.  
  987. /* get instance method from a class object */
  988. #define imcPointer(c,g)  (ofun)({extern vobject Generic(g);gFindMethod(c, Generic(g), 1);})
  989. /* get class method from a class object */
  990. #define cmcPointer(c,g)  (ofun)({extern vobject Generic(g);gFindMethod(ClassOf(c), Generic(g), 1);})
  991. /* get instance method from an instance object */
  992. #define imiPointer(i,g)  (ofun)({extern vobject Generic(g);gFindMethod(ClassOf(i), Generic(g), 1);})
  993. /* get class method from an instance object */
  994. #define cmiPointer(i,g)  (ofun)({extern vobject Generic(g);gFindMethod(ClassOf(ClassOf(i)), Generic(g), 1);})
  995. #define RespondsTo(i,g)    (ofun)({extern vobject Generic(g);(gFindMethod(ClassOf(i), Generic(g), 1) != NULL);})
  996.  
  997. extern object Class;
  998. extern object Method;
  999. extern object COS;
  1000. extern vobject gNew(object, ...);
  1001. extern vobject gDispose(object);
  1002. extern ofun gFindMethod();
  1003. extern vobject LoadClass(void *);
  1004.  
  1005. #else /* KERNEL */
  1006. #define super(g)    (*_FindMethod2(CLASS, Generic(g), 2))
  1007. #define cSuper(g)    (*_FindMethod2(ClassOf(CLASS), Generic(g), 2))
  1008. #define typedSuper(t,g)    (*tFindMethod(t, ClassOf(self), Generic(g), 2))
  1009. /* get instance method from a class object */
  1010. #define imcPointer(c,g)  gFindMethod(c, Generic(g), 1)
  1011. /* get class method from a class object */
  1012. #define cmcPointer(c,g)  gFindMethod(ClassOf(c), Generic(g), 1)
  1013. /* get instance method from an instance object */
  1014. #define imiPointer(i,g)  gFindMethod(ClassOf(i), Generic(g), 1)
  1015. /* get class method from an instance object */
  1016. #define cmiPointer(i,g)  gFindMethod(ClassOf(ClassOf(i)), Generic(g), 1)
  1017. #define RespondsTo(i,g)    (gFindMethod(ClassOf(i), Generic(g), 1) != NULL)
  1018. #define mDirect(g,c) (*_FindMethod2(c, Generic(g), 1))
  1019. #endif /* KERNEL */
  1020.  
  1021. #define typedGeneric(t,g)     (*(t (*)()) &g)
  1022.  
  1023.  
  1024. #define RegisterVariable(v)    gRegisterMemory(COS, &v, (long) sizeof(object))
  1025.  
  1026. #define makeThenAccess(self, obj, iv)          \
  1027.     object    obj = cSuper(gNew)(self);    \
  1028.     ivType    *iv = ivPtr(obj)
  1029.  
  1030. extern    int    _CheckObjects_;
  1031. extern    object    _LastGeneric_;        /*  last generic called  */
  1032.  
  1033. #define ChkArg(obj, argn)                        \
  1034.     if (_CheckObjects_  &&  !IsObj(obj))                \
  1035.         gInvalidObject(_LastGeneric_, argn, self)
  1036.  
  1037. #define ChkArgTyp(obj, argn, argType)                    \
  1038.     if (_CheckObjects_)  {                        \
  1039.         if (!IsObj(obj))                    \
  1040.             gInvalidObject(_LastGeneric_, argn, self);    \
  1041.         if (argType)  {                        \
  1042.             object    lg = _LastGeneric_;            \
  1043.             if (!gIsKindOf(obj, argType))            \
  1044.                 gInvalidType(lg, argn, self, argType, obj); \
  1045.             _LastGeneric_ = lg;                \
  1046.         }                            \
  1047.     }
  1048.  
  1049. #define ChkArgNul(obj, argn)           if (obj)  ChkArg(obj, argn)
  1050.  
  1051. #define ChkArgTypNul(obj, argn, argType)     \
  1052.     if (obj)  ChkArgTyp(obj, argn, argType)
  1053.  
  1054. #define CheckArg(obj, argn, argType)                    \
  1055.     if (_CheckObjects_)  {                        \
  1056.         if (!IsObj(obj))                    \
  1057.             gInvalidObject(_LastGeneric_, argn, self);    \
  1058.         if (argType)  {                        \
  1059.             object    lg = _LastGeneric_;            \
  1060.             if (!gIsKindOf(obj, argType))            \
  1061.                 gInvalidType(lg, argn, self, argType, obj); \
  1062.             _LastGeneric_ = lg;                \
  1063.         }                            \
  1064.     }
  1065.  
  1066.  
  1067. /*  Thread stuff  */
  1068.  
  1069.  
  1070. /*  thread states   */
  1071.  
  1072. #define NEW_THREAD            (0)
  1073. #define    RUNNING_THREAD        (1)
  1074. #define HOLD_THREAD            (2)
  1075. #define DONE_THREAD            (3)
  1076. #define EXPUNGE_THREAD        (4)
  1077. #define WAITING_FOR_THREAD    (5)
  1078. #define WAITING_FOR_SEMAPHORE    (6)
  1079.  
  1080. #define DEFAULT_PRIORITY    100
  1081.  
  1082. #define TIMESTAMP (OXPORT_timestamp())
  1083. #define THREAD_COUNTDOWN (OXPORT_thread_countdown())
  1084. #define THREAD_MSEC (oxport_thread_msec)
  1085. #define MSEC_PER_TICK (55)
  1086. #define DEFAULT_THREAD_MSEC MSEC_PER_TICK
  1087.  
  1088. extern    unsigned long    _final_thread_tick;
  1089. extern    int    _no_context_switch;
  1090. extern    jmp_buf    _t_start;
  1091.  
  1092. extern    void    (*__cos_yield)();
  1093. extern    void    _start_threader(), _start_thread();
  1094.  
  1095. #define INHIBIT_THREADER    _no_context_switch++
  1096. #define ENABLE_THREADER        if (_no_context_switch) _no_context_switch--
  1097.  
  1098. #if 0  /*  Debugging or to disable Threads  */
  1099. #define YIELD    
  1100. #else
  1101. #define YIELD    ({if (!_no_context_switch){if(THREAD_COUNTDOWN){(*__cos_yield)(0);}}})
  1102. #endif
  1103.  
  1104. #define StartThreader(x)        \
  1105.     _start_threader(&x);        \
  1106.     if (setjmp(_t_start))        \
  1107.         _start_thread()
  1108.  
  1109.  
  1110. /*  End of thread specific stuff  */
  1111.  
  1112. /* Message dispatch */
  1113. #define __CFWNDCLASS_ID__ 0xd24f193c
  1114. #define __CFMSGCLASS_ID__ 0x87104be5
  1115.  
  1116. typedef struct __mdis__ {
  1117.     long id;
  1118.     _LONGLONG_ (*defproc)();
  1119.     _LONGLONG_ (*usrproc)();
  1120. } *MD, MDIV;
  1121.  
  1122. #define ClassMsgProc(cl) \
  1123. ({MD biv=GetIVptr(self,cl);(*biv->defproc)(self,wnd,it);})
  1124.  
  1125. #define DefaultMsgProc() \
  1126. ({MD biv=GetIVptr(self,ClassOf(self));(*biv->defproc)(self,wnd,it);})
  1127.  
  1128. #define Mfunc(a) _5cat_(CLASS,_,MPROC,_,a)
  1129.  
  1130. #if 0
  1131. #define MsgFunc(a) _LONGLONG_ Mfunc(a)(object self,WINDOW wnd,CFmsg it,CLASS_I *iv,CLASS_C *cv)
  1132. #else
  1133. #define MsgFunc(a) _LONGLONG_ Mfunc(a)(MSGARGS *args)
  1134. #endif
  1135.  
  1136. typedef struct msgbitstuf {
  1137. void *cmdDict;
  1138. vobject bitVec;
  1139. int (*bitTest)();    
  1140. } MSGBITSTUF;
  1141.  
  1142. #define MSGARGS CLASS_A
  1143.  
  1144. #define MSGARGDEF \
  1145. typedef struct CLASS_A { \
  1146.     vobject self; \
  1147.     struct window  *wnd; \
  1148.     CFmsg it; \
  1149.     CLASS_I *iv; \
  1150.     CLASS_C *cv; \
  1151.     MSGBITSTUF bs; \
  1152.     char *fn; \
  1153. } CLASS_A;
  1154.  
  1155. #define TO_SUPERCLASS (0x7a6b290cf31e4811LL)
  1156.  
  1157. #define CLASSMSG(args...) \
  1158. ({\
  1159. extern _LONGLONG_ MASTERdomsg();\
  1160. static MSGARGS margs = {fn: "_" cName "_" __FUNCTION__ "_"};\
  1161. _LONGLONG_ result; \
  1162. if(it.e_type == evAddCmd) {\
  1163. if(margs.bs.bitVec)\
  1164.   if(margs.bs.bitTest(margs.bs.bitVec, it.m_lparam))\
  1165.     gReset(margs.bs.bitVec, it.m_lparam);\
  1166.   result = 0;\
  1167. }else {\
  1168. margs.cv = cvsPtr;\
  1169. margs.iv = ivsPtr;\
  1170. margs.it = it;\
  1171. margs.wnd = wnd;\
  1172. margs.self = self;\
  1173. result = MASTERdomsg(&margs , ## args);\
  1174. }\
  1175. result;})
  1176.  
  1177. #if 0
  1178. #define defGeneric(t, g)                       \
  1179.     object    Generic(g) = (vobject) 0;            \
  1180.     t    g(object i, ...)            \
  1181.         {                            \
  1182.         if (_CheckObjects_)  {                \
  1183.             if (!IsObj(i))                \
  1184.                 gInvalidObject(Generic(g), 1, i);  \
  1185.             _LastGeneric_ = Generic(g);        \
  1186.         }                        \
  1187.         YIELD;                        \
  1188.         _jumpToMethod( _FindMethod(ClassOf(i), Generic(g), 1) ); \
  1189.     }
  1190. #else
  1191. #define defGeneric(t, g)                       \
  1192.     object    Generic(g) = (object) 0;            \
  1193.     t    g(object i, ...)            \
  1194.     {                            \
  1195.         _jumpToMethod( _FindMethod(i, Generic(g)) );     \
  1196.     }
  1197. #endif
  1198.  
  1199. #define externGeneric(t, g)                    \
  1200.     extern    object    Generic(g);                \
  1201.     extern    t    g(object i, ...);
  1202.  
  1203. #define InitGeneric(x)    Generic(x) = gNew(GenericFunction, #x)
  1204.  
  1205. #define _qt2_(x) #x
  1206. #define _qt_(x) _qt2_(x)
  1207.  
  1208. #define oxcall(func, args...) ({ \
  1209. typedef _fret = (func()); \
  1210. _fret (*dofunc)(); _fret _ret; \
  1211. dofunc = oxlink_find_bare_func(_qt_(_cat_(_, func))); \
  1212. if(!dofunc) \
  1213. dofunc = oxlink_load_bare_symb(_qt_(_cat_(_, func)),1); \
  1214. else oxlink_clear_bss(oxlink_file_of_bare(_qt_(_cat_(_, func))));\
  1215. if(dofunc) _ret = dofunc(## args); \
  1216. else _ret = (_fret) -1; \
  1217. _ret;})
  1218.  
  1219.  
  1220. #define oxrun(func, args...) ({ \
  1221. typedef _fret = (func()); \
  1222. _fret (*dofunc)(); _fret _ret; \
  1223. dofunc = oxlink_find_bare_func(_qt_(_cat_(_, func))); \
  1224. if(!dofunc) \
  1225. dofunc = oxlink_load_bare_symb(_qt_(_cat_(_, func)),1); \
  1226. if(dofunc) { _ret = dofunc(## args);gGC(COS);oxlink_unload_symb(#func, 0); } \
  1227. else _ret = (_fret) -1; \
  1228. _ret;})
  1229.  
  1230. #define oxfunc(func, args...) ({ \
  1231. typedef _fret = (appfunc()); \
  1232. _fret (*dofunc)(); _fret _ret; \
  1233. dofunc = oxlink_load_bare_symb(func,1); \
  1234. if(dofunc) _ret = dofunc(## args); \
  1235. else _ret = (_fret) -1; \
  1236. _ret;})
  1237.  
  1238. #define oxload_bare(func) \
  1239. oxlink_load_bare_symb(_qt_(_cat_(_, func)),1)
  1240.  
  1241. #define oxload(func) \
  1242. oxlink_load_symb(#func,1)
  1243.  
  1244. #define oxunload(func) \
  1245. oxlink_unload_symb(#func, 0)
  1246.  
  1247.  
  1248. #define DISPATCH_MESSAGES \
  1249. ({extern vobject Thread; vobject _th = (vobject)gFind(Thread, NULL); \
  1250. while(DispatchMessages(_th));})
  1251.  
  1252. #define INIT_IO(arg) \
  1253. ({_LONGLONG_ AppMsg();CF_InitIO(arg, AppMsg); \
  1254. if((arg & (CF_USE_MESSAGES|CF_USE_EVENTS)) && !(arg & CF_USE_GUI)) { \
  1255. extern object Absorber; \
  1256. extern object Application; \
  1257. vobject pgm = gNew(Absorber, AppMsg); \
  1258. Application = Absorber; \
  1259. CaptureKeyboard(pgm, 0);}})
  1260.  
  1261. extern void *_cos_malloc(unsigned);
  1262. extern void *_cos_calloc(unsigned, unsigned);
  1263. extern void *_cos_realloc(void *, unsigned);
  1264. #define     Talloc(t)   (t *) _cos_malloc(sizeof(t))
  1265. #define     Tcalloc(t)  (t *) _cos_calloc(1, sizeof(t))
  1266. #define     Tnalloc(t,n)   (t *) _cos_malloc((n) * sizeof(t))
  1267. #define     Tncalloc(t,n)  (t *) _cos_calloc((n), sizeof(t))
  1268. #define  Tnrealloc(t,n,b) (t *) _cos_realloc(b, (n) * sizeof(t))
  1269.  
  1270. #ifdef KERNEL
  1271. #include <generics.h>
  1272. #endif /* KERNEL */
  1273.  
  1274. /*  from the Stream class  */
  1275. extern    object    stdoutStream, stdinStream, stderrStream;
  1276. extern    object    traceStream;
  1277.  
  1278. void    *MA_malloc(unsigned, void *);
  1279. void    MA_free(void *);
  1280. void    *MA_realloc(void *, unsigned);
  1281. void    MA_compact(void);
  1282. void    *MA_calloc(unsigned, void *);
  1283.  
  1284. #define     MTncalloc(t,n,v)  (t *) MA_calloc((n) * sizeof(t), &v)
  1285. #define     MTnalloc(t,n,v)   (t *) MA_malloc((n) * sizeof(t), &v)
  1286.  
  1287. /* KEYCODES */
  1288. /* ----------- keys ------------ */
  1289.  
  1290. /* 
  1291.     This file defines all extended keys which can be read from DOS in
  1292.     raw unfiltered mode with CTRL BREAK checking turned off. i.e.
  1293.     the first character read is == 0 and the second character contains
  1294.     a scan code. Here we create a 2 byte character with the scan code
  1295.     in the low order byte and a flag bit in the high order byte.
  1296.     
  1297.     Non printable characters created by typing the CTRL key are also
  1298.     defined here.
  1299. */
  1300. /* 
  1301.     Believe it or not, gcc 2.2.2 has a bug which causes parsing to fail
  1302.     if a hex constant ends in E or e. So you will see decimal values
  1303.     occasionally. [NDC]
  1304. */
  1305. #define EFLAG         (0x0100)
  1306. #define SHIFTFLAG    (0x0200)
  1307. #define ALTFLAG        (0x0400)
  1308. #define CTRLFLAG    (0x0800)
  1309.  
  1310. #define CTL_AT    (0x0)
  1311. #define NUL        (0x0)
  1312. #define CTL_A    (0x1)
  1313. #define SOH        (0x1) 
  1314. #define CTL_B    (0x2)
  1315. #define STX        (0x2)
  1316. #define CTL_C    (0x3)
  1317. #define ETX        (0x3)
  1318. #define CTL_D    (0x4)
  1319. #define EOT        (0x4)
  1320. #define CTL_E    (0x5)
  1321. #define ENQ        (0x5)
  1322. #define CTL_F    (0x6)
  1323. #define ACK        (0x6)
  1324. #define CTL_G    (0x7)
  1325. #define BELL    (0x7)
  1326. #define CTL_H    (0x8)
  1327. #define RUBOUT    (0x8)
  1328. #define BS        (0x8)
  1329. #define CTL_I    (0x9)
  1330. #define HT        (0x9)
  1331. #define TAB        (0x9)
  1332. #define CTL_J    (0xA)
  1333. #define LF        (0xA)
  1334. #define CTL_K    (0xB)
  1335. #define VT        (0xB)
  1336. #define CTL_L    (0xC)
  1337. #define FF        (0xC)
  1338. #define CTL_M    (0xD)
  1339. #define CR        (0xD)
  1340. #define ENTER    (0xD)
  1341. #define CTL_N    (6)
  1342. #define SO        (6)
  1343. #define CTL_O    (0xF)
  1344. #define SI        (0xF)
  1345. #define CTL_P    (0x10)
  1346. #define DLE        (0x10)
  1347. #define CTL_Q    (0x11)
  1348. #define DC1        (0x11)
  1349. #define CTL_R    (0x12)
  1350. #define DC2        (0x12)
  1351. #define CTL_S    (0x13)
  1352. #define DC3        (0x13)
  1353. #define CTL_T    (0x14)
  1354. #define DC4        (0x14)
  1355. #define CTL_U    (0x15)
  1356. #define NAK        (0x15)
  1357. #define CTL_V    (0x16)
  1358. #define SYN        (0x16)
  1359. #define CTL_W    (0x17)
  1360. #define ETB        (0x17)
  1361. #define CTL_X    (0x18)
  1362. #define CAN        (0x18)
  1363. #define CTL_Y    (0x19)
  1364. #define EM        (0x19)
  1365. #define CTL_Z    (0x1A)
  1366. #define SUB        (0x1A)
  1367. #define CTL_LBRK    (0x1B)
  1368. #define ESCKEY        (0x1B)
  1369. #define CTL_BKSLSH    (0x1C)
  1370. #define FS            (0x1C)
  1371. #define CTL_RBRK    (0x1D)
  1372. #define GS            (0x1D)
  1373. #define CTL_CARAT    (30) 
  1374. #define RS            (30)
  1375. #define CTL_HYPHEN    (0x1F)
  1376. #define US            (0x1F)
  1377. #define CTL_BS        (0x7F)
  1378. #define ASCIDEL        (0x7F)
  1379. #define SLASHKEY     ('/')
  1380. #define SPACEKEY     (' ')
  1381.  
  1382. #define F1            (0x3B+EFLAG)
  1383. #define F2            (0x3C+EFLAG)
  1384. #define F3            (0x3D+EFLAG)
  1385. #define F4            (62+EFLAG)
  1386. #define F5            (0x3F+EFLAG)
  1387. #define F6            (0x40+EFLAG)
  1388. #define F7            (0x41+EFLAG)
  1389. #define F8            (0x42+EFLAG)
  1390. #define F9            (0x43+EFLAG)
  1391. #define F10            (0x44+EFLAG)
  1392. #define F11            (0x85+EFLAG)
  1393. #define F12            (0x86+EFLAG)
  1394. #define SHIFT_F1    (0x54+EFLAG)
  1395. #define SHIFT_F2    (0x55+EFLAG)
  1396. #define SHIFT_F3    (0x56+EFLAG)
  1397. #define SHIFT_F4    (0x57+EFLAG)
  1398. #define SHIFT_F5    (0x58+EFLAG)
  1399. #define SHIFT_F6    (0x59+EFLAG)
  1400. #define SHIFT_F7    (0x5A+EFLAG)
  1401. #define SHIFT_F8    (0x5B+EFLAG)
  1402. #define SHIFT_F9    (0x5C+EFLAG)
  1403. #define SHIFT_F10    (0x5D+EFLAG)
  1404. #define SHIFT_F11    (0x87+EFLAG)
  1405. #define SHIFT_F12    (0x88+EFLAG)
  1406. #define CTRL_F1        (94+EFLAG)
  1407. #define CTRL_F2     (0x5F+EFLAG)
  1408. #define CTRL_F3     (0x60+EFLAG)
  1409. #define CTRL_F4     (0x61+EFLAG)
  1410. #define CTRL_F5     (0x62+EFLAG)
  1411. #define CTRL_F6     (0x63+EFLAG)
  1412. #define CTRL_F7     (0x64+EFLAG)
  1413. #define CTRL_F8     (0x65+EFLAG)
  1414. #define CTRL_F9     (0x66+EFLAG)
  1415. #define CTRL_F10    (0x67+EFLAG)
  1416. #define CTRL_F11    (0x89+EFLAG)
  1417. #define CTRL_F12    (0x8A+EFLAG)
  1418. #define ALT_F1      (0x68+EFLAG)
  1419. #define ALT_F2      (0x69+EFLAG)
  1420. #define ALT_F3      (0x6A+EFLAG)
  1421. #define ALT_F4      (0x6B+EFLAG)
  1422. #define ALT_F5      (0x6C+EFLAG)
  1423. #define ALT_F6      (0x6D+EFLAG)
  1424. #define ALT_F7        (110+EFLAG)
  1425. #define ALT_F8      (0x6F+EFLAG)
  1426. #define ALT_F9      (0x70+EFLAG)
  1427. #define ALT_F10     (0x71+EFLAG)
  1428. #define ALT_F11     (0x8B+EFLAG)
  1429. #define ALT_F12     (0x8C+EFLAG)
  1430.  
  1431. #define HOMEKEY        (0x47+EFLAG)
  1432. #define UPKEY        (0x48+EFLAG)
  1433. #define PGUP        (0x49+EFLAG)
  1434. #define BAKKEY        (0x4B+EFLAG)
  1435. #define FWDKEY        (0x4D+EFLAG)
  1436.  
  1437. #define ENDKEY        (0x4F+EFLAG)
  1438. #define DNKEY        (0x50+EFLAG)
  1439. #define PGDN        (0x51+EFLAG)
  1440. #define INSERTKEY    (0x52+EFLAG)
  1441. #define DELETEKEY    (0x53+EFLAG)
  1442.  
  1443. #define CTRL_HOME    (0x77+EFLAG)
  1444. #define CTRL_UP        (0x8D+EFLAG)
  1445. #define CTRL_PGUP    (0x84+EFLAG)
  1446. #define CTRL_BAK    (0x73+EFLAG)
  1447. #define CTRL_FWD    (0x74+EFLAG)
  1448. #define CTRL_END    (0x75+EFLAG)
  1449. #define CTRL_DN        (0x91+EFLAG)
  1450. #define CTRL_PGDN    (0x76+EFLAG)
  1451. #define CTRL_INSERT    (0x92+EFLAG)
  1452. #define CTRL_DELETE    (0x93+EFLAG)
  1453. #define CTRL_HT        (0x94+EFLAG)
  1454. #define CTRL_TAB    CTRL_HT
  1455. #define CTRL_2        (0x03+EFLAG)
  1456.  
  1457. /* keypad keys */
  1458. #define KP_FIVE            (0x4c+EFLAG)
  1459. #define CTRL_KP_SLASH    (0x95+EFLAG)
  1460. #define CTRL_KP_STAR    (0x96+EFLAG)
  1461. #define CTRL_KP_PLUS    (0x90+EFLAG)
  1462. #define CTRL_KP_MINUS    (142+EFLAG)
  1463. #define CTRL_KP_FIVE    (0x8F+EFLAG)
  1464.  
  1465. /* *** GRAY CENTER KEYS ONLY *** */
  1466. #define ALT_HOME    (0x97+EFLAG)
  1467. #define ALT_UP        (0x98+EFLAG)
  1468. #define ALT_PGUP    (0x99+EFLAG)
  1469. #define ALT_BAK        (0x9B+EFLAG)
  1470. #define ALT_FWD        (0x9D+EFLAG)
  1471. #define ALT_END        (0x9F+EFLAG)
  1472. #define ALT_DN        (0xA0+EFLAG)
  1473. #define ALT_PGDN    (0xA1+EFLAG)
  1474. #define ALT_INSERT    (0xA2+EFLAG)
  1475. #define ALT_DELETE    (0xA3+EFLAG)
  1476. /* ****************************** */
  1477.  
  1478. #define ALT_A        (30+EFLAG)
  1479. #define ALT_B        (0x30+EFLAG)
  1480. #define ALT_C        (46+EFLAG)
  1481. #define ALT_D        (0x20+EFLAG)
  1482. #define ALT_E        (0x12+EFLAG)
  1483. #define ALT_F        (0x21+EFLAG)
  1484. #define ALT_G        (0x22+EFLAG)
  1485. #define ALT_H        (0x23+EFLAG)
  1486. #define ALT_I        (0x17+EFLAG)
  1487. #define ALT_J        (0x24+EFLAG)
  1488. #define ALT_K        (0x25+EFLAG)
  1489. #define ALT_L        (0x26+EFLAG)
  1490. #define ALT_M        (0x32+EFLAG)
  1491. #define ALT_N        (0x31+EFLAG)
  1492. #define ALT_O        (0x18+EFLAG)
  1493. #define ALT_P        (0x19+EFLAG)
  1494. #define ALT_Q        (0x10+EFLAG)
  1495. #define ALT_R        (0x13+EFLAG)
  1496. #define ALT_S        (0x1F+EFLAG)
  1497. #define ALT_T        (0x14+EFLAG)
  1498. #define ALT_U        (0x16+EFLAG)
  1499. #define ALT_V        (0x2F+EFLAG)
  1500. #define ALT_W        (0x11+EFLAG)
  1501. #define ALT_X        (0x2D+EFLAG)
  1502. #define ALT_Y        (0x15+EFLAG)
  1503. #define ALT_Z        (0x2C+EFLAG)
  1504. #define ALT_1        (0x78+EFLAG)
  1505. #define ALT_2        (0x79+EFLAG)
  1506. #define ALT_3        (0x7A+EFLAG)
  1507. #define ALT_4        (0x7B+EFLAG)
  1508. #define ALT_5        (0x7C+EFLAG)
  1509. #define ALT_6        (0x7D+EFLAG)
  1510. #define ALT_7        (126+EFLAG)
  1511. #define ALT_8        (0x7F+EFLAG)
  1512. #define ALT_9        (0x80+EFLAG)
  1513. #define ALT_0        (0x81+EFLAG)
  1514. #define ALT_HYPHEN    (0x82+EFLAG)
  1515. #define ALT_EQUALS    (0x83+EFLAG)
  1516. #define ALT_LBRK    (0x1A+EFLAG)
  1517. #define ALT_RBRK    (0x1B+EFLAG)
  1518. #define ALT_SEMI    (0x27+EFLAG)
  1519. #define ALT_RAPOS    (0x28+EFLAG)
  1520. #define ALT_LAPOS    (0x29+EFLAG)
  1521. #define ALT_BKSLSH    (0x2B+EFLAG)
  1522. #define ALT_COMMA    (0x33+EFLAG)
  1523. #define ALT_PERIOD    (0x34+EFLAG)
  1524. #define ALT_SLASH    (0x35+EFLAG)
  1525. #define ALT_BS        (6+EFLAG)
  1526. #define ALT_ENTER    (0x1C+EFLAG)
  1527. #define ALT_HT        (0xA5+EFLAG)
  1528. #define ALT_TAB        ALT_HT
  1529. #define ALT_ESC        (0x01+EFLAG)
  1530.  
  1531. /* keypad keys */
  1532. #define ALT_KP_ENTER    (0xA6+EFLAG)
  1533. #define ALT_KP_PLUS        (78+EFLAG)
  1534. #define ALT_KP_MINUS    (0x4A+EFLAG)
  1535. #define ALT_KP_STAR        (0x37+EFLAG)
  1536. #define ALT_KP_SLASH    (0xA4+EFLAG)
  1537.  
  1538. #define SHIFT_HT        (0x0F+EFLAG)
  1539. #define SHIFT_TAB         SHIFT_HT
  1540. /* 
  1541.     Artificial codes produced by testing the shift states
  1542.  
  1543.     Unused codes:
  1544.     02,04,05,06,07,08,09,0A,0B,0C,0D,2A,36,38,39,3A,45,46,
  1545.     72,9A,A7-AF,BC-BF,C0-CF,E0-EF,F0-FF
  1546. */
  1547.  
  1548. #define SHIFT_INSERT        (INSERTKEY+SHIFTFLAG)
  1549. #define SHIFT_END            (ENDKEY+SHIFTFLAG)
  1550. #define SHIFT_DN            (DNKEY+SHIFTFLAG)
  1551. #define SHIFT_PGDN            (PGDN+SHIFTFLAG)
  1552. #define SHIFT_BAK            (BAKKEY+SHIFTFLAG)
  1553. #define SHIFT_KP_FIVE        (KP_FIVE+SHIFTFLAG)
  1554. #define SHIFT_FWD            (FWDKEY+SHIFTFLAG)
  1555. #define SHIFT_HOME            (HOMEKEY+SHIFTFLAG)
  1556. #define SHIFT_UP            (UPKEY+SHIFTFLAG)
  1557. #define SHIFT_PGUP            (PGUP+SHIFTFLAG)
  1558. #define SHIFT_DELETE        (DELETEKEY+SHIFTFLAG)
  1559.  
  1560. #define SHIFT_CTRL_INSERT    (CTRL_INSERT+SHIFTFLAG)
  1561. #define SHIFT_CTRL_END        (CTRL_END+SHIFTFLAG)
  1562. #define SHIFT_CTRL_DN        (CTRL_DN+SHIFTFLAG)
  1563. #define SHIFT_CTRL_PGDN        (CTRL_PGDN+SHIFTFLAG)
  1564. #define SHIFT_CTRL_BAK        (CTRL_BAK+SHIFTFLAG)
  1565. #define SHIFT_CTRL_KP_FIVE    (CTRL_KP_FIVE+SHIFTFLAG)
  1566. #define SHIFT_CTRL_FWD        (CTRL_FWD+SHIFTFLAG)
  1567. #define SHIFT_CTRL_HOME        (CTRL_HOME+SHIFTFLAG)
  1568. #define SHIFT_CTRL_UP        (CTRL_UP+SHIFTFLAG)
  1569. #define SHIFT_CTRL_PGUP        (CTRL_PGUP+SHIFTFLAG)
  1570. #define SHIFT_CTRL_DELETE    (CTRL_DELETE+SHIFTFLAG)
  1571.  
  1572. #define SHIFT_ALT_INSERT    (ALT_INSERT+SHIFTFLAG)
  1573. #define SHIFT_ALT_END        (ALT_END+SHIFTFLAG)
  1574. #define SHIFT_ALT_DN        (ALT_DN+SHIFTFLAG)
  1575. #define SHIFT_ALT_PGDN        (ALT_PGDN+SHIFTFLAG)
  1576. #define SHIFT_ALT_BAK        (ALT_BAK+SHIFTFLAG)
  1577. #define SHIFT_ALT_FWD        (ALT_FWD+SHIFTFLAG)
  1578. #define SHIFT_ALT_HOME        (ALT_HOME+SHIFTFLAG)
  1579. #define SHIFT_ALT_UP        (ALT_UP+SHIFTFLAG)
  1580. #define SHIFT_ALT_PGUP        (ALT_PGUP+SHIFTFLAG)
  1581. #define SHIFT_ALT_DELETE    (ALT_DELETE+SHIFTFLAG)
  1582.  
  1583. #define CTRL_ALT_INSERT        (ALT_INSERT+CTRLFLAG)
  1584. #define CTRL_ALT_END        (ALT_END+CTRLFLAG)
  1585. #define CTRL_ALT_DN            (ALT_DN+CTRLFLAG)
  1586. #define CTRL_ALT_PGDN        (ALT_PGDN+CTRLFLAG)
  1587. #define CTRL_ALT_BAK        (ALT_BAK+CTRLFLAG)
  1588. #define CTRL_ALT_FWD        (ALT_FWD+CTRLFLAG)
  1589. #define CTRL_ALT_HOME        (ALT_HOME+CTRLFLAG)
  1590. #define CTRL_ALT_UP            (ALT_UP+CTRLFLAG)
  1591. #define CTRL_ALT_PGUP        (ALT_PGUP+CTRLFLAG)
  1592. #define CTRL_ALT_DELETE        (ALT_DELETE+CTRLFLAG)
  1593.  
  1594. #define SHIFT_CTRL_KP_SLASH    (CTRL_KP_SLASH+SHIFTFLAG)
  1595. #define SHIFT_CTRL_KP_STAR    (CTRL_KP_STAR+SHIFTFLAG)
  1596. #define SHIFT_CTRL_KP_MINUS    (CTRL_KP_MINUS+SHIFTFLAG)
  1597. #define SHIFT_CTRL_KP_PLUS    (CTRL_KP_PLUS+SHIFTFLAG)
  1598. #define SHIFT_ALT_KP_ENTER    (ALT_KP_ENTER+SHIFTFLAG)
  1599. #define CTRL_ALT_KP_ENTER    (ALT_KP_ENTER+CTRLFLAG)
  1600. #define CTRL_ALT_KP_PLUS    (ALT_KP_PLUS+CTRLFLAG)
  1601. #define CTRL_ALT_KP_MINUS    (ALT_KP_MINUS+CTRLFLAG)
  1602. #define CTRL_ALT_KP_STAR    (ALT_KP_STAR+CTRLFLAG)
  1603. #define CTRL_ALT_KP_SLASH    (ALT_KP_SLASH+CTRLFLAG)
  1604.  
  1605.  
  1606. #define SHIFT_CTRL_BS        (CTL_BS+SHIFTFLAG)
  1607. #define SHIFT_ALT_BS        (ALT_BS+SHIFTFLAG)
  1608. #define SHIFT_CTRL_HT        (CTRL_HT+SHIFTFLAG)
  1609. #define SHIFT_CTRL_TAB        SHIFT_CTRL_HT
  1610. #define SHIFT_ALT_HT        (ALT_HT+SHIFTFLAG)
  1611. #define SHIFT_ALT_TAB        SHIFT_ALT_HT
  1612.  
  1613. #define CTRL_ALT_BS            (ALT_BS+CTRLFLAG)
  1614. #define CTRL_SLASH            (SLASHKEY+CTRLFLAG)
  1615. #define CTRL_ESC            (ESCKEY+CTRLFLAG)
  1616. #define CTRL_SPACE            (SPACEKEY+CTRLFLAG)
  1617. #define SHIFT_ESC            (ESCKEY+SHIFTFLAG)
  1618. #define ALT_SPACE            (SPACEKEY+ALTFLAG)
  1619.  
  1620. /* keypad specials (not usually implemented) */
  1621. #define KP_ENTER            (0xB0+EFLAG)
  1622. #define KP_PLUS                (0xB1+EFLAG)
  1623. #define KP_MINUS            (0xB2+EFLAG)
  1624. #define KP_STAR                (0xB3+EFLAG)
  1625. #define KP_SLASH            (0xB4+EFLAG)
  1626. #define SHIFT_KP_ENTER        (0xB5+EFLAG)
  1627. #define SHIFT_KP_PLUS        (0xB6+EFLAG)
  1628. #define SHIFT_KP_MINUS        (0xB7+EFLAG)
  1629. #define SHIFT_KP_STAR        (0xB8+EFLAG)
  1630. #define SHIFT_KP_SLASH        (0xB9+EFLAG)
  1631. #define CTRL_KP_ENTER        (0xBA+EFLAG)
  1632. #define SHIFT_CTRL_KP_ENTER    (0xBB+EFLAG)
  1633.  
  1634.  
  1635.  
  1636. /* ---------- EVENT STUFF ------------- */
  1637.  
  1638. typedef union {        /* 8 bytes (a long long ) */
  1639.     _LONGLONG_ item;
  1640.     short m_type;
  1641.     STOR s;
  1642. #define e_keychar s.a5.b[4]
  1643. #define e_keyflag s.a5.b[5]
  1644. #define m_sparam s.a3.s1
  1645. #define m_lparam s.a4.s1
  1646.     struct {
  1647.         unsigned short type;
  1648.         unsigned char kbstat;
  1649.         unsigned char mask;
  1650.         short xpos;
  1651.         short ypos;
  1652. #define e_type e.type
  1653. #define e_kbstat e.kbstat
  1654. #define e_mask e.mask
  1655. #define e_xpos e.xpos
  1656. #define e_ypos e.ypos
  1657. #define e_keycode e.xpos
  1658.     } e;
  1659. } RawEvent, CFmsg;
  1660.  
  1661.  
  1662. #define M_MOTION        (0x001)
  1663. #define M_LEFT_DOWN        (0x002)
  1664. #define M_LEFT_UP        (0x004)
  1665. #define M_RIGHT_DOWN    (0x008)
  1666. #define M_RIGHT_UP        (0x010)
  1667. #define M_MIDDLE_DOWN    (0x020)
  1668. #define M_MIDDLE_UP        (0x040)
  1669. #define M_BUTTON_DOWN    (M_LEFT_DOWN | M_MIDDLE_DOWN | M_RIGHT_DOWN)
  1670. #define M_BUTTON_UP        (M_LEFT_UP   | M_MIDDLE_UP   | M_RIGHT_UP)
  1671. #define M_BUTTON_CHANGE (M_BUTTON_UP | M_BUTTON_DOWN )
  1672.  
  1673. #define KB_RIGHTSHIFT    (0x01)        /* right shift key depressed */
  1674. #define KB_LEFTSHIFT    (0x02)        /* left shift key depressed */
  1675. #define KB_CTRL            (0x04)        /* CTRL depressed */
  1676. #define KB_ALT            (0x08)        /* ALT depressed */
  1677. #define KB_SCROLLOCK    (0x10)        /* SCROLL LOCK active */
  1678. #define KB_NUMLOCK        (0x20)        /* NUM LOCK active */
  1679. #define KB_CAPSLOCK        (0x40)        /* CAPS LOCK active */
  1680. #define GLBLKEY            (0x80)
  1681. #define KB_SHIFT        (KB_LEFTSHIFT | KB_RIGHTSHIFT)
  1682.  
  1683. /* A complicated CUA information word */
  1684. extern int AltDown;
  1685.  
  1686. typedef struct {
  1687.     unsigned short  width;
  1688.     unsigned short  height;
  1689.     unsigned short  number_of_colors;
  1690.     unsigned char   BIOS_mode;
  1691.     unsigned char   special;
  1692. } DRIVER_MODE_ENTRY;
  1693.  
  1694. /* Pointer to a millisecond unsigned long ticker */
  1695. extern unsigned long oxport_thread_msec;
  1696.  
  1697. int OXPORT_shift_state();
  1698. void OXPORT_deinit_kbd(long arg);
  1699. void OXPORT_init_kbd(long arg);
  1700. int OXPORT_was_kbd();
  1701. int OXPORT_get_kbd();
  1702. void OXPORT_flush_kbd(void);
  1703. void OXPORT_position_kb_cursor(int x, int y);
  1704. void OXPORT_get_kb_cursor_pos_shape(int *pos, int *shape);
  1705. void OXPORT_set_kb_cursor_shape(int shape);
  1706. void OXPORT_hide_kb_cursor();
  1707. void OXPORT_unhide_kb_cursor();
  1708. void OXPORT_direct_attr_text_output(int offset, short *buf, int len);
  1709. void OXPORT_bios_attr_text_output(int x, int y, short *buf, int len);
  1710.  
  1711. void OXPORT_read_image(void *dst, int x, int y, int wd, int ht, int dw);
  1712. void OXPORT_write_image(void *src, int x, int y, int wd, int ht, int sw);
  1713. void OXPORT_or_image(void *src, int x, int y, int wd, int ht, int sw);
  1714. void OXPORT_and_image(void *src, int x, int y, int wd, int ht, int sw);
  1715. void OXPORT_xor_image(void *src, int x, int y, int wd, int ht, int sw);
  1716.  
  1717. void OXPORT_deinit_events(long arg);
  1718. int OXPORT_init_events(long arg);
  1719. int OXPORT_was_event(void);
  1720. RawEvent OXPORT_get_event(void);
  1721.  
  1722. void OXPORT_set_mouse_cursor_shape(void *shape);
  1723. int OXPORT_register_mouse_cursor_shape(void *shape);
  1724. void OXPORT_set_mouse_limits(int x1, int y1, int x2, int y2);
  1725. void OXPORT_set_mouse_speed(int speed);
  1726. void OXPORT_set_mouse_accel(int thresh, int accel);
  1727. void OXPORT_disable_mouse(void);
  1728. void OXPORT_enable_mouse(void);
  1729. void OXPORT_set_mousepos(int x, int y);
  1730.  
  1731. int OXPORT_get_curr_screen_mode(void);
  1732. int OXPORT_get_curr_screen_cols(void);
  1733. int OXPORT_get_curr_screen_rows(void);
  1734. void OXPORT_get_video_modes(void);
  1735. void OXPORT_set_video_mode(int mode);
  1736. void OXPORT_set_ORIGvideo_mode(int mode);
  1737. void OXPORT_read_palette_register(int n, int *red, int *green, int *blue);
  1738. void OXPORT_write_palette_register(int n, int *red, int *green, int *blue);
  1739. void OXPORT_clear_screen(void);
  1740. void OXPORT_fill_screen_rect(int color, int x, int y, int w, int h);
  1741.  
  1742. void OXPORT_start_timer(void);
  1743. void OXPORT_stop_timer(void);
  1744. void OXPORT_set_thread_msec(int msec);
  1745. void OXPORT_compute_final_tick(void);
  1746. unsigned long OXPORT_get_clock_ticks(void);
  1747. unsigned long OXPORT_get_timestamp(void);
  1748. void OXPORT_wait_msec(long n);
  1749. void OXPORT_beep(int freq);
  1750. void OXPORT_beeplen(int freq, int msec);
  1751.  
  1752. void OXPORT_crash(char *msg);
  1753. void OXPORT_nulproc(void);
  1754.  
  1755. int CF_was_msg(void);
  1756. CFmsg CF_get_msg(void);
  1757. void CF_InitIO(long arg, _LONGLONG_ (*msgproc)());
  1758.  
  1759. #define CF_REMOTE_KEYBOARD (1)
  1760. #define CF_USE_EVENTS    (2)
  1761. #define CF_USE_MESSAGES    (4)
  1762. #define CF_USE_GUI        (8)
  1763. #define CF_ANSI_TEXT_OUTPUT    (16)
  1764. #define CF_BIOS_TEXT_OUTPUT (32)
  1765. #define CF_DIRECT_TEXT_OUTPUT (64)
  1766. #define CF_GRAPHIC_TEXT_OUTPUT (128)
  1767. #define CF_GRAPHIC_OUTPUT (256)
  1768. #define CF_TEXT_MODE (CF_ANSI_TEXT_OUTPUT|CF_BIOS_TEXT_OUTPUT|CF_DIRECT_TEXT_OUTPUT)
  1769. #define CF_GRAPHIC_MODE (CF_GRAPHIC_TEXT_OUTPUT|CF_GRAPHIC_OUTPUT)
  1770.  
  1771. extern _LONGLONG_
  1772. DeliverMessage(vobject to, CFmsg m);
  1773. extern void
  1774. QueueMessage(vobject to, CFmsg m);
  1775.  
  1776. #define SendEvent(to, msg, sparm, lparm) \
  1777. ({CFmsg it;it.e_type=msg;it.m_sparam=(short)sparm;it.m_lparam=(long)lparm; \
  1778. DeliverMessage(to,it);})
  1779.  
  1780. #define PostEvent(to, msg, sparm, lparm) \
  1781. ({CFmsg it;it.e_type=msg;it.m_sparam=(short)sparm;it.m_lparam=(long)lparm; \
  1782. QueueMessage(to,it);})
  1783.  
  1784. extern _LONGLONG_
  1785. ConstructCommand(vobject to, char *cmd, short sparm, long lparm, int flag);
  1786.  
  1787. #define SendCommand(to, cmd, sparm, lparm) \
  1788. ConstructCommand(to, #cmd, sparm, lparm, 0)
  1789.  
  1790. #define PostCommand(to, cmd, sparm, lparm) \
  1791. ConstructCommand(to, #cmd, sparm, lparm, 1)
  1792.  
  1793. extern vobject CaptureKeyboard(vobject self, int nochild);
  1794. extern void ReleaseKeyboard(vobject self, vobject prev);
  1795. extern vobject CaptureMouse(vobject self, int nochild);
  1796. extern void ReleaseMouse(vobject self, vobject prev);
  1797. extern void CaptureMotion(vobject self);
  1798. extern void ReleaseMotion(vobject self);
  1799. extern void CaptureClock(vobject self);
  1800. extern void ReleaseClock(vobject self);
  1801. extern void CaptureTicker(vobject self);
  1802. extern void ReleaseTicker(vobject self);
  1803. extern void EnterLeave(int flag);
  1804.  
  1805. /* ------------ Global coordinate macros -------------- */
  1806.  
  1807. #define SCREENXMAX _SCREENXMAX
  1808. #define SCREENYMAX _SCREENYMAX
  1809. #define SCREENHEIGHT _SCREENHEIGHT
  1810. #define SCREENWIDTH _SCREENWIDTH
  1811. #define EFFECTIVE_SCREENWIDTH _EFFECTIVE_SCREENWIDTH
  1812. #define EFFECTIVE_SCREENHEIGHT _EFFECTIVE_SCREENHEIGHT
  1813. #define GLOBALHEIGHT _GLOBALHEIGHT
  1814. #define GLOBALWIDTH _GLOBALWIDTH
  1815. #define FONTHEIGHT _FONTHEIGHT
  1816. #define FONTWIDTH _FONTWIDTH
  1817. #define CURCOLS _CURCOLS
  1818. #define CURROWS _CURROWS
  1819. #define MAXROWS _MAXROWS
  1820. #define MAXCOLS _MAXCOLS
  1821. #define LINEHEIGHT _LINEHEIGHT
  1822. #define CHARWIDTH _CHARWIDTH
  1823. #define GRIDWIDTH _GRIDWIDTH
  1824. #define GRIDHEIGHT _GRIDHEIGHT
  1825. #define GLOBALX _GLOBALX
  1826. #define GLOBALY _GLOBALY
  1827. #define UserXMin GLOBALX
  1828. #define UserYMin GLOBALY
  1829. #define UserXMax (GLOBALX+GLOBALWIDTH-1)
  1830. #define UserYMax (GLOBALY+GLOBALHEIGHT-1)
  1831. #define VBUF_SIZE (MAXROWS*MAXCOLS)
  1832. #define VIDEOMODE _VIDEOMODE
  1833. #define LOOK _LOOK
  1834. #define FEEL _FEEL
  1835. #define REMOTEFD _REMOTEFD
  1836.  
  1837. extern int GuiEnabled;
  1838. extern long AppArg;
  1839. extern int _SCREENXMAX;
  1840. extern int _SCREENYMAX;
  1841. extern int _SCREENHEIGHT;
  1842. extern int _SCREENWIDTH;
  1843. extern int _EFFECTIVE_SCREENWIDTH;
  1844. extern int _EFFECTIVE_SCREENHEIGHT;
  1845. extern int _GLOBALHEIGHT;
  1846. extern int _GLOBALWIDTH;
  1847. extern int _FONTHEIGHT;
  1848. extern int _FONTWIDTH;
  1849. extern int _CURCOLS;
  1850. extern int _CURROWS;
  1851. extern int _LINEHEIGHT;
  1852. extern int _CHARWIDTH;
  1853. extern int _GRIDWIDTH;
  1854. extern int _GRIDHEIGHT;
  1855. extern int _GLOBALX;
  1856. extern int _GLOBALY;
  1857. extern int _MAXROWS;
  1858. extern int _MAXCOLS;
  1859. extern int _VIDEOMODE;
  1860. extern int _LOOK;
  1861. extern int _FEEL;
  1862. extern int _REMOTEFD;
  1863. extern DRIVER_MODE_ENTRY *TextModes;
  1864. extern int numTextModes;
  1865. extern DRIVER_MODE_ENTRY *GraphicModes;
  1866. extern int numGraphicModes;
  1867. extern int MouseEnabled;
  1868.  
  1869. #define DEFAULT_LOOK 0
  1870. #define LOOK_TEXT1        1
  1871. #define LOOK_TEXT2        2
  1872. #define LOOK_TEXT3        3
  1873. #define LOOK_TEXT4        4
  1874. #define LOOK_GRAPHICS1    20
  1875. #define LOOK_GRAPHICS2    21
  1876. #define LOOK_GRAPHICS3    22
  1877. #define LOOK_GRAPHICS4    23
  1878. #define LOOK_GRAPHICS5    24
  1879.  
  1880. #define DEFAULT_FEEL 0
  1881. #define FEEL_CUA 1
  1882.  
  1883.  
  1884. #define rdiv(a,b) \
  1885.     ((a)/(b))
  1886. #define Scale(var,arg,num,den)    \
  1887. ((var) = rdiv(((arg) * (num)),(den)))
  1888.  
  1889. #define g2sx(x) \
  1890. Scale(x,x,EFFECTIVE_SCREENWIDTH,GLOBALWIDTH)
  1891. #define g2sy(y) \
  1892. Scale(y,y,EFFECTIVE_SCREENHEIGHT,GLOBALHEIGHT)
  1893. #define s2gx(x) \
  1894. Scale(x,x,GLOBALWIDTH,EFFECTIVE_SCREENWIDTH)
  1895. #define s2gy(y) \
  1896. Scale(y,y,GLOBALHEIGHT,EFFECTIVE_SCREENHEIGHT)
  1897. #define c2gx(x) \
  1898. Scale(x,x,GLOBALWIDTH,CURCOLS)
  1899. #define c2gy(y) \
  1900. Scale(y,y,GLOBALHEIGHT,CURROWS)
  1901. #define c2sx(x) \
  1902. Scale(x,x,EFFECTIVE_SCREENWIDTH,CURCOLS)
  1903. #define c2sy(y) \
  1904. Scale(y,y,EFFECTIVE_SCREENHEIGHT,CURROWS)
  1905. #define s2cx(x) \
  1906. Scale(x,x,1,FONTWIDTH)
  1907. #define s2cy(y) \
  1908. Scale(y,y,1,FONTHEIGHT)
  1909. #define g2cx(x) \
  1910. Scale(x,x,1,CHARWIDTH)
  1911. #define g2cy(y) \
  1912. Scale(y,y,1,LINEHEIGHT)
  1913.  
  1914.  
  1915. vobject
  1916. NewGuiClass(
  1917.     object cl,                 /* class                      */
  1918.     char *title,              /* window title or NULL       */
  1919.     int left, int top,        /* upper left coordinates     */
  1920.     int height, int width,    /* dimensions (global coords) */
  1921.     void *extension,          /* pointer to additional data */
  1922.     void *parent,             /* parent of window (a window)*/
  1923.     _LONGLONG_ (*msgproc)(),  /* message proc for user      */
  1924.     unsigned long attrib,     /* window attributes          */
  1925.     int look, int feel
  1926.     );
  1927.  
  1928. /* PARSER STUFF */
  1929. #define ASTMODE 1
  1930. #define LEXMODE 2
  1931. #define EOF_MARK       26   /* End of file character.                  */
  1932. #define ACTION         1           /* Call action function.            */
  1933. #define MAKENODE       2           /* Make a node.                     */
  1934. #define DELTREE        4           /* Delete the subtree.              */
  1935. #define PL_ACTION    0x10
  1936. #define PL_MAKENODE 0x20
  1937. #define PL_DELTREE  0x40
  1938. #define LEFT_ASSOC 0
  1939. #define RIGHT_ASSOC 1
  1940. #define NON_ASSOC 2
  1941. #define PARSER_STKSIZE 512
  1942. #define ASTMINADDR ((AstP)(100000))    /* lowest allowed address (line numbers here ) */
  1943.  
  1944. /*--- PARSER SYMBOL Structure. ---------------------------------------------*/
  1945.  
  1946. typedef struct                 /* Symbol table cell structure (4 bytes). */
  1947. {
  1948.    char   *name;        /* Pointer to name.               */
  1949. } PARSER_SYMBOL;
  1950.  
  1951. typedef struct
  1952. {
  1953.     int cnt;
  1954.     PARSER_SYMBOL *ptr;
  1955. } PARSER_SYMBOL_TABLE;
  1956.  
  1957. /*--- AST NODE Structure. --------------------------------------------------*/
  1958. #ifndef __ASTNODEH__
  1959. #define __ASTNODEH__
  1960. typedef union _datum { /* 16 bytes */
  1961.     STOR stor;
  1962.     CAT cat;
  1963.     struct {
  1964.         char d[16];
  1965.     } chr;
  1966.     struct {
  1967.         unsigned char d[16];
  1968.     } uchr;
  1969.     struct {
  1970.         short d[8];
  1971.     } shrt;
  1972.     struct {
  1973.         unsigned short d[8];
  1974.     } ushrt;
  1975.     struct {
  1976.         long d[4];
  1977.     } lng;
  1978.     struct {
  1979.         unsigned long d[4];
  1980.     } ulng;
  1981.     struct {
  1982.         _LONGLONG_ d[2];
  1983.     } lnglng;
  1984.     struct {
  1985.         unsigned _LONGLONG_ d[2];
  1986.     } ulnglng;
  1987.     struct {
  1988.         void *d[4];
  1989.     } ptr;
  1990.     unsigned char    Uuchar;
  1991.     char            Uchar;
  1992.     unsigned short    Uushort;
  1993.     short            Ushort;
  1994.     unsigned int    Uuint;
  1995.     int                Uint;
  1996.     unsigned long    Uulong;
  1997.     long            Ulong;
  1998.     void *            Upointer;
  1999.     float            Ufloat;
  2000.     double            Udouble;
  2001.     unsigned _LONGLONG_ Uulonglong;
  2002.     _LONGLONG_        Ulonglong;
  2003.  
  2004. #if SUPPORT_LONG_DOUBLE
  2005.     long double        Ulongdouble;
  2006. #endif
  2007. } DATUM, *PDATUM;
  2008.  
  2009. typedef struct  ast_node 
  2010. {/* MINIMUM AST Node structure. (20 bytes)  */
  2011.    struct ast_node *right;
  2012.    struct ast_node *down;
  2013.    short  symb;                /* Symbol number */
  2014.    short    id;                /* Nodeid  ((id<<6)|subid) */
  2015.    unsigned short Tindx;     /* Terminal type (is a symbol number) */
  2016.    unsigned short lineno;    /* line number */
  2017.    unsigned short flags;    /* general purpose flags */
  2018.    unsigned char fileno;    /* File number */
  2019.    unsigned char colno;        /* column of input text */
  2020. } AST_NODE, *AstP;
  2021.  
  2022. #endif /* __ASTNODEH__ */
  2023.  
  2024. typedef struct
  2025. {
  2026.     int cnt;
  2027.     int freecnt;
  2028.     AstP free;
  2029. } PARSER_AST_TABLE;
  2030.  
  2031. /* The structure at the beginning of each set of tables in the .lod file */
  2032. typedef struct lodtable {
  2033.  
  2034. long    type;        /* type of tables, LEXMODE, ASTMODE etc */
  2035. long    next;        /* offset from start of current structure to next structure */
  2036.  
  2037. /* Offsets to tables in the file */
  2038. long    t_D_red;
  2039. long    t_R_start;
  2040. long    t_R_symbol;
  2041. long    t_R_prod;
  2042. long    t_rBase;
  2043. long    t_Head;
  2044. long    t_MT_beg;
  2045. long    t_MT_tran;
  2046. long    t_MN_beg;
  2047. long    t_MN_tran;
  2048. long    t_M_bits;
  2049. long    t_G_symbol;
  2050. long    t_PL;
  2051. long    t_LGT;
  2052. long    n_actions;
  2053.  
  2054. long    t_ACTIONS;
  2055. long    t_ACTIONSTRINGS;
  2056. long    t_ia_numb;            /* unused */
  2057. long    t_oa_numb;            /* unused */
  2058. long    t_ia_proc;            /* unused */
  2059. long    t_oa_proc;            /* unused */
  2060. long    t_node_proc;        /* unused */
  2061.  
  2062. /* constants */
  2063. long    TM;
  2064. long    bitwords;
  2065. long    n_terms;
  2066. long    n_vars;
  2067. long    n_symbs;
  2068. long    n_rules;
  2069. long    n_states;
  2070. long    maxtoken;
  2071. } LODTABLE;
  2072. typedef struct _pactions {
  2073.     void (*func)();
  2074.     int args[9];
  2075. } *PACTIONS;
  2076.  
  2077. typedef struct {
  2078.     PARSER_AST_TABLE pat;
  2079.     PARSER_SYMBOL_TABLE pst;
  2080.     AstP    root;
  2081.     int        category;
  2082.     char    language[32];
  2083.  
  2084.     struct lodtable *lod_table;
  2085.     void    *in_file;
  2086.     void    *symhandle;
  2087.     void    *ROOT;
  2088.     unsigned int        line_numb;
  2089.     unsigned int        line_char;
  2090.     unsigned int        line_file;    /* entry in the 'files' array below */
  2091.     int        parsecnt;
  2092.     int        n_actions;
  2093.     PACTIONS ACTIONS;
  2094.     char     *ACTIONSTRINGS;
  2095.     struct ptable    *ptab;
  2096.     struct ltable    *ltab;
  2097.     int        LSP;
  2098.     int        errors;
  2099. #define PARSER_DEBUG 1
  2100. #define LEXER_DEBUG 2
  2101. #define NO_DYNAMIC_TOKENS 4
  2102.     int     debug;
  2103.     int     lastsymnum;
  2104.     int        lastclass;
  2105.     char    *actionerr;
  2106.     int        maxfile;
  2107.     int        numfiles;
  2108.     int        curfile;
  2109.     int        totsymlen;
  2110.     int        hashdups;
  2111.     short    L_stack[4];
  2112.     short    files[64];    /* contains symbol numbers of filenames */
  2113.     short    blockinID;
  2114.     short    blockoutID;
  2115.     int        blocklevel; /* block nesting level */
  2116.     char    *chunkbase;    /* symbol text is stored in chunks during parse */
  2117.     char    *chunkend;
  2118.     char    *symbase;
  2119.     char    *symend;
  2120.     _LONGLONG_    symhash;
  2121.     unsigned int symspot;
  2122.     int        (*readfunc)();    /* stream reader function */
  2123.     int        (*writefunc)();    /* stream writer function */
  2124.     int        (*readcharfunc)();
  2125.     int        (*writecharfuc)();
  2126.     int        (*statfunc)();
  2127.     int        fstack_depth;
  2128.     int        fstack[64];        /* for included file nesting */
  2129.     int        obj_inbufcnt;
  2130.     int        obj_inbufsize;
  2131.     unsigned char    obj_inbuf[128];
  2132.     int        astchunk;
  2133.     int        symbolchunk;
  2134.     int        textchunk;
  2135.     int        astsize;
  2136. } PG;
  2137.  
  2138. typedef struct ptable {
  2139.  
  2140. /* Pointers to tables produced by the parser generator     */
  2141.  
  2142. PG        *pg;        /* Pointer to multiparser global variable structure */
  2143. short    *D_red;     /* Default reduction.                        */
  2144. short    *R_start;   /* Reduction start.                          */
  2145. short    *R_symbol;  /* Reduction symbol.                         */
  2146. short    *R_prod;    /* Reduction production.                     */
  2147. short    *rBase;
  2148. short    *Head;         /* Head symbol number for a production.   */
  2149. short    *MT_beg;
  2150. short    *MT_tran;
  2151. short    *MN_beg;
  2152. short    *MN_tran;
  2153. short    *M_bits;
  2154. long    *G_symbol;        /* Symbol names of the grammar            */
  2155. short     *PL;            /* Production length less one.            */
  2156. short    *LGT;
  2157. long    *ACTIONS;
  2158. char    *ACTIONSTRINGS;
  2159.  
  2160. /* constants provided by the load module */
  2161. short    TM;
  2162. short    bitwords;
  2163. int        n_terms;
  2164. int        n_vars;
  2165. int        n_symbs;
  2166. int        n_states;
  2167. int        n_rules;
  2168. int        n_actions;
  2169. short    maxtoken;
  2170.  
  2171. /* variables */
  2172.  
  2173. short    rule;
  2174. short    state;
  2175. short    token;
  2176.  
  2177. /* Pointers used during parse */
  2178.  
  2179. short    *SS;                /* State stack pointer.             */
  2180. short    SStop[PARSER_STKSIZE];
  2181. short    *SSmax;             /* State stack maximum height.      */
  2182.  
  2183. /* PARSER AND LEXER TABLES MUST BE THE SAME UP TO THIS POINT */
  2184.  
  2185. AstP    *NS;                /* AST node stack pointer.          */
  2186. AstP    NStop[PARSER_STKSIZE];
  2187. short    *LS;
  2188. short    LStop[PARSER_STKSIZE];
  2189. short    *Rs;
  2190. short    RStop[PARSER_STKSIZE];
  2191. int        xx;
  2192. int        linksize;
  2193. AstP    *link;
  2194. AstP    node;
  2195.  
  2196. } PTABLE;
  2197.  
  2198. typedef struct ltable {
  2199.  
  2200. /* Pointers to tables produced by the parser generator     */
  2201.  
  2202. PG        *pg;        /* Pointer to multiparser global variable structure */
  2203. short    *D_red;     /* Default reduction.                        */
  2204. short    *R_start;   /* Reduction start.                          */
  2205. short    *R_symbol;  /* Reduction symbol.                         */
  2206. short    *R_prod;    /* Reduction production.                     */
  2207. short    *rBase;
  2208. short    *Head;         /* Head symbol number for a production.   */
  2209. short    *MT_beg;
  2210. short    *MT_tran;
  2211. short    *MN_beg;
  2212. short    *MN_tran;
  2213. short    *M_bits;
  2214. long    *G_symbol;        /* Symbol names of the grammar            */
  2215. short     *PL;            /* Production length less one.            */
  2216. short    *LGT;
  2217. long    *ACTIONS;
  2218. char    *ACTIONSTRINGS;
  2219.  
  2220. /* constants provided by the load module */
  2221. short    TM;
  2222. short    bitwords;
  2223. int        n_terms;
  2224. int        n_vars;
  2225. int        n_symbs;
  2226. int        n_states;
  2227. int        n_rules;
  2228. int        n_actions;
  2229. short    maxtoken;
  2230.  
  2231. /* Variables */
  2232.  
  2233. short    rule;
  2234. short    state;
  2235. short    token;
  2236.  
  2237.  
  2238. /* Pointers used during lex */
  2239.  
  2240. short    *SS;                /* State stack pointer.             */
  2241. short    SStop[PARSER_STKSIZE];
  2242. short    *SSmax;             /* State stack maximum height.      */
  2243.  
  2244. /* PARSER AND LEXER TABLES MUST BE THE SAME UP TO THIS POINT */
  2245.  
  2246. short    lextoken;
  2247. #if 0
  2248. char    ibuf[512];
  2249. #endif
  2250. } LTABLE;
  2251.  
  2252. #define ASTVARS(n) AstP curnode, pstack[n], *stack=pstack
  2253. #define SYMBOLCOUNT (pg->pst.cnt)
  2254. #define PARSERSYMBOLS (pg->pst.ptr)
  2255. #define MARK(sp) (*(++sp) = (AstP)0)
  2256. #define STACKTOP(sp) (**sp)
  2257. #define TOPDOWN(n) AstTopDown(&stack, n, pg)
  2258. #define BOTTOMUP(n) AstBottomUp(&stack, n, pg)
  2259. #define MARKAST MARK(stack)
  2260. #define DOWNAST (curnode = TOPDOWN(curnode))
  2261. #define UPAST (curnode = BOTTOMUP(curnode))
  2262. #define IGNOREBRANCH (curnode = 0)
  2263. #define nID(symb) _cat_(LANGUAGE, symb)
  2264. #define fID(symb) _cat_(symb, LANGUAGE)
  2265. #define lName        _cname1_(LANGUAGE)
  2266.  
  2267. #define NODERIGHT(n) (((AstP)n)->right)
  2268. #define NODEDOWN(n) (((AstP)n)->down)
  2269. #define ISEQUAL(n, s) (((AstP)n)->id == s)
  2270. #define NODEID (((AstP)curnode)->id)
  2271. #define NODECLASS (((AstP)curnode)->id & 0xffc0)
  2272. #define NODEFLAGS (((AstP)curnode)->flags)
  2273. #define NODESYMB (((AstP)curnode)->symb)
  2274.  
  2275. AstP NewAstNode(PG *pg, int id, int symb);
  2276. int NewParserSymbol(PG *pg, const char *name);
  2277. void ParserPush(PG *pg, int data);
  2278. int ParserPop(PG *pg);
  2279. int ParserStackdepth(PG *pg);
  2280.  
  2281. void *NewParserSymTable(PG *pg, int size);
  2282.  
  2283. AstP AstTopDown(AstP **sp, const AstP cur_node, PG *pg);
  2284. AstP AstBottomUp(AstP **sp, const AstP start_node, PG *pg);
  2285. void PrintAst (PG *pg, AstP root, void *file, int ptrs);
  2286. void HowBigAst(PG *pg, void *file);
  2287. void PruneAstTree(PG *pg,AstP root,int preserve_root,const AstP top);
  2288. void FreeAstNode(PG *pg, AstP node);
  2289. char *GetH_symbol(PG *pg, int numb);
  2290. void DelLastParserSymbol(PG *pg);
  2291. int AstPackSize(PG *pg);
  2292. void *PackAst(PG *pg, void *buf);
  2293.  
  2294. /* END: PARSER STUFF */
  2295.  
  2296. #ifndef __OXCCFUNCSH__
  2297. #define __OXCCFUNCSH__
  2298. extern void oxcc_proc_syms(void *iv, unsigned namespace, void (*func)());
  2299. /* func(void *node, int symb, void *container) */
  2300.  
  2301. extern void oxcc_proc_ptr_info(void *iv, void (*func)());
  2302. /* func(void *addr, void *mino, void *maxo) */
  2303.  
  2304. extern void oxcc_proc_mallocs(void *iv, void (*func)());
  2305. /* func(void *loc, int size, DATUM *ip) */
  2306.  
  2307. extern int oxcc(int argc, char **argv);
  2308. extern void *oxcc_get_pg(void *iv);
  2309. extern void oxcc_debug(void *iv, int flags);
  2310. extern void oxcc_enable_trace(void *iv);
  2311. extern void oxcc_disable_trace(void *iv);
  2312.  
  2313. extern void *oxcc_open_instance(void);
  2314. extern void oxcc_set_options(void *iv, char *opts);
  2315. extern int oxcc_preproc_file(void *iv, void *is, void *os, void *es,
  2316.                                 int argc, char **argv);
  2317. extern int oxcc_parse_file(void *iv, void *is, void *es, char *filename);
  2318. extern void oxcc_print_parse_errors(void *iv, void *es);
  2319. extern int oxcc_check_ast_tree(void *iv, void *es, char *filename);
  2320. extern int oxcc_init_outers(void *iv, void *es);
  2321. extern int oxcc_run_tree(void *iv, void *es, char *fname, char *args, char *rnm);
  2322. extern int oxcc_gen_code(void *iv, void *es, char *filename, void *os);
  2323. extern void oxcc_cleanup_parse(void *iv);
  2324. extern void oxcc_close_codefile(void *iv);
  2325. extern void oxcc_close_instance(void *iv);
  2326.  
  2327. extern void oxcc_print_ast(void *iv, void *os, int flag);
  2328. extern void *oxcc_get_ast_root(void *iv);
  2329. extern int oxcc_eval_expr(void *iv, void *buf, double *result, void *es);
  2330. extern void *__builtin_iv(void);
  2331. extern void *__builtin_pg(void);
  2332. #endif /* __OXCCFUNCSH__ */
  2333.  
  2334. #ifdef __cplusplus
  2335. }
  2336. #endif
  2337.