/* CCL qualifiers
* Europagate, 1995
*
- * $Log: cclqfile.c,v $
- * Revision 1.7 2001-01-24 11:55:31 adam
- * Fixed nasty bug introduced by previous commit (attribute sets not
- * properly allocated).
+ * $Id: cclqfile.c,v 1.13 2002-06-06 12:54:24 adam Exp $
*
- * Revision 1.6 2000/11/16 09:58:02 adam
- * Implemented local AttributeSet setting for CCL field maps.
- *
- * Revision 1.5 2000/10/17 19:50:28 adam
- * Implemented and-list and or-list for CCL module.
- *
- * Revision 1.4 2000/01/31 13:15:21 adam
- * Removed uses of assert(3). Cleanup of ODR. CCL parser update so
- * that some characters are not surrounded by spaces in resulting term.
- * ILL-code updates.
- *
- * Revision 1.3 1999/11/30 13:47:11 adam
- * Improved installation. Moved header files to include/yaz.
- *
- * Revision 1.2 1997/04/30 08:52:06 quinn
- * Null
- *
- * Revision 1.1 1996/10/11 15:00:25 adam
- * CCL parser from Europagate Email gateway 1.0.
+ * Old Europagate Log:
*
* Revision 1.3 1995/05/16 09:39:26 adam
* LICENSE.
#include <yaz/ccl.h>
-void ccl_qual_fitem (CCL_bibset bibset, const char *cp, const char *qual_name)
+void ccl_qual_field (CCL_bibset bibset, const char *cp, const char *qual_name)
{
char qual_spec[128];
- int no_scan;
int pair[256];
char *attsets[128];
int pair_no = 0;
{
char *qual_value, *qual_type;
char *split, *setp;
+ int no_scan = 0;
- if (sscanf (cp, "%s%n", qual_spec, &no_scan) != 1)
+ if (sscanf (cp, "%100s%n", qual_spec, &no_scan) < 1)
break;
if (!(split = strchr (qual_spec, '=')))
+ {
+ if (pair_no == 0)
+ {
+ ccl_qual_add_combi (bibset, qual_name, cp);
+ return;
+ }
break;
+ }
cp += no_scan;
*split++ = '\0';
pair[pair_no*2+1] = value;
if (setp)
{
- attsets[pair_no] = malloc (strlen(qual_spec)+1);
+ attsets[pair_no] = (char*) xmalloc (strlen(qual_spec)+1);
strcpy (attsets[pair_no], qual_spec);
}
else
ccl_qual_add_set (bibset, qual_name, pair_no, pair, attsets);
}
+void ccl_qual_fitem (CCL_bibset bibset, const char *cp, const char *qual_name)
+{
+ if (*qual_name == '@')
+ ccl_qual_add_special(bibset, qual_name+1, cp);
+ else
+ ccl_qual_field(bibset, cp, qual_name);
+}
+
/*
* ccl_qual_file: Read bibset definition from file.
* bibset: Bibset
void ccl_qual_file (CCL_bibset bibset, FILE *inf)
{
char line[256];
- char *cp;
+ char *cp, *cp1;
char qual_name[128];
- int no_scan;
while (fgets (line, 255, inf))
{
+ int no_scan = 0;
+
cp = line;
if (*cp == '#')
continue; /* ignore lines starting with # */
- if (sscanf (cp, "%s%n", qual_name, &no_scan) != 1)
+ if (sscanf (cp, "%100s%n", qual_name, &no_scan) < 1)
continue; /* also ignore empty lines */
cp += no_scan;
+ cp1 = strchr(cp, '#');
+ if (cp1)
+ *cp1 = '\0';
ccl_qual_fitem (bibset, cp, qual_name);
}
}
if (!inf)
return -1;
ccl_qual_file (bibset, inf);
+ fclose (inf);
return 0;
}