X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=ccl%2Fcclqfile.c;h=af18a4bd5e73bc60b604cb150f213b8d406c766b;hb=9158f8e318f25cb16171433742950236cae96d36;hp=a4ab07b10860f16ce639c9e5c4e1561dec166650;hpb=85a2e7affad79fd8bd59b403ba7b5f7867d60523;p=yaz-moved-to-github.git diff --git a/ccl/cclqfile.c b/ccl/cclqfile.c index a4ab07b..af18a4b 100644 --- a/ccl/cclqfile.c +++ b/ccl/cclqfile.c @@ -45,7 +45,38 @@ * Europagate, 1995 * * $Log: cclqfile.c,v $ - * Revision 1.2 1997-04-30 08:52:06 quinn + * Revision 1.11 2001-09-14 10:49:51 adam + * Bug fix: file wasn't closed in ccl_qual_fname. + * + * Revision 1.10 2001/05/16 07:30:16 adam + * Minor cosmetic changes that makes checker gcc happier. + * + * Revision 1.9 2001/03/07 13:24:40 adam + * Member and_not in Z_Operator is kept for backwards compatibility. + * Added support for definition of CCL operators in field spec file. + * + * Revision 1.8 2001/02/21 13:46:53 adam + * C++ fixes. + * + * Revision 1.7 2001/01/24 11:55:31 adam + * Fixed nasty bug introduced by previous commit (attribute sets not + * properly allocated). + * + * 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 @@ -66,32 +97,41 @@ #include #include -#include #include -#include +#include -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_type[128]; - int no_scan; - int pair[128]; + char qual_spec[128]; + int pair[256]; + char *attsets[128]; int pair_no = 0; - while (1) + while (pair_no < 128) { - char *qual_value; - char *split; - - if (sscanf (cp, "%s%n", qual_type, &no_scan) != 1) - break; + char *qual_value, *qual_type; + char *split, *setp; + int no_scan = 0; - if (!(split = strchr (qual_type, '='))) + if (sscanf (cp, "%100s%n", qual_spec, &no_scan) < 1) + break; + + if (!(split = strchr (qual_spec, '='))) break; cp += no_scan; *split++ = '\0'; - while (1) + + setp = strchr (qual_spec, ','); + if (setp) + { + *setp++ = '\0'; + qual_type = setp; + } + else + qual_type = qual_spec; + while (pair_no < 128) { int type, value; @@ -120,6 +160,10 @@ void ccl_qual_fitem (CCL_bibset bibset, const char *cp, const char *qual_name) type = CCL_BIB1_STR; if (!ccl_stricmp (qual_value, "pw")) value = CCL_BIB1_STR_WP; + if (!ccl_stricmp (qual_value, "al")) + value = CCL_BIB1_STR_AND_LIST; + if (!ccl_stricmp (qual_value, "ol")) + value = CCL_BIB1_STR_OR_LIST; break; case 't': case 'T': @@ -136,18 +180,33 @@ void ccl_qual_fitem (CCL_bibset bibset, const char *cp, const char *qual_name) case 'c': case 'C': type = CCL_BIB1_COM; - break; + break; default: type = atoi (qual_type); } pair[pair_no*2] = type; pair[pair_no*2+1] = value; + if (setp) + { + attsets[pair_no] = (char*) malloc (strlen(qual_spec)+1); + strcpy (attsets[pair_no], qual_spec); + } + else + attsets[pair_no] = 0; pair_no++; if (!split) break; } } - ccl_qual_add (bibset, qual_name, pair_no, pair); + 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); } /* @@ -166,18 +225,33 @@ void ccl_qual_fitem (CCL_bibset bibset, const char *cp, const char *qual_name) 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); } } + +int ccl_qual_fname (CCL_bibset bibset, const char *fname) +{ + FILE *inf; + inf = fopen (fname, "r"); + if (!inf) + return -1; + ccl_qual_file (bibset, inf); + fclose (inf); + return 0; +}