#!/bin/bash

C_FAJLOVI=$1;
#echo "C fajlovi: $C_FAJLOVI";

echo "${*:1}" | grep "k{\(.\{1,\}\)k}" -o | sed 's/k{//g' | sed 's/k}//g' > komarg.txt;
#vazno! argumenti komandne linije moraju biti zapisani u jednom redu, i samo prvi red iz
#fajla komarg.txt ce se uzimati u obzir
echo -e $(cat komarg.txt) > komarg.txt;
KOM_ARG=$(< komarg.txt);

echo "${*:1}" | grep "u{\(.\{1,\}\)u}" -o | sed 's/u{//g' | sed 's/u}//g' |  sed $'s/\r//'   > stdin.txt;
echo -e $(cat stdin.txt) > stdin.txt;

echo "${*:1}" | grep "i{\(.\{1,\}\)i}" -o | sed 's/i{//g' | sed 's/i}//g' | sed 's/\*/#$#/g'  > ocekivani_izlaz.txt;
echo -e "$(cat ocekivani_izlaz.txt)"  > ocekivani_izlaz_tmp.txt;
cat ocekivani_izlaz_tmp.txt |  sed 's/#$#/*/g' > ocekivani_izlaz.txt;

# standardna greska
echo "${*:1}" | grep "e{\(.\{1,\}\)e}" -o | sed 's/e{//g' | sed 's/e}//g' | sed 's/\*/#$#/g'  > ocekivana_greska.txt;
echo -e "$(cat ocekivana_greska.txt)"  > ocekivana_greska_tmp.txt;
cat ocekivana_greska_tmp.txt |  sed 's/#$#/*/g' > ocekivana_greska.txt;

#imamo do 5 ulaznih fajlova, i do 2 izlazna, ovo se, naravno moze prosiriti ako bude bilo potrebe
#oznake za ulazne su uf1, uf2, ..., a za izlazne su if1, if2

#za ulazne se samo pobrinemo da su kreirani, kako bi program mogao da ih koristi
ULAZNI_FAJL1=$("./tofile.sh" "${*:1}" "uf1");
ULAZNI_FAJL2=$("./tofile.sh" "${*:1}" "uf2");
ULAZNI_FAJL3=$("./tofile.sh" "${*:1}" "uf3");
ULAZNI_FAJL4=$("./tofile.sh" "${*:1}" "uf4");
ULAZNI_FAJL5=$("./tofile.sh" "${*:1}" "uf5");
#eliminisemo escape sekvence iz njih kako bi bili korektni za koriscenje od strane programa
if [ -n "$ULAZNI_FAJL1" ]; then
 	echo -en $(cat "$ULAZNI_FAJL1") > "$ULAZNI_FAJL1";
fi
if [ -n "$ULAZNI_FAJL2" ]; then
        echo -en $(cat "$ULAZNI_FAJL2") > "$ULAZNI_FAJL2";
fi
if [ -n "$ULAZNI_FAJL3" ]; then
        echo -en $(cat "$ULAZNI_FAJL3") > "$ULAZNI_FAJL3";
fi
if [ -n "$ULAZNI_FAJL4" ]; then
        echo -en $(cat "$ULAZNI_FAJL4") > "$ULAZNI_FAJL4";
fi
if [ -n "$ULAZNI_FAJL5" ]; then
        echo -en $(cat "$ULAZNI_FAJL5") > "$ULAZNI_FAJL5";
fi
#za izlazni vidimo koji je naziv fajla "{naziv}", pa mu dodamo prefiks "ocekivani_{naziv}" jer ce program pisati po fajlu "{naziv}"
#kasnije poredimo sadrzaj "ocekivani_{naziv}" i "naziv fajlova"
IZLAZNI_FAJL1=$("./tofile.sh" "$*:1}" "if1");
IZLAZNI_FAJL2=$("./tofile.sh" "$*:1" "if2");

if [ -n "$IZLAZNI_FAJL1" ]; then
	mv "$IZLAZNI_FAJL1" "_$IZLAZNI_FAJL1";
fi
if [ -n "$IZLAZNI_FAJL2" ]; then
	mv "$IZLAZNI_FAJL2" "_$IZLAZNI_FAJL2";
fi

# brisemo prethodni standardni izlaz ako postoji
if [ -f stdout.txt ]; then
	rm -f stdout.txt;
fi

# brisemo prethodni a.out ako postoji
if [ -f a.out ]; then
	rm -f a.out;
fi

# kompilacija
gcc $C_FAJLOVI -lm >& /dev/null

# ako se nije generisao a.out znaci da nije uspela kompilacija
if [ -f a.out ]; then
    # cekamo najvise 0.1 sekundu na izvrsavanje rezultata inace ubijamo ceo bash
    # standardni izlaz redirektujemo u stdout.txt a std gresku u /dev/null
    ./a.out $KOM_ARG < stdin.txt > stdout.txt 2> stderr.txt & pid=$!;
    sleep 0.1;
    kill $pid &> /dev/null;
fi

DIFF="XXXX";
# Ako se izgenerisao izlaz
# Poredimo ocekivani i realizovani izlaz, pritom igornisemo beline i prazne redove
if [ -f stdout.txt ]; then

	# na ocekivani izlaz dopisujemo i ocekivane sadrzaje izlaznih fajlova
	if [ -f "_$IZLAZNI_FAJL1" ]; then
		echo "izlaznifajl1" >> ocekivani_izlaz.txt;
		cat "_$IZLAZNI_FAJL1" >> ocekivani_izlaz.txt;
	fi
	if [ -f "_$IZLAZNI_FAJL2" ]; then
		echo "izlaznifajl2" >> ocekivani_izlaz.txt;
		cat "_$IZLAZNI_FAJL2" >> ocekivani_izlaz.txt;
	fi

	if [ -f "$IZLAZNI_FAJL1" ]; then
		echo "izlaznifajl1" >> stdout.txt;
		cat "$IZLAZNI_FAJL1" >> stdout.txt;
	fi	
	if [ -f "$IZLAZNI_FAJL2" ]; then
		echo "izlaznifajl2" >> stdout.txt;
		cat "$IZLAZNI_FAJL2" >> stdout.txt;
	fi

	if [ -f "ocekivana_greska.txt" ]; then
		echo "greska" >> ocekivani_izlaz.txt;
		cat "ocekivana_greska.txt" >> ocekivani_izlaz.txt;
	fi

	if [ -f "stderr.txt" ]; then
		echo "greska" >> stdout.txt;
		cat "stderr.txt" >> stdout.txt;
	fi

	NEMAIZLAZNOGFAJLA=0;
	#ako treba da postoji izlazni fajl a nije se izgenerisao, ne moramo ni da proveravamo, vec vracamo da je diff nesto
	if [ -f  "_$IZLAZNI_FAJL1" ]; then
		if [ ! -f "$IZLAZNI_FAJL1" ]; then
			NEMAIZLAZNOGFAJLA=1;
		fi
	fi
	if [ -f "_$IZLAZNI_FAJL2" ]; then
		if [ ! -f "$IZLAZNI_FAJL2" ]; then
			NEMAIZLAZNOGFAJLA=1;
		fi
	fi
	if [  "$NEMAIZLAZNOGFAJLA" == 0 ]; then
		#prociscjujemo sadrzaje ocekivanog i realizovanog izlaza, eliminisemo beline, a nove redove enkodiramo jer su dosad bili \n itd.
		echo -e "$( cat ocekivani_izlaz.txt)" > ocekivani_izlaz_tmp.txt;
		sed ':a;N;$!ba;s/\n//g' ocekivani_izlaz_tmp.txt > ocekivani_izlaz1.txt;
        	sed ':a;N;$!ba;s/\n//g' stdout.txt > stdout1.txt;
		#ako se ovde obrise -wB nece se ignorisati beline vec ce biti striktno
		DIFF=$(diff -wB ocekivani_izlaz1.txt stdout1.txt);
	fi
	rm -f ocekivani_izlaz1.txt stdout1.txt;
fi

# Brisanje svih generisanih fajlova
rm -f ocekivani_izlaz.txt ocekivani_izlaz_tmp.txt ocekivani_izlaz1.txt stdout.txt stdout1.txt a.out stdin.txt komarg.txt ocekivana_greska.txt ocekivana_greska_tmp.txt stderr.txt;
rm -f "$ULAZNI_FAJL1" "$ULAZNI_FAJL2" "$ULAZNI_FAJL3" "$ULAZNI_FAJL4" "$ULAZNI_FAJL5";
rm -f "$IZLAZNI_FAJL1" "$IZLAZNI_FAJL2" "_$IZLAZNI_FAJL1" "_$IZLAZNI_FAJL2";

#ne sme da bude nista vise od ovog jednog echa jer ga program koji ga poziva koristi kao rezultat

if [ "$DIFF" == "" ]; then
	echo "DA"; # prolazi test primer
else
	echo "NE"; # ne prolazi test primer
fi
