Advertisement
Guest User

chujowo

a guest
Dec 13th, 2019
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.29 KB | None | 0 0
  1. #include <ctype.h>
  2. #include <stdio.h>
  3. #include <unistd.h>
  4. #include <sys/mman.h>
  5. #include <sys/stat.h>
  6. #include <sys/types.h>
  7. #include <errno.h>
  8. #include <fcntl.h>
  9. #include <string.h>
  10. #include <stdlib.h>
  11. //map2=replace(map, reversed, torev);
  12.     char* replace(const char *str, const char *oldstr, const char *newstr)
  13.     {
  14.  
  15.         int lengthstr= strlen(oldstr); //strlen(oldstr)=strlen(newstr)
  16.  
  17.         char *result;
  18.         result = (char *)malloc(strlen(str)+1);
  19.  
  20.         char *space;
  21.         space = (char *)malloc(lengthstr+3);
  22.         space[0]=' ';
  23.         strncpy(&space[1], oldstr, lengthstr-1);
  24.         space[strlen(space)]=' ';
  25.         space[strlen(space)-1]=' ';
  26.         space[strlen(space)-2]=' ';
  27.  
  28.         char *newline;
  29.         newline = (char *)malloc(lengthstr+3);
  30.         newline[0]='\n';
  31.         newline[strlen(newline)-1]=' ';
  32.         strncpy(&newline[1], oldstr, lengthstr);
  33.  
  34.         char *first;
  35.         first = (char *)malloc(lengthstr+2);
  36.         strncpy(&first[0], oldstr, lengthstr);
  37.         first[strlen(first)-1]=' ';
  38.  
  39.  
  40.         int i = 0;
  41.             while (*str)
  42.             {
  43.             if (i==0 && strstr(str, first) == str)
  44.                 {
  45.                     result[i+lengthstr]=' ';
  46.                     strcpy(&result[i], newstr);
  47.                     i += lengthstr;
  48.                     str += lengthstr;
  49.                 }
  50.             else if (strstr(str, space) == str)
  51.                 {
  52.                     result[i]=' ';
  53.                     result[i+lengthstr]=' ';
  54.                     strcpy(&result[i]+1, newstr);
  55.                     i += lengthstr+1;
  56.                     str += lengthstr+1;
  57.                 }
  58.             else if (strstr(str, newline) == str)
  59.                 {
  60.                     result[i]='\n';
  61.                     result[i+lengthstr]=' ';
  62.                     strcpy(&result[i]+1, newstr);
  63.                     i += lengthstr+1;
  64.                     str += lengthstr+1;
  65.                 }
  66.             else
  67.             result[i++] = *str++;
  68.             }
  69.             return result;
  70. }
  71.  
  72. int main(int argc, char *argv[])
  73. {
  74.     char *torev, *file;
  75.     int fd;
  76.     struct stat inode;
  77.     void *map, *map2;
  78.  
  79.     switch(argc)
  80.     {
  81.     case 3:
  82.         file = argv[1];
  83.         torev=argv[2];
  84.         break;
  85.     default :
  86.         printf("You should write:\t%s file word\n", argv[0]);
  87.         return 1;
  88.     }
  89.  
  90.     char reversed[strlen(torev)+1];
  91.     strcpy(reversed, torev);
  92.  
  93.     if ((fd = open(argv[1], O_RDWR)) == -1)
  94.     {
  95.         perror("Error opening file for writing");
  96.         return 2;
  97.     }
  98.  
  99.     if (fstat(fd, &inode))
  100.     {
  101.         perror("Error fstat");
  102.         return 3;
  103.     }
  104.  
  105.     if ((map = mmap(NULL, inode.st_size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0))==(void *)-1)
  106.     {
  107.         perror("Error mmapping the file");
  108.         return 4;
  109.     }  
  110.  
  111.     int i;
  112.     int x= strlen(torev)/2;
  113.     for (i = 0; i<x; i++)
  114.     {
  115.         //torev[i] = toupper(torev[i]);
  116.         char tmp= torev[i];
  117.         torev[i]=torev[strlen(torev)-1-i];
  118.         torev[strlen(torev)-1-i]=tmp;
  119.     }
  120.  
  121.  
  122.     map2=replace(map, reversed, torev);
  123.  
  124.     memcpy(map, map2, inode.st_size);
  125.  
  126.     msync(map, inode.st_size, MS_SYNC);
  127.  
  128.     munmap(map, inode.st_size);
  129.  
  130.     close(fd);
  131.  
  132.     return 0;
  133. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement