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