X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=ccl%2Fcclqfile.c;h=61cd463f00a74b31febc698a51d40aa7c28be193;hp=339447619ed889d5859eb42ba94fcf1dde096872;hb=c71d717ada2a9ef730d527f161eb5ba9aa641a9f;hpb=448e7f2a48f6485a8d452c75420524fb37453bc1 diff --git a/ccl/cclqfile.c b/ccl/cclqfile.c index 3394476..61cd463 100644 --- a/ccl/cclqfile.c +++ b/ccl/cclqfile.c @@ -44,26 +44,9 @@ /* CCL qualifiers * Europagate, 1995 * - * $Log: cclqfile.c,v $ - * Revision 1.6 2000-11-16 09:58:02 adam - * Implemented local AttributeSet setting for CCL field maps. + * $Id: cclqfile.c,v 1.14 2003-06-23 10:22:21 adam Exp $ * - * 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. @@ -84,11 +67,12 @@ #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_spec[128]; - int no_scan; - int pair[256]; + int type_ar[128]; + int value_ar[128]; + char *svalue_ar[128]; char *attsets[128]; int pair_no = 0; @@ -96,12 +80,22 @@ void ccl_qual_fitem (CCL_bibset bibset, const char *cp, const char *qual_name) { 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, '='))) + { + /* alias specification .. */ + if (pair_no == 0) + { + ccl_qual_add_combi (bibset, qual_name, cp); + return; + } break; + } + /* [set,]type=value ... */ cp += no_scan; *split++ = '\0'; @@ -109,15 +103,13 @@ void ccl_qual_fitem (CCL_bibset bibset, const char *cp, const char *qual_name) setp = strchr (qual_spec, ','); if (setp) { - + /* set,type=value ... */ *setp++ = '\0'; - attsets[pair_no] = malloc (strlen(qual_spec)+1); - strcpy (attsets[pair_no], qual_spec); qual_type = setp; } else { - attsets[pair_no] = 0; + /* type=value ... */ qual_type = qual_spec; } while (pair_no < 128) @@ -127,7 +119,8 @@ void ccl_qual_fitem (CCL_bibset bibset, const char *cp, const char *qual_name) qual_value = split; if ((split = strchr (qual_value, ','))) *split++ = '\0'; - value = atoi (qual_value); + + value = 0; switch (qual_type[0]) { case 'u': @@ -173,14 +166,52 @@ void ccl_qual_fitem (CCL_bibset bibset, const char *cp, const char *qual_name) default: type = atoi (qual_type); } - pair[pair_no*2] = type; - pair[pair_no*2+1] = value; + + type_ar[pair_no] = type; + + if (value) + { + value_ar[pair_no] = value; + svalue_ar[pair_no] = 0; + } + else if (*qual_value >= '0' && *qual_value <= '9') + { + value_ar[pair_no] = atoi (qual_value); + svalue_ar[pair_no] = 0; + } + else + { + size_t len; + if (split) + len = split - qual_value; + else + len = strlen(qual_value); + svalue_ar[pair_no] = xmalloc(len+1); + memcpy(svalue_ar[pair_no], qual_value, len); + svalue_ar[pair_no][len] = '\0'; + } + if (setp) + { + attsets[pair_no] = (char*) xmalloc (strlen(qual_spec)+1); + strcpy (attsets[pair_no], qual_spec); + } + else + attsets[pair_no] = 0; pair_no++; if (!split) break; } } - ccl_qual_add_set (bibset, qual_name, pair_no, pair, attsets); + ccl_qual_add_set (bibset, qual_name, pair_no, type_ar, value_ar, svalue_ar, + 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); } /* @@ -199,18 +230,22 @@ 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); } } @@ -222,5 +257,6 @@ int ccl_qual_fname (CCL_bibset bibset, const char *fname) if (!inf) return -1; ccl_qual_file (bibset, inf); + fclose (inf); return 0; }