CCL combo qualifier should allow forward references YAZ-779
[yaz-moved-to-github.git] / src / ber_oct.c
index c571b88..a88da37 100644 (file)
@@ -1,9 +1,9 @@
 /* This file is part of the YAZ toolkit.
- * Copyright (C) 1995-2009 Index Data
+ * Copyright (C) Index Data
  * See the file LICENSE for details.
  */
 
-/** 
+/**
  * \file ber_oct.c
  * \brief Implements ber_octetstring
  *
 #endif
 
 #include "odr-priv.h"
+#include <yaz/log.h>
+#include <assert.h>
 
 int ber_octetstring(ODR o, Odr_oct *p, int cons)
 {
     int res, len;
-    const unsigned char *base;
-    unsigned char *c;
+    const char *base;
 
     switch (o->direction)
     {
     case ODR_DECODE:
-        if ((res = ber_declen(o->bp, &len, odr_max(o))) < 0)
+        if ((res = ber_declen(o->op->bp, &len, odr_max(o))) < 0)
         {
             odr_seterror(o, OPROTO, 14);
             return 0;
         }
-        o->bp += res;
+        o->op->bp += res;
         if (cons)       /* fetch component strings */
         {
-            base = o->bp;
+            base = o->op->bp;
             while (odp_more_chunks(o, base, len))
                 if (!odr_octetstring(o, &p, 0, 0))
                     return 0;
@@ -51,21 +52,9 @@ int ber_octetstring(ODR o, Odr_oct *p, int cons)
             odr_seterror(o, OOTHER, 16);
             return 0;
         }
-        if (len + 1 > p->size - p->len)
-        {
-            c = (unsigned char *)odr_malloc(o, p->size += len + 1);
-            if (p->len)
-                memcpy(c, p->buf, p->len);
-            p->buf = c;
-        }
-        if (len)
-            memcpy(p->buf + p->len, o->bp, len);
-        p->len += len;
-        o->bp += len;
-        /* the final null is really not part of the buffer, but */
-        /* it helps somes applications that assumes C strings */
-        if (len)
-            p->buf[p->len] = '\0';
+        p->len = len;
+        p->buf = odr_strdupn(o, o->op->bp, len);
+        o->op->bp += len;
         return 1;
     case ODR_ENCODE:
         if ((res = ber_enclen(o, p->len, 5, 0)) < 0)
@@ -85,6 +74,7 @@ int ber_octetstring(ODR o, Odr_oct *p, int cons)
 /*
  * Local variables:
  * c-basic-offset: 4
+ * c-file-style: "Stroustrup"
  * indent-tabs-mode: nil
  * End:
  * vim: shiftwidth=4 tabstop=8 expandtab