home *** CD-ROM | disk | FTP | other *** search
- /* textbuf.c
- Routinen zum Einlesen eines Interpreterprogramms
- (c) 1990 Michael Beising & TOOLBOX
- */
-
- #include <stdio.h>
- #include <stdlib.h>
- #include "interp.h"
-
- /* lokale Funktionen */
- static int ReadFileLine (FILE *FilePointer,char *BufPointer);
-
-
- /* Benötigte Globalvariablen */
- extern PRGZEILE *FirstLine; /* erste Interpreterzeile */
- extern PRGZEILE *ActLine; /* aktuelle interpretierte Zeile */
- extern char *LinePos; /* Zeilenposition der aktuellen Zeile*/
- extern int Steuer; /* der aufrufenden Routine wird mit- */
- /* geteilt, um was es sich handelt */
- extern char ScanBuffer[ZEILENLAENGE]; /* Ergebnisbuffer des Scanners */
-
-
- /* ReadProg: liest ein Interpreterprogramm in die interne Struktur ein
- */
-
- int
- ReadProg ()
- {
- PRGZEILE NewLine; /* interaktiv eingegebene Zeile */
- FILE *FilePointer;
- char ReadBuffer[255];
- char *FName;
-
- if ((FName = GetFileName()) != NULL) {
- if ((FilePointer = fopen (FName,"r")) == NULL) {
- fatal_error (" Datei konnte nicht geöffnet werden! ");
- return (ERROR);
- }
- }
- else {
- fatal_error (" Ungültiger Dateiname! ");
- return (ERROR);
- }
-
- ClearProg (); /* Programmspeicherplatz freigeben */
-
- printf ("\n Die Datei <%s> wird geladen ...",FName);
- /* solange das File nicht zu Ende ist, ... */
- while (ReadFileLine (FilePointer,ReadBuffer)) {
- if (strlen (ReadBuffer) > 3) { /* leere Zeile überlesen */
- LinePos = ReadBuffer;
- SkipChar ();
- Scan (); /* Zeile untersuchen */
-
- if (Steuer == ZIFFER) { /* Zeilennummer vorhanden */
- NewLine.LineNumber = atoi (ScanBuffer);
- ActLine = 
 /* Setze aktuelle zu bearb. Zeile */
- if (MakeToken () == OK) /* erzeuge eine Tokenzeile */
- InsIntLine (); /* Programmzeile in Programmtext einfügen */
- else {
- printf ("\n## Ungültiger Befehl <%s> in Zeile <%d> gefunden! ",
- ScanBuffer,NewLine.LineNumber);
- return (ERROR);
- }
- }
- else {
- fatal_error ("Fehler beim Einlesen der Datei! ");
- return (FALSE);
- }
- }
- }
- fclose (FilePointer);
- return (OK);
- }
-
- /* ReadFileLine
- Liest eine ASCII-Zeile in den Zwischenspeicher ein
- */
-
-
- int
- ReadFileLine (FilePointer,BufPointer)
- FILE *FilePointer;
- char BufPointer[];
- {
- char zeichen;
- char *ReadPointer;
-
- ReadPointer = BufPointer;
-
- do {
- zeichen = *ReadPointer++ = fgetc (FilePointer);
- } while ((zeichen != LF)&&(zeichen != CR) && (zeichen != EOF));
-
- *(--ReadPointer) = '\0'; /* Zeilenende markieren */
-
- if ((zeichen == EOF) && (ReadPointer == BufPointer))
- return (FALSE);
- else
- return (TRUE);
- }
-
- /* WriteProg
- Interpreterprogramm abspeichern
- */
- extern TOKBEF TokBefDesc[];
-
- int
- WriteProg ()
- {
- PRGZEILE *FindZeile;
- FILE *FilePointer;
- char WriteBuffer[255];
- char *FName;
- char *Line;
-
- if ((FName = GetFileName()) != NULL) {
- if ((FilePointer = fopen (FName,"w+")) == NULL) {
- fatal_error (" Datei konnte nicht geöffnet werden! ");
- return (ERROR);
- }
- }
- else {
- fatal_error (" Ungültiger Dateiname! ");
- return (ERROR);
- }
-
-
- if ((FindZeile = FirstLine) != NULL) {
- while ( FindZeile) {
- Line = FindZeile->Zeile;
- if (*Line) { /* Ist die Programmzeile leer? */
- sprintf (WriteBuffer,"\n%03d %s ",
- FindZeile->LineNumber,
- TokBefDesc[(*Line-TOKMIN)&0xff].Befehl
- );
- fprintf (FilePointer,"%s",WriteBuffer);
- Line++;
- if (*Line) {
- sprintf (WriteBuffer,"%s",Line);
- fprintf (FilePointer,"%s",WriteBuffer);
- }
- }
- FindZeile = FindZeile->NextZeile;
- }
- }
- fclose(FilePointer);
- return (OK);
- }
-
-
- /* Handhabung des Filenamens */
- extern char FileName[FNAMLEN];
-
- void
- SetFileName (FName)
- char *FName;
- {
- strcpy (FileName,FName);
- }
-
- char *
- GetFileName ()
- {
- return (FileName);
- }
-
- /* Ende des Files TEXTBUF.C */
-