home *** CD-ROM | disk | FTP | other *** search
/ Frostbyte's 1980s DOS Shareware Collection / floppyshareware.zip / floppyshareware / DOOG / CBASE09.ZIP / CBASE.ZIP / CBKEYSRC.C < prev    next >
Text File  |  1989-08-31  |  4KB  |  168 lines

  1. /*    Copyright (c) 1989 Citadel    */
  2. /*       All Rights Reserved        */
  3.  
  4. /* #ident    "cbkeysrc.c    1.1 - 89/08/31" */
  5.  
  6. #include <blkio.h>
  7. #include <bool.h>
  8. #include <btree.h>
  9. #include <errno.h>
  10. #include <lseq.h>
  11. /* #include <stdlib.h> */
  12. /* #include <string.h> */
  13. #include "cbase_.h"
  14.  
  15. /*man---------------------------------------------------------------------------
  16. NAME
  17.      cbkeysrch - search cbase key
  18.  
  19. SYNOPSIS
  20.      #include <cbase.h>
  21.  
  22.      int cbkeysrch(cbp, field, buf)
  23.      cbase_t *cbp;
  24.      int field;
  25.      void *buf;
  26.  
  27. DESCRIPTION
  28.      The cbkeysrch function searches a key in cbase cbp.  field is the field
  29.      to be searched.  buf points to the key to be searched for.  If found,
  30.      the cursor for that key is positioned to the key found.  If it is not
  31.      found, the cursor for that key is positioned to the next higher key,
  32.      which may be null.  The record cursor is set to the record associated
  33.      with the key marked by the key cursor.
  34.  
  35.      cbkeysrch will fail if one or more of the following is true:
  36.  
  37.      [EINVAL]       cbp is not a valid cbase pointer.
  38.      [EINVAL]       field is less than 1 or greater than
  39.                     the number of keys defined for cbp.
  40.      [EINVAL]       buf is the NULL pointer.
  41.      [CBELOCK]      cbp is not read locked.
  42.      [CBENKEY]      field is not a key.
  43.      [CBENOPEN]     cbp is not open.
  44.  
  45. SEE ALSO
  46.      cbkcursor, cbkeyfirst, cbkeylast, cbkeynext, cbkeyprev.
  47.  
  48. DIAGNOSTICS
  49.      Upon successful completion, a value of 1 is returned if the key was
  50.      found or a value of 0 if it was not.  Otherwise, a value of -1 is
  51.      returned and errno is set to indicate the error.
  52.  
  53. ------------------------------------------------------------------------------*/
  54. int cbkeysrch(cbp, field, buf)
  55. cbase_t * cbp;
  56. int       field;
  57. void *    buf;
  58. {
  59.     int        rs    = 0;
  60.     void *        buf2    = NULL;
  61.     cbrpos_t    cbrpos    = 0;
  62.     lspos_t        lspos    = 0;
  63.     bool        found    = FALSE;
  64.  
  65.     errno = 0;
  66.  
  67.     /* validate arguments */
  68.     if ((!cb_valid(cbp)) || (buf == NULL)) {
  69.         errno = EINVAL;
  70.         return -1;
  71.     }
  72.     if ((field < 1) || (field > cbp->fldcnt)) {
  73.         errno = EINVAL;
  74.         return -1;
  75.     }
  76.  
  77.     /* check if not open */
  78.     if (!(cbp->flags & CBOPEN)) {
  79.         errno = CBENOPEN;
  80.         return -1;
  81.     }
  82.  
  83.     /* check if field is a key */
  84.     if (!(cbp->fields[field - 1].flags & CBFKEY)) {
  85.         errno = CBENKEY;
  86.         return -1;
  87.     }
  88.  
  89.     /* check if not read locked */
  90.     if (!(cbp->flags & CBRDLCK)) {
  91.         errno = CBELOCK;
  92.         return -1;
  93.     }
  94.  
  95.     /* construct (key, record position) pair */
  96.     if (btkeysize(cbp->btp[field - 1]) !=
  97.             (cbp->fields[field - 1].size + sizeof(cbrpos_t))) {
  98.         CBEPRINT;
  99.         errno = CBEPANIC;
  100.         return -1;
  101.     }
  102.     buf2 = calloc(1, cbp->fields[field - 1].size + sizeof(cbrpos_t));
  103.     if (buf2 == NULL) {
  104.         CBEPRINT;
  105.         errno = ENOMEM;
  106.         return -1;
  107.     }
  108.     cbrpos = 0;
  109.     memcpy(buf2, buf, cbp->fields[field - 1].size);
  110.     memcpy((void *)((char *)buf2 + cbp->fields[field - 1].size),
  111.                     (void *)&cbrpos, sizeof(cbrpos_t));
  112.  
  113.     /* search for key */
  114.     rs = btsearch(cbp->btp[field - 1], buf2);
  115.     if (rs == -1) {
  116.         CBEPRINT;
  117.         free(buf2);
  118.         return -1;
  119.     }
  120.  
  121.     /* check if cursor is null */
  122.     if (btcursor(cbp->btp[field - 1]) == NULL) {
  123.         free(buf2);
  124.         rs = lssetcur(cbp->lsp, NULL);
  125.         if (rs == -1) {
  126.             CBEPRINT;
  127.             return -1;
  128.         }
  129.         errno = 0;
  130.         return 0;
  131.     }
  132.  
  133.     /* get record position */
  134.     rs = btgetk(cbp->btp[field - 1], buf2);
  135.     if (rs == -1) {
  136.         CBEPRINT;
  137.         free(buf2);
  138.         return -1;
  139.     }
  140.     memcpy((void *)&cbrpos, (void *)((char *)buf2 +
  141.                 cbp->fields[field - 1].size), sizeof(cbrpos));
  142.  
  143.     /* check if key found or not */
  144.     if ((*cbcmp_p[cbp->fields[field - 1].type - 1])(buf, buf2,
  145.                     cbp->fields[field - 1].size) == 0) {
  146.         found = TRUE;
  147.     } else {
  148.         found = FALSE;
  149.     }
  150.     free(buf2);
  151.     buf2 = NULL;
  152.  
  153.     /* set record cursor */
  154.     lspos = cbrpos;
  155.     if (lspos == 0) {
  156.         CBEPRINT;
  157.         errno = CBEPANIC;
  158.     }
  159.     rs = lssetcur(cbp->lsp, &lspos);
  160.     if (rs == -1) {
  161.         CBEPRINT;
  162.         return -1;
  163.     }
  164.  
  165.     errno = 0;
  166.     return (found ? 1 : 0);
  167. }
  168.