⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 marcread.c

📁 harvest是一个下载html网页得机器人
💻 C
📖 第 1 页 / 共 2 页
字号:
	    {		if (!yaz_matchstr(pisf->name, p->name))		{		    found = 1;		    break;		}	    }	    if (found)	    {		strcat(buf, " (");		pisf = cat_inline_subfield(p->u.child, buf, pisf);		strcat(buf, ") ");	    }	}    }    return pisf; }static void cat_inline_field(mc_field *pf, char *buf, data1_node *subfield){        if (!pf || !subfield)	return;    for (;subfield;)    {	int len;	inline_field *pif=NULL;	data1_node *psubf;		if (yaz_matchstr(subfield->u.tag.tag, "1"))	{	    subfield = subfield->next;	    continue;	}		psubf = subfield;	pif = inline_mk_field();	do	{	    int i;	    if ((i=inline_parse(pif, psubf->u.tag.tag, get_data(psubf, &len)))<0)	    {		logf(LOG_WARN, "inline subfield ($%s): parse error",		    psubf->u.tag.tag);		inline_destroy_field(pif);		return;		    }	    psubf = psubf->next;	} while (psubf && yaz_matchstr(psubf->u.tag.tag, "1"));		subfield = psubf;		if (pif && !yaz_matchstr(pif->name, pf->name))	{	    if (!pf->list && pif->list)	    {		strcat(buf, pif->list->data);	    }	    else	    {		int ind1, ind2;	        /*		    check indicators		*/		ind1 = (pif->ind1[0] == ' ') ? '_':pif->ind1[0];		ind2 = (pif->ind2[0] == ' ') ? '_':pif->ind2[0];    		if (((pf->ind1[0] == '.') || (ind1 == pf->ind1[0])) &&		    ((pf->ind2[0] == '.') || (ind2 == pf->ind2[0])))		{		    cat_inline_subfield(pf->list, buf, pif->list);		    		    /*		    	add separator for inline fields		    */		    if (strlen(buf))		    {		    	strcat(buf, "\n");		    }		}		else		{		    logf(LOG_WARN, "In-line field %s missed -- indicators does not match", pif->name);		}	    }	}	inline_destroy_field(pif);    }#if MARCOMP_DEBUG        logf(LOG_LOG, "cat_inline_field(): got buffer {%s}", buf);#endif}static data1_node *cat_subfield(mc_subfield *psf, char *buf, data1_node *subfield){    mc_subfield *p;        for (p = psf; p && subfield; p = p->next)    {	if (p->which == MC_SF)	{	    data1_node *found = lookup_subfield(subfield, p->name);	    	    if (found)	    {		int len;				if (strcmp(p->prefix, "_"))		{		    strcat(strcat(buf, " "), p->prefix);		}				if (p->u.in_line)		{		    cat_inline_field(p->u.in_line, buf, found);		}		else if (p->interval.start == -1)		{		    strcat(buf, get_data(found, &len));		}		else		{		    strncat(buf, get_data(found, &len)+p->interval.start,			p->interval.end-p->interval.start+1);		}		if (strcmp(p->suffix, "_"))		{		    strcat(strcat(buf, p->suffix), " ");		}#if MARCOMP_DEBUG				logf(LOG_LOG, "cat_subfield(): add subfield $%s", found->u.tag.tag);#endif				subfield = found->next;	    }	}	else if (p->which == MC_SFVARIANT)	{	    data1_node *next;	    do {		next = cat_subfield(p->u.child, buf, subfield);		if (next == subfield)		    break;		subfield = next;	    } while (subfield);	}	else if (p->which == MC_SFGROUP)	{	    mc_subfield *pp;	    int found;	    	    for (pp = p->u.child, found = 0; pp; pp = pp->next)	    {		if (!yaz_matchstr(subfield->u.tag.tag, pp->name))		{		    found = 1;		    break;		}	    }	    if (found)	    {		strcat(buf, " (");		subfield = cat_subfield(p->u.child, buf, subfield);		strcat(buf, ") ");	    }	}    }    return subfield;}static data1_node *cat_field(struct grs_read_info *p, mc_field *pf, char *buf, data1_node *field){    data1_node *subfield;    int ind1, ind2;        if (!pf || !field)	return 0;        if (yaz_matchstr(field->u.tag.tag, pf->name))	return field->next;    subfield = field->child;        if (!subfield)	return field->next;    /*	check subfield without indicators    */        if (!pf->list && subfield->which == DATA1N_data)    {	int len;		if (pf->interval.start == -1)	{	    strcat(buf, get_data(field, &len));	}	else	{	    strncat(buf, get_data(field, &len)+pf->interval.start,		pf->interval.end-pf->interval.start+1);	}#if MARCOMP_DEBUG        logf(LOG_LOG, "cat_field(): got buffer {%s}", buf);#endif	return field->next;    }        /*	check indicators    */    ind1 = (subfield->u.tag.tag[0] == ' ') ? '_':subfield->u.tag.tag[0];    ind2 = (subfield->u.tag.tag[1] == ' ') ? '_':subfield->u.tag.tag[1];        if (!(	((pf->ind1[0] == '.') || (ind1 == pf->ind1[0])) &&	((pf->ind2[0] == '.') || (ind2 == pf->ind2[0]))	))    {#if MARCOMP_DEBUG	logf(LOG_WARN, "Field %s missed -- does not match indicators", field->u.tag.tag);#endif	return field->next;    }        subfield = subfield->child;        if (!subfield)	return field->next;    cat_subfield(pf->list, buf, subfield);#if MARCOMP_DEBUG        logf(LOG_LOG, "cat_field(): got buffer {%s}", buf);#endif        return field->next;    }static int is_empty(char *s){    char *p = s;        for (p = s; *p; p++)    {	if (!isspace(*p))	    return 0;    }    return 1;}static void parse_data1_tree(struct grs_read_info *p, const char *mc_stmnt, data1_node *root){    data1_marctab *marctab = root->u.root.absyn->marc;    data1_node *top = root->child;    data1_node *field;    mc_context *c;    mc_field *pf;    char buf[1000000];        c = mc_mk_context(mc_stmnt+3);        if (!c)	return;	    pf = mc_getfield(c);        if (!pf)    {	mc_destroy_context(c);	return;    }#if MARCOMP_DEBUG        logf(LOG_LOG, "parse_data1_tree(): statement -{%s}", mc_stmnt);#endif    if (!yaz_matchstr(pf->name, "ldr"))    {	data1_node *new;#if MARCOMP_DEBUG	logf(LOG_LOG,"parse_data1_tree(): try LEADER from {%d} to {%d} positions",	    pf->interval.start, pf->interval.end);#endif		new = data1_mk_tag_n(p->dh, p->mem, mc_stmnt, strlen(mc_stmnt), 0, top);	data1_mk_text_n(p->dh, p->mem, marctab->leader+pf->interval.start,	    pf->interval.end-pf->interval.start+1, new);    }    else    {	field=top->child;		while(field)	{	    if (!yaz_matchstr(field->u.tag.tag, pf->name))	    {		data1_node *new;		char *pb = buf;#if MARCOMP_DEBUG				logf(LOG_LOG, "parse_data1_tree(): try field {%s}", field->u.tag.tag);#endif				*buf = '\0';	    		field = cat_field(p, pf, buf, field);				for (pb = strtok(pb, "\n"); pb; pb = strtok(NULL, "\n"))		{			if (!is_empty(pb))			{		    		new = data1_mk_tag_n(p->dh, p->mem, mc_stmnt, strlen(mc_stmnt), 0, top);		    		data1_mk_text_n(p->dh, p->mem, pb, strlen(pb), new);			}		}	    }	    else	    {		field = field->next;	    }	}    }    mc_destroy_field(pf);    mc_destroy_context(c);}data1_node *grs_read_marcxml(struct grs_read_info *p){    data1_node *root = grs_read_iso2709(p, 1);    data1_element *e;    if (!root)	return 0;	    for (e=root->u.root.absyn->main_elements; e; e=e->next)    {	data1_tag *tag = e->tag;		if (tag && tag->which == DATA1T_string &&	    !yaz_matchstr(tag->value.string, "mc?"))		parse_data1_tree(p, tag->value.string, root);    }    return root;}data1_node *grs_read_marc(struct grs_read_info *p){    data1_node *root = grs_read_iso2709(p, 0);    data1_element *e;    if (!root)	return 0;	    for (e=root->u.root.absyn->main_elements; e; e=e->next)    {	data1_tag *tag = e->tag;		if (tag && tag->which == DATA1T_string &&	    !yaz_matchstr(tag->value.string, "mc?"))		parse_data1_tree(p, tag->value.string, root);    }    return root;}static void *grs_init_marc(void){    return 0;}static void grs_destroy_marc(void *clientData){}static struct recTypeGrs marc_type = {    "marc",    grs_init_marc,    grs_destroy_marc,    grs_read_marc};RecTypeGrs recTypeGrs_marc = &marc_type;static struct recTypeGrs marcxml_type = {    "marcxml",    grs_init_marc,    grs_destroy_marc,    grs_read_marcxml};RecTypeGrs recTypeGrs_marcxml = &marcxml_type;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -