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

📄 recgrs.c

📁 harvest是一个下载html网页得机器人
💻 C
📖 第 1 页 / 共 3 页
字号:
	{	    yaz_log(LOG_LOG, "Unknown esetname '%s'", c->u.simple->u.generic);	    return 25; /* invalid esetname */	}	yaz_log(LOG_DEBUG, "Esetname '%s' in simple compspec",	     c->u.simple->u.generic);	espec = eset->spec;	break;    case Z_RecordComp_complex:	if (c->u.complex->generic)	{	    /* insert check for schema */	    if ((p = c->u.complex->generic->elementSpec))	    {		switch (p->which)		{		case Z_ElementSpec_elementSetName:		    if (!(eset =			  data1_getesetbyname(dh, n->u.root.absyn,					      p->u.elementSetName)))		    {			yaz_log(LOG_LOG, "Unknown esetname '%s'",			     p->u.elementSetName);			return 25; /* invalid esetname */		    }		    yaz_log(LOG_DEBUG, "Esetname '%s' in complex compspec",			 p->u.elementSetName);		    espec = eset->spec;		    break;		case Z_ElementSpec_externalSpec:		    if (p->u.externalSpec->which == Z_External_espec1)		    {			yaz_log(LOG_DEBUG, "Got Espec-1");			espec = p->u.externalSpec-> u.espec1;		    }		    else		    {			yaz_log(LOG_LOG, "Unknown external espec.");			return 25; /* bad. what is proper diagnostic? */		    }		    break;		}	    }	}	else	    return 26; /* fix */    }    if (espec)    {        yaz_log(LOG_DEBUG, "Element: Espec-1 match");	return data1_doespec1(dh, n, espec);    }    else    {	yaz_log(LOG_DEBUG, "Element: all match");	return -1;    }}/* Add Zebra info in separate namespace ...        <root          ...         <metadata xmlns="http://www.indexdata.dk/zebra/">          <size>359</size>          <localnumber>447</localnumber>          <filename>records/genera.xml</filename>         </metadata>        </root>*/static void zebra_xml_metadata (struct recRetrieveCtrl *p, data1_node *top,                                NMEM mem){    const char *idzebra_ns[3];    const char *i2 = "\n  ";    const char *i4 = "\n    ";    data1_node *n;    idzebra_ns[0] = "xmlns";    idzebra_ns[1] = "http://www.indexdata.dk/zebra/";    idzebra_ns[2] = 0;    data1_mk_text (p->dh, mem, i2, top);    n = data1_mk_tag (p->dh, mem, "idzebra", idzebra_ns, top);    data1_mk_text (p->dh, mem, "\n", top);    data1_mk_text (p->dh, mem, i4, n);        data1_mk_tag_data_int (p->dh, n, "size", p->recordSize, mem);    if (p->score != -1)    {        data1_mk_text (p->dh, mem, i4, n);        data1_mk_tag_data_int (p->dh, n, "score", p->score, mem);    }    data1_mk_text (p->dh, mem, i4, n);    data1_mk_tag_data_int (p->dh, n, "localnumber", p->localno, mem);    if (p->fname)    {        data1_mk_text (p->dh, mem, i4, n);        data1_mk_tag_data_text(p->dh, n, "filename", p->fname, mem);    }    data1_mk_text (p->dh, mem, i2, n);}static int grs_retrieve(void *clientData, struct recRetrieveCtrl *p){    data1_node *node = 0, *onode = 0, *top;    data1_node *dnew;    data1_maptab *map;    int res, selected = 0;    NMEM mem;    struct grs_read_info gri;    const char *tagname;    struct grs_handlers *h = (struct grs_handlers *) clientData;    int requested_schema = VAL_NONE;    data1_marctab *marctab;    int dummy;        mem = nmem_create();    gri.readf = p->readf;    gri.seekf = p->seekf;    gri.tellf = p->tellf;    gri.endf = NULL;    gri.fh = p->fh;    gri.offset = 0;    gri.mem = mem;    gri.dh = p->dh;    yaz_log(LOG_DEBUG, "grs_retrieve");    if (read_grs_type (h, &gri, p->subType, &node))    {	p->diagnostic = 14;        nmem_destroy (mem);	return 0;    }    if (!node)    {	p->diagnostic = 14;        nmem_destroy (mem);	return 0;    }    data1_concat_text(p->dh, mem, node);    /* ensure our data1 tree is UTF-8 */    data1_iconv (p->dh, mem, node, "UTF-8", data1_get_encoding(p->dh, node));#if 0    data1_pr_tree (p->dh, node, stdout);#endif    top = data1_get_root_tag (p->dh, node);    yaz_log(LOG_DEBUG, "grs_retrieve: size");    tagname = data1_systag_lookup(node->u.root.absyn, "size", "size");    if (tagname &&        (dnew = data1_mk_tag_data_wd(p->dh, top, tagname, mem)))    {	dnew->u.data.what = DATA1I_text;	dnew->u.data.data = dnew->lbuf;	sprintf(dnew->u.data.data, "%d", p->recordSize);	dnew->u.data.len = strlen(dnew->u.data.data);    }        tagname = data1_systag_lookup(node->u.root.absyn, "rank", "rank");    if (tagname && p->score >= 0 &&	(dnew = data1_mk_tag_data_wd(p->dh, top, tagname, mem)))    {        yaz_log(LOG_DEBUG, "grs_retrieve: %s", tagname);	dnew->u.data.what = DATA1I_num;	dnew->u.data.data = dnew->lbuf;	sprintf(dnew->u.data.data, "%d", p->score);	dnew->u.data.len = strlen(dnew->u.data.data);    }    tagname = data1_systag_lookup(node->u.root.absyn, "sysno",                                  "localControlNumber");    if (tagname && p->localno > 0 &&        (dnew = data1_mk_tag_data_wd(p->dh, top, tagname, mem)))    {        yaz_log(LOG_DEBUG, "grs_retrieve: %s", tagname);	dnew->u.data.what = DATA1I_text;	dnew->u.data.data = dnew->lbuf;        	sprintf(dnew->u.data.data, "%d", p->localno);	dnew->u.data.len = strlen(dnew->u.data.data);    }#if 0    data1_pr_tree (p->dh, node, stdout);#endif#if YAZ_VERSIONL >= 0x010903L    if (p->comp && p->comp->which == Z_RecordComp_complex &&	p->comp->u.complex->generic &&        p->comp->u.complex->generic->which == Z_Schema_oid &&        p->comp->u.complex->generic->schema.oid)    {	oident *oe = oid_getentbyoid (p->comp->u.complex->generic->schema.oid);	if (oe)	    requested_schema = oe->value;    }#else    if (p->comp && p->comp->which == Z_RecordComp_complex &&	p->comp->u.complex->generic && p->comp->u.complex->generic->schema)    {	oident *oe = oid_getentbyoid (p->comp->u.complex->generic->schema);	if (oe)	    requested_schema = oe->value;    }#endif    /* If schema has been specified, map if possible, then check that     * we got the right one      */    if (requested_schema != VAL_NONE)    {	yaz_log(LOG_DEBUG, "grs_retrieve: schema mapping");	for (map = node->u.root.absyn->maptabs; map; map = map->next)	{	    if (map->target_absyn_ref == requested_schema)	    {		onode = node;		if (!(node = data1_map_record(p->dh, onode, map, mem)))		{		    p->diagnostic = 14;		    nmem_destroy (mem);		    return 0;		}		break;	    }	}	if (node->u.root.absyn &&	    requested_schema != node->u.root.absyn->reference)	{	    p->diagnostic = 238;	    nmem_destroy (mem);	    return 0;	}    }    /*     * Does the requested format match a known syntax-mapping? (this reflects     * the overlap of schema and formatting which is inherent in the MARC     * family)     */    yaz_log(LOG_DEBUG, "grs_retrieve: syntax mapping");    if (node->u.root.absyn)        for (map = node->u.root.absyn->maptabs; map; map = map->next)        {            if (map->target_absyn_ref == p->input_format)            {                onode = node;                if (!(node = data1_map_record(p->dh, onode, map, mem)))                {                    p->diagnostic = 14;                    nmem_destroy (mem);                    return 0;                }                break;            }        }    yaz_log(LOG_DEBUG, "grs_retrieve: schemaIdentifier");    if (node->u.root.absyn &&	node->u.root.absyn->reference != VAL_NONE &&	p->input_format == VAL_GRS1)    {	oident oe;	Odr_oid *oid;	int oidtmp[OID_SIZE];		oe.proto = PROTO_Z3950;	oe.oclass = CLASS_SCHEMA;	oe.value = node->u.root.absyn->reference;		if ((oid = oid_ent_to_oid (&oe, oidtmp)))	{	    char tmp[128];	    data1_handle dh = p->dh;	    char *p = tmp;	    int *ii;	    	    for (ii = oid; *ii >= 0; ii++)	    {		if (p != tmp)			*(p++) = '.';		sprintf(p, "%d", *ii);		p += strlen(p);	    }	    if ((dnew = data1_mk_tag_data_wd(dh, top,                                              "schemaIdentifier", mem)))	    {		dnew->u.data.what = DATA1I_oid;		dnew->u.data.data = (char *) nmem_malloc(mem, p - tmp);		memcpy(dnew->u.data.data, tmp, p - tmp);		dnew->u.data.len = p - tmp;	    }	}    }    yaz_log(LOG_DEBUG, "grs_retrieve: element spec");    if (p->comp && (res = process_comp(p->dh, node, p->comp)) > 0)    {	p->diagnostic = res;	if (onode)	    data1_free_tree(p->dh, onode);	data1_free_tree(p->dh, node);	nmem_destroy(mem);	return 0;    }    else if (p->comp && !res)	selected = 1;#if 0    data1_pr_tree (p->dh, node, stdout);#endif    yaz_log(LOG_DEBUG, "grs_retrieve: transfer syntax mapping");    switch (p->output_format = (p->input_format != VAL_NONE ?				p->input_format : VAL_SUTRS))    {    case VAL_TEXT_XML:        zebra_xml_metadata (p, top, mem);#if 0        data1_pr_tree (p->dh, node, stdout);#endif        if (p->encoding)            data1_iconv (p->dh, mem, node, p->encoding, "UTF-8");	if (!(p->rec_buf = data1_nodetoidsgml(p->dh, node, selected,					      &p->rec_len)))	    p->diagnostic = 238;	else	{	    char *new_buf = (char*) odr_malloc (p->odr, p->rec_len);	    memcpy (new_buf, p->rec_buf, p->rec_len);	    p->rec_buf = new_buf;	}	break;    case VAL_GRS1:	dummy = 0;	if (!(p->rec_buf = data1_nodetogr(p->dh, node, selected,					  p->odr, &dummy)))	    p->diagnostic = 238; /* not available in requested syntax */	else	    p->rec_len = (size_t) (-1);	break;    case VAL_EXPLAIN:	if (!(p->rec_buf = data1_nodetoexplain(p->dh, node, selected,					       p->odr)))	    p->diagnostic = 238;	else	    p->rec_len = (size_t) (-1);	break;    case VAL_SUMMARY:	if (!(p->rec_buf = data1_nodetosummary(p->dh, node, selected,					       p->odr)))	    p->diagnostic = 238;	else	    p->rec_len = (size_t) (-1);	break;    case VAL_SUTRS:        if (p->encoding)            data1_iconv (p->dh, mem, node, p->encoding, "UTF-8");	if (!(p->rec_buf = data1_nodetobuf(p->dh, node, selected,					   &p->rec_len)))	    p->diagnostic = 238;	else	{	    char *new_buf = (char*) odr_malloc (p->odr, p->rec_len);	    memcpy (new_buf, p->rec_buf, p->rec_len);	    p->rec_buf = new_buf;	}	break;    case VAL_SOIF:	if (!(p->rec_buf = data1_nodetosoif(p->dh, node, selected,					    &p->rec_len)))	    p->diagnostic = 238;	else	{	    char *new_buf = (char*) odr_malloc (p->odr, p->rec_len);	    memcpy (new_buf, p->rec_buf, p->rec_len);	    p->rec_buf = new_buf;	}	break;    default:	if (!node->u.root.absyn)	{	    p->diagnostic = 238;	    break;	}	for (marctab = node->u.root.absyn->marc; marctab;	     marctab = marctab->next)	    if (marctab->reference == p->input_format)		break;	if (!marctab)	{	    p->diagnostic = 238;	    break;	}        if (p->encoding)            data1_iconv (p->dh, mem, node, p->encoding, "UTF-8");	if (!(p->rec_buf = data1_nodetomarc(p->dh, marctab, node,					selected, &p->rec_len)))	    p->diagnostic = 238;	else	{	    char *new_buf = (char*) odr_malloc (p->odr, p->rec_len);	    memcpy (new_buf, p->rec_buf, p->rec_len);		p->rec_buf = new_buf;	}    }    if (node)	data1_free_tree(p->dh, node);    if (onode)	data1_free_tree(p->dh, onode);    nmem_destroy(mem);    return 0;}static struct recType grs_type ={    "grs",    grs_init,    grs_destroy,    grs_extract,    grs_retrieve};RecType recTypeGrs = &grs_type;

⌨️ 快捷键说明

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