/****************************************************************
*																																*
*	 Filename : ListL2.c																					*
*																																*
*****************************************************************
*																																*
*		Comment : Alle Funktionen für die Listenverwaltung der			*
*							Plotlibrary. Es werden hier keine Fehler gesetzt,	*
*							denn es wird der einfachheit halber immer ein			*
*							Pointer zurückgegeben. Dieser kann NULL sein.			*
*																																*
*			                    Funktionen														*
*	                        ==========														*
*																																*
*				addlist()					fügt eine Kurvenstruktur in die Liste	*
*				dellist()					löscht Kurve aus der Liste						*
*				sortlist()				sortiert die Liste nach zmin					*
*				slistid()					sucht eine bestimmte Kurve nach id		*
*				slistname()				sucht eine bestimmte Kurve nach name	*
*																																*
*				Rev : V1.0																							*
*																																*
*		History : V1.0 erstellen dieses Files							15/11/89	*
*																																*
*				Doc : Plotlibrary User's Guide													*
*																																*
*			 Bugs : keine bekannten																		*
*																																*
*			Autor : Oesch Silvano																			*
*																																*
*			Datum : 10/12/89																					*
*																																*
****************************************************************/

/****************************************************************
*																																*
*	Plotlibrary Includedateien																		*
*																																*
****************************************************************/

#include "Plot.h"										/* all. Includes einlesen		*/
#include "ListL2.h"									/* und die eigene						*/

/****************************************************************
*																																*
*	externe Variablen																							*
*																																*
****************************************************************/

extern struct Plot *plot;						/* Plotpointer							*/
extern int plerr;										/* Fehlervariable						*/

/****************************************************************
*																																*
*	Function : addlist()																					*
*																																*
*****************************************************************
*																																*
*		 Input : curve																							*
*							struct Curve *curve																*
*																																*
*		Output : void																								*
*																																*
*****************************************************************
*																																*
*	 Comment : fügt eine Kurvenstruktur an die bestehende Liste		*
*						 an. Die Kurvenid wird in die Kurvenstruktur				*
*						 eingetragen.																				*
*																																*
****************************************************************/

void addlist(curve)
struct Curve *curve;
{
struct Curve *temp;									/* temp. Kurvenzeiger				*/

	if (plot->last == NULL)						/* keine Kurve vorhanden ?	*/
		plot->first = curve;						/* also erste								*/
	else															/* sonst an das ende der		*/
	{																	/* Liste addieren						*/
		temp = plot->last;							/* hole letzte Kurve				*/
		temp->next = curve;							/* neue als next eintragen	*/
	}
	plot->last = curve;								/* und last updaten					*/
	plot->count++;										/* erhöhe plotcounter				*/
	curve->id = ++plot->currid;				/* id eintragen							*/
}

/****************************************************************
*																																*
*	Function : dellist()																					*
*																																*
*****************************************************************
*																																*
*		 Input : curve																							*
*							struct Curve *curve																*
*																																*
*		Output : void																								*
*																																*
*****************************************************************
*																																*
*	 Comment : löscht eine Kurve aus der Liste und korrigiert die	*
*						 Pointer. ACHTUNG : Es muss sichergestellt sein,		*
*						 dass die curve in der Liste enthalten ist. Dafür		*
*						 kann slistid() oder slistname() verwendet werden.	*
*																																*
*						 Die Liste ist so aufgebaut:												*
*																																*
*								plot->first zeigt auf erste Kurve, wenn keine		*
*														Daten geladen ist dieser Zeiger			*
*														NULL.																*
*																																*
*								plot->last	zeigt auf letzte Kurve, wenn keine	*
*														Daten geladen ist dieser Zeiger			*
*														NULL.																*
*																																*
*								curve->next	zeigt auf die nächste Kurve, wenn		*
*														letzte Kurve (plot->last) Zeiger		*
*														ist NULL.														*
*																																*
****************************************************************/

void dellist(curve)
struct Curve *curve;
{
	struct Curve *prev = NULL,				/* prev auf null setzten		*/
							 *temp = plot->first;	/* temp auf first setzten		*/

	while (temp != curve)							/* suche bis gefunden				*/
	{
		prev = temp;										/* auf nächstes Element			*/
		temp = temp->next;							/* stellen									*/
	}

	if (prev == NULL)									/* kein Vorgänger ?					*/
		plot->first = temp->next;				/* dann ist es die erste		*/
																		/* Kurve in der Liste				*/
	else															/* und sonst irgendwo da-		*/
		prev->next = temp->next;				/* zwischen, auch das				*/
																		/* Element wird gesetzt			*/
	if (plot->last == temp)						/* korrigiere wenn nötig		*/
		plot->last = prev;							/* plot->last								*/
	plot->count--;										/* eine Kurve weniger				*/
}

/****************************************************************
*																																*
*	Function : sortlist()																					*
*																																*
*****************************************************************
*																																*
*		 Input : curve																							*
*							struct Curve *curve																*
*																																*
*		Output : void																								*
*																																*
*****************************************************************
*																																*
*	 Comment : SortList() sortiert alle Kurven nach ihren zmin		*
*						 Werten. Diese Funktion wird für die Niveau-				*
*						 darstellung benötigt. Es wird ein linearer					*
*						 Sortieralgorythmus verwendet.											*
*																																*
****************************************************************/

void sortlist()
{
	int i;
	struct Curve	**prev,							/* Adr. des Kurvenzeigers		*/
								*curve,							/* Kurvenzeiger							*/
								*next;							/* nächste Kurve						*/

	for (i=0;i<plot->count;i++)				/* für alle Kurven					*/
	{
		prev = &plot->first;						/* Pointerinit.							*/
		curve = plot->first;
		next = curve->next;
		while((curve) and (next))				/* solange Daten vorhanden	*/
		{
			if (curve->zmin > next->zmin)	/* muss sortiert werden			*/
			{															/* Ja												*/
				*prev = next;								/* Austausch mit diesem			*/
				curve->next = next->next;		/* Element									*/
				next->next = curve;
				prev = &next->next;
				next = curve->next;
			}
			else													/* Nein, keine Sortierung		*/
			{
				prev = &curve->next;				/* also nächstes Element		*/
				curve = next;								/* nehmen										*/
				next = curve->next;
			}
		}
	}
}

/****************************************************************
*																																*
*	Function : slistid()																					*
*																																*
*****************************************************************
*																																*
*		 Input : id																									*
*							int id							id der gesuchten Kurve				*
*																																*
*		Output : struct Curve *curve																*
*							curve != NULL				Kurve gefunden								*
*							curve == NULL				keine Kurve gefunden					*
*																																*
*****************************************************************
*																																*
*	 Comment : Durchsucht die	Kurvenliste nach der entsprechenden	*
*						 Nummer. Der Rückgabewert ist der Kurvenzeiger			*
*						 oder ein NULL-Pointer.															*
*																																*
****************************************************************/

struct Curve *slistid(id)
int id;
{
	struct Curve *temp = plot->first;	/* temp auf first setzten		*/

	while ((id != temp->id) and 			/* suche bis gefunden oder	*/
				(temp != NULL))							/* bis ende der Liste				*/
		temp = temp->next;							/* nicht gefunden nächste		*/
																		/* Kurve										*/
	if (temp == NULL)									/* setzte Fehler falls			*/
		seterror(NOTFOUND);							/* nicht gefunden						*/
	return (temp);
}

/****************************************************************
*																																*
*	Function : slistname()																				*
*																																*
*****************************************************************
*																																*
*		 Input : name																								*
*							*char name					name der gesuchten Kurve			*
*																																*
*		Output : struct Curve *curve																*
*							curve != NULL				Kurve gefunden								*
*							curve == NULL				keine Kurve gefunden					*
*																																*
*****************************************************************
*																																*
*	 Comment : Durchsucht die	Kurvenliste nach dem entsprechenden	*
*						 Namen. Der Rückgabewert ist der Kurvenzeiger				*
*						 oder ein NULL-Pointer.															*
*																																*
****************************************************************/

struct Curve *slistname(name)
char *name;
{
	struct Curve *temp = plot->first;	/* temp auf first setzten		*/

	while ((strcmp(name,temp->titel) != NULL) and
											 							/* suche bis gleiche Namen	*/
				(temp != NULL))							/* oder ende der Liste			*/
			temp = temp->next;						/* nicht gefunden, nächste	*/
																		/* Kurve										*/
	if (temp == NULL)									/* setzte Fehler falls			*/
		seterror(NOTFOUND);							/* nicht gefunden						*/
	return (temp);										/* und zurück								*/
}

