ZOOM: only supply clientIP for InitRequest
[yaz-moved-to-github.git] / src / copy_types.c
index c01d8e8..9062d86 100644 (file)
@@ -1,66 +1,81 @@
-/*
- * Copyright (C) 1995-2007, Index Data ApS
- * All rights reserved.
- *
- * $Id: copy_types.c,v 1.1 2007-04-30 08:29:07 adam Exp $
+/* This file is part of the YAZ toolkit.
+ * Copyright (C) Index Data
+ * See the file LICENSE for details.
  */
-
 /** \file copy_types.c
     \brief Copies various Z39.50 types
  */
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
 
+#include <string.h>
 #include <yaz/copy_types.h>
 
+/** macro clone_z_type copies a given ASN.1 type */
+#define clone_z_type(x) \
+Z_##x *yaz_clone_z_##x(Z_##x *q, NMEM nmem_out) \
+{ \
+    Z_##x *q1 = 0; \
+    ODR enc = odr_createmem(ODR_ENCODE); \
+    ODR dec = odr_createmem(ODR_DECODE); \
+    if (z_##x(enc, &q, 0, 0)) \
+    { \
+        int len; \
+        char *buf = odr_getbuf(enc, &len, 0); \
+        if (buf) \
+        { \
+            odr_setbuf(dec, buf, len, 0); \
+            z_##x(dec, &q1, 0, 0); \
+            nmem_transfer(nmem_out, dec->mem);  \
+        } \
+    } \
+    odr_destroy(enc); \
+    odr_destroy(dec); \
+    return q1; \
+} \
+int yaz_compare_z_##x(Z_##x *a, Z_##x *b) \
+{ \
+    int ret = 0; \
+    ODR o_a = odr_createmem(ODR_ENCODE); \
+    ODR o_b = odr_createmem(ODR_ENCODE); \
+    int r_a = z_##x(o_a, &a, 1, 0); \
+    int r_b = z_##x(o_b, &b, 1, 0); \
+    if (r_a && r_b) \
+    { \
+        int len_a, len_b; \
+        char *buf_a = odr_getbuf(o_a, &len_a, 0); \
+        char *buf_b = odr_getbuf(o_b, &len_b, 0); \
+        if (buf_a && buf_b && len_a == len_b && !memcmp(buf_a, buf_b, len_a)) \
+            ret = 1; \
+        else if (!buf_a && !buf_b) \
+            ret = 1; \
+    } \
+    odr_destroy(o_a); \
+    odr_destroy(o_b); \
+    return ret; \
+}
+
+clone_z_type(NamePlusRecord)
+clone_z_type(RPNQuery)
+clone_z_type(Query)
+clone_z_type(RecordComposition)
+clone_z_type(OtherInformation)
+
 Z_RPNQuery *yaz_copy_z_RPNQuery(Z_RPNQuery *q, ODR out)
 {
-    Z_RPNQuery *q1 = 0;
-    ODR enc = odr_createmem(ODR_ENCODE);
-    ODR dec = odr_createmem(ODR_DECODE);
-    if (!z_RPNQuery(enc, &q, 0, 0))
-        return 0;
-    else
-    {
-        int len;
-        char *buf = odr_getbuf(enc, &len, 0);
-        if (buf)
-        {
-            odr_setbuf(dec, buf, len, 0);
-            z_RPNQuery(dec, &q1, 0, 0);
-            nmem_transfer(out->mem, dec->mem);
-        }
-    }
-    odr_destroy(enc);
-    odr_destroy(dec);
-    return q1;
+    return yaz_clone_z_RPNQuery(q, out->mem);
 }
 
 Z_Query *yaz_copy_Z_Query(Z_Query *q, ODR out)
 {
-    Z_Query *q1 = 0;
-    ODR enc = odr_createmem(ODR_ENCODE);
-    ODR dec = odr_createmem(ODR_DECODE);
-    if (!z_Query(enc, &q, 0, 0))
-        return 0;
-    else
-    {
-        int len;
-        char *buf = odr_getbuf(enc, &len, 0);
-        if (buf)
-        {
-            odr_setbuf(dec, buf, len, 0);
-            z_Query(dec, &q1, 0, 0);
-            nmem_transfer(out->mem, dec->mem);
-        }
-    }
-    odr_destroy(enc);
-    odr_destroy(dec);
-    return q1;
+    return yaz_clone_z_Query(q, out->mem);
 }
 
-
 /*
  * Local variables:
  * c-basic-offset: 4
+ * c-file-style: "Stroustrup"
  * indent-tabs-mode: nil
  * End:
  * vim: shiftwidth=4 tabstop=8 expandtab