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