Advertisement
Guest User

Untitled

a guest
Nov 17th, 2017
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.22 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. void open_err(char* filename,char* str){
  37.   int count=0;
  38.   char buff[100];
  39.  
  40.   for(count=0;count<=strlen(filename);count++){
  41.     str[count]=(filename)[count];
  42.   }
  43.   sprintf(buff,"tail: cannot open '%s' for reading",str);
  44.   write(STDERR_FILENO, buff,strlen(buff));
  45.   perror("");
  46.  
  47. }
  48.  
  49. void read_err(char* filename,char* str){
  50.   int count=0;
  51.   char buff[100];
  52.  
  53.   for(count=0;count<=strlen(filename);count++){
  54.     str[count]=(filename)[count];
  55.   }
  56.   sprintf(buff,"tail: error reading '%s': %s\n",str,strerror(errno));
  57.   write(STDERR_FILENO, buff,strlen(buff));
  58.  
  59. }
  60.  
  61. void write_err(int is_it_file){
  62.   char buff[100];
  63.   if(is_it_file==1){
  64.     sprintf(buff,"tail: error writing: %s\n",strerror(errno));
  65.   }else{
  66.     sprintf(buff,"tail: error writing 'standard output': %s\n",strerror(errno));
  67.   }
  68.   write(STDERR_FILENO, buff,strlen(buff));
  69. }
  70.  
  71. void close_err(char* filename,char* str){
  72.   int count=0;
  73.   char buff[100];
  74.  
  75.   for(count=0;count<=strlen(filename);count++){
  76.     str[count]=(filename)[count];
  77.   }
  78.   sprintf(buff,"tail: error reading '%s': %s\n",str,strerror(errno));
  79.   write(STDERR_FILENO, buff,strlen(buff));
  80.  
  81. }
  82.  
  83. void *tail_for_file(int i,int numb_files,char*filename){
  84.   int fd;// използва се за достъп до даден файл
  85.   int error_exist=0,its_file=1;
  86.   int lines=0,count=0;//броячи
  87.   ssize_t wresult=0;// съхранява се стойносста върната от write()
  88.   ssize_t cresult=0;// съхранява се стойносста върната от close()
  89.   ssize_t rresult = 0;// съхранява се стойносста върната от read()
  90.   ssize_t whole = 0;// Общата стойност на прочетените байтовете.
  91.   ssize_t pos;// брои байтовете
  92.   char buff[100],str[100];// buff - съхранява прочетените байтове.
  93.  
  94.   fd = open(filename, O_RDONLY);
  95.   if(fd < 0){ //възникнала е грешка
  96.     open_err(filename,str);
  97.     error_exist=1;
  98.   }
  99.   whole=lseek(fd,0,SEEK_END);// lseek мести позицията ни във файла, в случая до края на файла
  100.   pos=0;
  101.   lines=0;
  102.   while(pos<=whole){
  103.     pos=lseek(fd,--whole,SEEK_SET);//отброяваме наобратно
  104.     rresult=read(fd,buff,1);
  105.     if(rresult < 0 && error_exist == 0){
  106.       read_err(filename,str);
  107.       error_exist=1;
  108.     }
  109.     if(*buff=='\n'){
  110.       lines++;
  111.     }
  112.     if(lines>=11)break;
  113.   }if(lines>=11){
  114.     lseek(fd,pos+1,SEEK_SET);
  115.   }else lseek(fd,0,SEEK_SET); // ако файла има по-малко от 10 реда се изкарва цялатa
  116.  
  117.   if(numb_files>2 && error_exist==0){
  118.     if(i>1)my_write("\n");
  119.     for(count=0;count<=strlen(filename);count++){
  120.       str[count]=(filename)[count];
  121.     }
  122.     my_write("==> ");
  123.     my_write(str);
  124.     my_write(" <==\n");
  125.  
  126.   }
  127.  
  128.   while((rresult = read(fd, buff, 1)) > 0){
  129.     if(rresult < 0 && error_exist == 0){
  130.       read_err(filename,str);
  131.       error_exist=1;
  132.     }
  133.     wresult=write(STDOUT_FILENO, buff, rresult); //изкарва файла от позицията на която се намираме
  134.     if(wresult < 0 && error_exist == 0){
  135.       write_err(its_file);
  136.       error_exist=1;
  137.     }
  138.   }
  139.  
  140.   cresult=close(fd);// затваря достъпващия файл
  141.   if(cresult < 0 && error_exist == 0){
  142.     close_err(filename,str);
  143.     error_exist=1;
  144.   }
  145.  
  146. }
  147.  
  148. void *tail_for_standard(int i, int numb_files){
  149.   int error_exist=0,its_file=0;
  150.   ssize_t wresult=0;// съхранява се стойносста върната от write()
  151.   ssize_t cresult=0;// съхранява се стойносста върната от close()
  152.   ssize_t rresult = 0;// съхранява се стойносста върната от read()
  153.   char buff[100],str[100],buf;// buff - съхранява прочетените байтове.
  154.   char *filename="tmp_file.txt";
  155.  
  156.   int fd=open("tmp_file.txt",O_CREAT|O_WRONLY,S_IRWXU);
  157.  
  158.   while(rresult=read(STDIN_FILENO,&buf,1)>0){
  159.     if(rresult < 0 && error_exist == 0){
  160.       read_err(filename,str);
  161.       error_exist=1;
  162.     }
  163.  
  164.     wresult=write(fd,&buf,1);
  165.     if(wresult < 0 && error_exist == 0){
  166.       write_err(its_file);
  167.       error_exist=1;
  168.     }
  169.   }
  170.  
  171.   cresult=close(fd);// затваря достъпващия файл
  172.   if(cresult < 0 && error_exist == 0){
  173.     close_err(filename,str);
  174.     error_exist=1;
  175.   }
  176.  
  177.   if(numb_files>2 && error_exist==0){
  178.     if(i>1)my_write("\n");
  179.     my_write("==>");
  180.     my_write(" standard input ");
  181.     my_write("<==\n");
  182.   }
  183.  
  184.   tail_for_file(i,numb_files,filename);
  185. }
  186.  
  187. int main (int argc, char* argv[]){ // argc съдържа броя на аргументите, argv съдържа самите аргументи
  188.   int count=0,i=1;//броячи
  189.  
  190.   if(argc==1)tail_for_standard(i,argc); //
  191.  
  192.   for(i=1;i<=argc-1;i++){
  193.     if(*argv[i] == '-'){
  194.       tail_for_standard(i,argc);
  195.     }else{
  196.       tail_for_file(i,argc,argv[i]);
  197.     }
  198.   }
  199.   return 0;
  200. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement