Better Z39.50 search/present handling
[yaz-moved-to-github.git] / src / prt-ext.c
index 0c130af..9fd35c2 100644 (file)
@@ -1,5 +1,5 @@
 /* This file is part of the YAZ toolkit.
- * Copyright (C) 1995-2012 Index Data
+ * Copyright (C) Index Data
  * See the file LICENSE for details.
  */
 /**
@@ -13,6 +13,7 @@
 #include <yaz/proto.h>
 
 #include <yaz/oid_db.h>
+#include "odr-priv.h"
 #define PRT_EXT_DEBUG 0
 
 #if PRT_EXT_DEBUG
@@ -216,8 +217,8 @@ int z_External(ODR o, Z_External **p, int opt, const char *name)
         if (zclass == ODR_CONTEXT && tag == 1 && cons == 0)
         {
             /* we have an OCTET STRING. decode BER contents from it */
-            const unsigned char *o_bp;
-            unsigned char *o_buf;
+            const char *o_bp;
+            char *o_buf;
             int o_size;
             char *voidp = 0;
             Odr_oct *oct;
@@ -227,13 +228,13 @@ int z_External(ODR o, Z_External **p, int opt, const char *name)
                 return 0;
 
             /* Save our decoding ODR members */
-            o_bp = o->bp;
-            o_buf = o->buf;
-            o_size = o->size;
+            o_bp = o->op->bp;
+            o_buf = o->op->buf;
+            o_size = o->op->size;
 
             /* Set up the OCTET STRING buffer */
-            o->bp = o->buf = oct->buf;
-            o->size = oct->len;
+            o->op->bp = o->op->buf = oct->buf;
+            o->op->size = oct->len;
 
             /* and decode that */
             r = (*type->fun)(o, &voidp, 0, 0);
@@ -241,9 +242,9 @@ int z_External(ODR o, Z_External **p, int opt, const char *name)
             (*p)->u.single_ASN1_type = (Odr_any*) voidp;
 
             /* Restore our decoding ODR member */
-            o->bp = o_bp;
-            o->buf = o_buf;
-            o->size = o_size;
+            o->op->bp = o_bp;
+            o->op->buf = o_buf;
+            o->op->size = o_size;
 
             return r && odr_sequence_end(o);
         }
@@ -258,16 +259,17 @@ int z_External(ODR o, Z_External **p, int opt, const char *name)
         odr_sequence_end(o);
 }
 
-Z_External *z_ext_record_oid(ODR o, const Odr_oid *oid, const char *buf, int len)
+Z_External *z_ext_record_oid_nmem(NMEM nmem, const Odr_oid *oid,
+                                  const char *buf, int len)
 {
     Z_External *thisext;
 
     if (!oid)
         return 0;
-    thisext = (Z_External *) odr_malloc(o, sizeof(*thisext));
+    thisext = (Z_External *) nmem_malloc(nmem, sizeof(*thisext));
     thisext->descriptor = 0;
     thisext->indirect_reference = 0;
-    thisext->direct_reference = odr_oiddup(o, oid);
+    thisext->direct_reference = odr_oiddup_nmem(nmem, oid);
 
     if (len < 0) /* Structured data */
     {
@@ -310,29 +312,35 @@ Z_External *z_ext_record_oid(ODR o, const Odr_oid *oid, const char *buf, int len
     }
     else if (!oid_oidcmp(oid, yaz_oid_recsyn_sutrs))
     {    /* SUTRS is a single-ASN.1-type */
-        Odr_oct *sutrs = (Odr_oct *)odr_malloc(o, sizeof(*sutrs));
+        Odr_oct *sutrs = (Odr_oct *)nmem_malloc(nmem, sizeof(*sutrs));
 
         thisext->which = Z_External_sutrs;
         thisext->u.sutrs = sutrs;
-        sutrs->buf = (unsigned char *)odr_malloc(o, len);
-        sutrs->len = sutrs->size = len;
+        sutrs->buf = (char *)nmem_malloc(nmem, len);
+        sutrs->len = len;
         memcpy(sutrs->buf, buf, len);
     }
     else
     {
         thisext->which = Z_External_octet;
         if (!(thisext->u.octet_aligned = (Odr_oct *)
-              odr_malloc(o, sizeof(Odr_oct))))
+              nmem_malloc(nmem, sizeof(Odr_oct))))
             return 0;
-        if (!(thisext->u.octet_aligned->buf = (unsigned char *)
-              odr_malloc(o, len)))
+        if (!(thisext->u.octet_aligned->buf = (char *)
+              nmem_malloc(nmem, len)))
             return 0;
         memcpy(thisext->u.octet_aligned->buf, buf, len);
-        thisext->u.octet_aligned->len = thisext->u.octet_aligned->size = len;
+        thisext->u.octet_aligned->len = len;
     }
     return thisext;
 }
 
+Z_External *z_ext_record_oid(ODR o, const Odr_oid *oid,
+                             const char *buf, int len)
+{
+    return z_ext_record_oid_nmem(o->mem, oid, buf, len);
+}
+
 Z_External *z_ext_record_oid_any(ODR o, const Odr_oid *oid,
                                  const char *buf, int len)
 {
@@ -349,12 +357,11 @@ Z_External *z_ext_record_oid_any(ODR o, const Odr_oid *oid,
     thisext->u.single_ASN1_type = (Odr_any *) odr_malloc(o, sizeof(Odr_any));
     if (!thisext->u.single_ASN1_type)
         return 0;
-    thisext->u.single_ASN1_type->buf = (unsigned char *) odr_malloc(o, len);
+    thisext->u.single_ASN1_type->buf = (char *) odr_malloc(o, len);
     if (!thisext->u.single_ASN1_type->buf)
         return 0;
     memcpy(thisext->u.single_ASN1_type->buf, buf, len);
-    thisext->u.single_ASN1_type->len = thisext->u.single_ASN1_type->size = len;
-
+    thisext->u.single_ASN1_type->len = len;
     return thisext;
 }