home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / spezial / 20 / st_txl / textbuf.c < prev    next >
Encoding:
C/C++ Source or Header  |  1985-07-18  |  3.8 KB  |  170 lines

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