home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 5 / 05.iso / a / a011 / 2.ddi / MWCXBTRV.C < prev    next >
Encoding:
C/C++ Source or Header  |  1986-09-22  |  3.8 KB  |  123 lines

  1.  
  2. /*                                    */
  3. /*  Mark Williams C interface to the Btrieve Record Manager, version 4    */
  4. /*                                    */
  5. /*    Note: if compiling for the LARGE memory model, remove the    */
  6. /*          comments surrounding the following definition.        */
  7. /*
  8. #define LARGE 1
  9. */
  10. #include <dos.h>
  11.  
  12. #define BTRERR        20        /* record manager not started */
  13. #define BTRINT        0x7B    /* Btrieve interrupt vector */
  14. #define BTR2INT     0x2F    /* BMulti interrupt vector */
  15. #define BTRVECTOR   BTRINT*4    /* offset for interrupt */
  16. #define BTROFFSET   0x33    /* Btrieve offset within segment */
  17. #define VARIABLE_ID 0x6176    /* id for variable length records - 'va' */
  18.  
  19. /* ProcId is used for communicating with the Multi Tasking Version of  */
  20. /* Btrieve. It contains the process id returned from BMulti and should */
  21. /* not be changed once it has been set.                    */
  22. /*                                       */
  23. int ProcId = 0;             /* initialize to no process id */
  24. static char multi = 0;              /* flag set to true if MultiUser */
  25. static char vset = 0;        /* flag set to true if checked version */
  26.  
  27. btrv (op, pos, databuf, datalen, keybuf, keynum)
  28. int op;
  29. char *pos;
  30. char *databuf;
  31. int  *datalen;
  32. char *keybuf;
  33. int keynum;
  34. {
  35.     struct reg regs;    /* 8086/88 registers */
  36.     int stat;        /* Btrieve return status */
  37.     struct {
  38.         int  dataoff;    /* data buffer offset */
  39.         int  dataseg;    /* data buffer segment */
  40.         int  datalen;    /* data buffer length */
  41.         int  posoff;    /* position block offset */
  42.         int  posseg;    /* position block segment */
  43.         int  fcboff;    /* fcb offset */
  44.         int  fcbseg;    /* fcb segment */
  45.         int  opcode;    /* operation code */
  46.         int  keyoff;    /* key buffer offset */
  47.         int  keyseg;    /* key buffer segment */
  48.         char keylen;    /* key length */
  49.         char keynum;    /* key number */
  50.         int  statoff;    /* key buffer offset */
  51.         int  statseg;    /* key buffer segment */
  52.         int  language;    /* language id */
  53.         } btrparms;    /* Btrieve parameter block */
  54.  
  55.     /* verify that Btrieve is loaded */
  56.  
  57.     regs.r_ax = 0x3500 + BTRINT;    /* set DOS function */
  58.     intcall (®s, ®s, DOSINT); /* get interrupt vector */
  59.     if (regs.r_bx != BTROFFSET)    /* check for Btrieve not loaded */
  60.       return (BTRERR);        /* return bad status */
  61.  
  62.     if (!vset)
  63.      {
  64.       vset = 1;
  65.       regs.r_ax = 0x3000;
  66.       intcall (®s, ®s, DOSINT);
  67.       if ((regs.r_ax & 0x00FF) >= 3)
  68.        {
  69.         regs.r_ax = 0xAB00;
  70.         intcall (®s, ®s, BTR2INT);
  71.         multi = ((regs.r_ax & 0x00FF) == 'M');
  72.        }
  73.      }
  74.  
  75.     /* set up the Btrieve parameter block */
  76.  
  77.     ptoreg (dsreg, regs.r_dx, regs.r_ds, databuf);
  78.     btrparms.dataoff = regs.r_dx;
  79.     btrparms.dataseg = regs.r_ds;
  80.     btrparms.datalen = *datalen;
  81.     ptoreg (dsreg, regs.r_dx, regs.r_ds, &pos[38]);
  82.     btrparms.posoff = regs.r_dx;
  83.     btrparms.posseg = regs.r_ds;
  84.     ptoreg (dsreg, regs.r_dx, regs.r_ds, pos);
  85.     btrparms.fcboff = regs.r_dx;
  86.     btrparms.fcbseg = regs.r_ds;
  87.     btrparms.opcode = op;
  88.     ptoreg (dsreg, regs.r_dx, regs.r_ds, keybuf);
  89.     btrparms.keyoff = regs.r_dx;
  90.     btrparms.keyseg = regs.r_ds;
  91.     btrparms.keylen = 255;
  92.     btrparms.keynum = keynum;
  93.     ptoreg (dsreg, regs.r_dx, regs.r_ds, &stat);
  94.     btrparms.statoff = regs.r_dx;
  95.     btrparms.statseg = regs.r_ds;
  96.     btrparms.language = VARIABLE_ID;
  97.  
  98.     ptoreg (dsreg, regs.r_dx, regs.r_ds, &btrparms);
  99.     if (!multi)
  100.       intcall (®s, ®s, BTRINT);
  101.     else
  102.      {
  103.       while (1)
  104.        {
  105.         regs.r_ax = 1;            /* assume no process id */
  106.         if ((regs.r_bx = ProcId) != 0) /* already have a process id? */
  107.           regs.r_ax = 2;            /* yes, let BMulti know */
  108.         regs.r_ax += 0xAB00;
  109.         intcall (®s, ®s, BTR2INT);
  110.         if (regs.r_ax == 0) break;
  111.         regs.r_ax = 0x0200;
  112.         intcall (®s, ®s, 0x7F);
  113.        }
  114.       if (ProcId == 0)             /* did we request PID? */
  115.         ProcId = regs.r_bx;          /* yes, set our process id */
  116.      }
  117.  
  118.     /* return status code and length of data returned */
  119.  
  120.     *datalen = btrparms.datalen;
  121.     return (stat);
  122. }
  123.