home *** CD-ROM | disk | FTP | other *** search
- /* inspglin.c
- Dieses File enthält alle Funktionen um mit Programmzeilen einzu-
- fügen und wieder zu löschen.
- (c) 1990 Michael Beising & TOOLBOX
- */
-
- #include <stdio.h>
- #include <stdlib.h>
- #include <interp.h>
-
- /* lokale Funktionsprototypen */
-
- /* Benötigte Globalvariable */
- extern PRGZEILE *FirstLine; /* erste Interpreterzeile */
- extern PRGZEILE *LastLine; /* letzte Interpreterzeile */
- extern PRGZEILE *ActLine; /* aktuelle interpretierte Zeile */
- extern char *LinePos; /* Zeilenposition der aktuellen Zeile*/
-
- /* InsIntLine: Programmzeile in Programmtext einfügen
- */
-
- void
- InsIntLine ()
- {
- PRGZEILE *NewLine;
- PRGZEILE *InsZeile;
-
- /* Speicherplatz für neue Zeile reservieren */
- NewLine = (PRGZEILE *)malloc (sizeof(PRGZEILE));
- if (NewLine == NULL) {
- printf ("\n### Kein Speicherplatz mehr vorhanden! ");
- return;
- }
-
- /* Handelt es sich um die erste Zeile, dann füge direkt ein. */
- if (!FirstLine) {
- FirstLine = NewLine;
- NewLine->LineNumber = ActLine->LineNumber;
- strcpy (NewLine->Zeile,ActLine->Zeile);
- NewLine->NextZeile = NULL;
- NewLine->PrevZeile = NULL;
- return;
- }
-
- if (FindInsPos(ActLine->LineNumber,&InsZeile)) {
- /* Kopiere den neuen Inhalt über die alte Zeile */
- strcpy (InsZeile->Zeile,ActLine->Zeile);
- free (NewLine); /* Speicher nicht benötigt */
- }
- else {
- /* Neue Zeile in Gefüge einhängen. */
- NewLine->LineNumber = ActLine->LineNumber;
- strcpy (NewLine->Zeile,ActLine->Zeile);
- /* Es gibt noch keine Zeile => erste Zeile */
- if ((InsZeile == FirstLine) &&
- (InsZeile->LineNumber < NewLine->LineNumber)) {
- NewLine->NextZeile = NULL;
- NewLine->PrevZeile = InsZeile;
- InsZeile->NextZeile = NewLine;
- return;
- }
-
- if (InsZeile->NextZeile) { /* Zeile richtig einfügen */
- NewLine->NextZeile = InsZeile;
- NewLine->PrevZeile = InsZeile->PrevZeile;
-
- if (InsZeile->PrevZeile)
- InsZeile->PrevZeile->NextZeile = NewLine;
- else
- FirstLine = NewLine;
- InsZeile->PrevZeile = NewLine;
- }
- else { /* Zeile am Ende einfügen */
- NewLine->NextZeile = NULL;
- NewLine->PrevZeile = InsZeile;
- InsZeile->NextZeile = NewLine;
- }
- }
- }
-
- /*FindInsPos: wenn es die Zeile schon gibt,
- gibt "FindInsPos" als Ergebnis TRUE zurück, ansonsten FALSE
- */
-
- int
- FindInsPos (LineNumber,InsPos)
- int LineNumber;
- PRGZEILE **InsPos;
- {
- PRGZEILE *FindZeile,*LastLine;
-
- FindZeile = FirstLine;
-
- while ((FindZeile != NULL) &&
- (FindZeile->LineNumber < LineNumber)) {
- LastLine = FindZeile;
- FindZeile = FindZeile->NextZeile;
- }
- if (!FindZeile)
- FindZeile = LastLine;
-
- if (FindZeile->LineNumber == LineNumber) {
- *InsPos = FindZeile;
- return (TRUE);
- }
- else {
- *InsPos = FindZeile;
- return (FALSE);
- }
- }
-
-
- /* DelLine
- Löscht die Zeile mit der angegebenen Zeilennummer, wenn sie vor-
- handen ist.
- */
-
- int
- DelLine (LineNumber)
- int LineNumber ;
- {
- PRGZEILE *InsPos;
-
- /* Wenn die Zeile vorhanden ist, muß sie ausgehängt werden. */
- if (FindInsPos (LineNumber,&InsPos)) {
- if ((InsPos->NextZeile == NULL) &&
- (InsPos->PrevZeile == NULL))
- FirstLine = NULL;
- else
- if (InsPos == FirstLine) {
- FirstLine = InsPos->NextZeile;
- InsPos->NextZeile->PrevZeile = NULL;
- }
- else {
- if (InsPos->NextZeile == NULL)
- InsPos->PrevZeile->NextZeile = NULL;
- else {
- InsPos->PrevZeile->NextZeile = InsPos->NextZeile;
- InsPos->NextZeile->PrevZeile = InsPos->PrevZeile;
- }
- }
- free (InsPos); /* Speicherplatz wieder freigeben. */
- return (TRUE); /* Zeile konnte gelöscht werden. */
- }
- else
- return (FALSE); /* Zeile konnte nicht gelöscht werden. */
- }
-
- /* Ende des Files INSPGLIN.C */
-