Multiple registers (alpha early)
[idzebra-moved-to-github.git] / index / zrpn.c
index 4de4914..2a14aee 100644 (file)
@@ -3,7 +3,7 @@
  * All rights reserved.
  * Sebastian Hammer, Adam Dickmeiss
  *
- * $Id: zrpn.c,v 1.110 2002-03-20 20:24:29 adam Exp $
+ * $Id: zrpn.c,v 1.112 2002-04-04 14:14:13 adam Exp $
  */
 #include <stdio.h>
 #include <assert.h>
@@ -14,7 +14,7 @@
 #endif
 #include <ctype.h>
 
-#include "zserver.h"
+#include "index.h"
 
 #include <charmap.h>
 #include <rstemp.h>
@@ -32,12 +32,12 @@ static const char **rpn_char_map_handler (void *vp, const char **from, int len)
     return zebra_maps_input (p->zm, p->reg_type, from, len);
 }
 
-static void rpn_char_map_prepare (ZebraHandle zh, int reg_type,
+static void rpn_char_map_prepare (struct zebra_register *reg, int reg_type,
                                  struct rpn_char_map_info *map_info)
 {
-    map_info->zm = zh->service->zebra_maps;
+    map_info->zm = reg->zebra_maps;
     map_info->reg_type = reg_type;
-    dict_grep_cmap (zh->service->dict, map_info, rpn_char_map_handler);
+    dict_grep_cmap (reg->dict, map_info, rpn_char_map_handler);
 }
 
 typedef struct {
@@ -152,7 +152,7 @@ static void term_untrans  (ZebraHandle zh, int reg_type,
 {
     while (*src)
     {
-        const char *cp = zebra_maps_output (zh->service->zebra_maps,
+        const char *cp = zebra_maps_output (zh->reg->zebra_maps,
                                            reg_type, &src);
        if (!cp)
            *dst++ = *src++;
@@ -209,7 +209,7 @@ static void add_isam_p (const char *name, const char *info,
        
        term_untrans  (p->zh, p->reg_type, term_tmp, name+len+1);
        logf (LOG_LOG, "grep: %d %c %s", su_code, name[len], term_tmp);
-       zebraExplain_lookup_ord (p->zh->service->zei,
+       zebraExplain_lookup_ord (p->zh->reg->zei,
                                 su_code, &db, &set, &use);
        logf (LOG_LOG, "grep:  set=%d use=%d db=%s", set, use, db);
        
@@ -656,7 +656,7 @@ static int string_relation (ZebraHandle zh, Z_AttributesPlusTerm *zapt,
     switch (relation_value)
     {
     case 1:
-        if (!term_100 (zh->service->zebra_maps, reg_type,
+        if (!term_100 (zh->reg->zebra_maps, reg_type,
                       term_sub, term_component,
                       space_split, term_dst))
             return 0;
@@ -686,7 +686,7 @@ static int string_relation (ZebraHandle zh, Z_AttributesPlusTerm *zapt,
        *term_tmp = '\0';
         break;
     case 2:
-        if (!term_100 (zh->service->zebra_maps, reg_type,
+        if (!term_100 (zh->reg->zebra_maps, reg_type,
                       term_sub, term_component,
                       space_split, term_dst))
             return 0;
@@ -717,7 +717,7 @@ static int string_relation (ZebraHandle zh, Z_AttributesPlusTerm *zapt,
        *term_tmp = '\0';
         break;
     case 5:
-        if (!term_100 (zh->service->zebra_maps, reg_type,
+        if (!term_100 (zh->reg->zebra_maps, reg_type,
                       term_sub, term_component, space_split, term_dst))
             return 0;
         logf (LOG_DEBUG, "Relation >");
@@ -749,7 +749,7 @@ static int string_relation (ZebraHandle zh, Z_AttributesPlusTerm *zapt,
        *term_tmp = '\0';
         break;
     case 4:
-        if (!term_100 (zh->service->zebra_maps, reg_type, term_sub,
+        if (!term_100 (zh->reg->zebra_maps, reg_type, term_sub,
                       term_component, space_split, term_dst))
             return 0;
         logf (LOG_DEBUG, "Relation >=");
@@ -786,7 +786,7 @@ static int string_relation (ZebraHandle zh, Z_AttributesPlusTerm *zapt,
     case 3:
     default:
         logf (LOG_DEBUG, "Relation =");
-        if (!term_100 (zh->service->zebra_maps, reg_type, term_sub,
+        if (!term_100 (zh->reg->zebra_maps, reg_type, term_sub,
                       term_component, space_split, term_dst))
             return 0;
        strcat (term_tmp, "(");
@@ -815,7 +815,7 @@ static int string_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt,
     struct rpn_char_map_info rcmi;
     int space_split = complete_flag ? 0 : 1;
 
-    rpn_char_map_prepare (zh, reg_type, &rcmi);
+    rpn_char_map_prepare (zh->reg, reg_type, &rcmi);
     attr_init (&use, zapt, 1);
     use_value = attr_find (&use, &curAttributeSet);
     logf (LOG_DEBUG, "string_term, use value %d", use_value);
@@ -859,7 +859,7 @@ static int string_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt,
            }
             return -1;
         }
-        if (zebraExplain_curDatabase (zh->service->zei, basenames[base_no]))
+        if (zebraExplain_curDatabase (zh->reg->zei, basenames[base_no]))
         {
             zh->errCode = 109; /* Database unavailable */
             zh->errString = basenames[base_no];
@@ -872,7 +872,7 @@ static int string_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt,
            char ord_buf[32];
            int i, ord_len;
 
-            ord = zebraExplain_lookupSU (zh->service->zei, attp.attset_ordinal,
+            ord = zebraExplain_lookupSU (zh->reg->zei, attp.attset_ordinal,
                                           local_attr->local);
             if (ord < 0)
                 continue;
@@ -911,59 +911,59 @@ static int string_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt,
                                  reg_type, space_split, term_dst))
                return 0;
            logf (LOG_DEBUG, "dict_lookup_grep: %s", term_dict+prefix_len);
-           r = dict_lookup_grep (zh->service->dict, term_dict, 0,
+           r = dict_lookup_grep (zh->reg->dict, term_dict, 0,
                                  grep_info, &max_pos, 0, grep_handle);
            if (r)
                logf (LOG_WARN, "dict_lookup_grep fail, rel=gt: %d", r);
            break;
        case 1:          /* right truncation */
            term_dict[j++] = '(';
-           if (!term_100 (zh->service->zebra_maps, reg_type,
+           if (!term_100 (zh->reg->zebra_maps, reg_type,
                           &termp, term_dict + j, space_split, term_dst))
                return 0;
            strcat (term_dict, ".*)");
-           dict_lookup_grep (zh->service->dict, term_dict, 0, grep_info,
+           dict_lookup_grep (zh->reg->dict, term_dict, 0, grep_info,
                              &max_pos, 0, grep_handle);
            break;
        case 2:          /* keft truncation */
            term_dict[j++] = '('; term_dict[j++] = '.'; term_dict[j++] = '*';
-           if (!term_100 (zh->service->zebra_maps, reg_type,
+           if (!term_100 (zh->reg->zebra_maps, reg_type,
                           &termp, term_dict + j, space_split, term_dst))
                return 0;
            strcat (term_dict, ")");
-           dict_lookup_grep (zh->service->dict, term_dict, 0, grep_info,
+           dict_lookup_grep (zh->reg->dict, term_dict, 0, grep_info,
                              &max_pos, 0, grep_handle);
            break;
        case 3:          /* left&right truncation */
            term_dict[j++] = '('; term_dict[j++] = '.'; term_dict[j++] = '*';
-           if (!term_100 (zh->service->zebra_maps, reg_type,
+           if (!term_100 (zh->reg->zebra_maps, reg_type,
                           &termp, term_dict + j, space_split, term_dst))
                return 0;
            strcat (term_dict, ".*)");
-           dict_lookup_grep (zh->service->dict, term_dict, 0, grep_info,
+           dict_lookup_grep (zh->reg->dict, term_dict, 0, grep_info,
                              &max_pos, 0, grep_handle);
            break;
            zh->errCode = 120;
            return -1;
        case 101:        /* process # in term */
            term_dict[j++] = '(';
-           if (!term_101 (zh->service->zebra_maps, reg_type,
+           if (!term_101 (zh->reg->zebra_maps, reg_type,
                           &termp, term_dict + j, space_split, term_dst))
                return 0;
            strcat (term_dict, ")");
-           r = dict_lookup_grep (zh->service->dict, term_dict, 0, grep_info,
+           r = dict_lookup_grep (zh->reg->dict, term_dict, 0, grep_info,
                                  &max_pos, 0, grep_handle);
            if (r)
                logf (LOG_WARN, "dict_lookup_grep err, trunc=#: %d", r);
            break;
        case 102:        /* Regexp-1 */
            term_dict[j++] = '(';
-           if (!term_102 (zh->service->zebra_maps, reg_type,
+           if (!term_102 (zh->reg->zebra_maps, reg_type,
                           &termp, term_dict + j, space_split, term_dst))
                return 0;
            strcat (term_dict, ")");
            logf (LOG_DEBUG, "Regexp-1 tolerance=%d", r);
-           r = dict_lookup_grep (zh->service->dict, term_dict, 0, grep_info,
+           r = dict_lookup_grep (zh->reg->dict, term_dict, 0, grep_info,
                                  &max_pos, 0, grep_handle);
            if (r)
                logf (LOG_WARN, "dict_lookup_grep err, trunc=regular: %d",
@@ -972,12 +972,12 @@ static int string_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt,
        case 103:       /* Regexp-2 */
            r = 1;
            term_dict[j++] = '(';
-           if (!term_103 (zh->service->zebra_maps, reg_type,
+           if (!term_103 (zh->reg->zebra_maps, reg_type,
                           &termp, term_dict + j, &r, space_split, term_dst))
                return 0;
            strcat (term_dict, ")");
            logf (LOG_DEBUG, "Regexp-2 tolerance=%d", r);
-           r = dict_lookup_grep (zh->service->dict, term_dict, r, grep_info,
+           r = dict_lookup_grep (zh->reg->dict, term_dict, r, grep_info,
                                  &max_pos, 2, grep_handle);
            if (r)
                logf (LOG_WARN, "dict_lookup_grep err, trunc=eregular: %d",
@@ -985,33 +985,33 @@ static int string_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt,
            break;
        case 104:        /* process # and ! in term */
            term_dict[j++] = '(';
-           if (!term_104 (zh->service->zebra_maps, reg_type,
+           if (!term_104 (zh->reg->zebra_maps, reg_type,
                           &termp, term_dict + j, space_split, term_dst))
                return 0;
            strcat (term_dict, ")");
-           r = dict_lookup_grep (zh->service->dict, term_dict, 0, grep_info,
+           r = dict_lookup_grep (zh->reg->dict, term_dict, 0, grep_info,
                                  &max_pos, 0, grep_handle);
            if (r)
                logf (LOG_WARN, "dict_lookup_grep err, trunc=#/!: %d", r);
            break;
        case 105:        /* process * and ! in term */
            term_dict[j++] = '(';
-           if (!term_105 (zh->service->zebra_maps, reg_type,
+           if (!term_105 (zh->reg->zebra_maps, reg_type,
                           &termp, term_dict + j, space_split, term_dst, 1))
                return 0;
            strcat (term_dict, ")");
-           r = dict_lookup_grep (zh->service->dict, term_dict, 0, grep_info,
+           r = dict_lookup_grep (zh->reg->dict, term_dict, 0, grep_info,
                                  &max_pos, 0, grep_handle);
            if (r)
                logf (LOG_WARN, "dict_lookup_grep err, trunc=*/!: %d", r);
            break;
        case 106:        /* process * and ! in term */
            term_dict[j++] = '(';
-           if (!term_105 (zh->service->zebra_maps, reg_type,
+           if (!term_105 (zh->reg->zebra_maps, reg_type,
                           &termp, term_dict + j, space_split, term_dst, 0))
                return 0;
            strcat (term_dict, ")");
-           r = dict_lookup_grep (zh->service->dict, term_dict, 0, grep_info,
+           r = dict_lookup_grep (zh->reg->dict, term_dict, 0, grep_info,
                                  &max_pos, 0, grep_handle);
            if (r)
                logf (LOG_WARN, "dict_lookup_grep err, trunc=*/!: %d", r);
@@ -1050,7 +1050,7 @@ static void trans_scan_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt,
     
     while ((len = (cp_end - cp)) > 0)
     {
-        map = zebra_maps_input (zh->service->zebra_maps, reg_type, &cp, len);
+        map = zebra_maps_input (zh->reg->zebra_maps, reg_type, &cp, len);
         if (**map == *CHR_SPACE)
             space_map = *map;
         else
@@ -1138,7 +1138,7 @@ static RSET rpn_prox (ZebraHandle zh, RSET *rset, int rset_no,
        parms.rset_term->nn = min_nn;
         parms.cmp = key_compare_it;
        parms.key_size = sizeof (struct it_key);
-       parms.temp_path = res_get (zh->service->res, "setTmpDir");
+       parms.temp_path = res_get (zh->res, "setTmpDir");
        result = rset_create (rset_kind_temp, &parms);
        rsfd_result = rset_open (result, RSETF_WRITE);
        
@@ -1197,7 +1197,7 @@ static RSET rpn_prox (ZebraHandle zh, RSET *rset, int rset_no,
        parms.rset_term->nn = min_nn;
         parms.cmp = key_compare_it;
        parms.key_size = sizeof (struct it_key);
-       parms.temp_path = res_get (zh->service->res, "setTmpDir");
+       parms.temp_path = res_get (zh->res, "setTmpDir");
        result = rset_create (rset_kind_temp, &parms);
        rsfd_result = rset_open (result, RSETF_WRITE);
 
@@ -1321,7 +1321,7 @@ char *normalize_term(ZebraHandle zh, Z_AttributesPlusTerm *zapt,
        break;
     }
     if (ex_list)
-       wrbuf = zebra_replace(zh->service->zebra_maps, reg_id, ex_list,
+       wrbuf = zebra_replace(zh->reg->zebra_maps, reg_id, ex_list,
                              termz, strlen(termz));
     if (!wrbuf)
        return nmem_strdup(stream, termz);
@@ -1397,6 +1397,7 @@ static RSET rpn_search_APT_phrase (ZebraHandle zh,
     char *termz = normalize_term(zh, zapt, termz_org, stream, reg_type);
     const char *termp = termz;
 
+    *term_dst = 0;
     if (grep_info_prepare (zh, zapt, &grep_info, reg_type, stream))
        return 0;
     while (1)
@@ -1424,7 +1425,7 @@ static RSET rpn_search_APT_phrase (ZebraHandle zh,
     {
        rset_null_parms parms;
        
-       parms.rset_term = rset_term_create (term_dst, -1, rank_type);
+       parms.rset_term = rset_term_create (termz, -1, rank_type);
         return rset_create (rset_kind_null, &parms);
     }
     else if (rset_no == 1)
@@ -1478,7 +1479,7 @@ static RSET rpn_search_APT_or_list (ZebraHandle zh,
     {
        rset_null_parms parms;
        
-       parms.rset_term = rset_term_create (term_dst, -1, rank_type);
+       parms.rset_term = rset_term_create (termz, -1, rank_type);
         return rset_create (rset_kind_null, &parms);
     }
     result = rset[0];
@@ -1538,7 +1539,7 @@ static RSET rpn_search_APT_and_list (ZebraHandle zh,
     {
        rset_null_parms parms;
        
-       parms.rset_term = rset_term_create (term_dst, -1, rank_type);
+       parms.rset_term = rset_term_create (termz, -1, rank_type);
         return rset_create (rset_kind_null, &parms);
     }
     result = rset[0];
@@ -1575,7 +1576,7 @@ static int numeric_relation (ZebraHandle zh, Z_AttributesPlusTerm *zapt,
 
     logf (LOG_DEBUG, "numeric relation value=%d", relation_value);
 
-    if (!term_100 (zh->service->zebra_maps, reg_type, term_sub, term_tmp, 1,
+    if (!term_100 (zh->reg->zebra_maps, reg_type, term_sub, term_tmp, 1,
                   term_dst))
        return 0;
     term_value = atoi (term_tmp);
@@ -1603,7 +1604,7 @@ static int numeric_relation (ZebraHandle zh, Z_AttributesPlusTerm *zapt,
        sprintf (term_tmp, "(0*%d)", term_value);
     }
     logf (LOG_DEBUG, "dict_lookup_grep: %s", term_tmp);
-    r = dict_lookup_grep (zh->service->dict, term_dict, 0, grep_info, max_pos,
+    r = dict_lookup_grep (zh->reg->dict, term_dict, 0, grep_info, max_pos,
                           0, grep_handle);
     if (r)
         logf (LOG_WARN, "dict_lookup_grep fail, rel=gt: %d", r);
@@ -1626,7 +1627,7 @@ static int numeric_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt,
     const char *termp;
     struct rpn_char_map_info rcmi;
 
-    rpn_char_map_prepare (zh, reg_type, &rcmi);
+    rpn_char_map_prepare (zh->reg, reg_type, &rcmi);
     attr_init (&use, zapt, 1);
     use_value = attr_find (&use, &curAttributeSet);
     logf (LOG_DEBUG, "numeric_term, use value %d", use_value);
@@ -1651,7 +1652,7 @@ static int numeric_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt,
                zh->errCode = 121;
             return -1;
         }
-        if (zebraExplain_curDatabase (zh->service->zei, basenames[base_no]))
+        if (zebraExplain_curDatabase (zh->reg->zei, basenames[base_no]))
         {
             zh->errCode = 109; /* Database unavailable */
             zh->errString = basenames[base_no];
@@ -1664,7 +1665,7 @@ static int numeric_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt,
            char ord_buf[32];
            int i, ord_len;
 
-            ord = zebraExplain_lookupSU (zh->service->zei, attp.attset_ordinal,
+            ord = zebraExplain_lookupSU (zh->reg->zei, attp.attset_ordinal,
                                           local_attr->local);
             if (ord < 0)
                 continue;
@@ -1773,7 +1774,7 @@ static RSET rpn_search_APT_local (ZebraHandle zh, Z_AttributesPlusTerm *zapt,
     parms.rset_term = rset_term_create (termz, -1, rank_type);
     parms.cmp = key_compare_it;
     parms.key_size = sizeof (struct it_key);
-    parms.temp_path = res_get (zh->service->res, "setTmpDir");
+    parms.temp_path = res_get (zh->res, "setTmpDir");
     result = rset_create (rset_kind_temp, &parms);
     rsfd = rset_open (result, RSETF_WRITE);
 
@@ -1802,6 +1803,7 @@ static RSET rpn_sort_spec (ZebraHandle zh, Z_AttributesPlusTerm *zapt,
     Z_AttributeElement *ae;
     int oid[OID_SIZE];
     oident oe;
+    char termz[20];
     
     attr_init (&sort_relation_type, zapt, 7);
     sort_relation_value = attr_find (&sort_relation_type, &attributeSet);
@@ -1825,6 +1827,7 @@ static RSET rpn_sort_spec (ZebraHandle zh, Z_AttributesPlusTerm *zapt,
                    zapt->term->u.general->len);
     if (i >= sort_sequence->num_specs)
        i = 0;
+    sprintf (termz, "%d", i);
 
     oe.proto = PROTO_Z3950;
     oe.oclass = CLASS_ATTSET;
@@ -1881,7 +1884,7 @@ static RSET rpn_sort_spec (ZebraHandle zh, Z_AttributesPlusTerm *zapt,
 
     sort_sequence->specs[i] = sks;
 
-    parms.rset_term = rset_term_create ("", -1, rank_type);
+    parms.rset_term = rset_term_create (termz, -1, rank_type);
     return rset_create (rset_kind_null, &parms);
 }
 
@@ -1898,7 +1901,7 @@ static RSET rpn_search_APT (ZebraHandle zh, Z_AttributesPlusTerm *zapt,
     int sort_flag;
     char termz[IT_MAX_WORD+1];
 
-    zebra_maps_attr (zh->service->zebra_maps, zapt, &reg_id, &search_type,
+    zebra_maps_attr (zh->reg->zebra_maps, zapt, &reg_id, &search_type,
                     rank_type, &complete_flag, &sort_flag);
     
     logf (LOG_DEBUG, "reg_id=%c", reg_id);
@@ -2238,7 +2241,7 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt,
     attr_init (&use, zapt, 1);
     use_value = attr_find (&use, &attributeset);
 
-    if (zebra_maps_attr (zh->service->zebra_maps, zapt, &reg_id, &search_type,
+    if (zebra_maps_attr (zh->reg->zebra_maps, zapt, &reg_id, &search_type,
                         rank_type, &complete_flag, &sort_flag))
     {
        *num_entries = 0;
@@ -2266,7 +2269,7 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt,
            *num_entries = 0;
            return;
         }
-        if (zebraExplain_curDatabase (zh->service->zei, basenames[base_no]))
+        if (zebraExplain_curDatabase (zh->reg->zei, basenames[base_no]))
         {
             zh->errString = basenames[base_no];
            zh->errCode = 109; /* Database unavailable */
@@ -2278,7 +2281,7 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt,
         {
             int ord;
 
-            ord = zebraExplain_lookupSU (zh->service->zei, attp.attset_ordinal,
+            ord = zebraExplain_lookupSU (zh->reg->zei, attp.attset_ordinal,
                                         local_attr->local);
             if (ord > 0)
                 ords[ord_no++] = ord;
@@ -2302,7 +2305,7 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt,
         struct scan_info *scan_info = scan_info_array + i;
        struct rpn_char_map_info rcmi;
 
-       rpn_char_map_prepare (zh, reg_id, &rcmi);
+       rpn_char_map_prepare (zh->reg, reg_id, &rcmi);
 
         scan_info->before = before;
         scan_info->after = after;
@@ -2320,7 +2323,7 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt,
 
         trans_scan_term (zh, zapt, termz+prefix_len, reg_id);
                     
-        dict_scan (zh->service->dict, termz, &before_tmp, &after_tmp,
+        dict_scan (zh->reg->dict, termz, &before_tmp, &after_tmp,
                   scan_info, scan_handle);
     }
     glist = (ZebraScanEntry *)