X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fber_oid.c;h=6a738e11901cfc1b58a47da45d9a50aa15fa7a2a;hb=0a1e9944179033c72f1fa9f9c13fabddc1945aeb;hp=276b49b5083389d446c67001700eee71857dfc23;hpb=c6e47cbbff56f39f6d81b079ebaeac41d793d4d9;p=yaz-moved-to-github.git diff --git a/src/ber_oid.c b/src/ber_oid.c index 276b49b..6a738e1 100644 --- a/src/ber_oid.c +++ b/src/ber_oid.c @@ -1,9 +1,8 @@ /* - * Copyright (c) 1995-2003, Index Data + * Copyright (c) 1995-2004, Index Data * See the file LICENSE for details. - * Sebastian Hammer, Adam Dickmeiss * - * $Id: ber_oid.c,v 1.1 2003-10-27 12:21:30 adam Exp $ + * $Id: ber_oid.c,v 1.2 2004-02-11 23:49:28 adam Exp $ */ #if HAVE_CONFIG_H #include @@ -25,32 +24,21 @@ int ber_oidc(ODR o, Odr_oid *p) odr_seterror(o, OPROTO, 18); return 0; } - if (len < 0) + if (len <= 0) { odr_seterror(o, OPROTO, 19); return 0; } o->bp += res; - if (len == 0) - { - *p = -1; - return 1; - } if (len > odr_max(o)) { odr_seterror(o, OPROTO, 20); return 0; } - p[0] = *o->bp / 40; - if (p[0] > 2) - p[0] = 2; - p[1] = *o->bp - p[0] * 40; - o->bp++; - pos = 2; - len--; - while (len) - { - p[pos] = 0; + pos = 0; + while (len) + { + int id = 0; do { if (!len) @@ -58,13 +46,22 @@ int ber_oidc(ODR o, Odr_oid *p) odr_seterror(o, OPROTO, 21); return 0; } - p[pos] <<= 7; - p[pos] |= *o->bp & 0X7F; + id <<= 7; + id |= *o->bp & 0X7F; len--; } while (*(o->bp++) & 0X80); - pos++; - } + if (pos > 0) + p[pos++] = id; + else + { + p[0] = id / 40; + if (p[0] > 2) + p[0] = 2; + p[1] = id - p[0] * 40; + pos = 2; + } + } p[pos] = -1; return 1; case ODR_ENCODE: @@ -73,15 +70,18 @@ int ber_oidc(ODR o, Odr_oid *p) lenp = odr_tell(o); if (odr_putc(o, 0) < 0) /* dummy */ return 0; - if (p[0] < 0 && p[1] <= 0) + if (p[0] < 0 || p[1] <= 0) { odr_seterror(o, ODATA, 23); return 0; } for (pos = 1; p[pos] >= 0; pos++) { - id = pos > 1 ? p[pos] : p[0] * 40 + p[1]; n = 0; + if (pos == 1) + id = p[0]*40 + p[1]; + else + id = p[pos]; do { octs[n++] = id & 0X7F;