X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=src%2Fcharneg.c;h=9701cdac545103db123d78b3338541325777e878;hp=51a4b25010a1bfce817b791851b171225a8b5f1d;hb=43a9d38d20c1b1bcd1a03b2445a501d27526bd35;hpb=8d691989077a0addcbd840d769dce6700f3d9622 diff --git a/src/charneg.c b/src/charneg.c index 51a4b25..9701cda 100644 --- a/src/charneg.c +++ b/src/charneg.c @@ -1,27 +1,27 @@ -/* - * Copyright (C) 1995-2007, Index Data ApS +/* This file is part of the YAZ toolkit. + * Copyright (C) 1995-2011 Index Data * See the file LICENSE for details. - * - * $Id: charneg.c,v 1.7 2007-01-03 08:42:15 adam Exp $ */ - /** * \file charneg.c * \brief Implements Z39.50 Charset negotiation utilities * * Helper functions for Character Set and Language Negotiation - 3 */ +#if HAVE_CONFIG_H +#include +#endif + #include #include #include #include #include +#include -static Z_External* z_ext_record2(ODR o, int oid_class, int oid_value, - const char *buf) +static Z_External* z_ext_record2(ODR o, const char *buf) { Z_External *p; - oident oid; int len = strlen(buf); if (!(p = (Z_External *)odr_malloc(o, sizeof(*p)))) return 0; @@ -29,10 +29,7 @@ static Z_External* z_ext_record2(ODR o, int oid_class, int oid_value, 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->direct_reference = odr_oiddup(o, yaz_oid_negot_charset_id); p->which = Z_External_octet; if (!(p->u.octet_aligned = (Odr_oct *)odr_malloc(o, sizeof(Odr_oct)))) { @@ -110,8 +107,7 @@ static Z_OriginProposal_0 *z_get_OriginProposal_0(ODR o, const char *charset) p0->u.zprivate = pc; pc->which = Z_PrivateCharacterSet_externallySpecified; - pc->u.externallySpecified = - z_ext_record2(o, CLASS_NEGOT, VAL_ID_CHARSET, charset); + pc->u.externallySpecified = z_ext_record2(o, charset); } return p0; } @@ -173,15 +169,11 @@ Z_External *yaz_set_proposal_charneg(ODR o, 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->direct_reference = odr_oiddup(o, yaz_oid_negot_charset_3); p->which = Z_External_charSetandLanguageNegotiation; p->u.charNeg3 = z_get_CharSetandLanguageNegotiation(o); @@ -205,10 +197,10 @@ Z_External *yaz_set_proposal_charneg_list(ODR o, int langs_count = 0; if (charset_list) - nmem_strsplit(o->mem, delim, charset_list, + nmem_strsplit(odr_getmem(o), delim, charset_list, &charsets_addresses, &charsets_count); if (lang_list) - nmem_strsplit(o->mem, delim, lang_list, + nmem_strsplit(odr_getmem(o), delim, lang_list, &langs_addresses, &langs_count); return yaz_set_proposal_charneg(o, (const char **) charsets_addresses, @@ -251,7 +243,7 @@ static Z_TargetResponse *z_get_TargetResponse(ODR o, const char *charset, pc->which = Z_PrivateCharacterSet_externallySpecified; pc->u.externallySpecified = - z_ext_record2(o, CLASS_NEGOT, VAL_ID_CHARSET, charset); + z_ext_record2(o, charset); } p->recordsInSelectedCharSets = (bool_t *)odr_malloc(o, sizeof(bool_t)); *p->recordsInSelectedCharSets = (selected) ? 1:0; @@ -265,15 +257,11 @@ 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->direct_reference = odr_oiddup(o, yaz_oid_negot_charset_3); p->which = Z_External_charSetandLanguageNegotiation; p->u.charNeg3 = z_get_CharSetandLanguageNegotiation(o); @@ -296,11 +284,8 @@ Z_CharSetandLanguageNegotiation *yaz_get_charneg_record(Z_OtherInformation *p) 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) + if (!oid_oidcmp(pext->direct_reference, yaz_oid_negot_charset_3) + && pext->which == Z_External_charSetandLanguageNegotiation) { return pext->u.charNeg3; } @@ -320,19 +305,16 @@ int yaz_del_charneg_record(Z_OtherInformation **p) for (i = 0; i < (*p)->num_elements; i++) { Z_External *pext; 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 = (*p)->list[i]->information.externallyDefinedInfo)) + { + if (!oid_oidcmp(pext->direct_reference, yaz_oid_negot_charset_3) && pext->which == Z_External_charSetandLanguageNegotiation) { - --((*p)->num_elements); - if ((*p)->num_elements == 0) + if ((*p)->num_elements <= 1) *p = 0; else { + --((*p)->num_elements); for(; i < (*p)->num_elements; i++) (*p)->list[i] = (*p)->list[i+1]; } @@ -446,6 +428,7 @@ void yaz_get_response_charneg(NMEM mem, Z_CharSetandLanguageNegotiation *p, /* * Local variables: * c-basic-offset: 4 + * c-file-style: "Stroustrup" * indent-tabs-mode: nil * End: * vim: shiftwidth=4 tabstop=8 expandtab