home *** CD-ROM | disk | FTP | other *** search
- /* -------------------------------------------------------------------------------------- */
-
- #include "exec/memory.h"
- #include "dos/dos.h"
- #include "dos/dosextens.h"
- #include "clib/exec_protos.h"
- #include "clib/dos_protos.h"
- #include "pragmas/exec_pragmas.h"
- #include "pragmas/dos_pragmas.h"
- #include <string.h>
- #include "buffer.h"
-
- /* -------------------------------------------------------------------------------------- */
-
- /* lese_puffer - !PRIVATE ROUTINE!
- Liest so viel wie m÷glich Byte in den Buffer ein. Grundannahme ist, da▀ der
- Puffer "ausbenutzt" ist. Es wird sowohl die neue Ausnutzung des Puffers wie
- auch der Zeiger auf die aktuelle Position korrigiert.
- */
-
- extern struct ExecBase *SysBase;
- extern struct DOSBase *DOSBase;
-
- STATIC BOOL lese_puffer (struct datei *meine_datei)
- {
- LONG anzahl;
-
- if (meine_datei->modus == MODE_OLDFILE)
- {
- anzahl = Read (meine_datei->datei_zeiger, meine_datei->puffer_zeiger, PUFFER_GROESSE);
- if (anzahl == -1)
- {
- return (FALSE);
- }
- meine_datei->puffer_voelle = anzahl;
- meine_datei->akt_position = 0;
- return (TRUE);
- }
- return (FALSE);
- }
-
- /* -------------------------------------------------------------------------------------- */
-
- /* schreibe_puffer - !PRIVATE ROUTINE!
- Schreib den Puffer bis "akt_position" in die Datei auf dem gewΣhlten Medium.
- "akt_position" wird danach zurⁿckgesetzt, der Puffer kann neu benutzt werden.
- Sollten keine Zeichen im Puffer sein (weil "akt_position" auf 0 steht), wird
- "TRUE" zurⁿckgeliefert.
- */
-
- STATIC BOOL schreibe_puffer (struct datei *meine_datei)
- {
- LONG anzahl;
-
- if (meine_datei->modus == MODE_NEWFILE)
- {
- if (meine_datei->akt_position > 0)
- {
- anzahl = Write (meine_datei->datei_zeiger, meine_datei->puffer_zeiger, meine_datei->akt_position);
- if (anzahl == -1)
- {
- return (FALSE);
- }
- if (anzahl != meine_datei->akt_position)
- {
- return (FALSE);
- }
- meine_datei->akt_position = 0;
- return (TRUE);
- }
- else
- {
- return (TRUE);
- }
- }
- return (FALSE);
- }
-
- /* -------------------------------------------------------------------------------------- */
-
- /* oeffne_datei
- ╓ffnet Datei zum sequenziellen Lesen (Modus MODE_OLDFILE) oder legt neue
- Datei zum sequenziellen Schreiben an (Modus MODE_NEWFILE). Rⁿckgabe ist
- eine Struktur vom Typ "datei". Rⁿckgabe ist NULL wenn Datei nicht ge-
- ÷ffnet werden kann oder kein RAM fⁿr Puffer da ist.
- */
-
- struct datei * oeffne_datei (char *name, ULONG modus)
- {
- struct datei *meine_datei;
- char *mein_puffer;
- BPTR mein_bptr;
- BOOL ergebnis;
-
- meine_datei = AllocMem (sizeof (struct datei), MEMF_CLEAR|MEMF_PUBLIC);
- if (meine_datei)
- {
- mein_puffer = AllocMem (PUFFER_GROESSE, MEMF_CLEAR);
- if (mein_puffer)
- {
- if ((modus == MODE_OLDFILE) || (modus == MODE_NEWFILE))
- {
- mein_bptr = Open (name, modus);
- if (mein_bptr)
- {
- meine_datei->datei_zeiger = mein_bptr;
- meine_datei->puffer_zeiger = mein_puffer;
- meine_datei->puffer_groesse = PUFFER_GROESSE;
- meine_datei->akt_position = 0;
- meine_datei->modus = modus;
- if (modus == MODE_OLDFILE)
- {
- ergebnis = lese_puffer (meine_datei);
- if (ergebnis == TRUE)
- {
- return (meine_datei);
- }
- }
- else
- {
- meine_datei->puffer_voelle = 0;
- return (meine_datei);
- }
- Close (mein_bptr);
- }
- }
- FreeMem (mein_puffer, PUFFER_GROESSE);
- }
- FreeMem (meine_datei, sizeof (struct datei));
- }
- return (NULL);
- }
-
- /* -------------------------------------------------------------------------------------- */
-
- /* hole_zeichen
- Holt aus der Datei, welche in "*meine_datei" uebergeben wird die
- gewⁿnschte Anzahl von Byte und kopiert diese in den "puffer". Benutzer mu▀
- selbst dafⁿr sorgen da▀ der Puffer ausreichend gro▀ ist.
- Als Rⁿckgabe gibts die Anzahl der gelesenen Byte oder einen Fehlercode:
-
- LESE_FEHLER : Datei konnte gelesen werden. Pufferung
- defekt. Datei schlie▀en und neu ÷ffnen.
- FALSCHER_MODUS : Datei ist mit Modus "MODE_NEWFILE" ge-
- ÷ffnet und kann nicht gelesen werden.
- */
-
- LONG hole_zeichen (struct datei *meine_datei, char *puffer, ULONG anzahl)
- {
- LONG zaehler = 0;
- BOOL ergebnis;
-
- if (meine_datei->modus == MODE_OLDFILE)
- {
- if (meine_datei->akt_position > (meine_datei->puffer_groesse - 1))
- {
- ergebnis = lese_puffer (meine_datei);
- if (ergebnis == FALSE)
- {
- return (LESE_FEHLER);
- }
- }
- if (meine_datei->akt_position > (LONG) (meine_datei->puffer_voelle - 1))
- {
- return (0L);
- }
- while (anzahl > 0)
- {
- if (meine_datei->akt_position + anzahl > meine_datei->puffer_voelle)
- {
- memcpy (puffer + zaehler, meine_datei->puffer_zeiger + meine_datei->akt_position,
- meine_datei->puffer_voelle - meine_datei->akt_position);
- zaehler += meine_datei->puffer_voelle - meine_datei->akt_position;
- anzahl -= meine_datei->puffer_voelle - meine_datei->akt_position;
- ergebnis = lese_puffer (meine_datei);
- if (ergebnis == FALSE)
- {
- return (LESE_FEHLER);
- }
- if (meine_datei->puffer_voelle == 0)
- {
- return (zaehler);
- }
- }
- else
- {
- memcpy (puffer + zaehler, meine_datei->puffer_zeiger + meine_datei->akt_position, anzahl);
- meine_datei->akt_position += anzahl;
- zaehler += anzahl;
- return (zaehler);
- }
- }
- }
- else
- {
- return (FALSCHER_MODUS);
- }
- }
-
- /* -------------------------------------------------------------------------------------- */
-
- /* schliesse_datei
- Schlie▀ die Datei (und schreibt vorher beim Schreibmodus den Puffer in
- die Datei) und gibt allen allozierten Speicher wieder frei. Diese Routine
- liefert einen der definierten Fehlercodes zurⁿck. Beim Fehler "NICHT_SCHLIESSBAR"
- werden die Strukturen und der Puffer _*NICHT*_ freigegeben und einen
- erneuten Schliessversuch m÷glich zu machen.
-
- NICHT_SCHLIESSBAR : Datei kann nicht geschlossen werden. Keine
- ─nderung durchgefⁿhrt.
- KEIN_FEHLER : Datei dicht und Puffer entfernt.
- MEDIUM_VOLL : Medium ist voll oder Puffer konnte aus anderen
- Grⁿnden nicht geschrieben werden.
- */
-
- LONG schliesse_datei (struct datei *meine_datei)
- {
- BOOL ergebnis;
-
- if (meine_datei->modus == MODE_OLDFILE)
- {
- ergebnis = Close (meine_datei->datei_zeiger);
- if (ergebnis == FALSE)
- {
- return (NICHT_SCHLIESSBAR);
- }
- FreeMem (meine_datei->puffer_zeiger, PUFFER_GROESSE);
- FreeMem (meine_datei, sizeof (struct datei));
- return (KEIN_FEHLER);
- }
- else
- {
- ergebnis = schreibe_puffer (meine_datei);
- if (ergebnis == FALSE)
- {
- return (MEDIUM_VOLL);
- }
- ergebnis = Close (meine_datei->datei_zeiger);
- if (ergebnis == FALSE)
- {
- return (NICHT_SCHLIESSBAR);
- }
- FreeMem (meine_datei->puffer_zeiger, PUFFER_GROESSE);
- FreeMem (meine_datei, sizeof (struct datei));
- return (KEIN_FEHLER);
- }
- }
-
- /* -------------------------------------------------------------------------------------- */
-
- /* schreibe_zeichen
- Schreibt die gewⁿnschte Anzahl von Byte in die Datei die mit "*meine_datei"
- ⁿbergeben wird. Rⁿckgabe ist ein Fehlercode:
-
- SCHREIB_FEHLER : Datei konnte nicht geschrieben werden. Datei und
- Pufferung defekt. Bitte schlie▀en und l÷schen.
- FALSCHER_MODUS : Datei ist mit Modus "MODE_OLDFILE" ge÷ffnet worden.
- Es wurde keine ─nderung vorgenommen.
- KEIN_FEHLER : "anzahl" wurde zumindest in den Puffer korrekt ge-
- schrieben.
- */
-
- LONG schreibe_zeichen (struct datei *meine_datei, char *puffer, ULONG anzahl)
- {
- LONG zaehler = 0;
- BOOL ergebnis;
-
- if (meine_datei->modus == MODE_NEWFILE)
- {
- if (meine_datei->akt_position > (meine_datei->puffer_groesse - 1))
- {
- ergebnis = schreibe_puffer (meine_datei);
- if (ergebnis == FALSE)
- {
- return (SCHREIB_FEHLER);
- }
- }
- while (anzahl > 0)
- {
- if (meine_datei->akt_position + anzahl > meine_datei->puffer_groesse)
- {
- memcpy (meine_datei->puffer_zeiger + meine_datei->akt_position, puffer + zaehler,
- meine_datei->puffer_groesse - meine_datei->akt_position);
-
- zaehler += meine_datei->puffer_groesse - meine_datei->akt_position;
- anzahl -= meine_datei->puffer_groesse - meine_datei->akt_position;
-
- meine_datei->akt_position += meine_datei->puffer_groesse - meine_datei->akt_position;
-
- ergebnis = schreibe_puffer (meine_datei);
- if (ergebnis == FALSE)
- {
- return (SCHREIB_FEHLER);
- }
- }
- else
- {
- memcpy (meine_datei->puffer_zeiger + meine_datei->akt_position,
- puffer + zaehler, anzahl);
- meine_datei->akt_position += anzahl;
-
- return (KEIN_FEHLER);
- }
- }
- }
- else
- {
- return (FALSCHER_MODUS);
- }
- }
-
- /* -------------------------------------------------------------------------------------- */
-
- /* hole_byte
- Holt ein einzelnes Zeichen aus der angegebenen Datei. Rⁿckgabe ist das
- Zeichen oder ein Fehlercode:
-
- FALSCHER_MODUS : Datei ist zum Schreiben und nicht zum
- Lesen er÷ffnet.
- DATEI_ENDE : Das Ende der Datei ist erreicht.
- LESE_FEHLER : Datei konnte aus irgendeinem Grund nicht
- gelesen werden. Datei bitte schlie▀en und
- neu ÷ffnen.
- */
-
- WORD hole_byte (struct datei *meine_datei)
- {
- WORD zeichen;
- BOOL ergebnis;
-
- if (meine_datei->modus == MODE_OLDFILE)
- {
- if (meine_datei->akt_position > (meine_datei->puffer_groesse - 1))
- {
- ergebnis = lese_puffer (meine_datei);
- if (ergebnis == FALSE)
- {
- return (LESE_FEHLER);
- }
- }
- if (meine_datei->akt_position > (LONG) (meine_datei->puffer_voelle - 1))
- {
- return (DATEI_ENDE);
- }
- zeichen = (WORD) *(meine_datei->puffer_zeiger + meine_datei->akt_position);
-
- meine_datei->akt_position++;
- return (zeichen);
- }
- else
- {
- return (FALSCHER_MODUS);
- }
- }
-
- /* -------------------------------------------------------------------------------------- */
-
- /* schreibe_byte
- Schreibt ein einzelnes Zeichen in die angegebene Datei. Liefert einen
- Fehlercode zurⁿck:
-
- FALSCHER_MODUS : Datei wurde zum Lesen, nicht zum Schreiben ge-
- ÷ffnet.
- SCHREIB_FEHLER : Datei konnte nicht geschrieben werden, evtl.
- Medium voll.
- KEIN_FEHLER : Zeichen konnte in den Puffer geschrieben werden.
- */
-
- LONG schreibe_byte (struct datei *meine_datei, UBYTE zeichen)
- {
- BOOL ergebnis;
-
- if (meine_datei->modus == MODE_NEWFILE)
- {
- if (meine_datei->akt_position > (meine_datei->puffer_groesse - 1))
- {
- ergebnis = schreibe_puffer (meine_datei);
- if (ergebnis == FALSE)
- {
- return (SCHREIB_FEHLER);
- }
- }
- *(meine_datei->puffer_zeiger + meine_datei->akt_position) = zeichen;
-
- meine_datei->akt_position++;
- return (KEIN_FEHLER);
- }
- return (FALSCHER_MODUS);
- }
-
- /* -------------------------------------------------------------------------------------- */
-