#include <stdio.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>

#define MAX_BUFF 50

int main(){
	int pipe_in[2], pipe_out[2], odgovor, pravi_odgovor, length;
	char izraz[MAX_BUFF + 1], buffer[MAX_BUFF + 1];
	FILE *izrazi;
	
	if((izrazi = fopen("izrazi", "r")) == NULL){
		printf("Nije moguce otvoriti datoteku izrazi!\n");
		exit(1);
	}
	
	if(mknod("pipe_in", 4480, NULL) == -1){
		printf("Datoteka nije stvorena! Mozda vec postoji.\n");
		exit(1);
	}
	
	if(mknod("pipe_out", 4480, NULL) == -1){
		printf("Datoteka nije stvorena! Mozda vec postoji.\n");
		exit(1);
	}

	while(fgets(izraz, MAX_BUFF, izrazi) != NULL){
		izraz[strlen(izraz) - 1] = 0;

		switch(fork()){
			case -1:
				printf("Proces dijete nije stvoren!\n");
				exit(1);
			case 0:
				if((pipe_in[0] = open("pipe_in", O_RDONLY)) == -1){
					printf("Cjevovod nije stvoren!\n");
					exit(1);
				}
				
				dup2(pipe_in[0], 0);
				close(pipe_in[0]);
				
				if((pipe_out[1] = open("pipe_out", O_WRONLY)) == -1){
					printf("Cjevovod nije stvoren!\n");
					exit(1);
				}
				
				dup2(pipe_out[1], 1);
				dup2(pipe_out[1], 2);
				close(pipe_out[1]);
				
				if(execlp("bc", "bc", NULL) == -1){
					printf("bc nije pokrenut!\n");
					exit(1);
				}
				exit(0);
			default:
				break;
		}
		
		if((pipe_in[1] = open("pipe_in", O_WRONLY)) == -1){
			printf("Cjevovod nije stvoren!\n");
			exit(1);
		}
		
		if((pipe_out[0] = open("pipe_out", O_RDONLY)) == -1){
			printf("Cjevovod nije stvoren!\n");
			exit(1);
		}
		
		printf("%s = ", izraz);
		fflush(stdout);
		scanf("%d%*c", &odgovor);
		
		length = strlen(izraz);
		izraz[length] = '\n';
		izraz[length + 1] = 0;
		
		write(pipe_in[1], izraz, strlen(izraz));
		close(pipe_in[1]);
		
		wait(NULL);
		
		length = read(pipe_out[0], buffer, MAX_BUFF);
		close(pipe_out[0]);
		buffer[length] = 0;
		
		if(strcmp(buffer, "syntax error on line 1, teletype\n") == 0)
			printf("NEISPRAVAN IZRAZ\n");
		else{
			pravi_odgovor = atoi(buffer);
			if(pravi_odgovor == odgovor)
				printf("TOCNO!\n");
			else
				printf("NETOCNO! Pravi odgovor je %d\n", pravi_odgovor);
		}
	}
	execlp("rm", "rm", "pipe_in", "pipe_out", NULL);
	fclose(izrazi);
	return 0;
}
