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