The constructions 'qualifier rel term ...' implemented.
authorAdam Dickmeiss <adam@indexdata.dk>
Tue, 14 Feb 1995 10:25:55 +0000 (10:25 +0000)
committerAdam Dickmeiss <adam@indexdata.dk>
Tue, 14 Feb 1995 10:25:55 +0000 (10:25 +0000)
ccl/Makefile
ccl/ccl.h
ccl/cclerrms.c
ccl/cclfind.c
ccl/cclp.h
ccl/cclptree.c [new file with mode: 0644]
ccl/cclqual.c
ccl/cclsh.c

index 8932443..d733398 100644 (file)
@@ -2,7 +2,10 @@
 # Europagate, 1995
 #
 # $Log: Makefile,v $
-# Revision 1.2  1995/02/13 15:15:06  adam
+# Revision 1.3  1995/02/14 10:25:55  adam
+# The constructions 'qualifier rel term ...' implemented.
+#
+# Revision 1.2  1995/02/13  15:15:06  adam
 # Added handling of qualifiers. Not finished yet.
 #
 # Revision 1.1  1995/02/13  12:35:20  adam
@@ -14,7 +17,7 @@ CFLAGS=-g -Wall -pedantic -ansi
 CC=gcc
 TPROG1=cclsh
 LIB=../lib/ccl.a
-PO=cclfind.o ccltoken.o cclerrms.o cclqual.o
+PO=cclfind.o ccltoken.o cclerrms.o cclqual.o cclptree.o
 CPP=cc -E
 DEFS=$(INCLUDE)
 
index 0b319a0..b89c498 100644 (file)
--- a/ccl/ccl.h
+++ b/ccl/ccl.h
@@ -2,7 +2,10 @@
  * Europagate, 1995
  *
  * $Log: ccl.h,v $
- * Revision 1.2  1995/02/13 15:15:06  adam
+ * Revision 1.3  1995/02/14 10:25:55  adam
+ * The constructions 'qualifier rel term ...' implemented.
+ *
+ * Revision 1.2  1995/02/13  15:15:06  adam
  * Added handling of qualifiers. Not finished yet.
  *
  * Revision 1.1  1995/02/13  12:35:20  adam
@@ -19,6 +22,7 @@
 #define CCL_ERR_UNKNOWN_QUAL      6
 #define CCL_ERR_DOBBLE_QUAL       7
 #define CCL_ERR_EQ_EXPECTED       8
+#define CCL_ERR_BAD_RELATION      9
 
 struct ccl_rpn_attr {
     struct ccl_rpn_attr *next;
@@ -45,22 +49,29 @@ struct ccl_rpn_node *ccl_find_str (CCL_bibset bibset,
                                    const char *str, int *error, int *pos);
 char *ccl_err_msg (int ccl_errno);
 void ccl_rpn_delete (struct ccl_rpn_node *rpn);
-void ccl_qual_add (CCL_bibset b,
-                   const char *name,
-                   int nuse, int *use,
-                   int relation,   
-/*                          -1  none
+void ccl_pr_tree (struct ccl_rpn_node *rpn);
+
+void ccl_qual_add (CCL_bibset b, const char *name, int no, int *attr);
+CCL_bibset ccl_qual_mk (void);
+void ccl_qual_rm (CCL_bibset *b);
+struct ccl_rpn_attr *ccl_qual_search (CCL_bibset b, const char *name, int len);
+
+
+
+/* use (1)
+
+   relation (2)
+                            -1  none
                              0  ordered
                            1-6  relation (<, <=, =, >=, >, <>)
- */
-                   int position,
-/*                          -1  none
+
+   position (3)
+                            -1  none
                              1  first in field
                              2  first in sub field
                              3  any position in field
- */
-                   int structure,
-/*                          -1  none
+   structure (4)
+                            -1  none
                              0  word/phrase auto select
                              1  phrase
                              2  word
@@ -71,11 +82,19 @@ void ccl_qual_add (CCL_bibset b,
                            100  date (un-normalized)
                            101  name (normalized)
                            102  name (un-normalized)
- */                            
-                   int truncation,
-                   int completeness);
-CCL_bibset ccl_qual_mk (void);
-void ccl_qual_rm (CCL_bibset *b);
+   truncation (5)                            
+   completeness (6)
+*/
+
+#define CCL_BIB1_USE 1
+#define CCL_BIB1_REL 2
+#define CCL_BIB1_POS 3
+#define CCL_BIB1_STR 4
+#define CCL_BIB1_TRU 5
+#define CCL_BIB1_COM 6
+
+#define CCL_BIB1_STR_WP (-1)
+#define CCL_BIB1_REL_ORDER (-1)
 
 #define CCL_TRUNC_L      1
 #define CCL_TRUNC_R      2
@@ -83,4 +102,3 @@ void ccl_qual_rm (CCL_bibset *b);
 #define CCL_TRUNC_NONE   8
 #define CCL_TRUNC_HASH   16
 #define CCL_TRUNC_REG    32
-
index 992140d..c05e6bd 100644 (file)
@@ -2,7 +2,10 @@
  * Europagate, 1995
  *
  * $Log: cclerrms.c,v $
- * Revision 1.2  1995/02/13 15:15:06  adam
+ * Revision 1.3  1995/02/14 10:25:56  adam
+ * The constructions 'qualifier rel term ...' implemented.
+ *
+ * Revision 1.2  1995/02/13  15:15:06  adam
  * Added handling of qualifiers. Not finished yet.
  *
  * Revision 1.1  1995/02/13  12:35:20  adam
@@ -19,8 +22,8 @@ char *err_msg_array[] = {
     "Unbalanced ')'",
     "Unknown qualifier",
     "Qualifiers applied twice",
-    "'=' expected"
-       
+    "'=' expected",
+    "Bad relation"
 };
 
 const char *ccl_err_msg (int ccl_errno)
index c100640..0d2c65f 100644 (file)
@@ -2,7 +2,10 @@
  * Europagate, 1995
  *
  * $Log: cclfind.c,v $
- * Revision 1.2  1995/02/13 15:15:07  adam
+ * Revision 1.3  1995/02/14 10:25:56  adam
+ * The constructions 'qualifier rel term ...' implemented.
+ *
+ * Revision 1.2  1995/02/13  15:15:07  adam
  * Added handling of qualifiers. Not finished yet.
  *
  * Revision 1.1  1995/02/13  12:35:20  adam
@@ -25,6 +28,17 @@ static CCL_bibset bibset;
 #define ADVANCE look_token = look_token->next
 #define ADVX(x) x=(x)->next
 
+static int *qual_val (struct ccl_rpn_attr *list, int type)
+{
+    while (list)
+    {
+        if (list->type == type)
+            return &list->value;
+        list = list->next;
+    }
+    return NULL;
+}
+
 static void strxcat (char *n, const char *src, int len)
 {
     while (*n)
@@ -84,8 +98,8 @@ void ccl_rpn_delete (struct ccl_rpn_node *rpn)
     free (rpn);
 }
 
-static struct ccl_rpn_node *find_spec (struct ccl_qualifier **qa);
-static struct ccl_rpn_node *search_terms (struct ccl_qualifier **qa);
+static struct ccl_rpn_node *find_spec (struct ccl_rpn_attr **qa);
+static struct ccl_rpn_node *search_terms (struct ccl_rpn_attr **qa);
 
 static void add_attr (struct ccl_rpn_node *p, int type, int value)
 {
@@ -99,7 +113,7 @@ static void add_attr (struct ccl_rpn_node *p, int type, int value)
     p->u.t.attr_list = n;
 }
 
-static struct ccl_rpn_node *search_term (struct ccl_qualifier **qa)
+static struct ccl_rpn_node *search_term (struct ccl_rpn_attr **qa)
 {
     struct ccl_rpn_node *p;
     struct ccl_token *lookahead = look_token;
@@ -133,34 +147,35 @@ static struct ccl_rpn_node *search_term (struct ccl_qualifier **qa)
     if (qa)
     {
         int i;
-        /* use ... */
+        int *intp;
         for (i=0; qa[i]; i++)
         {
-            int j;
-            for (j=0; j<qa[i]->nuse; j++)
-                add_attr (p, 1, qa[i]->use[j]);
+            struct ccl_rpn_attr *attr;
+
+            for (attr = qa[i]; attr; attr = attr->next)
+                if (attr->value > 0)
+                    add_attr (p, attr->type, attr->value);
         }
-        /* structure ... */
-        if (qa[0]->structure == 0)
+        if ((intp = qual_val (qa[0], CCL_BIB1_STR)) &&
+            *intp == CCL_BIB1_STR_WP)
         {
             if (no == 1)
-                add_attr (p, 4, 2);
+                add_attr (p, CCL_BIB1_STR, 2);
             else
-                add_attr (p, 4, 1);
+                add_attr (p, CCL_BIB1_STR, 1);
         }
-        else if (qa[0]->structure > 0)
-            add_attr (p, 4, qa[0]->structure);
     }
     return p;
 }
 
 static struct ccl_rpn_node *qualifiers (struct ccl_token *la,
-                                        struct ccl_qualifier **qa)
+                                        struct ccl_rpn_attr **qa)
 {
     struct ccl_token *lookahead = look_token;
-    struct ccl_qualifier **ap;
+    struct ccl_rpn_attr **ap;
     int no = 1;
-    int i;
+    int i, rel;
+    int *intp;
 
     if (qa)
     {
@@ -173,7 +188,7 @@ static struct ccl_rpn_node *qualifiers (struct ccl_token *la,
     assert (ap);
     for (i=0; look_token != la; i++)
     {
-        ap[i] = ccl_qual_search (bibset, lookahead->name);
+        ap[i] = ccl_qual_search (bibset, look_token->name, look_token->len);
         if (!ap[i])
         {
             ccl_error = CCL_ERR_UNKNOWN_QUAL;
@@ -185,7 +200,7 @@ static struct ccl_rpn_node *qualifiers (struct ccl_token *la,
             ADVANCE;
     }
     ap[i] = NULL;
-    if (ap[0]->relation != 0)  
+    if (! (intp = qual_val (ap[0], CCL_BIB1_REL)) || *intp == 3)
     {                
         /* unordered relation */
         struct ccl_rpn_node *p;
@@ -218,13 +233,42 @@ static struct ccl_rpn_node *qualifiers (struct ccl_token *la,
         free (ap);
         return p;
     }
-    /* ordered relation ... */
-    assert (0);
+    rel = 0;
+    if (look_token->len == 1)
+    {
+        if (look_token->name[0] == '<')
+            rel = 1;
+        else if (look_token->name[0] == '=')
+            rel = 3;
+        else if (look_token->name[0] == '>')
+            rel = 5;
+    }
+    else if (look_token->len == 2)
+    {
+        if (!memcmp (look_token->name, "<=", 2))
+            rel = 2;
+        else if (!memcmp (look_token->name, ">=", 2))
+            rel = 4;
+        else if (!memcmp (look_token->name, "<>", 2))
+            rel = 6;
+    }
+    if (!rel)
+        ccl_error = CCL_ERR_BAD_RELATION;
+    else
+    {
+        struct ccl_rpn_node *p;
+
+        ADVANCE;
+        p = search_term (ap);
+        add_attr (p, CCL_BIB1_REL, rel);
+        free (ap);
+        return p;
+    }
     free (ap);
     return NULL;
 }
 
-static struct ccl_rpn_node *search_terms (struct ccl_qualifier **qa)
+static struct ccl_rpn_node *search_terms (struct ccl_rpn_attr **qa)
 {
     struct ccl_rpn_node *p1, *p2, *pn;
     p1 = search_term (qa);
@@ -265,7 +309,7 @@ static struct ccl_rpn_node *search_terms (struct ccl_qualifier **qa)
     return p1;
 }
 
-static struct ccl_rpn_node *search_elements (struct ccl_qualifier **qa)
+static struct ccl_rpn_node *search_elements (struct ccl_rpn_attr **qa)
 {
     struct ccl_rpn_node *p1;
     struct ccl_token *lookahead;
@@ -287,6 +331,8 @@ static struct ccl_rpn_node *search_elements (struct ccl_qualifier **qa)
     else if (KIND == CCL_TOK_SET)
     {
        ADVANCE;
+        if (KIND == CCL_TOK_EQ)
+            ADVANCE;
         if (KIND != CCL_TOK_TERM)
         {
             ccl_error = CCL_ERR_SETNAME_EXPECTED;
@@ -306,7 +352,7 @@ static struct ccl_rpn_node *search_elements (struct ccl_qualifier **qa)
     return search_terms (qa);
 }
 
-static struct ccl_rpn_node *find_spec (struct ccl_qualifier **qa)
+static struct ccl_rpn_node *find_spec (struct ccl_rpn_attr **qa)
 {
     struct ccl_rpn_node *p1, *p2, *pn;
     if (!(p1 = search_elements (qa)))
@@ -385,58 +431,6 @@ struct ccl_rpn_node *ccl_find (CCL_bibset abibset, struct ccl_token *list,
     return p;
 }
 
-static void pr_tree (struct ccl_rpn_node *rpn)
-{
-
-    switch (rpn->kind)
-    {
-    case TERM:
-       printf ("\"%s\"", rpn->u.t.term);
-        if (rpn->u.t.attr_list)
-        {
-            struct ccl_rpn_attr *attr;
-            printf ("[ ");
-            for (attr = rpn->u.t.attr_list; attr; attr = attr->next)
-                printf ("%d=%d ", attr->type, attr->value);
-            printf ("] ");
-        }
-       break;
-    case AND:
-       printf ("(");
-       pr_tree (rpn->u.p[0]);
-       printf (") and (");
-       pr_tree (rpn->u.p[1]);
-       printf (")");
-       break;
-    case OR:
-       printf ("(");
-       pr_tree (rpn->u.p[0]);
-       printf (") or (");
-       pr_tree (rpn->u.p[1]);
-       printf (")");
-       break;
-    case NOT:
-       printf ("(");
-       pr_tree (rpn->u.p[0]);
-       printf (") not (");
-       pr_tree (rpn->u.p[1]);
-       printf (")");
-       break;
-    case SET:
-       printf ("set=%s", rpn->u.setname);
-       break;
-    case PROX:
-       printf ("(");
-       pr_tree (rpn->u.p[0]);
-       printf (") prox (");
-       pr_tree (rpn->u.p[1]);
-       printf (")");
-       break;
-    default:
-       assert (0);
-    }
-}
-
 struct ccl_rpn_node *ccl_find_str (CCL_bibset bibset, const char *str,
                                    int *error, int *pos)
 {
@@ -450,14 +444,7 @@ struct ccl_rpn_node *ccl_find_str (CCL_bibset bibset, const char *str,
        printf ("kind=%d, str='%.*s'\n", li->kind, li->len, li->name);
 #endif
     rpn = ccl_find (bibset, list, error, &char_pos);
-    if (! *error)
-    {
-        pr_tree (rpn);
-        printf ("\n");
-    }
-    else
-    {
+    if (*error)
         *pos = char_pos - str;
-    }
     return rpn;
 }
index d9565ce..574d464 100644 (file)
@@ -2,7 +2,10 @@
  * Europagate, 1995
  *
  * $Log: cclp.h,v $
- * Revision 1.2  1995/02/13 15:15:07  adam
+ * Revision 1.3  1995/02/14 10:25:56  adam
+ * The constructions 'qualifier rel term ...' implemented.
+ *
+ * Revision 1.2  1995/02/13  15:15:07  adam
  * Added handling of qualifiers. Not finished yet.
  *
  * Revision 1.1  1995/02/13  12:35:20  adam
@@ -36,17 +39,9 @@ struct ccl_token {
 
 struct ccl_qualifier {
     char *name;
-    int  nuse;
-    int  *use;
-    int  relation;
-    int  position;
-    int  structure;
-    int  truncation;
-    int  completeness;
+    struct ccl_rpn_attr *attr_list;
     struct ccl_qualifier *next;
 };
 
-
 struct ccl_token *ccl_tokenize (const char *command);
-struct ccl_qualifier *ccl_qual_search (CCL_bibset b, const char *name);
 
diff --git a/ccl/cclptree.c b/ccl/cclptree.c
new file mode 100644 (file)
index 0000000..aebcb10
--- /dev/null
@@ -0,0 +1,64 @@
+/* CCL print rpn tree - infix notation
+ * Europagate, 1995
+ *
+ * $Log: cclptree.c,v $
+ * Revision 1.1  1995/02/14 10:25:56  adam
+ * The constructions 'qualifier rel term ...' implemented.
+ *
+ */
+
+#include <stdio.h>
+#include <assert.h>
+#include <string.h>
+
+#include "cclp.h"
+
+void ccl_pr_tree (struct ccl_rpn_node *rpn)
+{
+
+    switch (rpn->kind)
+    {
+    case TERM:
+       printf ("\"%s\"", rpn->u.t.term);
+        if (rpn->u.t.attr_list)
+        {
+            struct ccl_rpn_attr *attr;
+            for (attr = rpn->u.t.attr_list; attr; attr = attr->next)
+                printf (" %d=%d", attr->type, attr->value);
+        }
+       break;
+    case AND:
+       printf ("(");
+       ccl_pr_tree (rpn->u.p[0]);
+       printf (") and (");
+       ccl_pr_tree (rpn->u.p[1]);
+       printf (")");
+       break;
+    case OR:
+       printf ("(");
+       ccl_pr_tree (rpn->u.p[0]);
+       printf (") or (");
+       ccl_pr_tree (rpn->u.p[1]);
+       printf (")");
+       break;
+    case NOT:
+       printf ("(");
+       ccl_pr_tree (rpn->u.p[0]);
+       printf (") not (");
+       ccl_pr_tree (rpn->u.p[1]);
+       printf (")");
+       break;
+    case SET:
+       printf ("set=%s", rpn->u.setname);
+       break;
+    case PROX:
+       printf ("(");
+       ccl_pr_tree (rpn->u.p[0]);
+       printf (") prox (");
+       ccl_pr_tree (rpn->u.p[1]);
+       printf (")");
+       break;
+    default:
+       assert (0);
+    }
+}
index 4dff9cb..263b6ce 100644 (file)
@@ -2,7 +2,10 @@
  * Europagate, 1995
  *
  * $Log: cclqual.c,v $
- * Revision 1.1  1995/02/13 15:15:07  adam
+ * Revision 1.2  1995/02/14 10:25:56  adam
+ * The constructions 'qualifier rel term ...' implemented.
+ *
+ * Revision 1.1  1995/02/13  15:15:07  adam
  * Added handling of qualifiers. Not finished yet.
  *
  */
@@ -18,13 +21,11 @@ struct ccl_qualifiers {
     struct ccl_qualifier *list;
 };
 
-void ccl_qual_add (CCL_bibset b,
-                   const char *name, int nuse, int *use, int relation,
-                   int position, int structure, int truncation,
-                   int completeness)
+void ccl_qual_add (CCL_bibset b, const char *name, int no, int *pairs)
 {
     struct ccl_qualifier *new_qual;
-
+    struct ccl_rpn_attr **attrp;
+    
     assert (b);
     new_qual = malloc (sizeof(*new_qual));
     assert (new_qual);
@@ -35,15 +36,20 @@ void ccl_qual_add (CCL_bibset b,
     new_qual->name = malloc (strlen(name)+1);
     assert (new_qual->name);
     strcpy (new_qual->name, name);
-    new_qual->nuse = nuse;
-    new_qual->use = malloc (sizeof(int)*nuse);
-    assert (new_qual->use);
-    memcpy (new_qual->use, use, sizeof(int)*nuse);
-    new_qual->relation = relation;
-    new_qual->position = position;
-    new_qual->structure = structure;
-    new_qual->truncation = truncation;
-    new_qual->completeness = completeness;
+    attrp = &new_qual->attr_list;
+
+    while (--no >= 0)
+    {
+        struct ccl_rpn_attr *attr;
+
+        attr = malloc (sizeof(*attr));
+        assert (attr);
+        attr->type = *pairs++;
+        attr->value = *pairs++;
+        *attrp = attr;
+        attrp = &attr->next;
+    }
+    *attrp = NULL;
 }
 
 CCL_bibset ccl_qual_mk (void)
@@ -60,13 +66,13 @@ void ccl_qual_rm (CCL_bibset *b)
     *b = NULL;
 }
 
-struct ccl_qualifier *ccl_qual_search (CCL_bibset b, const char *name)
+struct ccl_rpn_attr *ccl_qual_search (CCL_bibset b, const char *name, int len)
 {
     struct ccl_qualifier *q;
 
     assert (b);
     for (q = b->list; q; q = q->next)
-        if (strcmp (name, q->name))
-            return q;
+        if (strlen(q->name) == len && !memcmp (name, q->name, len))
+            return q->attr_list;
     return NULL;
 }
index f6dd236..5c3d290 100644 (file)
@@ -2,7 +2,10 @@
  * Europagate 1995
  *
  * $Log: cclsh.c,v $
- * Revision 1.2  1995/02/13 15:15:07  adam
+ * Revision 1.3  1995/02/14 10:25:57  adam
+ * The constructions 'qualifier rel term ...' implemented.
+ *
+ * Revision 1.2  1995/02/13  15:15:07  adam
  * Added handling of qualifiers. Not finished yet.
  *
  * Revision 1.1  1995/02/13  12:35:21  adam
 
 #include <stdio.h>
 #include <stdlib.h>
+#include <assert.h>
 
 #include "ccl.h"
 
 static int debug = 0;
 static char *prog;
 
+static int ti_attr[] = {
+    CCL_BIB1_USE, 5,
+    CCL_BIB1_STR, CCL_BIB1_STR_WP
+};
+
+static int au_attr[] = {
+    CCL_BIB1_USE, 1,
+    CCL_BIB1_STR, CCL_BIB1_STR_WP
+};
+
+static int pd_attr[] = {
+    CCL_BIB1_USE, 31,
+    CCL_BIB1_REL, CCL_BIB1_REL_ORDER
+};
+
 int main (int argc, char **argv)
 {
     CCL_bibset bibset;
-    static int uses[10];
 
     prog = *argv;
     bibset = ccl_qual_mk ();    
@@ -47,28 +65,32 @@ int main (int argc, char **argv)
             exit (1);
         }
     }
-    uses[0] = 5;
-    ccl_qual_add (bibset, "ti", 1, uses, -1, -1,
-                  0, -1, -1);
-    uses[0] = 1;
-    ccl_qual_add (bibset, "au", 1, uses, -1, -1,
-                  0, -1, -1);
+    ccl_qual_add (bibset, "ti", sizeof(ti_attr)/(2*sizeof(int)), ti_attr);
+    ccl_qual_add (bibset, "au", sizeof(au_attr)/(2*sizeof(int)), au_attr);
+    ccl_qual_add (bibset, "pd", sizeof(pd_attr)/(2*sizeof(int)), pd_attr);
     while (1)
     {
         char buf[80];
-        int error;
-        int pos;
+        int error, pos;
+        struct ccl_rpn_node *rpn;
+
        printf ("CCLSH>"); fflush (stdout);
        if (!fgets (buf, 79, stdin))
            break;
-       ccl_find_str (bibset, buf, &error, &pos);
+       rpn = ccl_find_str (bibset, buf, &error, &pos);
         if (error)
         {
             printf ("%*s^ - ", 6+pos, " ");
             printf ("%s\n", ccl_err_msg (error));
-            
+        }
+        else
+        {
+            assert (rpn);
+            ccl_pr_tree (rpn);
+            putchar ('\n');
         }
     }
+    putchar ('\n');
     return 0;
 }