Changed header.
[egate.git] / ccl / cclqual.c
1 /* CCL qualifiers
2  * Europagate, 1995
3  *
4  * $Log: cclqual.c,v $
5  * Revision 1.6  1995/02/23 08:32:00  adam
6  * Changed header.
7  *
8  * Revision 1.4  1995/02/14  19:55:12  adam
9  * Header files ccl.h/cclp.h are gone! They have been merged an
10  * moved to ../include/ccl.h.
11  * Node kind(s) in ccl_rpn_node have changed names.
12  *
13  * Revision 1.3  1995/02/14  16:20:56  adam
14  * Qualifiers are read from a file now.
15  *
16  * Revision 1.2  1995/02/14  10:25:56  adam
17  * The constructions 'qualifier rel term ...' implemented.
18  *
19  * Revision 1.1  1995/02/13  15:15:07  adam
20  * Added handling of qualifiers. Not finished yet.
21  *
22  */
23
24 #include <stdio.h>
25 #include <stdlib.h>
26 #include <assert.h>
27 #include <string.h>
28
29 #include <ccl.h>
30
31 struct ccl_qualifiers {
32     struct ccl_qualifier *list;
33 };
34
35 void ccl_qual_add (CCL_bibset b, const char *name, int no, int *pairs)
36 {
37     struct ccl_qualifier *q;
38     struct ccl_rpn_attr **attrp;
39
40     assert (b);
41     for (q = b->list; q; q = q->next)
42         if (!strcmp (name, q->name))
43             break;
44     if (!q)
45     {
46         struct ccl_qualifier *new_qual = malloc (sizeof(*new_qual));
47         assert (new_qual);
48         
49         new_qual->next = b->list;
50         b->list = new_qual;
51         
52         new_qual->name = malloc (strlen(name)+1);
53         assert (new_qual->name);
54         strcpy (new_qual->name, name);
55         attrp = &new_qual->attr_list;
56     }
57     else
58     {
59         attrp = &q->attr_list;
60         while (*attrp)
61             attrp = &(*attrp)->next;
62     }
63     while (--no >= 0)
64     {
65         struct ccl_rpn_attr *attr;
66
67         attr = malloc (sizeof(*attr));
68         assert (attr);
69         attr->type = *pairs++;
70         attr->value = *pairs++;
71         *attrp = attr;
72         attrp = &attr->next;
73     }
74     *attrp = NULL;
75 }
76
77 CCL_bibset ccl_qual_mk (void)
78 {
79     CCL_bibset b = malloc (sizeof(*b));
80     assert (b);
81     b->list = NULL;     
82     return b;
83 }
84
85 void ccl_qual_rm (CCL_bibset *b)
86 {
87     assert (*b);
88     *b = NULL;
89 }
90
91 struct ccl_rpn_attr *ccl_qual_search (CCL_bibset b, const char *name, int len)
92 {
93     struct ccl_qualifier *q;
94
95     assert (b);
96     for (q = b->list; q; q = q->next)
97         if (strlen(q->name) == len && !memcmp (name, q->name, len))
98             return q->attr_list;
99     return NULL;
100 }
101
102 void ccl_qual_file (CCL_bibset bibset, FILE *inf)
103 {
104     char line[256];
105     char *cp;
106     char qual_name[128];
107     char qual_des[128];
108     int  no_scan;
109
110     while (fgets (line, 255, inf))
111     {
112         cp = line;
113         if (*cp == '#')
114             continue;
115         if (sscanf (cp, "%s%n", qual_name, &no_scan) != 1)
116             continue;
117         cp += no_scan;
118         while (1)
119         {
120             int pair[2];
121             char *qual_type;
122             char *qual_value;
123             char *split;
124
125             if (sscanf (cp, "%s%n", qual_des, &no_scan) != 1)
126                 break;
127
128             if (!(split = strchr (qual_des, '=')))
129                 break;
130             cp += no_scan;
131
132             *split++ = '\0';
133             qual_type = qual_des;
134             qual_value = split;
135             while (1)
136             {
137                 if ((split = strchr (qual_value, ',')))
138                     *split++ = '\0';
139                 pair[1] = atoi (qual_value);
140                 switch (qual_type[0])
141                 {
142                 case 'u':
143                     pair[0] = CCL_BIB1_USE;
144                     break;
145                 case 'r':
146                     pair[0] = CCL_BIB1_REL;
147                     if (!strcmp (qual_value, "o"))
148                         pair[1] = CCL_BIB1_REL_ORDER;
149                     break;                
150                 case 'p':
151                     pair[0] = CCL_BIB1_POS;
152                     break;
153                 case 's':
154                     pair[0] = CCL_BIB1_STR;
155                     if (!strcmp (qual_value, "pw"))
156                         pair[1] = CCL_BIB1_STR_WP;
157                     break;                
158                 case 't':
159                     pair[0] = CCL_BIB1_TRU;
160                     if (!strcmp (qual_value, "l"))
161                         pair[1] = CCL_BIB1_TRU_CAN_LEFT;
162                     else if (!strcmp (qual_value, "r"))
163                         pair[1] = CCL_BIB1_TRU_CAN_RIGHT;
164                     else if (!strcmp (qual_value, "b"))
165                         pair[1] = CCL_BIB1_TRU_CAN_BOTH;
166                     else if (!strcmp (qual_value, "n"))
167                         pair[1] = CCL_BIB1_TRU_CAN_NONE;
168                     break;                
169                 case 'c':
170                     pair[0] = CCL_BIB1_COM;
171                     break;                
172                 default:
173                     pair[0] = atoi (qual_type);
174                 }
175                 ccl_qual_add (bibset, qual_name, 1, pair);
176                 if (!split)
177                     break;
178                 qual_value = split;
179             }
180         }
181     }
182 }