Module: wine Branch: master Commit: baaed37d6d425700921a8b57bcc8e6f3ad68b3e1 URL: http://source.winehq.org/git/wine.git/?a=commit;h=baaed37d6d425700921a8b57bc...
Author: Hans Leidekker hans@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