From 333b605b2afd472b823aeda0adf0e8b1ea9843c0 Mon Sep 17 00:00:00 2001 From: fishsoupisgood Date: Mon, 27 May 2019 02:41:51 +0100 Subject: initial commit from asl-1.41r8.tar.gz --- asmrelocs.c | 133 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 asmrelocs.c (limited to 'asmrelocs.c') 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 +#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 -- cgit v1.2.3