|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T m
Length: 8588 (0x218c)
Types: TextFile
Names: »mix.c«
└─⟦9ae75bfbd⟧ Bits:30007242 EUUGD3: Starter Kit
└─⟦697af93db⟧ »EurOpenD3/network/snmp/mit-snmp.tar.Z«
└─⟦57bbcbe75⟧
└─⟦this⟧ »./snmp/mix.c«
└─⟦9ae75bfbd⟧ Bits:30007242 EUUGD3: Starter Kit
└─⟦925ee6880⟧ »EurOpenD3/network/snmp/mit-snmp.900225.tar.Z«
└─⟦a4bfa469c⟧
└─⟦this⟧ »./snmp/mix.c«
/*
* $Header: mix.c,v 1.1 89/01/11 22:09:26 jrd Exp $
* Author: J. Davin
* Copyright 1988, 1989, Massachusetts Institute of Technology
* See permission and disclaimer notice in file "notice.h"
*/
#include <notice.h>
#include <mix.h>
#include <asn.h>
#include <avl.h>
#include <error.h>
#include <ctypes.h>
#include <debug.h>
#include <local.h>
typedef struct MixRecTag {
MixOpsPtrType mixRecOps;
MixCookieType mixRecCookie;
MixLengthType mixRecLen;
MixNamePtrType mixRecName;
} MixRecType;
typedef MixRecType *MixRecPtrType;
#define mixIdToPtr(m) ((MixRecPtrType) ((MixIdType) (m)))
#define mixPtrToId(m) ((MixIdType) ((MixRecPtrType) (m)))
#define mixCookieGet(m) ((mixIdToPtr(m))->mixRecCookie)
#define mixCookieSet(m, c) ((mixIdToPtr(m))->mixRecCookie = (c))
#define mixOpsGet(m) ((mixIdToPtr(m))->mixRecOps)
#define mixOpsSet(m, c) ((mixIdToPtr(m))->mixRecOps = (c))
#define mixLenGet(m) ((mixIdToPtr(m))->mixRecLen)
#define mixLenSet(m, c) ((mixIdToPtr(m))->mixRecLen = (c))
#define mixNameGet(m) ((mixIdToPtr(m))->mixRecName)
#define mixNameSet(m, c) ((mixIdToPtr(m))->mixRecName = (c))
#define mixOpRelease(m) ((mixOpsGet(m))->mixOpsReleaseOp)
#define mixOpCreate(m) ((mixOpsGet(m))->mixOpsCreateOp)
#define mixOpDestroy(m) ((mixOpsGet(m))->mixOpsDestroyOp)
#define mixOpNext(m) ((mixOpsGet(m))->mixOpsNextOp)
#define mixOpGet(m) ((mixOpsGet(m))->mixOpsGetOp)
#define mixOpSet(m) ((mixOpsGet(m))->mixOpsSetOp)
#ifdef DEBUG
static AvlStatusType mixPrint (p)
AvlInfoType p;
{
AvlLengthType i;
CBytePtrType cp;
printf ("<");
if (p != (AvlInfoType) 0) {
cp = (CBytePtrType) mixNameGet ((MixIdType) p);
for (i = mixLenGet ((MixIdType) p); i != 0; i--) {
printf ("%02.02X ", *cp++);
}
}
printf (">");
return (errOk);
}
#define DEBUGMIXPRINT mixPrint
#else /* DEBUG */
#define DEBUGMIXPRINT ((AvlPrintFnType) 0)
#endif /* DEBUG */
CVoidType mixInit ()
{
}
static AvlBalanceType mixCmp (p, name, namelen)
AvlInfoType p;
AvlNamePtrType name;
AvlLengthType namelen;
{
MixLengthType n;
MixNamePtrType cp;
CIntfType r;
n = mixLenGet ((MixIdType) p);
cp = mixNameGet ((MixIdType) p);
r = (CIntfType) 0;
if (namelen >= n) {
while ((n-- != 0) && ((r = (CIntfType) *name++ -
(CIntfType) *cp++) == 0));
}
else {
while ((namelen-- != 0) && ((r = (CIntfType) *name++ -
(CIntfType) *cp++) == 0));
if (r == 0) {
r = -1;
}
}
if (r == 0) {
return (avlDirBalanced);
}
else if (r < 0) {
return (avlDirLeft);
}
else {
return (avlDirRight);
}
}
MixIdType mixAlloc ()
{
MixRecPtrType mp;
if ((mp = (MixRecPtrType) malloc ((unsigned) sizeof (*mp))) !=
(MixRecPtrType) 0) {
return (mixPtrToId (mp));
}
else {
return ((MixIdType) 0);
}
}
MixIdType mixNew ()
{
MixIdType mix;
AvlIdType tree;
if ((tree = avlNew (mixCmp, DEBUGMIXPRINT)) == (AvlIdType) 0) {
return ((MixIdType) 0);
}
else if ((mix = mixAlloc ()) != (MixIdType) 0) {
(void) mixOpsSet (mix, (MixOpsPtrType) 0);
(void) mixCookieSet (mix, (MixCookieType) tree);
(void) mixLenSet (mix, (MixLengthType) 0);
(void) mixNameSet (mix, (MixNamePtrType) 0);
return (mix);
}
else {
tree = avlFree (tree);
return ((MixIdType) 0);
}
}
AsnIdType mixValue (ops, cookie)
MixOpsPtrType ops;
MixCookieType cookie;
{
MixRecType m;
MixIdType mix;
mix = mixPtrToId (& m);
(void) mixLenSet (mix, (MixLengthType) 0);
(void) mixNameSet (mix, (MixNamePtrType) 0);
(void) mixOpsSet (mix, ops);
(void) mixCookieSet (mix, cookie);
return (asnOctetString (mixValueAsnClass, mixValueAsnTag,
(CBytePtrType) & m, (AsnLengthType) sizeof (m)));
}
MixIdType mixFree (mix)
MixIdType mix;
{
if (mix != (MixIdType) 0) {
/*
* For each node in AVL tree, invoke
* mixOpRelease primitive. Then call avlFree ().
*/
free ((char *) (mixIdToPtr (mix)));
}
return ((MixIdType) 0);
}
static MixStatusType mixCreateNode (mix, name, namelen, value)
MixIdType mix;
MixNamePtrType name;
MixLengthType namelen;
AsnIdType value;
{
MixRecType m;
MixIdType new;
MixIdType template;
if (namelen == (MixLengthType) 0) {
return (smpErrorGeneric);
}
if (value == (AsnIdType) 0) {
return (smpErrorGeneric);
}
else if (asnClass (value) != mixValueAsnClass) {
return (smpErrorGeneric);
}
else if (asnTag (value) != mixValueAsnTag) {
return (smpErrorGeneric);
}
else if (asnContents (value, (CBytePtrType) & m,
(AsnLengthType) sizeof (m)) !=
(AsnLengthType) sizeof (m)) {
return (smpErrorGeneric);
}
else if ((new = mixAlloc ()) == (MixIdType) 0) {
return (smpErrorGeneric);
}
else if (avlInsert ((AvlIdType) mixCookieGet (mix),
(AvlNamePtrType) name, (AvlLengthType) namelen,
(AvlInfoType) new) != errOk) {
new = mixFree (new);
return (smpErrorGeneric);
}
else {
template = mixPtrToId (& m);
(void) mixOpsSet (new, mixOpsGet (template));
(void) mixCookieSet (new, mixCookieGet (template));
(void) mixLenSet (new, namelen);
(void) mixNameSet (new, name);
return (smpErrorNone);
}
}
MixStatusType mixCreate (mix, name, namelen, value)
MixIdType mix;
MixNamePtrType name;
MixLengthType namelen;
AsnIdType value;
{
AvlInfoType info;
if (mix == (MixIdType) 0) {
return (smpErrorGeneric);
}
info = avlFind ((AvlIdType) mixCookieGet (mix),
(AvlNamePtrType) name, (AvlLengthType) namelen);
if (info == (AvlInfoType) 0) {
return (mixCreateNode (mix, name, namelen, value));
}
else {
return ((*mixOpCreate ((MixIdType) info))
(mixCookieGet ((MixIdType) info),
name + mixLenGet ((MixIdType) info),
namelen - mixLenGet ((MixIdType) info), value));
}
}
AsnIdType mixNext (mix, name, namelenp)
MixIdType mix;
MixNamePtrType name;
MixLengthPtrType namelenp;
{
AvlInfoType info;
MixLengthType newlen;
AsnIdType result;
if (mix == (MixIdType) 0) {
return ((AsnIdType) 0);
}
result = (AsnIdType) 0;
info = avlFind ((AvlIdType) mixCookieGet (mix),
(AvlNamePtrType) name, (AvlLengthType) *namelenp);
if (info != (AvlInfoType) 0) {
newlen = *namelenp - mixLenGet ((MixIdType) info);
result = (*mixOpNext ((MixIdType) info))
(mixCookieGet ((MixIdType) info),
name + mixLenGet ((MixIdType) info), & newlen);
if (result != (AsnIdType) 0) {
*namelenp = newlen + mixLenGet ((MixIdType) info);
return (result);
}
}
do {
info = avlCessor ((AvlIdType) mixCookieGet (mix),
(AvlNamePtrType) name, (AvlLengthType) *namelenp);
if (info != (AvlInfoType) 0) {
*namelenp = mixLenGet ((MixIdType) info);
(void) bcopy ((char *) mixNameGet ((MixIdType) info),
(char *) name, (int) *namelenp);
newlen = (AvlLengthType) 0;
result = (*mixOpNext ((MixIdType) info))
(mixCookieGet ((MixIdType) info),
name + mixLenGet ((MixIdType) info),
& newlen);
}
} while ((info != (AvlInfoType) 0) && (result == (AsnIdType) 0));
if (info != (AvlInfoType) 0) {
*namelenp += newlen;
}
return (result);
}
AsnIdType mixGet (mix, name, namelen)
MixIdType mix;
MixNamePtrType name;
MixLengthType namelen;
{
AvlInfoType info;
if (mix == (MixIdType) 0) {
return ((AsnIdType) 0);
}
info = avlFind ((AvlIdType) mixCookieGet (mix),
(AvlNamePtrType) name, (AvlLengthType) namelen);
if (info == (AvlInfoType) 0) {
return ((AsnIdType) 0);
}
else {
return ((*mixOpGet ((MixIdType) info))
(mixCookieGet ((MixIdType) info),
name + mixLenGet ((MixIdType) info),
namelen - mixLenGet ((MixIdType) info)));
}
}
MixStatusType mixSet (mix, name, namelen, value)
MixIdType mix;
MixNamePtrType name;
MixLengthType namelen;
AsnIdType value;
{
AvlInfoType info;
if (mix == (MixIdType) 0) {
return (smpErrorGeneric);
}
info = avlFind ((AvlIdType) mixCookieGet (mix),
(AvlNamePtrType) name, (AvlLengthType) namelen);
if (info == (AvlInfoType) 0) {
return (smpErrorNoSuch);
}
else {
return ((*mixOpSet ((MixIdType) info))
(mixCookieGet ((MixIdType) info),
name + mixLenGet ((MixIdType) info),
namelen - mixLenGet ((MixIdType) info),
value));
}
}
MixStatusType mixDestroy (mix, name, namelen)
MixIdType mix;
AvlNamePtrType name;
AvlLengthType namelen;
{
AvlInfoType info;
if (mix == (MixIdType) 0) {
return (smpErrorGeneric);
}
info = avlFind ((AvlIdType) mixCookieGet (mix),
(AvlNamePtrType) name, (AvlLengthType) namelen);
if (info == (AvlInfoType) 0) {
return (smpErrorNoSuch);
}
else {
return ((*mixOpDestroy ((MixIdType) info))
(mixCookieGet ((MixIdType) info),
name + mixLenGet ((MixIdType) info),
namelen - mixLenGet ((MixIdType) info)));
}
}