/* eingabe attribut menge und fds, rueckgabe die Attributmenge xplus */
/* der speicher fuer xplus wird in linclosure erst allokiert */
linclosure(int *mengex, int *fds, int **mengexplus)
{
	int anzahl_fd=1; /* Anzahl fds */
	int max_attribut = 0;
	int *count,**list, *newdep, *update,  *rightindex;
	int i,j,k,l,a;

	for (i=0;fds[i] != -1; i++)
		{
		if (fds[i] == -2) anzahl_fd++;
		if (fds[i] > max_attribut) max_attribut=fds[i];
		}
	anzahl_fd /= 2; anzahl_fd++;
	for (i=0;mengex[i] != -1; i++)
		{
		if (mengex[i] > max_attribut) max_attribut=mengex[i];
		}
	max_attribut++;

	count= malloc(anzahl_fd * sizeof(int));
	rightindex= malloc(anzahl_fd * sizeof(int));
	list= malloc(max_attribut * sizeof(int *));
	newdep= calloc(max_attribut , sizeof(int));
	update= calloc(max_attribut , sizeof(int));
	
printf("Anzahl FD's = %d\n", anzahl_fd);
printf("Anzahl Attr = %d\n", max_attribut);

	for (i=0;<max_attribut;i++)
		{
		list[i] = malloc(anzahl_fd* sizeof (int));
		list[i][0]=-1;
		}
	/* initialisierung */
	i=0;l=0;
	while (fds[i] != -1)
		{
		if (fds[i] == -2) i++;
		for (j=i;fds[j] != -2;j++) /* linke seite einer fd */
			{
			for (k=0;list[fds[j]][k] != -1;k++);
			list[fds[j]][k]=l;
			list[fds[j]][k+1]= -1;
			}
		count[l]=j-i;
		j++;
		rightindex[l]=j; /* index fuer die rechte seite der fd */
		for (;fds[j]>0;j++);
		i = j;
		l++;
		}
	for (i=0;mengex[i] != -1; i++)
		{
		newdep[mengex[i]]=1;
		update[mengex[i]]=1;
		}
printf("Ausgabe von list\n");
	for (i=0;i<max_attribut;i++)
		{
		printf("list[%d]=",i);
		for (k=0;list[i][k] != -1;k++)
			printf(" %d ",list[i][k]);
		printf("\n");
		}

	/* berechnung */
	for (i=0;i<max_attribut;i++)
		if (update[i] == 1)
		{
		a = i;
		update[i] = 0;
		for (i=0;list[a][i] != -1; i++)
			{
			count[list[a][i]]--;
			if (count[list[a][i]] == 0)
				{
				for (k=rightindex[list[a][i]];fds[k] > 0; k++)
					{
					if (newdep [fds[k]] == 0)  {
						update[fds[k]]=1;
						newdep[fds[k]]=1;
						}
					}
				
				}
			}
		i=0;
		}
	
	
	/* ende */
		free(rightindex);
		free(update);
		free(count);
		for (i=0;i<max_attribut;i++) free(list[i]);
		free(list);
	*mengexplus=malloc(max_attribut* sizeof(int));
	k=0;
	for (i=0;i<max_attribut;i++)
		if (newdep[i]==1) { (*mengexplus)[k++]=i; }
	(*mengexplus)[k]=-1;
		free(newdep);
}