Details | Last modification | View Log | RSS feed
| Rev | Author | Line No. | Line |
|---|---|---|---|
| 1126 | savelij | 1 | /* entryaddress.c */ |
| 2 | /*****************************************************************************/ |
||
| 3 | /* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only */ |
||
| 4 | /* */ |
||
| 5 | /* AS-Portierung */ |
||
| 6 | /* */ |
||
| 7 | /* Maintain entry addresses */ |
||
| 8 | /* */ |
||
| 9 | /*****************************************************************************/ |
||
| 10 | |||
| 11 | #include "stdinc.h" |
||
| 12 | |||
| 13 | #include "strutil.h" |
||
| 14 | |||
| 15 | #include "entryaddress.h" |
||
| 16 | |||
| 17 | typedef struct sEntryAddress |
||
| 18 | { |
||
| 19 | struct sEntryAddress *pNext; |
||
| 20 | LargeWord Address; |
||
| 21 | } tEntryAddress; |
||
| 22 | |||
| 23 | static tEntryAddress *pFirstEntryAddress; |
||
| 24 | |||
| 25 | Boolean EntryAddressAvail(void) |
||
| 26 | { |
||
| 27 | return pFirstEntryAddress != NULL; |
||
| 28 | } |
||
| 29 | |||
| 30 | void AddEntryAddress(LargeWord Address) |
||
| 31 | { |
||
| 32 | tEntryAddress *pRun, *pPrev, *pNew; |
||
| 33 | |||
| 34 | for (pPrev = NULL, pRun = pFirstEntryAddress; pRun; pPrev = pRun, pRun = pRun->pNext) |
||
| 35 | { |
||
| 36 | if (pRun->Address == Address) |
||
| 37 | return; |
||
| 38 | if (pRun->Address > Address) |
||
| 39 | break; |
||
| 40 | } |
||
| 41 | |||
| 42 | pNew = (tEntryAddress*)malloc(sizeof(*pNew)); |
||
| 43 | pNew->Address = Address; |
||
| 44 | |||
| 45 | pNew->pNext = pRun; |
||
| 46 | if (pPrev) |
||
| 47 | pPrev->pNext = pNew; |
||
| 48 | else |
||
| 49 | pFirstEntryAddress = pNew; |
||
| 50 | } |
||
| 51 | |||
| 52 | LargeWord GetEntryAddress(Boolean UsePreferredAddress, LargeWord PreferredAddress) |
||
| 53 | { |
||
| 54 | tEntryAddress *pOld = NULL, *pPrev = NULL; |
||
| 55 | LargeWord Result; |
||
| 56 | |||
| 57 | if (!pFirstEntryAddress) |
||
| 58 | { |
||
| 59 | fprintf(stderr, "internal error: entry address list is empty\n"); |
||
| 60 | exit(255); |
||
| 61 | } |
||
| 62 | |||
| 63 | if (UsePreferredAddress) |
||
| 64 | { |
||
| 65 | for (pPrev = NULL, pOld = pFirstEntryAddress; pOld; pPrev = pOld, pOld = pOld->pNext) |
||
| 66 | if (pOld->Address >= PreferredAddress) |
||
| 67 | { |
||
| 68 | if (pOld->Address > PreferredAddress) |
||
| 69 | pOld = NULL; |
||
| 70 | break; |
||
| 71 | } |
||
| 72 | } |
||
| 73 | if (!pOld) |
||
| 74 | { |
||
| 75 | pOld = pFirstEntryAddress; |
||
| 76 | pPrev = NULL; |
||
| 77 | } |
||
| 78 | |||
| 79 | if (pPrev) |
||
| 80 | pPrev->pNext = pOld->pNext; |
||
| 81 | else |
||
| 82 | pFirstEntryAddress = pOld->pNext; |
||
| 83 | |||
| 84 | Result = pOld->Address; |
||
| 85 | free(pOld); |
||
| 86 | return Result; |
||
| 87 | } |
||
| 88 | |||
| 89 | void PrintEntryAddress(FILE *pFile) |
||
| 90 | { |
||
| 91 | tEntryAddress *pRun; |
||
| 92 | String Str; |
||
| 93 | |||
| 94 | fprintf(pFile, "("); |
||
| 95 | for (pRun = pFirstEntryAddress; pRun; pRun = pRun->pNext) |
||
| 96 | { |
||
| 97 | as_snprintf(Str, sizeof Str, " %lllx", pRun->Address); |
||
| 98 | fprintf(pFile, "%s\n", Str); |
||
| 99 | } |
||
| 100 | fprintf(pFile, ")\n"); |
||
| 101 | } |
||
| 102 | |||
| 103 | void entryaddress_init() |
||
| 104 | { |
||
| 105 | pFirstEntryAddress = NULL; |
||
| 106 | } |