C DATABASE (source!)

William E. Davidsen Jr davidsen at steinmetz.ge.com
Sat Dec 10 02:36:36 AEST 1988


In article <161 at lakesys.UUCP> jamesd at lakesys.UUCP (James Dicke) writes:
| Since there were so many requests sent to me about B-TREE databases
| wanted after I had made the request myself - I will post the only
| one I received which was written for MS C 5.0 so it need a few 
| changes to work under XENIX.

It took quite a few to get it running under Xenix, and a few more for
SunOS and Ultrix. Here are the patches I used, two routines which didn't
work correctly in Xenix, and several test programs with a makefile.

The utest3 program builds a case insensitive index for the last word on
a line, while utest4 looks it up. If the input file has the result of
find, you can have a easy was to look up the location of any file, case
free. I hope that will be useful.

#!/bin/sh
# shar:	Shell Archiver  (v1.24)
#
#	Run the following text with /bin/sh to create:
#	  bplus.diff
#	  filelen.c
#	  memmove.c
#	  utest.c
#	  utest1.c
#	  utest2.c
#	  utest3.c
#	  utest4.c
#	  makefile
#
echo "x - extracting bplus.diff (Text)"
sed 's/^X//' << 'SHAR_EOF' > bplus.diff &&
X*** bplus.h.orig
X--- bplus.h
X**************
X*** 2,7
X  /*  bplus.h - data structures and constants  */
X  
X  
X  #define IX_OK       1
X  #define IX_FAIL     0
X  #define EOIX       (-2)
X--- 2,31 -----
X  /*  bplus.h - data structures and constants  */
X  
X  
X+ /* the next two lines delete the 'pascal' and 'cdecl' keywords
X+    to make the source compile on an ANSI compiler.
X+ */
X+ #ifndef	MSC		/* not Microsoft C */
X+ #define cdecl
X+ #define pascal
X+ #endif			/* MSC */
X+ 
X+ /* the following checks are to define things frequently not in
X+    UNIX compilers, since they are recent ANSI additions.
X+ */
X+ #ifndef SEEK_SET
X+ #define SEEK_SET	0
X+ #endif
X+ #ifndef O_BINARY
X+ #define O_BINARY	0
X+ #endif
X+ 
X+ #if	defined(ANSI_C) | defined(MSC) | defined(M_XENIX)
X+ #define Param(x) x
X+ #else
X+ #define Param(x) ()
X+ #endif	/* ANSI or PCC style decls */
X+ 
X  #define IX_OK       1
X  #define IX_FAIL     0
X  #define EOIX       (-2)
X**************
X*** 55,71
X       IX_DISK  dx;
X    }  IX_DESC;
X  
X! int cdecl open_index(char *,IX_DESC *, int);
X! int cdecl close_index(IX_DESC *);
X! int cdecl make_index(char *,IX_DESC *, int);
X! int cdecl first_key(IX_DESC *);
X! int cdecl last_key(IX_DESC *);
X! int cdecl next_key(ENTRY *, IX_DESC *);
X! int cdecl prev_key(ENTRY *, IX_DESC *);
X! int cdecl find_key(ENTRY *, IX_DESC *);
X! int cdecl add_key(ENTRY *, IX_DESC *);
X! int cdecl locate_key(ENTRY *, IX_DESC *);
X! int cdecl delete_key(ENTRY *, IX_DESC *);
X! int cdecl find_exact(ENTRY *, IX_DESC *);
X  
X  \032
X--- 79,89 -----
X       IX_DISK  dx;
X    }  IX_DESC;
X  
X! /* a few system procedure types here */
X! extern long filelength(), lseek(), tell();
X! extern char *mktemp();
X! extern int read(), write(), open(), close();
X! extern void exit(), memcpy();
X  
X  /* ================ external interface ================ */
X  int cdecl open_index Param((char *,IX_DESC *, int));
X**************
X*** 68,71
X  int cdecl delete_key(ENTRY *, IX_DESC *);
X  int cdecl find_exact(ENTRY *, IX_DESC *);
X  
X! \032
X--- 85,100 -----
X  extern int read(), write(), open(), close();
X  extern void exit(), memcpy();
X  
X! /* ================ external interface ================ */
X! int cdecl open_index Param((char *,IX_DESC *, int));
X! int cdecl close_index Param((IX_DESC *));
X! int cdecl make_index Param((char *,IX_DESC *, int));
X! int cdecl first_key Param((IX_DESC *));
X! int cdecl last_key Param((IX_DESC *));
X! int cdecl next_key Param((ENTRY *, IX_DESC *));
X! int cdecl prev_key Param((ENTRY *, IX_DESC *));
X! int cdecl find_key Param((ENTRY *, IX_DESC *));
X! int cdecl add_key Param((ENTRY *, IX_DESC *));
X! int cdecl locate_key Param((ENTRY *, IX_DESC *));
X! int cdecl delete_key Param((ENTRY *, IX_DESC *));
X! int cdecl find_exact Param((ENTRY *, IX_DESC *));
X*** bplus.c.orig
X--- bplus.c
X**************
X*** 17,22
X  
X  #include <stdio.h>
X  #include <fcntl.h>
X  #include <io.h>
X  #include <sys\types.h>            /*  delete this line for Turbo C  */
X  #include <sys\stat.h>
X--- 17,23 -----
X  
X  #include <stdio.h>
X  #include <fcntl.h>
X+ #ifdef	MSC
X  #include <io.h>
X  #endif
X  #include <sys/types.h>            /*  delete this line for Turbo C  */
X**************
X*** 18,25
X  #include <stdio.h>
X  #include <fcntl.h>
X  #include <io.h>
X! #include <sys\types.h>            /*  delete this line for Turbo C  */
X! #include <sys\stat.h>
X  #include <string.h>
X  #include "bplus.h"
X  
X--- 19,27 -----
X  #include <fcntl.h>
X  #ifdef	MSC
X  #include <io.h>
X! #endif
X! #include <sys/types.h>            /*  delete this line for Turbo C  */
X! #include <sys/stat.h>
X  #include <string.h>
X  #include "bplus.h"
X  
X**************
X*** 46,52
X                      /* must be used for Microsoft 5.0 */
X                      /* and the Quick C compiler.      */
X  
X! /* #define memcpy            memmove */
X  
X  /*  declare some global variables  */
X  
X--- 48,56 -----
X                      /* must be used for Microsoft 5.0 */
X                      /* and the Quick C compiler.      */
X  
X! #if	1
X! #define memcpy            memmove
X! #endif	/* if not needed */
X  
X  /*  declare some global variables  */
X  
X**************
X*** 60,97
X  int          split_size = IXB_SPACE;
X  int          comb_size  = (IXB_SPACE/2);
X  
X! void pascal error(int, long);
X! void pascal read_if(long, char *, int);
X! void pascal write_if(int, long, char *, int);
X! int  pascal creat_if(char *);
X! int  pascal open_if(char *);
X! void pascal close_if(int);
X! void pascal update_block(void);
X! void pascal init_cache(void);
X! int  pascal find_cache(RECPOS);
X! int  pascal new_cache(void);
X! void pascal load_cache(RECPOS);
X! void pascal get_cache(RECPOS);
X! void pascal retrieve_block(int, RECPOS);
X! int  pascal prev_entry(int);
X! int  pascal next_entry(int);
X! int  pascal copy_entry(ENTRY *, ENTRY *);
X! int  pascal scan_blk(int);
X! int  pascal last_entry(void);
X! int  pascal write_free( RECPOS, BLOCK *);
X! RECPOS pascal get_free(void);
X! int  pascal find_block(ENTRY *, int *);
X! void pascal movedown(BLOCK *, int, int);
X! void pascal moveup(BLOCK *, int, int);
X! void pascal ins_block(BLOCK *, ENTRY *, int);
X! void pascal del_block(BLOCK *, int);
X! int  pascal split(int, ENTRY *, ENTRY *);
X! void pascal ins_level(int, ENTRY *);
X! int  pascal insert_ix(ENTRY *, IX_DESC *);
X! int  pascal find_ix(ENTRY *, IX_DESC *, int);
X! int  pascal combineblk(RECPOS, int);
X! void pascal replace_entry(ENTRY *);
X! void print_blk(BLOCK *);
X  
X  
X  /*  file I/O for B-PLUS module  */
X--- 64,102 -----
X  int          split_size = IXB_SPACE;
X  int          comb_size  = (IXB_SPACE/2);
X  
X! /* ================ internal procedures ================ */
X! static void pascal error Param((int, long));
X! static void pascal read_if Param((RECPOS, char *, int));
X! static void pascal write_if Param((int, RECPOS, char *, int));
X! static int  pascal creat_if Param((char *));
X! static int  pascal open_if Param((char *));
X! static void pascal close_if Param((int));
X! static void pascal update_block Param((void));
X! static void pascal init_cache Param((void));
X! static int  pascal find_cache Param((RECPOS));
X! static int  pascal new_cache Param((void));
X! static void pascal load_cache Param((RECPOS));
X! static void pascal get_cache Param((RECPOS));
X! static void pascal retrieve_block Param((int, RECPOS));
X! static int  pascal prev_entry Param((int));
X! static int  pascal next_entry Param((int));
X! static void pascal copy_entry Param((ENTRY *, ENTRY *));
X! static int  pascal scan_blk Param((int));
X! static int  pascal last_entry Param((void));
X! static void pascal write_free Param(( RECPOS, BLOCK *));
X! static RECPOS pascal get_free Param((void));
X! static int  pascal find_block Param((ENTRY *, int *));
X! static void pascal movedown Param((BLOCK *, int, int));
X! static void pascal moveup Param((BLOCK *, int, int));
X! static void pascal ins_block Param((BLOCK *, ENTRY *, int));
X! static void pascal del_block Param((BLOCK *, int));
X! static void pascal split Param((int, ENTRY *, ENTRY *));
X! static void pascal ins_level Param((int, ENTRY *));
X! static int  pascal insert_ix Param((ENTRY *, IX_DESC *));
X! static int  pascal find_ix Param((ENTRY *, IX_DESC *, int));
X! static int  pascal combineblk Param((RECPOS, int));
X! static void pascal replace_entry Param((ENTRY *));
X! static void print_blk Param((BLOCK *));
X  
X  
X  /*  file I/O for B-PLUS module  */
X**************
X*** 96,102
X  
X  /*  file I/O for B-PLUS module  */
X  
X! void pascal error(j, l)
X    int j;
X    long l;
X    {
X--- 101,108 -----
X  
X  /*  file I/O for B-PLUS module  */
X  
X! static void pascal 
X! error(j, l)
X    int j;
X    long l;
X    {
X**************
X*** 103,109
X      static char *msg[3] = {"ERROR - CANNOT OPEN/CLOSE FILE",
X                             "ERROR WHILE READING FILE",
X                             "ERROR WHILE WRITING FILE"};
X!     printf("\n  %s - Record Number %ld\n", msg[j], l);
X      exit(1);
X    } /* error */
X  
X--- 109,115 -----
X      static char *msg[3] = {"ERROR - CANNOT OPEN/CLOSE FILE",
X                             "ERROR WHILE READING FILE",
X                             "ERROR WHILE WRITING FILE"};
X!     (void) printf("\n  %s - Record Number %ld\n", msg[j], l);
X      exit(1);
X    } /* error */
X  
X**************
X*** 108,115
X    } /* error */
X  
X  
X! void pascal read_if(start, buf, nwrt)
X!   long start;
X    char *buf;
X    int nwrt;
X    {
X--- 114,122 -----
X    } /* error */
X  
X  
X! static void pascal 
X! read_if(start, buf, nwrt)
X!   RECPOS start;
X    char *buf;
X    int nwrt;
X    {
X**************
X*** 120,126
X    } /* read_if */
X  
X  
X! void pascal write_if(handle, start, buf, nwrt)
X    int handle;
X    long start;
X    char *buf;
X--- 127,134 -----
X    } /* read_if */
X  
X  
X! static void pascal 
X! write_if(handle, start, buf, nwrt)
X    int handle;
X    RECPOS start;
X    char *buf;
X**************
X*** 122,128
X  
X  void pascal write_if(handle, start, buf, nwrt)
X    int handle;
X!   long start;
X    char *buf;
X    int nwrt;
X    {
X--- 130,136 -----
X  static void pascal 
X  write_if(handle, start, buf, nwrt)
X    int handle;
X!   RECPOS start;
X    char *buf;
X    int nwrt;
X    {
X**************
X*** 133,139
X    } /* write_if */
X  
X  
X! int pascal creat_if(fn)
X    char *fn;
X    {
X      int   ret;
X--- 141,148 -----
X    } /* write_if */
X  
X  
X! static int pascal 
X! creat_if(fn)
X    char *fn;
X    {
X      int   ret;
X**************
X*** 137,143
X    char *fn;
X    {
X      int   ret;
X!     ret = open(fn,O_RDWR|O_CREAT|O_TRUNC|O_BINARY,S_IWRITE);
X      if (ret  < 0) error(0,0L);
X      return (ret);
X    } /* creat_if */
X--- 146,152 -----
X    char *fn;
X    {
X      int   ret;
X!     ret = open(fn,O_RDWR|O_CREAT|O_TRUNC|O_BINARY,S_IREAD|S_IWRITE);
X      if (ret  < 0) error(0,0L);
X      return (ret);
X    } /* creat_if */
X**************
X*** 143,149
X    } /* creat_if */
X  
X  
X! int pascal open_if(fn)
X    char *fn;
X    {
X      int  ret;
X--- 152,159 -----
X    } /* creat_if */
X  
X  
X! static int pascal 
X! open_if(fn)
X    char *fn;
X    {
X      int  ret;
X**************
X*** 153,159
X    } /* open_if */
X  
X  
X! void pascal close_if(handle)
X    int handle;
X    {
X      if(close(handle) < 0)  error(2,0L);
X--- 163,170 -----
X    } /* open_if */
X  
X  
X! static void pascal 
X! close_if(handle)
X    int handle;
X    {
X      if(close(handle) < 0)  error(2,0L);
X**************
X*** 160,166
X    } /*  close_if */
X  
X  
X! int cdecl open_index(name, pix, dup)
X    char *name;
X    IX_DESC *pix;
X    int dup;
X--- 171,178 -----
X    } /*  close_if */
X  
X  
X! int cdecl 
X! open_index(name, pix, dup)
X    char *name;
X    IX_DESC *pix;
X    int dup;
X**************
X*** 179,185
X    } /* open_index */
X  
X  
X! int cdecl close_index(pix)
X    IX_DESC *pix;
X    {
X      int i;
X--- 191,198 -----
X    } /* open_index */
X  
X  
X! int cdecl 
X! close_index(pix)
X    IX_DESC *pix;
X    {
X      int i;
X**************
X*** 193,199
X                write_if(BUFHANDLE(i),
X                         BUFBLOCK(i).brec,
X                         (char *) &BUFBLOCK(i),
X!                        sizeof(BLOCK));
X                BUFDIRTY(i) = 0;
X              }
X            BUFBLOCK(i).brec = NULLREC;
X--- 206,212 -----
X                write_if(BUFHANDLE(i),
X                         BUFBLOCK(i).brec,
X                         (char *) &BUFBLOCK(i),
X!                        (int) sizeof(BLOCK));
X                BUFDIRTY(i) = 0;
X              }
X            BUFBLOCK(i).brec = NULLREC;
X**************
X*** 203,209
X    } /* close_index */
X  
X  
X! int cdecl make_index(name, pix, dup)
X    char *name;
X    IX_DESC *pix;
X    int dup;
X--- 216,223 -----
X    } /* close_index */
X  
X  
X! int cdecl 
X! make_index(name, pix, dup)
X    char *name;
X    IX_DESC *pix;
X    int dup;
X**************
X*** 233,239
X  
X  /*  cache I/O for BPLUS  */
X  
X! void pascal update_block()
X    {
X      if (block_ptr != &(pci->root))
X         BUFDIRTY(cache_ptr) = 1;
X--- 247,254 -----
X  
X  /*  cache I/O for BPLUS  */
X  
X! static void pascal 
X! update_block()
X    {
X      if (block_ptr != &(pci->root))
X         BUFDIRTY(cache_ptr) = 1;
X**************
X*** 240,246
X    } /* update_block */
X  
X  
X! void pascal init_cache()
X    {
X      register int  j;
X      for (j = 0; j < NUM_BUFS; j++)
X--- 255,262 -----
X    } /* update_block */
X  
X  
X! static void pascal 
X! init_cache()
X    {
X      register int  j;
X      for (j = 0; j < NUM_BUFS; j++)
X**************
X*** 251,257
X    } /* init_cache */
X  
X  
X! int pascal find_cache(r)
X    RECPOS r;
X    {
X      register int  j;
X--- 267,274 -----
X    } /* init_cache */
X  
X  
X! static int pascal 
X! find_cache(r)
X    RECPOS r;
X    {
X      register int  j;
X**************
X*** 265,271
X    } /* find_cache */
X  
X  
X! int pascal new_cache()
X    {
X      register int  i;
X      i = (cache_ptr + 1) % NUM_BUFS;
X--- 282,289 -----
X    } /* find_cache */
X  
X  
X! static int pascal 
X! new_cache()
X    {
X      register int  i;
X      i = (cache_ptr + 1) % NUM_BUFS;
X**************
X*** 279,285
X    } /* new_cache */
X  
X  
X! void pascal load_cache(r)
X    RECPOS r;
X    {
X      cache_ptr = new_cache();
X--- 297,304 -----
X    } /* new_cache */
X  
X  
X! static void pascal 
X! load_cache(r)
X    RECPOS r;
X    {
X      cache_ptr = new_cache();
X**************
X*** 287,293
X    } /* load_cache */
X  
X  
X! void pascal get_cache(r)
X    RECPOS r;
X    {
X      if (find_cache(r) < 0)
X--- 306,313 -----
X    } /* load_cache */
X  
X  
X! static void pascal 
X! get_cache(r)
X    RECPOS r;
X    {
X      if (find_cache(r) < 0)
X**************
X*** 296,302
X    } /* get_cache */
X  
X  
X! void pascal retrieve_block(j, r)
X    int j;
X    RECPOS r;
X    {
X--- 316,323 -----
X    } /* get_cache */
X  
X  
X! static void pascal 
X! retrieve_block(j, r)
X    int j;
X    RECPOS r;
X    {
X**************
X*** 309,315
X  
X  /*  low level functions of BPLUS  */
X  
X! int pascal prev_entry(off)
X    int off;
X    {
X       if (off <= 0)
X--- 330,337 -----
X  
X  /*  low level functions of BPLUS  */
X  
X! static int pascal 
X! prev_entry(off)
X    int off;
X    {
X       if (off <= 0)
X**************
X*** 323,329
X    } /* prev_entry */
X  
X  
X! int pascal next_entry(off)
X    int off;
X    {
X       if (off == -1)
X--- 345,352 -----
X    } /* prev_entry */
X  
X  
X! static int pascal 
X! next_entry(off)
X    int off;
X    {
X       if (off == -1)
X**************
X*** 338,344
X    } /* next_entry */
X  
X  
X! int pascal copy_entry(to, from)
X    ENTRY *to;
X    ENTRY *from;
X    {
X--- 361,368 -----
X    } /* next_entry */
X  
X  
X! static void pascal 
X! copy_entry(to, from)
X    ENTRY *to;
X    ENTRY *from;
X    {
X**************
X*** 344,350
X    {
X      int me;
X      me = ENT_SIZE(from);
X!     memcpy(to, from, me);
X    } /* copy_entry */
X  
X  
X--- 368,374 -----
X    {
X      int me;
X      me = ENT_SIZE(from);
X!     (void) memcpy(to, from, me);
X    } /* copy_entry */
X  
X  
X**************
X*** 348,354
X    } /* copy_entry */
X  
X  
X! int pascal scan_blk(n)
X    int n;
X    {
X       register int off, last;
X--- 372,379 -----
X    } /* copy_entry */
X  
X  
X! static int pascal 
X! scan_blk(n)
X    int n;
X    {
X       register int off, last;
X**************
X*** 363,369
X    } /* scan_blk */
X  
X  
X! int pascal last_entry()
X    {
X       return( scan_blk(block_ptr->bend) );
X    } /* last_entry */
X--- 388,395 -----
X    } /* scan_blk */
X  
X  
X! static int pascal 
X! last_entry()
X    {
X       return( scan_blk(block_ptr->bend) );
X    } /* last_entry */
X**************
X*** 371,377
X  
X  /*  maintain list of free index blocks  */
X  
X! int pascal write_free(r, pb)
X    RECPOS r;
X    BLOCK *pb;
X    {
X--- 397,404 -----
X  
X  /*  maintain list of free index blocks  */
X  
X! static void pascal 
X! write_free(r, pb)
X    RECPOS r;
X    BLOCK *pb;
X    {
X**************
X*** 377,383
X    {
X      pb->p0 = FREE_BLOCK;
X      pb->brec = pci->dx.ff;
X!     write_if(pci->ixfile, r, (char *) pb, sizeof(BLOCK));
X      pci->dx.ff = r;
X    } /* write_free */
X  
X--- 404,410 -----
X    {
X      pb->p0 = FREE_BLOCK;
X      pb->brec = pci->dx.ff;
X!     write_if(pci->ixfile, r, (char *) (char *) pb, sizeof(BLOCK));
X      pci->dx.ff = r;
X    } /* write_free */
X  
X**************
X*** 382,388
X    } /* write_free */
X  
X  
X! RECPOS pascal get_free()
X    {
X      RECPOS  r, rt;
X  
X--- 409,416 -----
X    } /* write_free */
X  
X  
X! static RECPOS pascal 
X! get_free()
X    {
X      RECPOS  r, rt;
X  
X**************
X*** 388,394
X  
X      r = pci->dx.ff;
X      if ( r != NULLREC )
X!       {  read_if(r, (char *)&rt, sizeof( RECPOS ));
X           pci->dx.ff = rt;
X        }
X      else
X--- 416,422 -----
X  
X      r = pci->dx.ff;
X      if ( r != NULLREC )
X!       {  read_if(r, (char *)&rt, (int) sizeof( RECPOS ));
X           pci->dx.ff = rt;
X        }
X      else
X**************
X*** 399,405
X  
X  /*  general BPLUS block level functions  */
X  
X! int pascal find_block(pe, poff)
X    ENTRY *pe;
X    int *poff;
X    {
X--- 427,434 -----
X  
X  /*  general BPLUS block level functions  */
X  
X! static int pascal 
X! find_block(pe, poff)
X    ENTRY *pe;
X    int *poff;
X    {
X**************
X*** 425,431
X    } /* find_block */
X  
X  
X! void pascal movedown(pb, off, n)
X    BLOCK *pb;
X    int off;
X    int n;
X--- 454,461 -----
X    } /* find_block */
X  
X  
X! static void pascal 
X! movedown(pb, off, n)
X    BLOCK *pb;
X    int off;
X    int n;
X**************
X*** 436,442
X    } /* movedown */
X  
X  
X! void pascal moveup(pb, off, n)
X    BLOCK *pb;
X    int off;
X    int n;
X--- 466,473 -----
X    } /* movedown */
X  
X  
X! static void pascal 
X! moveup(pb, off, n)
X    BLOCK *pb;
X    int off;
X    int n;
X**************
X*** 447,453
X    } /* moveup */
X  
X  
X! void pascal ins_block(pb, pe, off)
X    BLOCK *pb;
X    ENTRY *pe;
X    int off;
X--- 478,485 -----
X    } /* moveup */
X  
X  
X! static void pascal 
X! ins_block(pb, pe, off)
X    BLOCK *pb;
X    ENTRY *pe;
X    int off;
X**************
X*** 460,466
X    } /* ins_block */
X  
X  
X! void pascal del_block(pb, off)
X    BLOCK *pb;
X    int off;
X    {
X--- 492,499 -----
X    } /* ins_block */
X  
X  
X! static void pascal 
X! del_block(pb, off)
X    BLOCK *pb;
X    int off;
X    {
X**************
X*** 473,479
X  
X  /*  position at start/end of index  */
X  
X! int cdecl first_key(pix)
X    IX_DESC *pix;
X    {
X      pci = pix;
X--- 506,513 -----
X  
X  /*  position at start/end of index  */
X  
X! int cdecl 
X! first_key(pix)
X    IX_DESC *pix;
X    {
X      pci = pix;
X**************
X*** 490,496
X    } /* first_key */
X  
X  
X! int cdecl last_key(pix)
X    IX_DESC *pix;
X    {
X      long  ads;
X--- 524,531 -----
X    } /* first_key */
X  
X  
X! int cdecl 
X! last_key(pix)
X    IX_DESC *pix;
X    {
X      long  ads;
X**************
X*** 510,516
X  
X  /*  get next, previous entries  */
X  
X! int cdecl next_key(pe, pix)
X    ENTRY *pe;
X    IX_DESC *pix;
X    {
X--- 545,552 -----
X  
X  /*  get next, previous entries  */
X  
X! int cdecl 
X! next_key(pe, pix)
X    ENTRY *pe;
X    IX_DESC *pix;
X    {
X**************
X*** 544,550
X    } /* next_key */
X  
X  
X! int cdecl prev_key(pe, pix)
X    ENTRY *pe;
X    IX_DESC *pix;
X    {
X--- 580,587 -----
X    } /* next_key */
X  
X  
X! int cdecl 
X! prev_key(pe, pix)
X    ENTRY *pe;
X    IX_DESC *pix;
X    {
X**************
X*** 582,588
X  
X  /*  insert new entries into tree  */
X  
X! int pascal split(l, pe, e)
X    int l;
X    ENTRY *pe;
X    ENTRY *e;
X--- 619,626 -----
X  
X  /*  insert new entries into tree  */
X  
X! static void pascal 
X! split(l, pe, e)
X    int l;
X    ENTRY *pe;
X    ENTRY *e;
X**************
X*** 622,628
X    } /* split */
X  
X  
X! void pascal ins_level(l, e)
X    int l;
X    ENTRY *e;
X    {
X--- 660,667 -----
X    } /* split */
X  
X  
X! static void pascal 
X! ins_level(l, e)
X    int l;
X    ENTRY *e;
X    {
X**************
X*** 647,653
X    } /* ins_level */
X  
X  
X! int pascal insert_ix(pe, pix)
X    ENTRY *pe;
X    IX_DESC *pix;
X    {
X--- 686,693 -----
X    } /* ins_level */
X  
X  
X! static int pascal 
X! insert_ix(pe, pix)
X    ENTRY *pe;
X    IX_DESC *pix;
X    {
X**************
X*** 691,697
X  
X  /*  BPLUS find and add key functions  */
X  
X! int pascal find_ix(pe, pix, find)
X    ENTRY *pe;
X    IX_DESC *pix;
X    int find;
X--- 731,738 -----
X  
X  /*  BPLUS find and add key functions  */
X  
X! static int pascal 
X! find_ix(pe, pix, find)
X    ENTRY *pe;
X    IX_DESC *pix;
X    int find;
X**************
X*** 717,723
X     } /* find_ix */
X  
X  
X! int cdecl find_key(pe, pix)
X    ENTRY *pe;
X    IX_DESC *pix;
X    {
X--- 758,765 -----
X     } /* find_ix */
X  
X  
X! int cdecl 
X! find_key(pe, pix)
X    ENTRY *pe;
X    IX_DESC *pix;
X    {
X**************
X*** 728,734
X    } /* find_key */
X  
X  
X! int cdecl add_key(pe, pix)
X    ENTRY *pe;
X    IX_DESC *pix;
X    {
X--- 770,777 -----
X    } /* find_key */
X  
X  
X! int cdecl 
X! add_key(pe, pix)
X    ENTRY *pe;
X    IX_DESC *pix;
X    {
X**************
X*** 740,746
X    } /* add_key */
X  
X  
X! int cdecl locate_key(pe, pix)
X    ENTRY *pe;
X    IX_DESC *pix;
X    {
X--- 783,790 -----
X    } /* add_key */
X  
X  
X! int cdecl 
X! locate_key(pe, pix)
X    ENTRY *pe;
X    IX_DESC *pix;
X    {
X**************
X*** 753,759
X    } /* locate_key */
X  
X  
X! int cdecl find_exact(pe, pix)
X    ENTRY *pe;
X    IX_DESC * pix;
X    {
X--- 797,804 -----
X    } /* locate_key */
X  
X  
X! int cdecl 
X! find_exact(pe, pix)
X    ENTRY *pe;
X    IX_DESC * pix;
X    {
X**************
X*** 778,784
X  
X  /* BPLUS delete key functions */
X  
X! int cdecl delete_key(pe, pix)
X    ENTRY *pe;
X    IX_DESC *pix;
X    {
X--- 823,830 -----
X  
X  /* BPLUS delete key functions */
X  
X! int cdecl 
X! delete_key(pe, pix)
X    ENTRY *pe;
X    IX_DESC *pix;
X    {
X**************
X*** 831,837
X    } /* delete_key */
X  
X  
X! int pascal combineblk(ads, size)
X    RECPOS ads;
X    int size;
X    {
X--- 877,884 -----
X    } /* delete_key */
X  
X  
X! static int pascal 
X! combineblk(ads, size)
X    RECPOS ads;
X    int size;
X    {
X**************
X*** 938,944
X    } /* combineblk */
X  
X  
X! void pascal replace_entry(pe)
X    ENTRY *pe;
X    {
X      retrieve_block(pci->level, CB(pci->level));
X--- 985,992 -----
X    } /* combineblk */
X  
X  
X! static void pascal 
X! replace_entry(pe)
X    ENTRY *pe;
X    {
X      retrieve_block(pci->level, CB(pci->level));
X**************
X*** 947,951
X      prev_entry(CO(pci->level));
X      insert_ix(pe, pci);
X    } /* replace_entry */
X- 
X- \032
X--- 995,997 -----
X      prev_entry(CO(pci->level));
X      insert_ix(pe, pci);
X    } /* replace_entry */
SHAR_EOF
chmod 0644 bplus.diff || echo "restore of bplus.diff fails"
echo "x - extracting filelen.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > filelen.c &&
X/*****************************************************************
X |  filelength - returns the length of a file
X ****************************************************************/
X
Xlong  filelength (fd)
X    int  fd;
X{
X#if	0		/* original version */
X    long  orig, last, lseek();
X
X    orig = lseek (fd, 0L, 1);		/* seek to the current position */
X    last = lseek (fd, 0L, 2);		/* seek to the end */
X    lseek (fd, orig, 0);		/* reset the pointer */
X
X    return last;
X#else			/* new network version */
X#include <fcntl.h>
X#include <sys/types.h>
X#include <sys/stat.h>
X
X    struct stat sb;
X    fstat(fd, &sb);
X    return sb.st_size;
X#endif
X}
SHAR_EOF
chmod 0644 filelen.c || echo "restore of filelen.c fails"
echo "x - extracting memmove.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > memmove.c &&
X/*****************************************************************
X |  memmove - move in memory with attention to order and overlap
X |----------------------------------------------------------------
X |  Arguments:
X |   1) destination: char *
X |   2) source: char *
X |   3) length: int
X |  Returns: none
X ****************************************************************/
X
Xvoid memmove (to, from, length)
X    char *to, *from;
X    int  length;
X{
X    register char *TO, *FROM;
X
X    if (to < from) {
X    /* move left to right */
X	TO = to;
X	FROM = from;
X	while (length--)
X	    *(TO++) = *(FROM++);
X    }
X    else {
X    /* move right to left */
X	TO = to + length - 1;
X	FROM = from + length - 1;
X	while (length--)
X	    *(TO--) = *(FROM--);
X    }
X}
SHAR_EOF
chmod 0644 memmove.c || echo "restore of memmove.c fails"
echo "x - extracting utest.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > utest.c &&
X/* UNIX test, pipe the output of "find" into this and get a sorted list
X   The keys are printed in order after the data has been read.
X*/
X
X#include <stdio.h>
X#include "bplus.h"
X
Xmain() {
X  ENTRY wk, *ep = &wk;
X  IX_DESC pix, *ixptr = &pix;
X  char line[80];
X  int stat;
X
X  if (make_index("names.idx", ixptr, 0) != IX_OK) {
X     perror("Make index");
X     exit(1);
X  }
X  
X  while (fgets(line, 80, stdin) != NULL) {
X    line[strlen(line)-1] = 0;
X    strcpy(wk.key, line);
X    if ((stat = add_key(ep, ixptr)) != IX_OK) {
X      printf("Status %d from add_key\n", stat);
X      exit(0);
X    }
X  }
X
X  /* dump the file */
X  first_key(ixptr);
X  while (next_key(ep, ixptr) == IX_OK) {
X    printf("%s\n", wk.key);
X  }
X  close_index(ixptr);
X}
SHAR_EOF
chmod 0644 utest.c || echo "restore of utest.c fails"
echo "x - extracting utest1.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > utest1.c &&
X/* UNIX test, pipe the output of "find" into this and get a sorted list
X
X   The key value is the last non-blank data in the input record. This
X   works well using the output of "ls -l" as input.
X
X   After the index has been built, the keys are read in order, the
X   record position is used to access the complete data record, and
X   the data record is displayed.
X*/
X
X#include <stdio.h>
X#include "bplus.h"
X
X#define DUPflag		1		/* allow dups */
X#define LineSize	180		/* input max line */
Xmain(argc, argv)
X  int argc;
X  char *argv[];
X{
X  ENTRY wk, *ep = &wk;
X  IX_DESC pix, *ixptr = &pix;
X  char line[LineSize];
X  FILE *infile, *fopen();
X  long filepos, ftell();
X  int stat, pos, rcount = 0;
X
X  if (argc < 2) {
X    printf("Missing filename\n");
X    exit(1);
X  }
X
X  if ((infile = fopen(argv[1], "r")) == NULL) {
X    printf("Can't open input file %s\n", argv[1]);
X    exit(1);
X  }
X  
X  if (make_index("names.idx", ixptr, DUPflag) != IX_OK) {
X     perror("Make index");
X     exit(1);
X  }
X  
X  while (filepos = ftell(infile), fgets(line, LineSize, infile) != NULL) {
X    rcount++;
X    pos = strlen(line) - 1;
X    line[pos] = 0;
X    while (pos && line[pos-1] != ' ') pos--;
X    strcpy(wk.key, &line[pos]);
X    wk.recptr = filepos;
X    if ((stat = add_key(ep, ixptr)) != IX_OK) {
X      printf("Status %d from add_key at record %d\n", stat, rcount);
X      exit(0);
X    }
X  }
X
X  /* dump the file */
X  first_key(ixptr);
X  while (next_key(ep, ixptr) == IX_OK) {
X    fseek(infile, wk.recptr, 0);
X    fgets(line, LineSize, infile);
X    printf("%s", line);
X  }
X  
X  close_index(ixptr);
X  fclose(infile);
X}
SHAR_EOF
chmod 0644 utest1.c || echo "restore of utest1.c fails"
echo "x - extracting utest2.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > utest2.c &&
X/* UNIX test, pipe the output of "find" into this and get a sorted list
X
X   The key value is the last non-blank data in the input record. This
X   works well using the output of "ls -l" as input. Keys are stored
X   without regard to case.
X
X   After the index has been built, the keys are read in order, the
X   record position is used to access the complete data record, and
X   the data record is displayed.
X*/
X
X#include <stdio.h>
X#include <ctype.h>
X#include "bplus.h"
X
X#define DUPflag		1		/* allow dups */
X#define LineSize	180		/* input max line */
Xmain(argc, argv)
X  int argc;
X  char *argv[];
X{
X  ENTRY wk, *ep = &wk;
X  IX_DESC pix, *ixptr = &pix;
X  char line[LineSize];
X  FILE *infile, *fopen();
X  long filepos, ftell();
X  int stat, pos, rcount = 0, wkch, wkpos;
X
X  if (argc < 2) {
X    printf("Missing filename\n");
X    exit(1);
X  }
X
X  if ((infile = fopen(argv[1], "r")) == NULL) {
X    printf("Can't open input file %s\n", argv[1]);
X    exit(1);
X  }
X  
X  if (make_index("names.idx", ixptr, DUPflag) != IX_OK) {
X     perror("Make index");
X     exit(1);
X  }
X  
X  while (filepos = ftell(infile), fgets(line, LineSize, infile) != NULL) {
X    rcount++;
X    pos = strlen(line) - 1;
X    line[pos] = 0;
X    while (pos && line[pos-1] != ' ' && line[pos-1] != '/') pos--;
X    
X    /* this forces the sort key into lower case */
X    for (wkpos=pos; wkch = line[wkpos]; wkpos++) {
X      if (isupper(wkch)) line[wkpos] = tolower(wkch);
X    }
X
X    strcpy(wk.key, &line[pos]);
X    wk.recptr = filepos;
X    if ((stat = add_key(ep, ixptr)) != IX_OK) {
X      printf("Status %d from add_key at record %d\n", stat, rcount);
X      exit(0);
X    }
X  }
X
X  /* dump the file */
X  first_key(ixptr);
X  while (next_key(ep, ixptr) == IX_OK) {
X    fseek(infile, wk.recptr, 0);
X    fgets(line, LineSize, infile);
X    printf("%s", line);
X  }
X  
X  close_index(ixptr);
X  fclose(infile);
X}
SHAR_EOF
chmod 0644 utest2.c || echo "restore of utest2.c fails"
echo "x - extracting utest3.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > utest3.c &&
X/* UNIX test, pipe the output of "find" into this and get a sorted list
X
X   The key value is the last non-blank data in the input record. This
X   works well using the output of "ls -l" as input. Keys are stored
X   without regard to case.
X*/
X
X#include <stdio.h>
X#include <ctype.h>
X#include "bplus.h"
X
X#define DUPflag		1		/* allow dups */
X#define LineSize	180		/* input max line */
Xmain(argc, argv)
X  int argc;
X  char *argv[];
X{
X  ENTRY wk, *ep = &wk;
X  IX_DESC pix, *ixptr = &pix;
X  char line[LineSize];
X  FILE *infile, *fopen();
X  long filepos, ftell();
X  int stat, pos, rcount = 0, wkch, wkpos;
X
X  if (argc < 2) {
X    printf("Missing filename\n");
X    exit(1);
X  }
X
X  if ((infile = fopen(argv[1], "r")) == NULL) {
X    printf("Can't open input file %s\n", argv[1]);
X    exit(1);
X  }
X  
X  if (make_index("names.idx", ixptr, DUPflag) != IX_OK) {
X     perror("Make index");
X     exit(1);
X  }
X  
X  while (filepos = ftell(infile), fgets(line, LineSize, infile) != NULL) {
X    rcount++;
X    pos = strlen(line) - 1;
X    line[pos] = 0;
X    while (pos && line[pos-1] != ' ' && line[pos-1] != '/') pos--;
X    
X    /* this forces the sort key into lower case */
X    for (wkpos=pos; wkch = line[wkpos]; wkpos++) {
X      if (isupper(wkch)) line[wkpos] = tolower(wkch);
X    }
X
X    strcpy(wk.key, &line[pos]);
X    wk.recptr = filepos;
X    if ((stat = add_key(ep, ixptr)) != IX_OK) {
X      printf("Status %d from add_key at record %d\n", stat, rcount);
X      exit(0);
X    }
X  }
X
X  close_index(ixptr);
X  fclose(infile);
X}
SHAR_EOF
chmod 0644 utest3.c || echo "restore of utest3.c fails"
echo "x - extracting utest4.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > utest4.c &&
X/* UNIX B+tree test, read a database created by the utest3 program and
X   display records matching given keys
X*/
X
X#include <stdio.h>
X#include <ctype.h>
X#include "bplus.h"
X
X#define DUPflag		1	/* allow dups */
X#define LineSize	180	/* input max line */
X
Xmain (argc, argv)
X  int  argc;
X  char *argv[];
X{
X  ENTRY wk, *ep = &wk;
X  IX_DESC pix, *ixptr = &pix;
X  char  line[LineSize], MyKey[MAXKEY];
X  char *fgets();
X  FILE *infile, *fopen ();
X  long  filepos, ftell ();
X  int  stat, pos, rcount = 0, wkch, wkpos;
X
X  if (argc < 2) {
X    printf ("Missing filename\n");
X    exit (1);
X  }
X
X  if ((infile = fopen (argv[1], "r")) == NULL) {
X    printf ("Can't open input file %s\n", argv[1]);
X    exit (1);
X  }
X
X  if (open_index ("names.idx", ixptr, DUPflag) != IX_OK) {
X    perror ("Open index");
X    exit (1);
X  }
X
X /* dump the file */
X  for (;;) {
X    printf ("Filename: ");
X    if (fgets (MyKey, MAXKEY, stdin) == NULL) break;
X    MyKey[pos = strlen (MyKey) - 1] = 0;
X    if (pos == 0) break;
X    for (pos = 0; wkch = MyKey[pos]; pos++) {
X      if (isupper (wkch))
X	MyKey[pos] = tolower (wkch);
X    }
X    /* insure readable output if input is from a pipe */
X    if (!isatty(0)) printf("%s\n", MyKey);
X
X  /* get the first matching key */
X    strcpy (wk.key, MyKey);
X    if (find_key (ep, ixptr) == IX_OK) {
X    /* at least one matching key */
X      fseek (infile, wk.recptr, 0);
X      fgets (line, LineSize, infile);
X      printf ("%s", line);
X
X    /* now look for more duplicates */
X      while (next_key (ep, ixptr) == IX_OK && strcmp (wk.key, MyKey) == 0) {
X      /* display all duplicate keys */
X	fseek (infile, wk.recptr, 0);
X	fgets (line, LineSize, infile);
X	printf ("%s", line);
X      }
X    }
X  }
X
X  close_index (ixptr);
X  fclose (infile);
X}
SHAR_EOF
chmod 0644 utest4.c || echo "restore of utest4.c fails"
echo "x - extracting makefile (Text)"
sed 's/^X//' << 'SHAR_EOF' > makefile &&
X# makefile for UNIX bplus test
X
XLIB		= bplus.o filelen.o memmove.o
XTESTS		= utest utest1 utest2 utest3 utest4
XTESTOBJ		= utest.o utest1.o utest2.o utest3.o utest4.o
XCFLAGS		= -O
X
Xall: $(TESTS)
X
X$(TESTS): bplus.a $$@.o
X	cc -o $@ $@.o bplus.a
X
Xbplus.o:	bplus.h
X$(TESTOBJ):	bplus.h
X
Xbplus.a: $(LIB)
X	ar rv bplus.a $?
X	ranlib bplus.a
SHAR_EOF
chmod 0644 makefile || echo "restore of makefile fails"
exit 0

-- 
	bill davidsen		(wedu at ge-crd.arpa)
  {uunet | philabs}!steinmetz!crdos1!davidsen
"Stupidity, like virtue, is its own reward" -me



More information about the Comp.lang.c mailing list