|
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