#include <stdio.h>
#include <stdlib.h>

main()
{
	int *fds, *mengex, *mengexplus, eingabe;
bbb:
	get_fds(&fds);
aaa:
	get_mengex(&mengex);
	linclosure(mengex, fds, &mengexplus);
	prettyprint_menge(mengexplus);
ccc:
	printf("neue mengex[1] neue fds[2] ende [<0] ");
	scanf("%d",&eingabe);
	if (eingabe < 0)
		{
		free(mengex);
		free(fds);
		free(mengexplus);
		return 0;
		}
	if (eingabe == 1) 
		{
                free(mengex);
                free(mengexplus);
		goto aaa;
		}
	if (eingabe == 2) 
		{
		free(mengex);
		free(fds);
		free(mengexplus);
		goto bbb;
		}
	goto ccc;
}

#ifdef UNDEF
linclosure(mengex, fds, mengexplus) int *mengex, **mengexplus, *fds;
/* eingabe attribut menge und fds, rueckgabe die Attributmenge xplus */
/* der speicher fuer xplus wird in linclosure erst allokiert */
{
	
}
#endif


#define BSIZE 10
get_mengex(xmenge) int **xmenge;
/* liest von der eingabe zahlen im format fuer eine Attribut Menge */
{
	int counter = 0,eintrag;

	printf("Eingabe einer Attributmenge\n");
	printf("Format:Zahlen >=0 am Ende eine -1\n");

	*xmenge = calloc(BSIZE,sizeof(int));
	while (scanf("%d",&eintrag) == 1)
		{
		if (eintrag < -1)
			goto eee;
		if ((counter % BSIZE) == (BSIZE-1))
			*xmenge = realloc(*xmenge, 
				(counter + 1 + BSIZE)*sizeof(int));
		(*xmenge)[ counter ] = eintrag;
		if (eintrag == -1)
			return 0;
		counter++;
		}
eee:
	fprintf(stderr,"Format Fehler");
	free(*xmenge);
	*xmenge = NULL;
	return 1;
}

get_fds(fdsp) int **fdsp;
/* liest von der Eingabe fds format */
{   
	int counter = 0,eintrag, zahlmengen=1;
	printf("Eingabe einer FD-menge\n");
	printf("Format:Zahlenmenge >=0 getrennt durch -2 am Ende eine -1\n");
	printf("Format:Die Zahlenmengen stellen linke und rechte Seiten einer FD dar\n");
        *fdsp = calloc(BSIZE,sizeof(int));
        while (scanf("%d",&eintrag) == 1)
                {
                if (eintrag < -2)
                        goto eee;
                if ((counter % BSIZE) == (BSIZE-1))
                        *fdsp = realloc(*fdsp,
                                (counter + 1 + BSIZE)*sizeof(int));
                (*fdsp)[ counter ] = eintrag;
                if (eintrag == -1)
			{
			if ((zahlmengen%2) != 0)
				goto eee;
                        return 0;
			}
		if (eintrag == -2)
			zahlmengen++;
		counter++;
                }
eee:
        fprintf(stderr,"Format Fehler");
        free(*fdsp);
        *fdsp = NULL;
        return 1;
}

prettyprint_menge(menge) int *menge;
/* hilfsroutine zur ausgabe von Attributmengen */
/* format:
        Die eintraege des int Vektors sind positive zahlen =
        Attributnummer, oder -1 = ende der Atrributmenge
*/
{
	int *z ;
	z = menge;
printf("Ausgabe der Attribut Menge \n");
while (*z >= 0) printf("A_%d ", *z++);
if (*z != -1)
	{
	fprintf(stderr,"Formatfehler in Attributmenge");
	return 1;
	}
printf("\n");
return 0;
}

prettyprint_fds(fds) int *fds;
/* hilfsroutine zur Ausgabe von funktionalen Abhaengigkeiten */
/* format:
	Die eintraege des int Vektors sind positive zahlen =
	Attributnummer, oder -2 = trenner zwischen attributmengen
	oder -1 = ende der fd liste
   bsp:
	k1 k2 .. -2 n1 n2 .. -2  m1 m2 ... -2 ...          -1
	die erste fd ist dann
	A_k1 A_k2 ..  --> A_n1 A_n2 ...
*/
{
int *z , anz = 0;
z = fds;
printf("Ausgabe der Funktionalen Abhaengigkeiten \n");

aaa:
if (*z == -1) {
	printf("Es wurden %d Abhaengigkeiten ausgegeben\n",anz);
	return 0;
	}
if (*z == -2) z++;
while (*z >= 0) printf("A_%d ", *z++);
if (*z != -2) 
	{
	fprintf(stderr,"Formatfehler in fd");
	return 1;
	}
printf(" ----> ");
z++;
while (*z >= 0) printf("A_%d ", *z++);
printf("\n");
anz++;
goto aaa;
}