X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=isam%2Fisam.c;h=2958f16ec356f83751ebf20fa7c70211caca2596;hb=e12dd8d52a43a7159afd90fd2fa80b0072fd2ce7;hp=3ae755c817fbea961e2c795398ea542b771d282d;hpb=a5545de18b5d3762a1f29569a4b10ca5017506db;p=idzebra-moved-to-github.git diff --git a/isam/isam.c b/isam/isam.c index 3ae755c..2958f16 100644 --- a/isam/isam.c +++ b/isam/isam.c @@ -4,7 +4,22 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: isam.c,v $ - * Revision 1.5 1994-09-27 20:03:50 quinn + * Revision 1.10 1994-09-28 16:58:32 quinn + * Small mod. + * + * Revision 1.9 1994/09/28 12:56:15 quinn + * Added access functions (ISPT) + * + * Revision 1.8 1994/09/28 12:32:17 quinn + * Trivial + * + * Revision 1.7 1994/09/28 11:56:25 quinn + * Added sort of input to is_merge + * + * Revision 1.6 1994/09/28 11:29:33 quinn + * Added cmp parameter. + * + * Revision 1.5 1994/09/27 20:03:50 quinn * Seems relatively bug-free. * * Revision 1.4 1994/09/26 17:11:29 quinn @@ -30,6 +45,29 @@ #include "rootblk.h" #include "keyops.h" +static int (*extcmp)(const void *p1, const void *p2); +static ispt_struct *ispt_freelist = 0; + +static ISPT ispt_alloc() +{ + ISPT p; + + if (ispt_freelist) + { + p = ispt_freelist; + ispt_freelist = ispt_freelist->next; + } + else + p = xmalloc(sizeof(ispt_struct)); + return p; +} + +static void ispt_free(ISPT pt) +{ + pt->next = ispt_freelist; + ispt_freelist = pt; +} + static int splitargs(const char *s, char *bf[], int max) { int ct = 0; @@ -56,7 +94,8 @@ static int splitargs(const char *s, char *bf[], int max) * Open isam file. * Process resources. */ -ISAM is_open(const char *name, int writeflag) +ISAM is_open(const char *name, int (*cmp)(const void *p1, const void *p2), + int writeflag) { ISAM new; char *nm, *r, *pp[IS_MAX_BLOCKTYPES+1], m[2]; @@ -217,7 +256,7 @@ ISAM is_open(const char *name, int writeflag) new->types[i].nice_keys_block = 1; } - new->cmp = is_default_cmp; + new->cmp = cmp ? cmp : is_default_cmp; return new; } @@ -262,7 +301,16 @@ static ISAM_P is_address(int type, int pos) return r; } -ISAM_P is_merge(ISAM is, ISAM_P pos, int num, const char *data) +int sort_input(const void *p1, const void *p2) +{ + int rs; + + if ((rs = (*extcmp)(((char *)p1) + 1, ((char *)p2) + 1))) + return rs; + return *((char *)p1) - *((char*)p2); +} + +ISAM_P is_merge(ISAM is, ISAM_P pos, int num, char *data) { is_mtable tab; int res; @@ -270,8 +318,9 @@ ISAM_P is_merge(ISAM is, ISAM_P pos, int num, const char *data) int oldnum, oldtype, i; char operation, *record; + extcmp = is->cmp; + qsort(data, num, is_keysize(is) + 1, sort_input); is_m_establish_tab(is, &tab, pos); - /* TODO: do something to aquire oldnum at this point */ if (pos) if (is_m_read_full(&tab, tab.data) < 0) { @@ -367,9 +416,38 @@ ISAM_P is_merge(ISAM is, ISAM_P pos, int num, const char *data) * Locate a table of keys in an isam file. The ISPT is an individual * position marker for that table. */ -ISPT is_position(ISAM is, ISAM_P pos); +ISPT is_position(ISAM is, ISAM_P pos) +{ + ispt_struct *p; + + p = ispt_alloc(); + is_m_establish_tab(is, &p->tab, pos); + return p; +} /* * Release ISPT. */ -void is_pt_free(ISPT ip); +void is_pt_free(ISPT ip) +{ + is_m_release_tab(&ip->tab); + ispt_free(ip); +} + +/* + * Read a key from a table. + */ +int is_readkey(ISPT ip, void *buf) +{ + return is_m_read_record(&ip->tab, buf); +} + +int is_numkeys(ISPT ip) +{ + return is_m_num_records(&ip->tab); +} + +void is_rewind(ISPT ip) +{ + is_m_rewind(&ip->tab); +}