Hans Leidekker : snmpapi: Implement SnmpUtilOid{Append, Cmp, NCmp}. Fix SnmpUtilOid{Cpy, Free}.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Jan 22 07:05:32 CST 2007


Module: wine
Branch: master
Commit: baaed37d6d425700921a8b57bcc8e6f3ad68b3e1
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=baaed37d6d425700921a8b57bcc8e6f3ad68b3e1

Author: Hans Leidekker <hans at it.vu.nl>
Date:   Mon Jan 22 11:06:38 2007 +0100

snmpapi: Implement SnmpUtilOid{Append, Cmp, NCmp}. Fix SnmpUtilOid{Cpy, Free}.

---

 dlls/snmpapi/main.c       |   83 ++++++++++++++++++++++++++++++++++++++++-----
 dlls/snmpapi/snmpapi.spec |    6 ++--
 2 files changed, 77 insertions(+), 12 deletions(-)

diff --git a/dlls/snmpapi/main.c b/dlls/snmpapi/main.c
index 8031162..e385638 100644
--- a/dlls/snmpapi/main.c
+++ b/dlls/snmpapi/main.c
@@ -253,23 +253,53 @@ INT WINAPI SnmpUtilOctetsCmp(AsnOctetStr
 }
 
 /***********************************************************************
- *      SnmpUtilOidCpy          (SNMPAPI.@)
+ *      SnmpUtilOidAppend       (SNMPAPI.@)
  */
-INT WINAPI SnmpUtilOidCpy(AsnObjectIdentifier *dst, AsnObjectIdentifier *src)
+INT WINAPI SnmpUtilOidAppend(AsnObjectIdentifier *dst, AsnObjectIdentifier *src)
 {
-    unsigned int i, size;
+    UINT *ids, i, size;
 
     TRACE("(%p, %p)\n", dst, src);
 
-    size = sizeof(AsnObjectIdentifier);
-    if ((dst = HeapAlloc(GetProcessHeap(), 0, size)))
+    if (!dst) return SNMPAPI_ERROR;
+    if (!src) return SNMPAPI_NOERROR;
+
+    size = (src->idLength + dst->idLength) * sizeof(UINT);
+    if (!(ids = HeapReAlloc(GetProcessHeap(), 0, dst->ids, size)))
     {
-        size = src->idLength * sizeof(UINT);
-        if (!(dst->ids = HeapAlloc(GetProcessHeap(), 0, size)))
+        if (!(ids = HeapAlloc(GetProcessHeap(), 0, size)))
         {
-            HeapFree(GetProcessHeap(), 0, dst);
+            SetLastError(SNMP_MEM_ALLOC_ERROR);
             return SNMPAPI_ERROR;
         }
+        else memcpy(ids, dst->ids, dst->idLength * sizeof(UINT));
+    }
+
+    for (i = 0; i < src->idLength; i++) ids[i + dst->idLength] = src->ids[i];
+    dst->idLength = dst->idLength + src->idLength;
+    dst->ids = ids;
+
+    return SNMPAPI_NOERROR;
+}
+
+/***********************************************************************
+ *      SnmpUtilOidCpy          (SNMPAPI.@)
+ */
+INT WINAPI SnmpUtilOidCpy(AsnObjectIdentifier *dst, AsnObjectIdentifier *src)
+{
+    TRACE("(%p, %p)\n", dst, src);
+
+    if (!dst) return SNMPAPI_ERROR;
+    if (!src)
+    {
+        dst->idLength = 0;
+        dst->ids = NULL;
+        return SNMPAPI_NOERROR;
+    }
+    if ((dst->ids = HeapAlloc(GetProcessHeap(), 0, src->idLength * sizeof(UINT))))
+    {
+        unsigned int i;
+
         dst->idLength = src->idLength;
         for (i = 0; i < dst->idLength; i++) dst->ids[i] = src->ids[i];
         return SNMPAPI_NOERROR;
@@ -284,8 +314,43 @@ void WINAPI SnmpUtilOidFree(AsnObjectIde
 {
     TRACE("(%p)\n", oid);
 
+    if (!oid) return;
+
+    oid->idLength = 0;
     HeapFree(GetProcessHeap(), 0, oid->ids);
-    HeapFree(GetProcessHeap(), 0, oid);
+    oid->ids = NULL;
+}
+
+/***********************************************************************
+ *      SnmpUtilOidNCmp         (SNMPAPI.@)
+ */
+INT WINAPI SnmpUtilOidNCmp(AsnObjectIdentifier *oid1, AsnObjectIdentifier *oid2, UINT count)
+{
+    unsigned int i;
+
+    TRACE("(%p, %p, %d)\n", oid1, oid2, count);
+
+    if (!oid1 || !oid2) return 0;
+
+    for (i = 0; i < count; i++)
+    {
+        if (oid1->ids[i] > oid2->ids[i]) return 1;
+        if (oid1->ids[i] < oid2->ids[i]) return -1;
+    }
+    return 0;
+}
+
+/***********************************************************************
+ *      SnmpUtilOidCmp          (SNMPAPI.@)
+ */
+INT WINAPI SnmpUtilOidCmp(AsnObjectIdentifier *oid1, AsnObjectIdentifier *oid2)
+{
+    TRACE("(%p, %p)\n", oid1, oid2);
+
+    if (oid1->idLength < oid2->idLength) return -1;
+    if (oid1->idLength > oid2->idLength) return 1;
+
+    return SnmpUtilOidNCmp(oid1, oid2, oid1->idLength);
 }
 
 /***********************************************************************
diff --git a/dlls/snmpapi/snmpapi.spec b/dlls/snmpapi/snmpapi.spec
index cd6dcd0..b98d029 100644
--- a/dlls/snmpapi/snmpapi.spec
+++ b/dlls/snmpapi/snmpapi.spec
@@ -29,11 +29,11 @@
 @ stdcall SnmpUtilOctetsCpy(ptr ptr)
 @ stdcall SnmpUtilOctetsFree(ptr)
 @ stdcall SnmpUtilOctetsNCmp(ptr ptr long)
-@ stub SnmpUtilOidAppend
-@ stub SnmpUtilOidCmp
+@ stdcall SnmpUtilOidAppend(ptr ptr)
+@ stdcall SnmpUtilOidCmp(ptr ptr)
 @ stdcall SnmpUtilOidCpy(ptr ptr)
 @ stdcall SnmpUtilOidFree(ptr)
-@ stub SnmpUtilOidNCmp
+@ stdcall SnmpUtilOidNCmp(ptr ptr long)
 @ stub SnmpUtilOidToA
 @ stub SnmpUtilPrintAsnAny
 @ stub SnmpUtilPrintOid




More information about the wine-cvs mailing list