X-Git-Url: http://sru.miketaylor.org.uk/?a=blobdiff_plain;f=dict%2Finsert.c;h=4a0007f531bbb87bf5a4239bdfdfb9408ba981d1;hb=400055a9f298ff9d5689dcf292c84f8cafff4697;hp=70a18b4e6088583ef30e4eeb68affac67fa450b8;hpb=30bfffa1e13e0ebd1d7eac84518705e2fbcd955b;p=idzebra-moved-to-github.git diff --git a/dict/insert.c b/dict/insert.c index 70a18b4..4a0007f 100644 --- a/dict/insert.c +++ b/dict/insert.c @@ -4,7 +4,16 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: insert.c,v $ - * Revision 1.10 1994-10-05 12:16:48 adam + * 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 @@ -86,7 +95,7 @@ static int split_page (Dict dict, Dict_ptr ptr, void *p) void *subp; char *info_here; Dict_ptr subptr; - int i; + int i, j; short *indxp, *best_indxp = NULL; Dict_char best_char = 0; Dict_char prev_char = 0; @@ -125,18 +134,18 @@ 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; + j = best_indxp - (short*) p; subptr = new_page (dict, ptr, &subp); /* scan entries to see if there is a string with */ /* length 1. info_here indicates if such entry exist */ info_here = NULL; - for (indxp=best_indxp, i=0; i 0); - - info = (char*) p + *indxp; /* entry start */ + info = (char*) p + ((short*) p)[j]; + /* entry start */ assert (*info == best_char); slen = dict_strlen(info); @@ -159,7 +168,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) + Dict_ptr subptr, char *userinfo) { char *np = xmalloc (dict->head.page_size); int i, slen, no = 0; @@ -223,8 +232,17 @@ static void clean_page (Dict dict, Dict_ptr ptr, void *p, Dict_char *out, info2 += slen; ++no; } +#if 1 + memcpy ((char*)p+DICT_infoffset, + (char*)np+DICT_infoffset, + info2 - ((char*)np+DICT_infoffset)); + memcpy ((char*)p + ((char*)indxp2 - (char*)np), + indxp2, + ((char*) np+DICT_pagesize(dict)) - (char*)indxp2); +#else memcpy ((char*)p+DICT_infoffset, (char*)np+DICT_infoffset, DICT_pagesize(dict)-DICT_infoffset); +#endif DICT_size(p) = info2 - np; DICT_type(p) = 0; DICT_nodir(p) = no; @@ -346,7 +364,7 @@ static int dict_ins (Dict dict, const Dict_char *str, } if (split_page (dict, ptr, p)) { - log (LOG_FATAL, "Unable to split page %d\n", ptr); + logf (LOG_FATAL, "Unable to split page %d\n", ptr); abort (); } return dict_ins (dict, str-1, ptr, userlen, userinfo);