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

📄 charneg.c

📁 harvest是一个下载html网页得机器人
💻 C
字号:
/*  $ $Id: charneg.c,v 1.8 2003/09/02 12:12:13 adam Exp $ * Helper functions for Character Set and Language Negotiation - 3 */#include <stdio.h>#include <yaz/otherinfo.h>#include <yaz/z-charneg.h>#include <yaz/charneg.h>#include <yaz/yaz-util.h>static Z_External* z_ext_record2(ODR o, int oid_class, int oid_value,                                 const char *buf){    Z_External *p;    oident oid;    int len = strlen(buf);        if (!(p = (Z_External *)odr_malloc(o, sizeof(*p)))) return 0;        p->descriptor = 0;    p->indirect_reference = 0;        oid.proto = PROTO_Z3950;    oid.oclass = (enum oid_class) oid_class;    oid.value = (enum oid_value) oid_value;    p->direct_reference = odr_oiddup(o, oid_getoidbyent(&oid));        p->which = Z_External_octet;    if (!(p->u.octet_aligned = (Odr_oct *)odr_malloc(o, sizeof(Odr_oct)))) {        return 0;    }    if (!(p->u.octet_aligned->buf = (unsigned char *)odr_malloc(o, len))) {        return 0;    }    p->u.octet_aligned->len = p->u.octet_aligned->size = len;    memcpy(p->u.octet_aligned->buf, buf, len);	    return p;}static int get_form(const char *charset){    int form = -1;    if (!yaz_matchstr(charset, "UCS-2"))        form = 2;    if (!yaz_matchstr(charset, "UCS-4"))        form = 4;    if (!yaz_matchstr(charset, "UTF-16"))        form = 5;    if (!yaz_matchstr(charset, "UTF-8"))        form = 8;    return form;}static char *set_form (Odr_oid *encoding){    static char *charset = 0;    if ( oid_oidlen(encoding) != 6)        return 0;    if (encoding[5] == 2)        charset = "UCS-2";    if (encoding[5] == 4)        charset = "UCS-4";    if (encoding[5] == 5)        charset = "UTF-16";    if (encoding[5] == 8)        charset = "UTF-8";    return charset;}static Z_OriginProposal_0 *z_get_OriginProposal_0(ODR o, const char *charset){    int form = get_form (charset);    Z_OriginProposal_0 *p0 =        (Z_OriginProposal_0*)odr_malloc(o, sizeof(*p0));    memset(p0, 0, sizeof(*p0));    if (form > 0)    {   /* ISO 10646 (UNICODE) */        char oidname[20];        Z_Iso10646 *is = (Z_Iso10646 *) odr_malloc (o, sizeof(*is));        p0->which = Z_OriginProposal_0_iso10646;        p0->u.iso10646 = is;        is->collections = 0;        sprintf (oidname, "1.0.10646.1.0.%d", form);        is->encodingLevel = odr_getoidbystr (o, oidname);    }    else    {   /* private ones */        Z_PrivateCharacterSet *pc =            (Z_PrivateCharacterSet *)odr_malloc(o, sizeof(*pc));        memset(pc, 0, sizeof(*pc));                p0->which = Z_OriginProposal_0_private;        p0->u.zprivate = pc;	        pc->which = Z_PrivateCharacterSet_externallySpecified;        pc->u.externallySpecified =            z_ext_record2(o, CLASS_NEGOT, VAL_ID_CHARSET, charset);    }    return p0;}static Z_OriginProposal *z_get_OriginProposal(    ODR o, const char **charsets, int num_charsets,    const char **langs, int num_langs, int selected){	    int i;    Z_OriginProposal *p = (Z_OriginProposal *) odr_malloc(o, sizeof(*p));		    memset(p, 0, sizeof(*p));    p->recordsInSelectedCharSets = (bool_t *)odr_malloc(o, sizeof(bool_t));    *p->recordsInSelectedCharSets = (selected) ? 1:0;    if (charsets && num_charsets) {			        p->num_proposedCharSets = num_charsets;        p->proposedCharSets =             (Z_OriginProposal_0**)            odr_malloc(o, num_charsets*sizeof(Z_OriginProposal_0*));        for (i = 0; i<num_charsets; i++)            p->proposedCharSets[i] =                z_get_OriginProposal_0(o, charsets[i]);    }    if (langs && num_langs) {	        p->num_proposedlanguages = num_langs;        p->proposedlanguages =             (char **) odr_malloc(o, num_langs*sizeof(char *));        for (i = 0; i<num_langs; i++) {            p->proposedlanguages[i] = (char *)langs[i];			        }    }    return p;}static Z_CharSetandLanguageNegotiation *z_get_CharSetandLanguageNegotiation(    ODR o){    Z_CharSetandLanguageNegotiation *p =        (Z_CharSetandLanguageNegotiation *) odr_malloc(o, sizeof(*p));        memset(p, 0, sizeof(*p));	    return p;}/* Create EXTERNAL for negotation proposal. Client side */Z_External *yaz_set_proposal_charneg(ODR o,                                     const char **charsets, int num_charsets,                                     const char **langs, int num_langs,                                     int selected){    Z_External *p = (Z_External *)odr_malloc(o, sizeof(*p));    oident oid;	    p->descriptor = 0;    p->indirect_reference = 0;	    oid.proto = PROTO_Z3950;    oid.oclass = CLASS_NEGOT;    oid.value = VAL_CHARNEG3;    p->direct_reference = odr_oiddup(o, oid_getoidbyent(&oid));    p->which = Z_External_charSetandLanguageNegotiation;    p->u.charNeg3 = z_get_CharSetandLanguageNegotiation(o);    p->u.charNeg3->which = Z_CharSetandLanguageNegotiation_proposal;    p->u.charNeg3->u.proposal =        z_get_OriginProposal(o, charsets, num_charsets,                             langs, num_langs, selected);    return p;}/* used by yaz_set_response_charneg */static Z_TargetResponse *z_get_TargetResponse(ODR o, const char *charset,                                              const char *lang, int selected){	    Z_TargetResponse *p = (Z_TargetResponse *) odr_malloc(o, sizeof(*p));    int form = get_form(charset);    memset(p, 0, sizeof(*p));    if (form > 0)    {        char oidname[20];        Z_Iso10646 *is = (Z_Iso10646 *) odr_malloc (o, sizeof(*is));        p->which = Z_TargetResponse_iso10646;        p->u.iso10646 = is;        is->collections = 0;        sprintf (oidname, "1.0.10646.1.0.%d", form);        is->encodingLevel = odr_getoidbystr (o, oidname);    }    else    {        Z_PrivateCharacterSet *pc =            (Z_PrivateCharacterSet *)odr_malloc(o, sizeof(*pc));                memset(pc, 0, sizeof(*pc));	        p->which = Z_TargetResponse_private;        p->u.zprivate = pc;	        pc->which = Z_PrivateCharacterSet_externallySpecified;        pc->u.externallySpecified =	    z_ext_record2(o, CLASS_NEGOT, VAL_ID_CHARSET, charset);    }    p->recordsInSelectedCharSets = (bool_t *)odr_malloc(o, sizeof(bool_t));    *p->recordsInSelectedCharSets = (selected) ? 1:0;        p->selectedLanguage = lang ? (char *)odr_strdup(o, lang) : 0;    return p;}/* Create charset response. Server side */Z_External *yaz_set_response_charneg(ODR o, const char *charset,                                     const char *lang, int selected){    Z_External *p = (Z_External *)odr_malloc(o, sizeof(*p));    oident oid;	    p->descriptor = 0;    p->indirect_reference = 0;	    oid.proto = PROTO_Z3950;    oid.oclass = CLASS_NEGOT;    oid.value = VAL_CHARNEG3;    p->direct_reference = odr_oiddup(o, oid_getoidbyent(&oid));    p->which = Z_External_charSetandLanguageNegotiation;    p->u.charNeg3 = z_get_CharSetandLanguageNegotiation(o);    p->u.charNeg3->which = Z_CharSetandLanguageNegotiation_response;    p->u.charNeg3->u.response = z_get_TargetResponse(o, charset, lang, selected);    return p;}/* Get negotiation from OtherInformation. Client&Server side */Z_CharSetandLanguageNegotiation *yaz_get_charneg_record(Z_OtherInformation *p){    Z_External *pext;    int i;	    if(!p)        return 0;	    for (i=0; i<p->num_elements; i++) {	        if ((p->list[i]->which == Z_OtherInfo_externallyDefinedInfo) &&            (pext = p->list[i]->information.externallyDefinedInfo)) {					            oident *ent = oid_getentbyoid(pext->direct_reference);			            if (ent && ent->value == VAL_CHARNEG3 && ent->oclass == CLASS_NEGOT &&                pext->which == Z_External_charSetandLanguageNegotiation) {				                return pext->u.charNeg3;            }        }    }    return 0;}/* Get charsets, langs, selected from negotiation.. Server side */void yaz_get_proposal_charneg(NMEM mem, Z_CharSetandLanguageNegotiation *p,                              char ***charsets, int *num_charsets,                              char ***langs, int *num_langs, int *selected){    int i;    Z_OriginProposal *pro = p->u.proposal;        if (num_charsets && charsets)    {        if (pro->num_proposedCharSets)        {            *num_charsets = pro->num_proposedCharSets;                        (*charsets) = (char **)                nmem_malloc(mem, pro->num_proposedCharSets * sizeof(char *));                        for (i=0; i<pro->num_proposedCharSets; i++)             {                (*charsets)[i] = 0;                                if (pro->proposedCharSets[i]->which ==                    Z_OriginProposal_0_private &&                    pro->proposedCharSets[i]->u.zprivate->which ==                    Z_PrivateCharacterSet_externallySpecified) {                                        Z_External *pext =                        pro->proposedCharSets[i]->u.zprivate->u.externallySpecified;                                        if (pext->which == Z_External_octet) {                                                (*charsets)[i] = (char *)                            nmem_malloc(mem, (1+pext->u.octet_aligned->len) *                                        sizeof(char));                                                memcpy ((*charsets)[i], pext->u.octet_aligned->buf,                                pext->u.octet_aligned->len);                        (*charsets)[i][pext->u.octet_aligned->len] = 0;                                            }                }                else if (pro->proposedCharSets[i]->which ==                         Z_OriginProposal_0_iso10646)                    (*charsets)[i] = set_form (                        pro->proposedCharSets[i]->u.iso10646->encodingLevel);            }        }        else            *num_charsets = 0;    }        if (langs && num_langs)    {        if (pro->num_proposedlanguages)        {            *num_langs = pro->num_proposedlanguages;                        (*langs) = (char **)                nmem_malloc(mem, pro->num_proposedlanguages * sizeof(char *));                        for (i=0; i<pro->num_proposedlanguages; i++)                (*langs)[i] = nmem_strdup(mem, pro->proposedlanguages[i]);        }        else            *num_langs = 0;    }        if(pro->recordsInSelectedCharSets && selected)        *selected = *pro->recordsInSelectedCharSets;}/* Return charset, lang, selected from negotiation.. Client side */void yaz_get_response_charneg(NMEM mem, Z_CharSetandLanguageNegotiation *p,                              char **charset, char **lang, int *selected){    Z_TargetResponse *res = p->u.response;	    if (charset && res->which == Z_TargetResponse_private &&        res->u.zprivate->which == Z_PrivateCharacterSet_externallySpecified) {        Z_External *pext = res->u.zprivate->u.externallySpecified;                if (pext->which == Z_External_octet) {                        *charset = (char *)                nmem_malloc(mem, (1+pext->u.octet_aligned->len)*sizeof(char));            memcpy (*charset, pext->u.octet_aligned->buf,                    pext->u.octet_aligned->len);            (*charset)[pext->u.octet_aligned->len] = 0;        }	    }    if (charset && res->which == Z_TargetResponse_iso10646)        *charset = set_form (res->u.iso10646->encodingLevel);    if (lang && res->selectedLanguage)        *lang = nmem_strdup (mem, res->selectedLanguage);    if(selected && res->recordsInSelectedCharSets)        *selected = *res->recordsInSelectedCharSets;}

⌨️ 快捷键说明

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