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