home *** CD-ROM | disk | FTP | other *** search
-
- /* */
- /* Mark Williams C interface to the Btrieve Record Manager, version 4 */
- /* */
- /* Note: if compiling for the LARGE memory model, remove the */
- /* comments surrounding the following definition. */
- /*
- #define LARGE 1
- */
- #include <dos.h>
-
- #define BTRERR 20 /* record manager not started */
- #define BTRINT 0x7B /* Btrieve interrupt vector */
- #define BTR2INT 0x2F /* BMulti interrupt vector */
- #define BTRVECTOR BTRINT*4 /* offset for interrupt */
- #define BTROFFSET 0x33 /* Btrieve offset within segment */
- #define VARIABLE_ID 0x6176 /* id for variable length records - 'va' */
-
- /* ProcId is used for communicating with the Multi Tasking Version of */
- /* Btrieve. It contains the process id returned from BMulti and should */
- /* not be changed once it has been set. */
- /* */
- int ProcId = 0; /* initialize to no process id */
- static char multi = 0; /* flag set to true if MultiUser */
- static char vset = 0; /* flag set to true if checked version */
-
- btrv (op, pos, databuf, datalen, keybuf, keynum)
- int op;
- char *pos;
- char *databuf;
- int *datalen;
- char *keybuf;
- int keynum;
- {
- struct reg regs; /* 8086/88 registers */
- int stat; /* Btrieve return status */
- struct {
- int dataoff; /* data buffer offset */
- int dataseg; /* data buffer segment */
- int datalen; /* data buffer length */
- int posoff; /* position block offset */
- int posseg; /* position block segment */
- int fcboff; /* fcb offset */
- int fcbseg; /* fcb segment */
- int opcode; /* operation code */
- int keyoff; /* key buffer offset */
- int keyseg; /* key buffer segment */
- char keylen; /* key length */
- char keynum; /* key number */
- int statoff; /* key buffer offset */
- int statseg; /* key buffer segment */
- int language; /* language id */
- } btrparms; /* Btrieve parameter block */
-
- /* verify that Btrieve is loaded */
-
- regs.r_ax = 0x3500 + BTRINT; /* set DOS function */
- intcall (®s, ®s, DOSINT); /* get interrupt vector */
- if (regs.r_bx != BTROFFSET) /* check for Btrieve not loaded */
- return (BTRERR); /* return bad status */
-
- if (!vset)
- {
- vset = 1;
- regs.r_ax = 0x3000;
- intcall (®s, ®s, DOSINT);
- if ((regs.r_ax & 0x00FF) >= 3)
- {
- regs.r_ax = 0xAB00;
- intcall (®s, ®s, BTR2INT);
- multi = ((regs.r_ax & 0x00FF) == 'M');
- }
- }
-
- /* set up the Btrieve parameter block */
-
- ptoreg (dsreg, regs.r_dx, regs.r_ds, databuf);
- btrparms.dataoff = regs.r_dx;
- btrparms.dataseg = regs.r_ds;
- btrparms.datalen = *datalen;
- ptoreg (dsreg, regs.r_dx, regs.r_ds, &pos[38]);
- btrparms.posoff = regs.r_dx;
- btrparms.posseg = regs.r_ds;
- ptoreg (dsreg, regs.r_dx, regs.r_ds, pos);
- btrparms.fcboff = regs.r_dx;
- btrparms.fcbseg = regs.r_ds;
- btrparms.opcode = op;
- ptoreg (dsreg, regs.r_dx, regs.r_ds, keybuf);
- btrparms.keyoff = regs.r_dx;
- btrparms.keyseg = regs.r_ds;
- btrparms.keylen = 255;
- btrparms.keynum = keynum;
- ptoreg (dsreg, regs.r_dx, regs.r_ds, &stat);
- btrparms.statoff = regs.r_dx;
- btrparms.statseg = regs.r_ds;
- btrparms.language = VARIABLE_ID;
-
- ptoreg (dsreg, regs.r_dx, regs.r_ds, &btrparms);
- if (!multi)
- intcall (®s, ®s, BTRINT);
- else
- {
- while (1)
- {
- regs.r_ax = 1; /* assume no process id */
- if ((regs.r_bx = ProcId) != 0) /* already have a process id? */
- regs.r_ax = 2; /* yes, let BMulti know */
- regs.r_ax += 0xAB00;
- intcall (®s, ®s, BTR2INT);
- if (regs.r_ax == 0) break;
- regs.r_ax = 0x0200;
- intcall (®s, ®s, 0x7F);
- }
- if (ProcId == 0) /* did we request PID? */
- ProcId = regs.r_bx; /* yes, set our process id */
- }
-
- /* return status code and length of data returned */
-
- *datalen = btrparms.datalen;
- return (stat);
- }