Improved handling of qualifiers. Aliases or reserved words.
[egate.git] / ccl / cclqfile.c
1 /* CCL qualifiers
2  * Europagate, 1995
3  *
4  * $Log: cclqfile.c,v $
5  * Revision 1.1  1995/04/17 09:31:45  adam
6  * Improved handling of qualifiers. Aliases or reserved words.
7  *
8  */
9
10 #include <stdio.h>
11 #include <stdlib.h>
12 #include <assert.h>
13 #include <string.h>
14
15 #include <ccl.h>
16
17 /*
18  * ccl_qual_file: Read bibset definition from file.
19  * bibset:  Bibset
20  * inf:     FILE pointer.
21  *
22  * Each line format is:
23  *  <name> <t>=<v> <t>=<v> ....
24  *  Where <name> is name of qualifier;
25  *  <t>=<v> is a attribute definition pair where <t> is one of: 
26  *     u(use), r(relation), p(position), t(truncation), c(completeness) 
27  *     or plain integer.
28  *  <v> is an integer or special pseudo-value.
29  */
30 void ccl_qual_file (CCL_bibset bibset, FILE *inf)
31 {
32     char line[256];
33     char *cp;
34     char qual_name[128];
35     char qual_des[128];
36     int  no_scan;
37
38     while (fgets (line, 255, inf))
39     {
40         cp = line;
41         if (*cp == '#')
42             continue;        /* ignore lines starting with # */
43         if (sscanf (cp, "%s%n", qual_name, &no_scan) != 1)
44             continue;        /* also ignore empty lines */
45         cp += no_scan;
46         while (1)
47         {
48             int pair[2];
49             char *qual_type;
50             char *qual_value;
51             char *split;
52
53             if (sscanf (cp, "%s%n", qual_des, &no_scan) != 1)
54                 break;
55
56             if (!(split = strchr (qual_des, '=')))
57                 break;
58             cp += no_scan;
59
60             *split++ = '\0';
61             qual_type = qual_des;
62             qual_value = split;
63             while (1)
64             {
65                 if ((split = strchr (qual_value, ',')))
66                     *split++ = '\0';
67                 pair[1] = atoi (qual_value);
68                 switch (qual_type[0])
69                 {
70                 case 'u':
71                     pair[0] = CCL_BIB1_USE;
72                     break;
73                 case 'r':
74                     pair[0] = CCL_BIB1_REL;
75                     if (!strcmp (qual_value, "o"))
76                         pair[1] = CCL_BIB1_REL_ORDER;
77                     break;                
78                 case 'p':
79                     pair[0] = CCL_BIB1_POS;
80                     break;
81                 case 's':
82                     pair[0] = CCL_BIB1_STR;
83                     if (!strcmp (qual_value, "pw"))
84                         pair[1] = CCL_BIB1_STR_WP;
85                     break;                
86                 case 't':
87                     pair[0] = CCL_BIB1_TRU;
88                     if (!strcmp (qual_value, "l"))
89                         pair[1] = CCL_BIB1_TRU_CAN_LEFT;
90                     else if (!strcmp (qual_value, "r"))
91                         pair[1] = CCL_BIB1_TRU_CAN_RIGHT;
92                     else if (!strcmp (qual_value, "b"))
93                         pair[1] = CCL_BIB1_TRU_CAN_BOTH;
94                     else if (!strcmp (qual_value, "n"))
95                         pair[1] = CCL_BIB1_TRU_CAN_NONE;
96                     break;                
97                 case 'c':
98                     pair[0] = CCL_BIB1_COM;
99                     break;                
100                 default:
101                     pair[0] = atoi (qual_type);
102                 }
103                 ccl_qual_add (bibset, qual_name, 1, pair);
104                 if (!split)
105                     break;
106                 qual_value = split;
107             }
108         }
109     }
110 }