Adding initial code jy.oak@samsung.com
[ric-app/kpimon.git] / asn1c_defs / all-defs / xer_encoder.c
diff --git a/asn1c_defs/all-defs/xer_encoder.c b/asn1c_defs/all-defs/xer_encoder.c
new file mode 100755 (executable)
index 0000000..23e0311
--- /dev/null
@@ -0,0 +1,237 @@
+/*-\r
+ * Copyright (c) 2003, 2004 Lev Walkin <vlm@lionet.info>. All rights reserved.\r
+ * Redistribution and modifications are permitted subject to BSD license.\r
+ */\r
+#include <asn_internal.h>\r
+#include <stdio.h>\r
+#include <errno.h>\r
+\r
+/*\r
+ * The XER encoder of any type. May be invoked by the application.\r
+ */\r
+asn_enc_rval_t\r
+xer_encode(const asn_TYPE_descriptor_t *td, const void *sptr,\r
+           enum xer_encoder_flags_e xer_flags, asn_app_consume_bytes_f *cb,\r
+           void *app_key) {\r
+    asn_enc_rval_t er = {0, 0, 0};\r
+       asn_enc_rval_t tmper;\r
+       const char *mname;\r
+       size_t mlen;\r
+       int xcan = (xer_flags & XER_F_CANONICAL) ? 1 : 2;\r
+\r
+       if(!td || !sptr) goto cb_failed;\r
+\r
+       mname = td->xml_tag;\r
+       mlen = strlen(mname);\r
+\r
+       ASN__CALLBACK3("<", 1, mname, mlen, ">", 1);\r
+\r
+       tmper = td->op->xer_encoder(td, sptr, 1, xer_flags, cb, app_key);\r
+       if(tmper.encoded == -1) return tmper;\r
+       er.encoded += tmper.encoded;\r
+\r
+       ASN__CALLBACK3("</", 2, mname, mlen, ">\n", xcan);\r
+\r
+       ASN__ENCODED_OK(er);\r
+cb_failed:\r
+       ASN__ENCODE_FAILED;\r
+}\r
+\r
+/*\r
+ * This is a helper function for xer_fprint, which directs all incoming data\r
+ * into the provided file descriptor.\r
+ */\r
+static int\r
+xer__print2fp(const void *buffer, size_t size, void *app_key) {\r
+       FILE *stream = (FILE *)app_key;\r
+\r
+       if(fwrite(buffer, 1, size, stream) != size)\r
+               return -1;\r
+\r
+       return 0;\r
+}\r
+\r
+int\r
+xer_fprint(FILE *stream, const asn_TYPE_descriptor_t *td, const void *sptr) {\r
+       asn_enc_rval_t er = {0,0,0};\r
+\r
+       if(!stream) stream = stdout;\r
+       if(!td || !sptr)\r
+               return -1;\r
+\r
+       er = xer_encode(td, sptr, XER_F_BASIC, xer__print2fp, stream);\r
+       if(er.encoded == -1)\r
+               return -1;\r
+\r
+       return fflush(stream);\r
+}\r
+\r
+struct xer_buffer {\r
+    char *buffer;\r
+    size_t buffer_size;\r
+    size_t allocated_size;\r
+};\r
+\r
+static int\r
+xer__buffer_append(const void *buffer, size_t size, void *app_key) {\r
+    struct xer_buffer *xb = app_key;\r
+\r
+    while(xb->buffer_size + size + 1 > xb->allocated_size) {\r
+        size_t new_size = 2 * (xb->allocated_size ? xb->allocated_size : 64);\r
+        char *new_buf = MALLOC(new_size);\r
+        if(!new_buf) return -1;\r
+        if (xb->buffer) {\r
+            memcpy(new_buf, xb->buffer, xb->buffer_size);\r
+        }\r
+        FREEMEM(xb->buffer);\r
+        xb->buffer = new_buf;\r
+        xb->allocated_size = new_size;\r
+    }\r
+\r
+    memcpy(xb->buffer + xb->buffer_size, buffer, size);\r
+    xb->buffer_size += size;\r
+    xb->buffer[xb->buffer_size] = '\0';\r
+    return 0;\r
+}\r
+\r
+enum xer_equivalence_e\r
+xer_equivalent(const struct asn_TYPE_descriptor_s *td, const void *struct1,\r
+               const void *struct2, FILE *opt_debug_stream) {\r
+    struct xer_buffer xb1 = {0, 0, 0};\r
+    struct xer_buffer xb2 = {0, 0, 0};\r
+    asn_enc_rval_t e1, e2;\r
+    asn_dec_rval_t rval;\r
+    void *sptr = NULL;\r
+\r
+    if(!td || !struct1 || !struct2) {\r
+        if(opt_debug_stream) {\r
+            if(!td) fprintf(opt_debug_stream, "Type descriptor missing\n");\r
+            if(!struct1) fprintf(opt_debug_stream, "Structure 1 missing\n");\r
+            if(!struct2) fprintf(opt_debug_stream, "Structure 2 missing\n");\r
+        }\r
+        return XEQ_FAILURE;\r
+    }\r
+\r
+    e1 = xer_encode(td, struct1, XER_F_BASIC, xer__buffer_append, &xb1);\r
+    if(e1.encoded == -1) {\r
+        if(opt_debug_stream) {\r
+            fprintf(stderr, "XER Encoding of %s failed\n", td->name);\r
+        }\r
+        FREEMEM(xb1.buffer);\r
+        return XEQ_ENCODE1_FAILED;\r
+    }\r
+\r
+    e2 = xer_encode(td, struct2, XER_F_BASIC, xer__buffer_append, &xb2);\r
+    if(e2.encoded == -1) {\r
+        if(opt_debug_stream) {\r
+            fprintf(stderr, "XER Encoding of %s failed\n", td->name);\r
+        }\r
+        FREEMEM(xb1.buffer);\r
+        FREEMEM(xb2.buffer);\r
+        return XEQ_ENCODE1_FAILED;\r
+    }\r
+\r
+    if(xb1.buffer_size != xb2.buffer_size\r
+       || memcmp(xb1.buffer, xb2.buffer, xb1.buffer_size) != 0) {\r
+        if(opt_debug_stream) {\r
+            fprintf(opt_debug_stream,\r
+                    "Structures XER-encoded into different byte streams:\n=== "\r
+                    "Structure 1 ===\n%s\n=== Structure 2 ===\n%s\n",\r
+                    xb1.buffer, xb2.buffer);\r
+        }\r
+        FREEMEM(xb1.buffer);\r
+        FREEMEM(xb2.buffer);\r
+        return XEQ_DIFFERENT;\r
+    } else {\r
+        if(opt_debug_stream) {\r
+            fprintf(opt_debug_stream,\r
+                    "Both structures encoded into the same XER byte stream "\r
+                    "of size %" ASN_PRI_SIZE ":\n%s",\r
+                    xb1.buffer_size, xb1.buffer);\r
+        }\r
+    }\r
+\r
+    rval = xer_decode(NULL, td, (void **)&sptr, xb1.buffer,\r
+               xb1.buffer_size);\r
+    switch(rval.code) {\r
+    case RC_OK:\r
+        break;\r
+    case RC_WMORE:\r
+        if(opt_debug_stream) {\r
+            fprintf(opt_debug_stream,\r
+                    "Structure %s XER decode unexpectedly requires "\r
+                    "more data:\n%s\n",\r
+                    td->name, xb1.buffer);\r
+        }\r
+        /* Fall through */\r
+    case RC_FAIL:\r
+    default:\r
+        if(opt_debug_stream) {\r
+            fprintf(opt_debug_stream,\r
+                    "Structure %s XER decoding resulted in failure.\n",\r
+                    td->name);\r
+        }\r
+        ASN_STRUCT_FREE(*td, sptr);\r
+        FREEMEM(xb1.buffer);\r
+        FREEMEM(xb2.buffer);\r
+        return XEQ_DECODE_FAILED;\r
+    }\r
+\r
+    if(rval.consumed != xb1.buffer_size\r
+       && ((rval.consumed > xb1.buffer_size)\r
+           || xer_whitespace_span(xb1.buffer + rval.consumed,\r
+                                  xb1.buffer_size - rval.consumed)\r
+                  != (xb1.buffer_size - rval.consumed))) {\r
+        if(opt_debug_stream) {\r
+            fprintf(opt_debug_stream,\r
+                    "Round-trip decode of %s required less bytes (%" ASN_PRI_SIZE ") than "\r
+                    "encoded (%" ASN_PRI_SIZE ")\n",\r
+                    td->name, rval.consumed, xb1.buffer_size);\r
+        }\r
+        ASN_STRUCT_FREE(*td, sptr);\r
+        FREEMEM(xb1.buffer);\r
+        FREEMEM(xb2.buffer);\r
+        return XEQ_ROUND_TRIP_FAILED;\r
+    }\r
+\r
+    /*\r
+     * Reuse xb2 to encode newly decoded structure.\r
+     */\r
+    FREEMEM(xb2.buffer);\r
+    memset(&xb2, 0, sizeof(xb2));\r
+\r
+    e2 = xer_encode(td, sptr, XER_F_BASIC, xer__buffer_append, &xb2);\r
+    if(e2.encoded == -1) {\r
+        if(opt_debug_stream) {\r
+            fprintf(stderr, "XER Encoding of round-trip decode of %s failed\n",\r
+                    td->name);\r
+        }\r
+        ASN_STRUCT_FREE(*td, sptr);\r
+        FREEMEM(xb1.buffer);\r
+        FREEMEM(xb2.buffer);\r
+        return XEQ_ROUND_TRIP_FAILED;\r
+    }\r
+\r
+    ASN_STRUCT_FREE(*td, sptr);\r
+    sptr = 0;\r
+\r
+    if(xb1.buffer_size != xb2.buffer_size\r
+       || memcmp(xb1.buffer, xb2.buffer, xb1.buffer_size) != 0) {\r
+        if(opt_debug_stream) {\r
+            fprintf(opt_debug_stream,\r
+                    "XER Encoding of round-trip decode of %s resulted in "\r
+                    "different byte stream:\n"\r
+                    "=== Original ===\n%s\n"\r
+                    "=== Round-tripped ===\n%s\n",\r
+                    xb1.buffer, xb2.buffer, td->name);\r
+        }\r
+        FREEMEM(xb1.buffer);\r
+        FREEMEM(xb2.buffer);\r
+        return XEQ_ROUND_TRIP_FAILED;\r
+    }\r
+\r
+       FREEMEM(xb1.buffer);\r
+       FREEMEM(xb2.buffer);\r
+       return XEQ_SUCCESS;\r
+}\r
+\r