sta-s2z

Untitled

Jul 24th, 2019
165
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.45 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <fcntl.h>
  5.  
  6. typedef struct s_result
  7. {
  8.   long sqsize;
  9.   long sqx;
  10.   long sqy;
  11.   long sqline;
  12. } t_result;
  13.  
  14. typedef struct s_filereader
  15. {
  16.   int fd;
  17.   char * fbuf;
  18.   char * filename;
  19.   long fsize;
  20.   long lines;
  21.   long linelen;
  22.   long firstcrpos;
  23.   char * linebuf;
  24.   long bytesread;
  25.   char cobs;
  26.   char cfree;
  27.   char cfill;
  28. } t_filereader;
  29.  
  30. typedef struct s_square_finder
  31. {
  32.   long pos;
  33.   long is_square;
  34.   long size;
  35. } t_finder;
  36.  
  37. int print_error (void) {
  38.   write(1, "map error\n", 10);
  39.   return -1;
  40. }
  41.  
  42. inline long pw(long number, int pw)
  43. {
  44.   long newnumber;
  45.   int count;
  46.   newnumber = 1;
  47.   if (pw == 0)
  48.     return 1;
  49.   count = 0;
  50.   while (count < pw)
  51.   {
  52.     newnumber *= number;
  53.     count++;
  54.   }
  55.   return newnumber;
  56. }
  57.  
  58. long filesizecr(char * filename, long *crpos)
  59. {
  60.   char buf[300000];
  61.   int fd;
  62.   long c;
  63.   unsigned long fs;
  64.   unsigned long size;
  65.   fs = 0;
  66.   size = 1;
  67.   *crpos = -1;
  68. //  if (filename != NULL)
  69.   if ((fd = open(filename, O_RDONLY)) == -1)
  70.     return (-1);
  71. //  else
  72. //    fd = 0;
  73.   while (size > 0)
  74.   {
  75.     size = read(fd, &buf, sizeof(buf));
  76.     if (*crpos == -1)
  77.     {
  78.       c = 0;
  79.       while (c < size)
  80.       {
  81.         if ((buf[c] == '\n') && (*crpos == -1))
  82.           *crpos = (long)fs + c;
  83.         c++;
  84.       }
  85.     }
  86.     fs += size;
  87.   }
  88.   close(fd);
  89.   return fs;
  90. }
  91.  
  92. /* inline */ void find_largest_square(long *histo, t_result *t, long len, long nlen)
  93. {
  94.   long i;
  95.   t_finder f;
  96.   f.pos = 0;
  97.   while (f.pos < len)
  98.   {
  99.     f.size = histo[f.pos];
  100.     while (f.size > t->sqy)
  101.     {
  102.       f.is_square = nlen - (f.pos + f.size);
  103.       i = f.pos;
  104.       while ((f.is_square >= 0) && (i < f.pos + f.size))
  105.       {
  106.         f.is_square = histo[i] - f.size;
  107.         i++;
  108.       }
  109.       if ((f.is_square >= 0) && (f.size > t->sqy))
  110.       {
  111.         t->sqx = f.pos;
  112.         t->sqy = f.size;
  113.       }
  114.       f.size--;
  115.     }
  116.     f.pos++;
  117.   }
  118.   t->sqsize = t->sqy * t->sqy;
  119. }
  120.  
  121. int count_line_length(t_filereader *file, long offset)
  122. {
  123.   long cpow = 0;
  124.   long i;
  125.   cpow = 0;
  126.   i = offset;
  127.   file->lines = 0;
  128.   while (i >= 0) /* atoi */
  129.   {
  130.     if (file->fbuf[i] > '9' || file->fbuf[i] < '0')
  131.       return -1;
  132.     file->lines += (file->fbuf[i] - '0') * pw(10, cpow);
  133.     cpow++;
  134.     i--;
  135.   }
  136.   return 0;
  137. }
  138.  
  139. int process_header(t_filereader *file)
  140. {
  141.   char temp;
  142.   file->fbuf = (char *)malloc(file->firstcrpos * sizeof(char) + 1);
  143.   file->bytesread = read(file->fd, file->fbuf, file->firstcrpos * sizeof(char));
  144.   if ((file->bytesread != file->firstcrpos * sizeof(char)) || (file->bytesread < 4))
  145.     return print_error();
  146.   file->fbuf[file->bytesread] = '\0';
  147.   file->cfill = file->fbuf[file->bytesread - 1];
  148.   file->cobs = file->fbuf[file->bytesread - 2];
  149.   file->cfree = file->fbuf[file->bytesread - 3];
  150.   file->fbuf[file->bytesread - 3] = '\0';
  151.   if (count_line_length(file, file->bytesread - 4) == -1)
  152.     return print_error();
  153.   file->linelen = ((file->fsize - file->bytesread) / file->lines) - 1;
  154.   free(file->fbuf);
  155.   file->bytesread = read(file->fd, &temp, sizeof(char));
  156.   if (temp != '\n')
  157.     return print_error();
  158. }
  159. int file_open(t_filereader * file, char * filename)
  160. {
  161.   file->filename = filename;
  162.   file->firstcrpos = 0;
  163.   file->fsize = filesizecr(file->filename, &file->firstcrpos);
  164.   if (file->fsize == -1)
  165.     return print_error();
  166.   if ((file->fd = open(file->filename, O_RDONLY)) == -1)
  167.     return print_error();
  168. }
  169.  
  170. int file_open_stdin(t_filereader * file)
  171. {
  172.   file->filename = "STDIN";
  173.   file->firstcrpos = 0;
  174.   file->fsize = filesizecr(NULL, &file->firstcrpos);
  175.   if (file->fsize == -1)
  176.     return print_error();
  177.   file->fd = 0;
  178. }
  179.  
  180. void assign_result(t_result *res, t_result *temp_res, long line)
  181. {
  182.   if (res->sqsize < temp_res->sqsize)
  183.   {
  184.     res->sqsize = temp_res->sqsize;
  185.     res->sqx = temp_res->sqx;
  186.     res->sqy = temp_res->sqy;
  187.     res->sqline = line;
  188.   }
  189. }
  190.  
  191. void prepare_temp_result(t_result *tres, long initvalue) {
  192.   tres->sqsize = 0;
  193.   tres->sqx = 0;
  194.   tres->sqy = initvalue;
  195.   return;
  196. }
  197.  
  198. void clear_result(t_result *res)
  199. {
  200.   res->sqx = 0;
  201.   res->sqy = 0;
  202.   res->sqsize = 0;
  203.   res->sqline = 0;
  204. }
  205.  
  206. int buffer_line (t_filereader *file)
  207. {
  208.   file->bytesread = read(file->fd, file->fbuf, file->linelen + 1);
  209.   if ((file->fbuf[file->linelen] != '\n') || (file->bytesread != file->linelen + 1))
  210.     return print_error();
  211.   return 0;
  212. }
  213.  
  214. void clear_histogram(long * h, long length)
  215. {
  216.   long i;
  217.   i = 0;
  218.   while (i < length)
  219.   {
  220.     h[i] = 0;
  221.     i++;
  222.   }
  223. }
  224.  
  225. int fill_histogram(t_filereader *file, long *histo, long *lasthisto)
  226. {
  227.   long i;
  228.   i = 0;
  229.   while (i < file->linelen)
  230.   {
  231.     if ((file->fbuf[i] != file->cobs) && (file->fbuf[i] != file->cfree))
  232.       return print_error();
  233.     if (file->fbuf[i] == file->cobs)
  234.       histo[i] = 0;
  235.     if (file->fbuf[i] == file->cfree)
  236.       histo[i] = lasthisto[i] + 1;
  237.     lasthisto[i] = histo[i];
  238.     i++;
  239.   }
  240.   return 0;
  241. }
  242.  
  243. int process_map(t_filereader *file, t_result * res)
  244. {
  245.   long *histo;
  246.   long *lasthisto;
  247.   t_result tres;
  248.   long i;
  249.   i = 0;
  250.   lasthisto = (long *)malloc(file->linelen * sizeof(long));
  251.   clear_histogram(lasthisto, file->linelen);
  252.   while (i < file->lines)
  253.   {
  254.     file->fbuf = (char *)malloc(file->linelen + 1);
  255.     if (buffer_line(file) == -1)
  256.       return print_error();
  257.     file->fbuf[file->linelen] = '\0';
  258.     histo = (long *)malloc(file->linelen * sizeof(long));
  259.     if (fill_histogram(file, histo, lasthisto) == -1)
  260.       return print_error();
  261.     free(file->fbuf);
  262.     prepare_temp_result(&tres, res->sqy);
  263.     find_largest_square(histo, &tres, file->linelen - tres.sqy, file->linelen);
  264.     free(histo);
  265.     assign_result(res, &tres, i);
  266.     i++;
  267.   }
  268.   free(lasthisto);
  269.   return 0;
  270. }
  271.  
  272. void skip_header (t_filereader *file)
  273. {
  274.   file->fbuf = (char *)malloc(file->firstcrpos * sizeof(char) + 1);
  275.   file->bytesread = read(file->fd, file->fbuf, file->firstcrpos * sizeof(char) + 1);
  276.   free(file->fbuf);
  277. }
  278.  
  279. int print_result (t_filereader *file, t_result *res) {
  280.   long i;
  281.   long j;
  282.   if ((file->fd = open(file->filename, O_RDONLY)) == -1)
  283.     return print_error();
  284.   skip_header(file);
  285.   i = 0;
  286.   while (i < file->lines)
  287.   {
  288.     file->fbuf = (char *)malloc((file->linelen + 1) * sizeof(char));
  289.     file->bytesread = read(file->fd, file->fbuf, file->linelen + 1);
  290.     if ((file->fbuf[file->linelen] != '\n') || (file->bytesread != file->linelen + 1))
  291.       return print_error();
  292.     j = 0;
  293.     while (j < file->linelen)
  294.     {
  295.       if ((i > res->sqline - res->sqy) && (i <= res->sqline) && (j >= res->sqx) && (j < res->sqx + res->sqy))
  296.         file->fbuf[j] = file->cfill;
  297.       j++;
  298.     }
  299.     write(1, file->fbuf, file->linelen + 1);
  300.     free(file->fbuf);
  301.     i++;
  302.   }
  303.   close(file->fd);
  304.   return 0;
  305. }
  306.  
  307. int main(int argc, char **argv)
  308. {
  309.   long i;
  310.   t_result res;
  311.   t_filereader file;
  312.   if (argc <= 1)
  313.   {
  314.       if (file_open_stdin(&file) != -1) {
  315.       if (process_header(&file) != -1) {
  316.           clear_result(&res);
  317.           process_map(&file, &res);
  318.           close(file.fd);
  319.           print_result(&file, &res);
  320.         }
  321.       }
  322.   } else {
  323.     i = 1;
  324.     while (i < argc) {
  325.       if (file_open(&file, argv[i]) != -1) {
  326.       if (process_header(&file) != -1) {
  327.           clear_result(&res);
  328.           process_map(&file, &res);
  329.           close(file.fd);
  330.           print_result(&file, &res);
  331.         }
  332.       }
  333.       i++;
  334.     }
  335.   }
  336. }
Advertisement
Add Comment
Please, Sign In to add comment