aboutsummaryrefslogtreecommitdiffstats
path: root/asmrelocs.c
diff options
context:
space:
mode:
Diffstat (limited to 'asmrelocs.c')
-rw-r--r--asmrelocs.c133
1 files changed, 133 insertions, 0 deletions
diff --git a/asmrelocs.c b/asmrelocs.c
new file mode 100644
index 0000000..bb24e22
--- /dev/null
+++ b/asmrelocs.c
@@ -0,0 +1,133 @@
+/* asmrelocs.c */
+/*****************************************************************************/
+/* AS-Portierung */
+/* */
+/* Verwaltung von Relokationslisten */
+/* */
+/* Historie: 25. 7.1999 Grundsteinlegung */
+/* 1. 8.1999 Merge-Funktion implementiert */
+/* 8. 8.1999 Reloc-Liste gespeichert */
+/* 15. 9.1999 fehlende Includes */
+/* Add in Merge */
+/*****************************************************************************/
+
+#include "stdinc.h"
+#include <string.h>
+#include "strutil.h"
+#include "asmdef.h"
+#include "asmsub.h"
+#include "asmrelocs.h"
+
+/*---------------------------------------------------------------------------*/
+
+PRelocEntry LastRelocs = Nil;
+
+/*---------------------------------------------------------------------------*/
+
+ PRelocEntry MergeRelocs(PRelocEntry *list1, PRelocEntry *list2,
+ Boolean Add)
+BEGIN
+ PRelocEntry PRun1, PRun2, PPrev, PNext, PLast, PRes;
+
+ PRun1 = *list1; PLast = PRes = Nil;
+
+ /* ueber alle in Liste 1 */
+
+ while (PRun1 != Nil)
+ BEGIN
+ /* Uebereinstimmung suchen, die sich aufhebt */
+
+ PNext = PRun1->Next;
+ PRun2 = *list2; PPrev = Nil;
+ while (PRun2 != Nil)
+ if ((strcasecmp(PRun1->Ref, PRun2->Ref) == 0) AND ((PRun1->Add != PRun2->Add) != Add))
+ BEGIN
+ /* gefunden -> beide weg */
+
+ free(PRun1->Ref); free(PRun2->Ref);
+ if (PPrev == Nil) *list2 = PRun2->Next;
+ else PPrev->Next = PRun2->Next;
+ free(PRun2); free(PRun1); PRun1 = Nil;
+ break;
+ END
+ else
+ BEGIN
+ PPrev = PRun2; PRun2 = PRun2->Next;
+ END
+
+ /* ansonsten an Ergebnisliste anhaengen */
+
+ if (PRun1 != Nil)
+ if (PLast == Nil) PRes = PLast = PRun1;
+ else
+ BEGIN
+ PLast->Next = PRun1; PLast = PRun1;
+ END
+ PRun1 = PNext;
+ END
+
+ /* Reste aus Liste 2 nicht vergessen */
+
+ if (PLast == Nil) PRes = *list2;
+ else PLast->Next = *list2;
+
+ /* Quellisten jetzt leer */
+
+ *list1 = *list2 = Nil;
+
+ /* fertich */
+
+ return PRes;
+END
+
+ void InvertRelocs(PRelocEntry *erg, PRelocEntry *src)
+BEGIN
+ PRelocEntry SRun;
+
+ for (SRun = *src; SRun != Nil; SRun = SRun->Next)
+ SRun->Add = NOT (SRun->Add);
+
+ *erg = *src;
+END
+
+ void FreeRelocs(PRelocEntry *list)
+BEGIN
+ PRelocEntry Run;
+
+ while (*list != Nil)
+ BEGIN
+ Run = *list;
+ *list = (*list)->Next;
+ free(Run->Ref);
+ free(Run);
+ END
+END
+
+ PRelocEntry DupRelocs(PRelocEntry src)
+BEGIN
+ PRelocEntry First, Run, SRun, Neu;
+
+ First = Run = Nil;
+ for (SRun = src; SRun != Nil; SRun = SRun->Next)
+ BEGIN
+ Neu = (PRelocEntry) malloc(sizeof(TRelocEntry));
+ Neu->Next = Nil;
+ Neu->Ref = strdup(SRun->Ref);
+ Neu->Add = SRun->Add;
+ if (First == Nil) First = Neu;
+ else Run->Next = Neu;
+ Run = Neu;
+ END
+
+ return First;
+END
+
+ void SetRelocs(PRelocEntry List)
+BEGIN
+ if (LastRelocs != Nil)
+ BEGIN
+ WrError(1155);
+ FreeRelocs(&LastRelocs);
+ END
+ LastRelocs = List;
+END