Fix encoding of 0x00a4 (unicode to danmarc) YAZ-713
[yaz-moved-to-github.git] / src / ber_any.c
index 0c73bd7..f12b4ba 100644 (file)
@@ -1,11 +1,9 @@
-/*
- * Copyright (C) 1995-2006, Index Data ApS
+/* This file is part of the YAZ toolkit.
+ * Copyright (C) 1995-2013 Index Data
  * See the file LICENSE for details.
- *
- * $Id: ber_any.c,v 1.5 2006-08-24 13:10:03 adam Exp $
  */
 
-/** 
+/**
  * \file ber_any.c
  * \brief Implements BER ANY encoding and decoding.
  *
 int ber_any(ODR o, Odr_any **p)
 {
     int res;
-    
+
     switch (o->direction)
     {
     case ODR_DECODE:
-        if ((res = completeBER(o->bp, odr_max(o))) <= 0)        /* FIX THIS */
+        if ((res = completeBER(o->op->bp, odr_max(o))) <= 0)        /* FIX THIS */
         {
             odr_seterror(o, OPROTO, 2);
             return 0;
         }
-        (*p)->buf = (unsigned char *)odr_malloc(o, res);
-        memcpy((*p)->buf, o->bp, res);
-        (*p)->len = (*p)->size = res;
-        o->bp += res;
+        (*p)->buf = (char *)odr_malloc(o, res);
+        memcpy((*p)->buf, o->op->bp, res);
+        (*p)->len = res;
+        o->op->bp += res;
         return 1;
     case ODR_ENCODE:
         if (odr_write(o, (*p)->buf, (*p)->len) < 0)
@@ -47,11 +45,11 @@ int ber_any(ODR o, Odr_any **p)
 
 #define BER_ANY_DEBUG 0
 
-int completeBER_n(const unsigned char *buf, int len, int level)
+int completeBER_n(const char *buf, int len, int level)
 {
     int res, ll, zclass, tag, cons;
-    const unsigned char *b = buf;
-    
+    const char *b = buf;
+
     if (level > 1000)
     {
 #if BER_ANY_DEBUG
@@ -76,7 +74,7 @@ int completeBER_n(const unsigned char *buf, int len, int level)
 #endif
         return -1;  /* error */
     }
-    if (res == -1)  
+    if (res == -1)
     {
 #if BER_ANY_DEBUG
         yaz_log(YLOG_LOG, "<<<<<<<<< return2 lev=%d res=%d", level, res);
@@ -111,10 +109,9 @@ int completeBER_n(const unsigned char *buf, int len, int level)
     {
         if (b[0] == 0 && b[1] == 0)
             break;
-        if (!(res = completeBER_n(b, len, level+1)))
-            return 0;
-        if (res == -1)
-            return -1;
+        res = completeBER_n(b, len, level+1);
+        if (res <= 0)
+            return res;
         b += res;
         len -= res;
     }
@@ -123,7 +120,7 @@ int completeBER_n(const unsigned char *buf, int len, int level)
     return (b - buf) + 2;
 }
 
-int completeBER(const unsigned char *buf, int len)
+int completeBER(const char *buf, int len)
 {
     int res = completeBER_n(buf, len, 0);
 #if BER_ANY_DEBUG
@@ -136,6 +133,7 @@ int completeBER(const unsigned char *buf, int len)
 /*
  * Local variables:
  * c-basic-offset: 4
+ * c-file-style: "Stroustrup"
  * indent-tabs-mode: nil
  * End:
  * vim: shiftwidth=4 tabstop=8 expandtab