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

  1. /*    inspglin.c
  2. Dieses File enthält alle Funktionen um mit Programmzeilen einzu-
  3. fügen und wieder zu löschen.
  4. (c) 1990 Michael Beising & TOOLBOX
  5. */
  6.  
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <string.h>
  10. #include "interp.h"
  11.  
  12. /* lokale Funktionsprototypen */
  13.  
  14. /* Benötigte Globalvariable */
  15. extern    PRGZEILE    *FirstLine;        /* erste Interpreterzeile */
  16. extern    PRGZEILE    *LastLine;        /* letzte Interpreterzeile */
  17. extern    PRGZEILE    *ActLine;        /* aktuelle interpretierte Zeile */
  18. extern    char        *LinePos;        /* Zeilenposition der aktuellen Zeile*/
  19.  
  20. /* InsIntLine: Programmzeile in Programmtext einfügen
  21. */
  22.  
  23. void
  24. InsIntLine ()    
  25. {
  26. PRGZEILE    *NewLine;
  27. PRGZEILE    *InsZeile;
  28.  
  29.     /* Speicherplatz für neue Zeile reservieren */
  30.     NewLine = (PRGZEILE *)malloc (sizeof(PRGZEILE));
  31.     if (NewLine == NULL) {
  32.       printf ("\n### Kein Speicherplatz mehr vorhanden! ");
  33.       return;
  34.     }
  35.  
  36.     /* Handelt es sich um die erste Zeile, dann füge direkt ein. */
  37.     if (!FirstLine) {
  38.       FirstLine = NewLine;
  39.       NewLine->LineNumber = ActLine->LineNumber;
  40.       strcpy (NewLine->Zeile,ActLine->Zeile);
  41.       NewLine->NextZeile = NULL;
  42.       NewLine->PrevZeile = NULL;
  43.       return;
  44.     }
  45.     
  46.     if (FindInsPos(ActLine->LineNumber,&InsZeile)) {
  47.         /* Kopiere den neuen Inhalt über die alte Zeile */
  48.         strcpy (InsZeile->Zeile,ActLine->Zeile);
  49.         free (NewLine);                    /* Speicher nicht benötigt */
  50.     }
  51.     else {
  52.           /* Neue Zeile in Gefüge einhängen. */
  53.         NewLine->LineNumber = ActLine->LineNumber;
  54.         strcpy (NewLine->Zeile,ActLine->Zeile);
  55.             /* Es gibt noch keine Zeile => erste Zeile */
  56.         if ((InsZeile == FirstLine) &&
  57.             (InsZeile->LineNumber < NewLine->LineNumber)) {
  58.           NewLine->NextZeile = NULL;
  59.           NewLine->PrevZeile = InsZeile;
  60.           InsZeile->NextZeile = NewLine;
  61.           return;        
  62.         }
  63.         
  64.         if (InsZeile->NextZeile) { /* Zeile richtig einfügen */
  65.           NewLine->NextZeile  = InsZeile;        
  66.           NewLine->PrevZeile  = InsZeile->PrevZeile;
  67.         
  68.           if (InsZeile->PrevZeile)
  69.             InsZeile->PrevZeile->NextZeile = NewLine;
  70.           else
  71.             FirstLine = NewLine;
  72.           InsZeile->PrevZeile = NewLine;
  73.         }
  74.         else {    /* Zeile am Ende einfügen */
  75.           NewLine->NextZeile = NULL;
  76.           NewLine->PrevZeile = InsZeile;
  77.           InsZeile->NextZeile = NewLine;
  78.         }
  79.     }
  80. }
  81.  
  82. /*FindInsPos: wenn es die Zeile schon gibt,
  83. gibt "FindInsPos" als Ergebnis TRUE zurück, ansonsten FALSE
  84. */
  85.  
  86. int
  87. FindInsPos (LineNumber,InsPos)
  88. int        LineNumber;
  89. PRGZEILE    **InsPos;
  90. {
  91. PRGZEILE    *FindZeile,*LastLine;
  92.  
  93.     FindZeile = FirstLine;
  94.  
  95.     while ((FindZeile != NULL) &&
  96.            (FindZeile->LineNumber < LineNumber)) {
  97.       LastLine = FindZeile;
  98.       FindZeile = FindZeile->NextZeile;
  99.     }
  100.     if (!FindZeile)
  101.       FindZeile = LastLine;
  102.  
  103.     if (FindZeile->LineNumber == LineNumber) {
  104.       *InsPos = FindZeile;
  105.       return (TRUE);
  106.     }
  107.     else {
  108.       *InsPos =  FindZeile;
  109.       return (FALSE);
  110.     }
  111. }
  112.  
  113.  
  114. /*    DelLine
  115.     Löscht die Zeile mit der angegebenen Zeilennummer, wenn sie vor-
  116.     handen ist.
  117. */
  118.  
  119. int
  120. DelLine (LineNumber)
  121. int        LineNumber ;
  122. {
  123. PRGZEILE    *InsPos;
  124.  
  125.       /* Wenn die Zeile vorhanden ist, muß sie ausgehängt werden. */
  126.     if (FindInsPos (LineNumber,&InsPos)) {
  127.       if ((InsPos->NextZeile == NULL) &&
  128.           (InsPos->PrevZeile == NULL))
  129.         FirstLine = NULL;
  130.       else
  131.         if (InsPos == FirstLine) {
  132.             FirstLine = InsPos->NextZeile;
  133.             InsPos->NextZeile->PrevZeile = NULL;
  134.         }
  135.         else {
  136.           if (InsPos->NextZeile == NULL)
  137.             InsPos->PrevZeile->NextZeile = NULL;
  138.           else {
  139.               InsPos->PrevZeile->NextZeile = InsPos->NextZeile;
  140.               InsPos->NextZeile->PrevZeile = InsPos->PrevZeile;
  141.           }
  142.         }
  143.       free (InsPos);        /* Speicherplatz wieder freigeben.        */
  144.       return (TRUE);        /* Zeile konnte gelöscht werden.        */
  145.     }
  146.     else
  147.       return (FALSE);        /* Zeile konnte nicht gelöscht werden.    */    
  148. }
  149.  
  150. /* Ende des Files INSPGLIN.C */
  151.