home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Turbo Toolbox
/
Turbo_Toolbox.iso
/
1991
/
04
/
txl
/
3_preis
/
fast
/
textbuf.c
< prev
next >
Wrap
Text File
|
1990-11-16
|
4KB
|
169 lines
/* textbuf.c
Routinen zum Einlesen eines Interpreterprogramms
(c) 1990 Michael Beising & TOOLBOX
*/
#include <string.h>
#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 */