home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1991 / 04 / txl / 3_preis / fast / textbuf.c < prev    next >
Text File  |  1990-11-16  |  4KB  |  169 lines

  1. /* textbuf.c
  2. Routinen zum Einlesen eines Interpreterprogramms
  3. (c) 1990 Michael Beising & TOOLBOX
  4. */
  5. #include <string.h>
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include "interp.h"
  9.  
  10. /* lokale Funktionen */
  11. static int ReadFileLine (FILE *FilePointer,char *BufPointer);
  12.  
  13.  
  14. /* Benötigte Globalvariablen */
  15. extern    PRGZEILE    *FirstLine;        /* erste Interpreterzeile */
  16. extern    PRGZEILE    *ActLine;        /* aktuelle interpretierte Zeile */
  17. extern    char        *LinePos;        /* Zeilenposition der aktuellen Zeile*/
  18. extern    int        Steuer;                /* der aufrufenden Routine wird mit-    */
  19.                                     /* geteilt, um was es sich handelt         */
  20. extern    char    ScanBuffer[ZEILENLAENGE]; /* Ergebnisbuffer des Scanners */
  21.  
  22.  
  23. /* ReadProg: liest ein Interpreterprogramm in die interne Struktur ein
  24. */
  25.  
  26. int    
  27. ReadProg ()
  28. {
  29. PRGZEILE    NewLine;        /* interaktiv eingegebene Zeile */
  30. FILE    *FilePointer;
  31. char    ReadBuffer[255];
  32. char    *FName;
  33.  
  34.     if ((FName = GetFileName()) != NULL) {
  35.       if ((FilePointer = fopen (FName,"r")) == NULL) {
  36.         fatal_error (" Datei konnte nicht geöffnet werden! ");
  37.         return (ERROR);
  38.       }
  39.     }
  40.     else {
  41.       fatal_error (" Ungültiger Dateiname! ");
  42.       return (ERROR);
  43.     }
  44.  
  45.     ClearProg ();            /* Programmspeicherplatz freigeben */
  46.     
  47.     printf ("\n Die Datei <%s> wird geladen ...",FName);
  48.         /* solange das File nicht zu Ende ist, ... */
  49.     while (ReadFileLine (FilePointer,ReadBuffer)) {
  50.       if (strlen (ReadBuffer) > 3) {    /* leere Zeile überlesen */
  51.         LinePos    = ReadBuffer;
  52.         SkipChar ();
  53.         Scan ();                        /* Zeile untersuchen */
  54.  
  55.         if (Steuer == ZIFFER) {     /* Zeilennummer vorhanden */
  56.           NewLine.LineNumber = atoi (ScanBuffer);
  57.           ActLine =          /* Setze aktuelle zu bearb. Zeile */    
  58.           if (MakeToken () == OK)    /* erzeuge eine Tokenzeile */
  59.             InsIntLine ();            /* Programmzeile in Programmtext einfügen */
  60.           else {
  61.             printf ("\n## Ungültiger Befehl <%s> in Zeile <%d> gefunden! ",
  62.                      ScanBuffer,NewLine.LineNumber);
  63.             return (ERROR);
  64.           }
  65.         }
  66.         else {
  67.           fatal_error ("Fehler beim Einlesen der Datei! ");
  68.           return (FALSE);
  69.         }
  70.       }
  71.     }
  72. fclose (FilePointer);
  73. return (OK);
  74. }
  75.  
  76. /*    ReadFileLine
  77.     Liest eine ASCII-Zeile in den Zwischenspeicher ein
  78. */
  79.  
  80.  
  81. int
  82. ReadFileLine (FilePointer,BufPointer)
  83. FILE    *FilePointer;
  84. char    BufPointer[];
  85. {
  86. char    zeichen;
  87. char    *ReadPointer;
  88.  
  89.     ReadPointer = BufPointer;
  90.  
  91.      do {
  92.         zeichen = *ReadPointer++ = fgetc (FilePointer);
  93.     }     while ((zeichen != LF)&&(zeichen != CR) && (zeichen != EOF));
  94.  
  95.     *(--ReadPointer) = '\0';     /* Zeilenende markieren */
  96.     
  97.     if ((zeichen == EOF) && (ReadPointer == BufPointer))
  98.       return (FALSE);
  99.     else
  100.       return (TRUE);
  101. }
  102.  
  103. /*    WriteProg
  104.     Interpreterprogramm abspeichern
  105. */
  106. extern    TOKBEF    TokBefDesc[];
  107.  
  108. int
  109. WriteProg ()
  110. {
  111. PRGZEILE    *FindZeile;    
  112. FILE    *FilePointer;
  113. char    WriteBuffer[255];
  114. char    *FName;
  115. char    *Line;
  116.  
  117.     if ((FName = GetFileName()) != NULL) {
  118.       if ((FilePointer = fopen (FName,"w+")) == NULL) {
  119.         fatal_error (" Datei konnte nicht geöffnet werden! ");
  120.         return (ERROR);
  121.       }
  122.     }
  123.     else {
  124.       fatal_error (" Ungültiger Dateiname! ");
  125.       return (ERROR);
  126.     }
  127.  
  128.  
  129.     if ((FindZeile = FirstLine) != NULL) {
  130.         while ( FindZeile) {
  131.             Line = FindZeile->Zeile;
  132.             if (*Line) {            /* Ist die Programmzeile leer? */
  133.               sprintf (WriteBuffer,"\n%03d %s ",
  134.                          FindZeile->LineNumber,
  135.                          TokBefDesc[(*Line-TOKMIN)&0xff].Befehl
  136.                          );
  137.                fprintf (FilePointer,"%s",WriteBuffer);
  138.                Line++;
  139.                if (*Line) {
  140.                  sprintf (WriteBuffer,"%s",Line);
  141.                  fprintf (FilePointer,"%s",WriteBuffer);
  142.                }
  143.             }        
  144.               FindZeile = FindZeile->NextZeile;
  145.         }
  146.     }
  147. fclose(FilePointer);
  148. return (OK);
  149. }
  150.  
  151.  
  152. /* Handhabung des Filenamens */
  153. extern    char    FileName[FNAMLEN];
  154.  
  155. void
  156. SetFileName (FName)
  157. char    *FName;
  158. {
  159.  strcpy (FileName,FName);
  160. }
  161.  
  162. char    *
  163. GetFileName ()
  164. {
  165.  return (FileName);
  166. }
  167.  
  168. /* Ende des Files TEXTBUF.C */
  169.