//
// Atom BN 31-Mai-98
//
//
//
//
#include <stdlib.h>
#include <malloc.h>
#include <string.h>

#include "WinMain.h"
#include "Atom.h"

// *****************************************************************
// vlInit
// *****************************************************************
Atom::vlInit (void)
{
VAtom_ *pStruktur;


pStruktur = &pVAtom;
pStruktur->nStatus = FALSE;
if(pStruktur->InterneListe.vlInit()==TRUE){
pStruktur->nStatus = TRUE;
return(TRUE);
} else {
return(FALSE);
}
}

// *****************************************************************
// vlnew
// *****************************************************************
Atom::vlnew (void *pKey, void *pBuffer, long lLaenge)
{
int nRet=FALSE;
long lWert=0, lWert2=0;
char *pPointer;
int nGefunden;


if(pVAtom.nStatus==TRUE){
nGefunden = FALSE;
if(pVAtom.InterneListe.vlroot()==TRUE){
while(nGefunden==FALSE && pVAtom.InterneListe.vlnext(&pPointer)==TRUE){
if(memcmp((pPointer + sizeof(long)), pBuffer, lLaenge)==FALSE){
memcpy(pKey, pPointer, sizeof(long));
nGefunden = TRUE;
}
memcpy(&lWert2, pKey, sizeof(long));
if(lWert<=lWert2){
lWert = lWert2 + 1;
}
}
}
if(nGefunden==FALSE){
if(pVAtom.InterneListe.vlnew (&lWert, sizeof(long), &pPointer, lLaenge)==TRUE){
memcpy(pPointer, pBuffer, lLaenge);
memcpy(pKey, &lWert, sizeof(long));
nRet = TRUE;
}
} else {
nRet = TRUE;
}
}
return(nRet);
}

// *****************************************************************
// vlread
// *****************************************************************
Atom::vlread (void *pKey, void *pBuffer)
{
int nRet=FALSE;
void *pPointer;


if(pVAtom.nStatus==TRUE){
if(pVAtom.InterneListe.vlread (pKey, &pPointer)==TRUE){
memcpy(pBuffer, pPointer, sizeof(long));
nRet = TRUE;
}
}
return(nRet);
}

// *****************************************************************
// vldelet *
// *****************************************************************
Atom::vldelet (void *pKey, void *pBuffer)
{
int nRet=FALSE;


if(pVAtom.nStatus==TRUE){
if(pVAtom.InterneListe.vldelet (pKey, pBuffer)==TRUE){
nRet = TRUE;
}
}
return(nRet);
}

// *****************************************************************
// vlDeInit *
// *****************************************************************
Atom::vlDeInit (void)
{
int nRet=FALSE;


if(pVAtom.nStatus==TRUE){
if(pVAtom.InterneListe.vlDeInit()==TRUE){
pVAtom.nStatus = FALSE;
nRet = TRUE;
}
}
return(nRet);
}