Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <sys/fcntl.h>
- #include <sys/ipc.h>
- #include <sys/types.h>
- #include <sys/sem.h>
- int main(int argc,char* argv[]){
- int fin,fout,len,paidia,i,start,end,j,ffinal;
- int sema_read,sema_write,finalsize,initsize;
- struct sembuf sem_op;
- char chh;
- fin=open(argv[1],O_RDONLY);
- fout=open("ask.c.tmp",O_RDWR|O_CREAT|O_TRUNC,0777);
- ffinal=open("ask_bare.c",O_RDWR|O_CREAT|O_TRUNC,0777);
- len=lseek(fin,0,SEEK_END); //paei sto telos tou arxeiou
- paidia=len/50 + 1;//ta pidia tha einai to synoliko megethos tou arxeiou dia 50 +1
- sema_read=semget(IPC_PRIVATE,1,0600); //dimiourgia simaforou pou diabazei
- sema_write=semget(IPC_PRIVATE,1,0600);//dimiourgia simaforou pou grafei
- printf("%d %d %d chars\n",fin,len,paidia);
- for (i=0;i<paidia;i++)
- {
- if (fork()==0)
- {
- int katastasi=3; // 3 -> kodikas, 1 -> /* */, 2 -> //
- start= i*50;//xekinaei me tous protous 50 xaraktires
- end = start+50;//telos
- //elenxos gia to telefteo paidi
- if (end>len)
- end=len;
- for(j=start;j<end;j++)
- {
- char c[3];
- c[2]=0;
- sem_op.sem_num=0;//desmeusi semaforou semaread
- sem_op.sem_op =-1;
- sem_op.sem_flg=0;
- semop(sema_read,&sem_op,1);
- lseek(fin,j,SEEK_SET);//paei sto arxeio eisodou kai paei to dromea sti thesi pou leei to j
- read(fin,c,2);//diabazei 2 xaraktires
- sem_op.sem_num=0; //apodesmeusi semaforou semaread
- sem_op.sem_op =1;
- sem_op.sem_flg=0;
- semop(sema_read,&sem_op,1);
- if (katastasi==3)
- { //kodikas
- if (strcmp(c,"/*")==0)//ean c="/*" tote paei stin katastasi 1
- katastasi=1;
- else if (strcmp(c,"//")==0)
- katastasi=2;
- }
- else if (katastasi==2)
- { //sxolio //
- if (c[0]=='\n')//xaraktiras telos tou sxoliou einai to /n
- katastasi=3;
- }
- else if (katastasi==1)
- { //sxolio /*
- if (strcmp(c,"*/")==0)
- katastasi=4;
- }
- else if (katastasi==4)//katastasi 4 kai 5 gia epipleon kathisterisi
- katastasi=5;
- else if (katastasi==5)
- katastasi=3;
- if (katastasi!=3)
- c[0]='@';//antikathista to xaraktira me papaki otan eprokeito gia sxolio
- sem_op.sem_num=0; //desmeusi semaforou semawrite
- sem_op.sem_op =-1;
- sem_op.sem_flg=0;
- semop(sema_write,&sem_op,1);
- lseek(fout,j,SEEK_SET);//kanei seek gia na grapsei to gramma stin exodo
- write(fout,c,1);//grafei enan xaraktira
- sem_op.sem_num=0;//apodesmeusi semaforou semawrite
- sem_op.sem_op =1;
- sem_op.sem_flg=0;
- semop(sema_write,&sem_op,1);
- }
- //kleisimo arxeion
- close(fin);
- close(fout);
- close(ffinal);
- //kleisimo simaforon
- semctl(sema_read,0,IPC_RMID,0);
- semctl(sema_write,0,IPC_RMID,0);
- //telos ektelesis paidion
- exit(0);
- }
- }
- //anamoni olon ton paidion
- for (i=0;i<paidia;i++)
- {
- wait(0);
- }
- lseek(fout,0,SEEK_SET);//stin arxi
- //antigrafi olon ton xaraktiron pou den einai @ sto teliko arxeio
- while(read(fout,&chh,1)==1)
- {
- if (chh!='@')
- write(ffinal,&chh,1);
- }
- //emfanisi tou posostou simbiesis
- finalsize=lseek(ffinal,0,SEEK_END);
- initsize=lseek(fin,0,SEEK_END);
- printf("Simbiesi %d\n",(finalsize-initsize)*initsize);
- //kleisimo arxeion
- close(fin);
- close(fout);
- close(ffinal);
- semctl(sema_read,0,IPC_RMID,0);
- semctl(sema_write,0,IPC_RMID,0);
- //telos patera
- }
Add Comment
Please, Sign In to add comment