Merge branch 'master' of ssh://git.indexdata.com:222/home/git/pub/yaz
authorHeikki Levanto <heikki@indexdata.dk>
Fri, 31 May 2013 13:36:35 +0000 (15:36 +0200)
committerHeikki Levanto <heikki@indexdata.dk>
Fri, 31 May 2013 13:36:35 +0000 (15:36 +0200)
doc/tools.xml
src/cclfind.c
test/test_ccl.c

index 2544316..ec3bc1b 100644 (file)
          <entry><literal>?</literal></entry>
         </row>
         <row>
+         <entry>mask</entry>
+         <entry>Masking character</entry>
+         <entry><literal>#</literal></entry>
+        </row>
+        <row>
          <entry>field</entry>
          <entry>Specifies how multiple fields are to be
           combined. There are two modes: <literal>or</literal>:
index 93ea05d..a2ea081 100644 (file)
@@ -232,6 +232,7 @@ static size_t cmp_operator(const char **aliases, const char *input)
 static int append_term(CCL_parser cclp, const char *src_str, size_t src_len,
                        char *dst_term, int *regex_trunc, int *z3958_trunc,
                        const char **truncation_aliases,
+                       const char **mask_aliases,
                        int is_first, int is_last,
                        int *left_trunc, int *right_trunc)
 {
@@ -283,8 +284,10 @@ static int append_term(CCL_parser cclp, const char *src_str, size_t src_len,
                 return -1;
             }
         }
-        else if (!quote_mode && src_str[j] == '#')
+        else if (!quote_mode &&
+                 (op_size = cmp_operator(mask_aliases, src_str + j)))
         {
+            j += (op_size - 1);  /* j++ in for loop */
             if (*regex_trunc)
             {
                 strcat(dst_term, ".");
@@ -339,6 +342,8 @@ static struct ccl_rpn_node *search_term_x(CCL_parser cclp,
     char *attset;
     const char **truncation_aliases;
     const char *t_default[2];
+    const char **mask_aliases;
+    const char *m_default[2];
 
     truncation_aliases =
         ccl_qual_search_special(cclp->bibset, "truncation");
@@ -349,6 +354,16 @@ static struct ccl_rpn_node *search_term_x(CCL_parser cclp,
         t_default[1] = 0;
     }
 
+    mask_aliases =
+        ccl_qual_search_special(cclp->bibset, "mask");
+    if (!mask_aliases)
+    {
+        mask_aliases = m_default;
+        m_default[0] = "#";
+        m_default[1] = 0;
+    }
+
+
     if (qual_val_type(qa, CCL_BIB1_STR, CCL_BIB1_STR_AND_LIST, 0))
         and_list = 1;
     if (qual_val_type(qa, CCL_BIB1_STR, CCL_BIB1_STR_AUTO_GROUP, 0))
@@ -500,7 +515,8 @@ static struct ccl_rpn_node *search_term_x(CCL_parser cclp,
                         cclp->look_token->ws_prefix_len);
             }
             if (append_term(cclp, src_str, src_len, p->u.t.term, &regex_trunc,
-                            &z3958_trunc, truncation_aliases, i == 0, i == no - 1,
+                            &z3958_trunc, truncation_aliases, mask_aliases,
+                            i == 0, i == no - 1,
                             &left_trunc, &right_trunc))
             {
                 ccl_rpn_delete(p);
index 9e2b927..d189f00 100644 (file)
@@ -429,6 +429,9 @@ void tst2(void)
     ccl_qual_fitem(bibset, "u=4    s=pw t=l,r", "ti");
     ccl_qual_fitem(bibset, "1=1016 s=al,pw t=z",    "term");
 
+    YAZ_CHECK(tst_ccl_query(bibset, "a?#",
+                            "@attr 5=104 @attr 4=2 @attr 1=1016 a?# "));
+
     YAZ_CHECK(tst_ccl_query(bibset, "a*",
                             "@attr 4=2 @attr 1=1016 a* "));
 
@@ -442,6 +445,16 @@ void tst2(void)
     YAZ_CHECK(tst_ccl_query(bibset, "a?",
                             "@attr 5=104 @attr 4=2 @attr 1=1016 a\\\\? "));
 
+    ccl_qual_fitem(bibset, "?", "@mask");
+    YAZ_CHECK(tst_ccl_query(bibset, "a?",
+                            "@attr 5=104 @attr 4=2 @attr 1=1016 a# "));
+
+
+    ccl_qual_fitem(bibset, "", "@mask");
+    ccl_qual_fitem(bibset, "", "@truncation");
+    YAZ_CHECK(tst_ccl_query(bibset, "a?#",
+                            "@attr 5=104 @attr 4=2 @attr 1=1016 a\\\\?\\\\# "));
+
     ccl_qual_fitem(bibset, "og", "@and");
     ccl_qual_fitem(bibset, "eller", "@or");
     ccl_qual_fitem(bibset, "ikke", "@not");