dom: accept type="adelete" (accept bad deletes)
[idzebra-moved-to-github.git] / dict / lookup.c
index 8719af7..d47267f 100644 (file)
@@ -1,46 +1,46 @@
-/*
- * Copyright (C) 1994, Index Data I/S 
- * All rights reserved.
- * Sebastian Hammer, Adam Dickmeiss
- *
- * $Log: lookup.c,v $
- * Revision 1.5  1995-09-04 09:09:15  adam
- * String arg in lookup is const.
- *
- * Revision 1.4  1994/10/05  12:16:51  adam
- * Pagesize is a resource now.
- *
- * Revision 1.3  1994/09/26  10:17:25  adam
- * Minor changes.
- *
- * Revision 1.2  1994/09/16  15:39:14  adam
- * Initial code of lookup - not tested yet.
- *
- * Revision 1.1  1994/08/16  16:26:48  adam
- * Added dict.
- *
- */
+/* This file is part of the Zebra server.
+   Copyright (C) 2004-2013 Index Data
+
+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
+
+*/
 
+
+
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
 #include <stdlib.h>
 #include <string.h>
 #include <stdio.h>
 #include <assert.h>
 
-#include <dict.h>
+#include "dict-p.h"
 
-static char *dict_look (Dict dict, const Dict_char *str)
+static char *dict_look(Dict dict, const Dict_char *str, Dict_ptr ptr)
 {
-    Dict_ptr ptr = 1;
     int mid, lo, hi;
     int cmp;
     void *p;
     short *indxp;
     char *info;
 
-    dict_bf_readp (dict->dbf, ptr, &p);
+    dict_bf_readp(dict->dbf, ptr, &p);
     mid = lo = 0;
     hi = DICT_nodir(p)-1;
-    indxp = (short*) ((char*) p+DICT_pagesize(dict)-sizeof(short));    
+    indxp = (short*) ((char*) p+DICT_bsize(p)-sizeof(short));
     while (lo <= hi)
     {
         mid = (lo+hi)/2;
@@ -52,7 +52,8 @@ static char *dict_look (Dict dict, const Dict_char *str)
             info = (char*)p + indxp[-mid];
             cmp = dict_strcmp((Dict_char*) info, str);
             if (!cmp)
-                return info+(dict_strlen (info)+1)*sizeof(Dict_char);
+                return info+(dict_strlen ((Dict_char*) info)+1)
+                    *sizeof(Dict_char);
         }
         else
         {
@@ -64,11 +65,11 @@ static char *dict_look (Dict dict, const Dict_char *str)
             /* unsigned char        length of information */
             /* char *               information */
             info = (char*)p - indxp[-mid];
-            memcpy (&dc, info+sizeof(Dict_ptr), sizeof(Dict_char));
+            memcpy(&dc, info+sizeof(Dict_ptr), sizeof(Dict_char));
             cmp = dc- *str;
             if (!cmp)
             {
-                memcpy (&subptr, info, sizeof(Dict_ptr));
+                memcpy(&subptr, info, sizeof(Dict_ptr));
                 if (*++str == DICT_EOS)
                 {
                     if (info[sizeof(Dict_ptr)+sizeof(Dict_char)])
@@ -80,11 +81,10 @@ static char *dict_look (Dict dict, const Dict_char *str)
                     if (subptr == 0)
                         return NULL;
                     ptr = subptr;
-                    dict_bf_readp (dict->dbf, ptr, &p);
+                    dict_bf_readp(dict->dbf, ptr, &p);
                     mid = lo = 0;
                     hi = DICT_nodir(p)-1;
-                    indxp = (short*) ((char*) p+DICT_pagesize(dict)
-                                      -sizeof(short));
+                    indxp = (short*) ((char*) p+DICT_bsize(p)-sizeof(short));
                     continue;
                 }
             }
@@ -97,11 +97,19 @@ static char *dict_look (Dict dict, const Dict_char *str)
     return NULL;
 }
 
-char *dict_lookup (Dict dict, const Dict_char *p)
+char *dict_lookup(Dict dict, const char *p)
 {
-    if (dict->head.last == 1)
+    dict->no_lookup++;
+    if (!dict->head.root)
         return NULL;
-    return dict_look (dict, p);
+    return dict_look(dict, (const Dict_char *) p, dict->head.root);
 }
-
+/*
+ * Local variables:
+ * c-basic-offset: 4
+ * c-file-style: "Stroustrup"
+ * indent-tabs-mode: nil
+ * End:
+ * vim: shiftwidth=4 tabstop=8 expandtab
+ */