/* asmfnums.c */
/*****************************************************************************/
/* AS-Portierung                                                             */
/*                                                                           */
/* Verwaltung von Datei-Nummern                                              */
/*                                                                           */
/* Historie: 15. 5.1996 Grundsteinlegung                                     */
/*           25. 7.1998 GetFileName jetzt mit int statt Byte                 */
/*                      Verwaltung Adreßbereiche                             */
/*                      Caching FileCount                                    */
/*           16. 8.1998 Ruecksetzen Adressbereiche                           */
/*                                                                           */
/*****************************************************************************/

#include "stdinc.h"
#include <string.h>

#include "strutil.h"
#include "chunks.h"
#include "asmdef.h"
#include "asmsub.h"

#include "asmfnums.h"

#ifdef HAS64
#define ADRMAX 9223372036854775807ll;
#else
#define ADRMAX 4294967295l;
#endif


typedef struct _TToken
         {
          struct _TToken *Next;
          LargeWord FirstAddr,LastAddr;
          char *Name;
         } TToken,*PToken;

static PToken FirstFile;
static int FileCount;

        void InitFileList(void)
BEGIN
   FirstFile=Nil; FileCount=0;
END


        void ClearFileList(void)
BEGIN
   PToken F;

   while (FirstFile!=Nil)
    BEGIN
     F=FirstFile->Next;
     free(FirstFile->Name);
     free(FirstFile);
     FirstFile=F;
    END
   FileCount=0;
END


	static PToken SearchToken(int Num)
BEGIN
   PToken Lauf=FirstFile;

   while (Num>0)
    BEGIN
     if (Lauf==Nil) return Nil;
     Num--; Lauf=Lauf->Next;
    END
   return Lauf;
END


        void AddFile(char *FName)
BEGIN
   PToken Lauf,Neu;

   if (GetFileNum(FName)!=-1) return;

   Neu=(PToken) malloc(sizeof(TToken));
   Neu->Next=Nil;
   Neu->Name=strdup(FName);
   Neu->FirstAddr=ADRMAX;
   Neu->LastAddr=0;
   if (FirstFile==Nil) FirstFile=Neu;
   else
    BEGIN
     Lauf=FirstFile;
     while (Lauf->Next!=Nil) Lauf=Lauf->Next;
     Lauf->Next=Neu;
    END
   FileCount++;
END


        Integer GetFileNum(char *Name)
BEGIN
   PToken FLauf=FirstFile;
   int Cnt=0;

   while ((FLauf!=Nil) AND (strcmp(FLauf->Name,Name)!=0))
    BEGIN
     Cnt++;
     FLauf=FLauf->Next;
    END
   return (FLauf==Nil)?(-1):(Cnt);
END


        char *GetFileName(int Num)
BEGIN
   PToken Lauf=SearchToken(Num);
   static char *Dummy="";

   return (Lauf==Nil)?(Dummy):(Lauf->Name);
END


        Integer GetFileCount(void)
BEGIN
   return FileCount;
END


	void AddAddressRange(int File, LargeWord Start, LargeWord Len)
BEGIN
   PToken Lauf=SearchToken(File);

   if (Lauf==Nil) return;

   if (Start<Lauf->FirstAddr) Lauf->FirstAddr=Start;
   if ((Len+=Start-1)>Lauf->LastAddr) Lauf->LastAddr=Len;
END


	void GetAddressRange(int File, LargeWord *Start, LargeWord *End)
BEGIN
   PToken Lauf=SearchToken(File);

   if (Lauf==Nil)
    BEGIN
     *Start=ADRMAX; *End=0;
    END
   else
    BEGIN
     *Start=Lauf->FirstAddr; *End=Lauf->LastAddr;
    END
END

	void ResetAddressRanges(void)
BEGIN
   PToken Run;

   for (Run=FirstFile; Run!=Nil; Run=Run->Next)
    BEGIN
     Run->FirstAddr=ADRMAX;
     Run->LastAddr=0;
    END
END

	void asmfnums_init(void)
BEGIN
   FirstFile=Nil; FileCount=0;
END

