/* entryaddress.c */
/*****************************************************************************/
/* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only */
/* */
/* AS-Portierung */
/* */
/* Maintain entry addresses */
/* */
/*****************************************************************************/
#include "stdinc.h"
#include "strutil.h"
#include "entryaddress.h"
typedef struct sEntryAddress
{
struct sEntryAddress *pNext;
LargeWord Address;
} tEntryAddress;
static tEntryAddress *pFirstEntryAddress;
Boolean EntryAddressAvail(void)
{
return pFirstEntryAddress != NULL;
}
void AddEntryAddress(LargeWord Address)
{
tEntryAddress *pRun, *pPrev, *pNew;
for (pPrev = NULL, pRun = pFirstEntryAddress; pRun; pPrev = pRun, pRun = pRun->pNext)
{
if (pRun->Address == Address)
return;
if (pRun->Address > Address)
break;
}
pNew
= (tEntryAddress
*)malloc(sizeof(*pNew
));
pNew->Address = Address;
pNew->pNext = pRun;
if (pPrev)
pPrev->pNext = pNew;
else
pFirstEntryAddress = pNew;
}
LargeWord GetEntryAddress(Boolean UsePreferredAddress, LargeWord PreferredAddress)
{
tEntryAddress *pOld = NULL, *pPrev = NULL;
LargeWord Result;
if (!pFirstEntryAddress)
{
fprintf(stderr
, "internal error: entry address list is empty\n");
}
if (UsePreferredAddress)
{
for (pPrev = NULL, pOld = pFirstEntryAddress; pOld; pPrev = pOld, pOld = pOld->pNext)
if (pOld->Address >= PreferredAddress)
{
if (pOld->Address > PreferredAddress)
pOld = NULL;
break;
}
}
if (!pOld)
{
pOld = pFirstEntryAddress;
pPrev = NULL;
}
if (pPrev)
pPrev->pNext = pOld->pNext;
else
pFirstEntryAddress = pOld->pNext;
Result = pOld->Address;
return Result;
}
void PrintEntryAddress(FILE *pFile)
{
tEntryAddress *pRun;
String Str;
for (pRun = pFirstEntryAddress; pRun; pRun = pRun->pNext)
{
as_snprintf(Str, sizeof Str, " %lllx", pRun->Address);
}
}
void entryaddress_init()
{
pFirstEntryAddress = NULL;
}