/*************************************************************************/
/* Autor      : RTA                                                      */
/* Computer   : Amiga                                                    */
/* Sprache    : Ansi C                                                   */
/* Compiler   : SAS C-Compiler Version 5.1a                              */
/* Dateiname  : liste.c                                                  */
/* Projekt    : OnlineHelp                                               */
/* Erstellt am: 10 Nov 1991,18:54                                        */
/*************************************************************************/

#include "online.h"

static struct List *mylist=NULL;
static struct Node *actnode=NULL;

/*************************************************************************/
/*              Fügt einen Dateinamen in die Suchliste ein               */
/*************************************************************************/
BOOL additem(BYTE *name)
{
      struct Node *temp;

		if(!name)return(FALSE);

      if(!mylist)
        	{
				mylist=(struct List *)calloc(1,sizeof(struct List));
				if(!mylist)
                {
                SimpleRequest(errortext.nomem);
                return(FALSE);
                }
	        NewList(mylist);
         }

      temp=FindName(mylist,name);
      if(temp) return(TRUE);

      temp=(struct Node *)calloc(1,sizeof(struct Node));
      if(!temp)
                {
                SimpleRequest(errortext.nomem);
                return(FALSE);
                }
      temp->ln_Name=strdup(name);
      temp->ln_Type=NT_UNKNOWN;
      AddTail(mylist,temp);
      return(TRUE);
}
/*************************************************************************/
/*                         Löscht die Suchliste                          */
/*************************************************************************/
void delitem()
{
        struct Node *np;

		  if(!mylist)	return;
 		  for(np=(struct Node *)mylist->lh_Head;np!=(struct Node *)&mylist->lh_Tail;np=np->ln_Succ)
			{
				if(!np) break;
		      Remove(np);
		      free(np);
        	}
        	free(mylist);
        	mylist=NULL;
			actnode=NULL;
}

/*************************************************************************/
/*                         Listet die Suchliste                          */
/*************************************************************************/
BYTE *listitem()
{
	char *puffer;
	long i=0;
   struct Node *np;

	if(!(puffer=calloc(LIST_PUF,BYTE_LEN))) return(NULL);
	if(!mylist)	
					{
					strcpy(puffer,errortext.nodocs);
					return(puffer);
					}
	
 	for(puffer[0]='\0',np=(struct Node *)mylist->lh_Head;np!=(struct Node *)&mylist->lh_Tail;np=np->ln_Succ)
			{
				if(!np) break;
				strcat(puffer,np->ln_Name);
				strcat(puffer," ");
				i+=strlen(np->ln_Name)+1;
				if(i>=LIST_PUF)
					{
					strcpy(puffer,errortext.tobig);
					break;
					}
        	}
   return(puffer);
}

/*************************************************************************/
/*             Erzeugt die Suchliste aus einer String-Liste              */
/*************************************************************************/
void makelist(char **argv,int start,int ende)
{
int i;

if(!argv)return;

for(i=start;i<ende;i++)
	if(!additem(argv[i]))break;
}

/*************************************************************************/
/*              Gibt das nächste Doc-File oder NULL zurück               */
/*************************************************************************/
BYTE *getnext()
{
	if(!mylist)return(NULL);

	if(!actnode)actnode=(struct Node *)mylist->lh_Head;
	else actnode=actnode->ln_Succ;
	if(!actnode)return(NULL);
   if(actnode==(struct Node *)&mylist->lh_Tail)
   	{
   	actnode=NULL;
		return(NULL);
		}
	return(actnode->ln_Name);
}
/*************************************************************************/
/*              Gibt das aktuelle Doc-File oder NULL zurück              */
/*************************************************************************/
BYTE *getact()
{
	if(!mylist)return(NULL);

	if(!actnode)actnode=(struct Node *)mylist->lh_Head;
	if(!actnode)return(NULL);
	return(actnode->ln_Name);
}
/*************************************************************************/
/*          Löscht einen einzelnen Dateinamen aus der Suchliste          */
/*************************************************************************/
BOOL delitemonly(BYTE *fname)
{
        struct Node *np;

		  if(!mylist || !fname)	return(FALSE);
 		   for(np=(struct Node *)mylist->lh_Head;np!=(struct Node *)&mylist->lh_Tail;np=np->ln_Succ)
			{
				if(!np) return(FALSE);
				if(!stricmp(fname,np->ln_Name))
					{
					Remove(np);
					free(np);
					actnode=NULL;
					return(TRUE);
					}
        	}
return(FALSE);
}
/*************************************************************************/
/*         Initialisiert den aktuellen Dateinamen auf den Anfang         */
/*************************************************************************/
void initlist(void)
{
	actnode=NULL;
}
