IT

tiny bc

kio467 2014. 11. 19. 15:22

#include <stdio.h>


#define oops(m,x) {perror(m); exit(x);}


main()

{

int pid, todc[2], fromdc[2];


if(pipe(todc)==-1||pipe(fromdc)==-1)

oops("pipe failed", 1);


if((pid=fork())==-1)

oops("cannot fork",2);

if(pid==0)

be_dc(todc,fromdc);

else

{

be_bc(todc,fromdc);

wait(NULL);

}

}


be_dc(int in[2], int out[2])

{

if(dup2(in[0],0)==-1)

oops("dc",3);

close(in[0]);

close(in[1]);


if(dup2(out[1],1)==-1)

oops("dc",4);

close(out[1]);

close(out[0]);


execlp("dc", "dc", "-", NULL);

oops("cannot dc",5);

}


be_bc(int todc[2], int fromdc[2])

{

int num1, num2;

char operation[BUFSIZ], message[BUFSIZ], *fgets();

FILE *fpout, *fpin, *fdopen();


close(todc[0]);

close(fromdc[1]);


fpout = fdopen(todc[1], "w");

fpin = fdopen(fromdc[0],"r");

if(fpout==NULL||fpin==NULL)

fatal("error");


while(printf("tinybc: "), fgets(message, BUFSIZ, stdin)!=NULL)

{

if(sscanf(message,"%d%[-+*/^]%d",&num1,operation,&num2)!=3)

{

printf("syntax error\n");

continue;

}

if(fprintf(fpout, "%d\n%d\n%c\np\n",num1,num2,*operation)==EOF)

fatal("error");

fflush(fpout);

if(fgets(message,BUFSIZ,fpin)==NULL)

break;

printf("%d %c %d = %s", num1, *operation, num2, message);

}

fclose(fpout);

fclose(fpin);

}


fatal(char mess[])

{

fprintf(stderr, "errod: %s\n", mess);

exit(1);

}