Advertisement
Guest User

Untitled

a guest
Nov 18th, 2017
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.94 KB | None | 0 0
  1. //------------------------------------------------------------------------
  2. // NAME: Маргарита Маринова
  3. // CLASS: XIa
  4. // NUMBER: 14
  5. // PROBLEM: #1
  6. // FILE NAME: tail.c
  7. // FILE PURPOSE:
  8. // Да се реализира стандартаната UNIX команда tail
  9. //------------------------------------------------------------------------
  10. #include <stdio.h>
  11. #include <string.h>
  12. #include <unistd.h>
  13. #include <sys/types.h>
  14. #include <sys/stat.h>
  15. #include <fcntl.h>
  16. #include <errno.h>
  17.  
  18. //------------------------------------
  19. // FUNCTUION: void my_write(char line[])
  20. // Параметри char line[] - подаваме текста, който искаме да изпишем на стандартния изход.
  21. //--------------------------------------
  22. void my_write(char line[])
  23. {
  24.   write(STDOUT_FILENO, line, strlen(line));
  25.  
  26. }
  27. //------------------------------------
  28. // FUNCTUION: void my_еrr_write(char line[])
  29. // Параметри char line[] - подаваме текста, който искаме да изпишем на стандартния изход за грешки.
  30. //--------------------------------------
  31. void my_err_write(char line[])
  32. {
  33.   write(STDERR_FILENO, line, strlen(line));
  34. }
  35.  
  36. int open_err(int i,int check,int argc,char* filename,char* str){
  37.   int count=0;
  38.   char buff[100];
  39.  
  40.   if(i==2 && check==1)my_write("\n");
  41.   for(count=0;count<=strlen(filename);count++){
  42.     str[count]=(filename)[count];
  43.   }
  44.   sprintf(buff,"tail: cannot open '%s' for reading: %s",str,strerror(errno));
  45.   write(STDERR_FILENO, buff,strlen(buff));
  46.   if(i>1 || argc==2)my_write("\n");
  47.  
  48.   return 1;
  49. }
  50.  
  51. int read_err(int i,int check,int argc,char* filename,char* str){
  52.   int count=0;
  53.   char buff[100];
  54.  
  55.   if(i==2 && check==1)my_write("\n");
  56.   for(count=0;count<=strlen(filename);count++){
  57.     str[count]=(filename)[count];
  58.   }
  59.   sprintf(buff,"tail: error reading '%s': %s",str,strerror(errno));
  60.   write(STDERR_FILENO, buff,strlen(buff));
  61.   if(i>1 || argc==1)my_write("\n");
  62.  
  63.   return 1;
  64. }
  65.  
  66. int write_err(int i,int check,int argc,int is_it_file){
  67.   char buff[100];
  68.  
  69.   if(i==2 && check==1)my_write("\n");
  70.   if(is_it_file==1){
  71.     sprintf(buff,"tail: error writing: %s",strerror(errno));
  72.   }else{
  73.     sprintf(buff,"tail: error writing 'standard output': %s",strerror(errno));
  74.   }
  75.   write(STDERR_FILENO, buff,strlen(buff));
  76.   if(i>1 || argc==1)my_write("\n");
  77.  
  78.   return 1;
  79. }
  80.  
  81. int close_err(int i,int check,int argc,char* filename,char* str){
  82.   int count=0;
  83.   char buff[100];
  84.  
  85.   if(i==2 && check==1)my_write("\n");
  86.   for(count=0;count<=strlen(filename);count++){
  87.     str[count]=(filename)[count];
  88.   }
  89.   sprintf(buff,"tail: error reading '%s': %s",str,strerror(errno));
  90.   write(STDERR_FILENO, buff,strlen(buff));
  91.   if(i>1 || argc==1)my_write("\n");
  92.  
  93.   return 1;
  94. }
  95.  
  96. int tail_for_file(int i,int check,int numb_files,char*filename){
  97.   int fd;// използва се за достъп до даден файл
  98.   int error_exist=0,its_file=1;
  99.   int lines=0,count=0;//броячи
  100.   ssize_t wresult=0;// съхранява се стойносста върната от write()
  101.   ssize_t cresult=0;// съхранява се стойносста върната от close()
  102.   ssize_t rresult = 0;// съхранява се стойносста върната от read()
  103.   ssize_t whole = 0;// Общата стойност на прочетените байтовете.
  104.   ssize_t pos;// брои байтовете
  105.   char buff[100],str[100];// buff - съхранява прочетените байтове.
  106.  
  107.   fd = open(filename, O_RDONLY);
  108.   if(fd < 0){ //възникнала е грешка
  109.     check=open_err(i,check,numb_files,filename,str);
  110.     error_exist=1;
  111.   }
  112.   whole=lseek(fd,0,SEEK_END);// lseek мести позицията ни във файла, в случая до края на файла
  113.   pos=0;
  114.   lines=0;
  115.   while(pos<=whole){
  116.     pos=lseek(fd,--whole,SEEK_SET);//отброяваме наобратно
  117.     rresult=read(fd,buff,1);
  118.     if(rresult < 0 && error_exist == 0){
  119.       check=read_err(i,check,numb_files,filename,str);
  120.       error_exist=1;
  121.     }
  122.     if(*buff=='\n'){
  123.       lines++;
  124.     }
  125.     if(lines>=11)break;
  126.   }if(lines>=11){
  127.     lseek(fd,pos+1,SEEK_SET);
  128.   }else lseek(fd,0,SEEK_SET); // ако файла има по-малко от 10 реда се изкарва цялатa
  129.  
  130.   if(numb_files>2 && error_exist==0){
  131.     if(i>1)my_write("\n");
  132.     for(count=0;count<=strlen(filename);count++){
  133.       str[count]=(filename)[count];
  134.     }
  135.     my_write("==> ");
  136.     my_write(str);
  137.     my_write(" <==\n");
  138.  
  139.   }
  140.  
  141.   while((rresult = read(fd, buff, 1)) > 0){
  142.     if(rresult < 0 && error_exist == 0){
  143.       check=read_err(i,check,numb_files,filename,str);
  144.       error_exist=1;
  145.     }
  146.     wresult=write(STDOUT_FILENO, buff, rresult); //изкарва файла от позицията на която се намираме
  147.     if(wresult < 0 && error_exist == 0){
  148.       check=write_err(i,check,numb_files,its_file);
  149.       error_exist=1;
  150.     }
  151.   }
  152.  
  153.   cresult=close(fd);// затваря достъпващия файл
  154.   if(cresult < 0 && error_exist == 0){
  155.     check=close_err(i,check,numb_files,filename,str);
  156.     error_exist=1;
  157.   }
  158.   return check;
  159. }
  160.  
  161. void *tail_for_standard(int i,int check, int numb_files){
  162.   int error_exist=0,its_file=0;
  163.   ssize_t wresult=0;// съхранява се стойносста върната от write()
  164.   ssize_t cresult=0;// съхранява се стойносста върната от close()
  165.   ssize_t rresult = 0;// съхранява се стойносста върната от read()
  166.   char buff[100],str[100],buf;// buff - съхранява прочетените байтове.
  167.   char *filename="tmp_file.txt";
  168.  
  169.   int fd=open("tmp_file.txt",O_CREAT|O_WRONLY,S_IRWXU);
  170.  
  171.   while(rresult=read(STDIN_FILENO,&buf,1)>0){
  172.     if(rresult < 0 && error_exist == 0){
  173.       check=read_err(i,check,numb_files,filename,str);
  174.       error_exist=1;
  175.     }
  176.  
  177.     wresult=write(fd,&buf,1);
  178.     if(wresult < 0 && error_exist == 0){
  179.       check=write_err(i,check,numb_files,its_file);
  180.       error_exist=1;
  181.     }
  182.  
  183.   }
  184.   cresult=close(fd);// затваря достъпващия файл
  185.   if(cresult < 0 && error_exist == 0){
  186.     check=close_err(i,check,numb_files,filename,str);
  187.     error_exist=1;
  188.   }
  189.  
  190.   if(numb_files>2 && error_exist==0){
  191.     if(i>1)my_write("\n");
  192.     my_write("==>");
  193.     my_write(" standard input ");
  194.     my_write("<==\n");
  195.   }
  196.  
  197.   tail_for_file(i,check,numb_files,filename);
  198. }
  199.  
  200. int main (int argc, char* argv[]){ // argc съдържа броя на аргументите, argv съдържа самите аргументи
  201.   int count=0,i=1;//броячи
  202.   int check=0;
  203.  
  204.   if(argc==1)tail_for_standard(i,check,argc); //
  205.  
  206.   for(i=1;i<=argc-1;i++){
  207.     if(*argv[i] == '-'){
  208.       tail_for_standard(i,check,argc);
  209.     }else{
  210.       check=tail_for_file(i,check,argc,argv[i]);
  211.     }
  212.   }
  213.   return 0;
  214. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement