mxDatei.c


/* mxDatei.c */

#include "mxDatei.h"
#include "mxStrukturen.h"
#include "mxMMU.h"
#include "mxLib.h"


static tVerzeichnisEintrag *DateiVerzeichnis                            /* erster Verzeichniseintrag                    */
       = (tVerzeichnisEintrag *) cRamdiskStart;

/* -------------------------------------------------------------------------------------------------------------------- */

void LiesVerzeichnis( tNamenVerzeichnis *Verzeichnis )
{
  int Anzahl = 0;

  while (Anzahl < cMaxDateiAnzahl &&
	 DateiVerzeichnis[Anzahl].Name[0] != cFuellZeichen )            /* Verzeichnis durchgehen bis Ende erreicht     */
  {
    strncpy(Verzeichnis->Namen[Anzahl],
	    DateiVerzeichnis[Anzahl].Name,
	    cDateiNameLaenge+1);                                        /* Namen herauskopieren                         */
    Anzahl++;
  }

  Verzeichnis->Anzahl = Anzahl;
} /* LiesVerzeichnis */

/* -------------------------------------------------------------------------------------------------------------------- */

int SucheDatei( tDateiName DateiName )
{
  int i = 0;

  while (i < cMaxDateiAnzahl &&
	 DateiVerzeichnis[i].Name[0] != cFuellZeichen )                 /* Verzeichnis durchgehen bis Ende erreicht     */
    {
      if (!strcmp(DateiName, DateiVerzeichnis[i].Name))
        return i;
      i++;
    }
  return -1;
} /* SucheDatei */

/* -------------------------------------------------------------------------------------------------------------------- */

static void* Offset2Addr( int Offset )
/*
 * Wandelt den uebergebenen Offset im Dateisystem zu seiner absoluten
 * Adresse um
 */
{
  return (void *) ((char *) DateiVerzeichnis + Offset);
} /* Offset2Addr */

/* -------------------------------------------------------------------------------------------------------------------- */

static tProgrammInfo *InfoZeiger(int DateiKennung)
/*
 * Gibt eines Zeiger auf den Anfang des Programmkopfs der Datei zurueck, die
 * vom <DateiKennung>ten Eintrag im Dateiverzeichnis referenziert wird.
 */
{
  return (tProgrammInfo *) Offset2Addr(DateiVerzeichnis[DateiKennung].Offset);
} /* InfoZeiger */

/* -------------------------------------------------------------------------------------------------------------------- */

static int KopfGroesse(tProgrammInfo *Info)
/*
 * Berechnet die Groesse des Programmkopfs der Datei deren
 * Informations-Struktur uebergeben wird
 */
{
  return sizeof(tProgrammInfo) + Info->FixupAnzahl * sizeof(tFixup);
} /* KopfGroesse */

/* -------------------------------------------------------------------------------------------------------------------- */

static void *ProgrammStart(tProgrammInfo *InfoP)
/*
 * Gibt die Adresse zurueck an der das Programmsegment einer Datei beginnt.
 * <InfoP> ist der Zeiger auf die Informationsstruktur der Datei im
 * Dateisystem
 */
{
  return (void *) ((char *) InfoP + KopfGroesse(InfoP));
} /* ProgrammStart */

/* -------------------------------------------------------------------------------------------------------------------- */

/*
 * Gibt die Adresse zurueck an der das Konstantensegment einer Datei beginnt.
 * <InfoP> ist der Zeiger auf die Informationsstruktur der Datei im
 * Dateisystem
 */
static void *KonstantenStart(tProgrammInfo *InfoP)
{
  return (void *) ((char *) ProgrammStart(InfoP) + InfoP->ProgrammGroesse);
} /* KonstantenStart */

/* -------------------------------------------------------------------------------------------------------------------- */

void LiesProgrammInfo(int DateiKennung, tProgrammInfo *Info)
{
  memcpy(Info, InfoZeiger(DateiKennung), sizeof(tProgrammInfo));
} /* LiesProgrammInfo */

/* -------------------------------------------------------------------------------------------------------------------- */

void LiesProgramm(int DateiKennung, void* Wohin)
{
  tProgrammInfo *InfoP;

  InfoP = InfoZeiger(DateiKennung);
  memcpy(Wohin, ProgrammStart(InfoP ), InfoP->ProgrammGroesse);
} /* LiesProgramm */

/* -------------------------------------------------------------------------------------------------------------------- */

void LiesKonstanten(int DateiKennung, void* Wohin)
{
  tProgrammInfo *InfoP;

  InfoP = InfoZeiger(DateiKennung);
  memcpy(Wohin, KonstantenStart(InfoP), InfoP->KonstantenGroesse);
} /* LiesKonstanten */

/* -------------------------------------------------------------------------------------------------------------------- */

void LiesFixup(int DateiKennung, int Index, tFixup *Fixup)
{
  char *FixupP;

  FixupP = ((char *) InfoZeiger(DateiKennung)) + sizeof(tProgrammInfo) + (Index * sizeof(tFixup));
  memcpy(Fixup, FixupP, sizeof(tFixup));
} /* LiesFixup */

/* -------------------------------------------------------------------------------------------------------------------- */

int InitDatei(void)
{
  return TRUE;
}



Bei Problemen mit der Seite bitte eine Mail an Marek
Converted with C2HTML V0.669 by Iluvatar
Prozeßdatenverarbeitung