X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=dict%2Finsert.c;h=aa7a68507ff4bdae24eaf0af610e97a4f5f94b21;hb=0efcca9923da4586d3c1d1c10d4afa68c894f576;hp=6fd334e982f86a04e3c8fe0bd6c398580e414b0b;hpb=4ed5fbcd29d2a98b048d1d94510b262d352b4f7c;p=idzebra-moved-to-github.git diff --git a/dict/insert.c b/dict/insert.c index 6fd334e..aa7a685 100644 --- a/dict/insert.c +++ b/dict/insert.c @@ -1,84 +1,33 @@ -/* - * Copyright (C) 1994-1999, Index Data - * All rights reserved. - * Sebastian Hammer, Adam Dickmeiss - * - * $Log: insert.c,v $ - * Revision 1.20 1999-05-15 14:36:37 adam - * Updated dictionary. Implemented "compression" of dictionary. - * - * Revision 1.19 1999/02/02 14:50:22 adam - * Updated WIN32 code specific sections. Changed header. - * - * Revision 1.18 1998/03/05 08:17:24 adam - * Added a few comments - no code changed. - * - * Revision 1.17 1996/05/14 15:49:09 adam - * Bug fix: In function split_page. In rare cases variable best_indxp was - * referenced. - * - * Revision 1.16 1996/02/02 13:43:50 adam - * The public functions simply use char instead of Dict_char to represent - * search strings. Dict_char is used internally only. - * - * Revision 1.15 1996/02/01 20:39:59 adam - * Bug fix: insert didn't work on 8-bit characters due to unsigned char - * compares in dict_strcmp (strcmp) and signed Dict_char. Dict_char is - * unsigned now. - * - * Revision 1.14 1995/12/07 11:48:56 adam - * Insert operation obeys DICT_type = 1 (slack in page). - * Function dict_open exists if page size or magic aren't right. - * - * Revision 1.13 1995/11/28 09:06:37 adam - * Fixed potential dangling pointer. - * - * Revision 1.12 1995/09/06 10:34:44 adam - * Memcpy in clean_page edited to satisfy checkergcc. - * - * Revision 1.11 1995/09/04 12:33:31 adam - * Various cleanup. YAZ util used instead. - * - * Revision 1.10 1994/10/05 12:16:48 adam - * Pagesize is a resource now. - * - * Revision 1.9 1994/09/16 15:39:13 adam - * Initial code of lookup - not tested yet. - * - * Revision 1.8 1994/09/16 12:35:01 adam - * New version of split_page which use clean_page for splitting. - * - * Revision 1.7 1994/09/12 08:06:42 adam - * Futher development of insert.c - * - * Revision 1.6 1994/09/06 13:05:15 adam - * Further development of insertion. Some special cases are - * not properly handled yet! assert(0) are put here. The - * binary search in each page definitely reduce usr CPU. - * - * Revision 1.5 1994/09/01 17:49:39 adam - * Removed stupid line. Work on insertion in dictionary. Not finished yet. - * - * Revision 1.4 1994/09/01 17:44:09 adam - * depend include change. - * - * Revision 1.3 1994/08/18 12:40:56 adam - * Some development of dictionary. Not finished at all! - * - * Revision 1.2 1994/08/17 13:32:19 adam - * Use cache in dict - not in bfile. - * - * Revision 1.1 1994/08/16 16:26:48 adam - * Added dict. - * - */ +/* $Id: insert.c,v 1.31 2007-01-15 15:10:15 adam Exp $ + Copyright (C) 1995-2007 + Index Data ApS + +This file is part of the Zebra server. + +Zebra is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free +Software Foundation; either version 2, or (at your option) any later +version. + +Zebra is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +*/ + + #include #include #include #include -#include +#include "dict-p.h" #define CHECK 0 @@ -125,6 +74,7 @@ static int split_page (Dict dict, Dict_ptr ptr, void *p) Dict_char prev_char = 0; int best_no = -1, no_current = 1; + dict->no_split++; /* determine splitting char... */ indxp = (short*) ((char*) p+DICT_bsize(p)-sizeof(short)); for (i = DICT_nodir (p); --i >= 0; --indxp) @@ -156,8 +106,7 @@ static int split_page (Dict dict, Dict_ptr ptr, void *p) } } } - if (best_no < 0) /* we didn't find any tail string entry at all! */ - return -1; + assert(best_no >= 0); /* we didn't find any tail string entry at all! */ j = best_indxp - (short*) p; subptr = new_page (dict, ptr, &subp); @@ -198,7 +147,7 @@ static int split_page (Dict dict, Dict_ptr ptr, void *p) static void clean_page (Dict dict, Dict_ptr ptr, void *p, Dict_char *out, Dict_ptr subptr, char *userinfo) { - char *np = xmalloc (dict->head.page_size); + char *np = (char *) xmalloc (dict->head.page_size); int i, slen, no = 0; short *indxp1, *indxp2; char *info1, *info2; @@ -394,8 +343,8 @@ static int dict_ins (Dict dict, const Dict_char *str, } if (split_page (dict, ptr, p)) { - logf (LOG_FATAL, "Unable to split page %d\n", ptr); - abort (); + yaz_log (YLOG_FATAL, "Unable to split page %d\n", ptr); + assert(0); } return dict_ins (dict, str-1, ptr, userlen, userinfo); } @@ -439,7 +388,7 @@ static int dict_ins (Dict dict, const Dict_char *str, --indxp; slen = (dict_strlen(str)+1)*sizeof(Dict_char); if (DICT_size(p)+slen+userlen >= - DICT_bsize(p) - (1+DICT_nodir(p))*sizeof(short)) /* overflow? */ + (int)(DICT_bsize(p) - (1+DICT_nodir(p))*sizeof(short)))/* overflow? */ { if (DICT_type(p)) { @@ -488,15 +437,25 @@ static int dict_ins (Dict dict, const Dict_char *str, int dict_insert (Dict dict, const char *str, int userlen, void *userinfo) { + if (!dict->rw) + return -1; + dict->no_insert++; if (!dict->head.root) { void *p; - if (dict->rw) - dict->head.root = new_page (dict, 0, &p); + dict->head.root = new_page (dict, 0, &p); if (!dict->head.root) - return 0; + return -1; } return dict_ins (dict, (const Dict_char *) str, dict->head.root, userlen, userinfo); } +/* + * Local variables: + * c-basic-offset: 4 + * indent-tabs-mode: nil + * End: + * vim: shiftwidth=4 tabstop=8 expandtab + */ +