sta-s2z

Untitled

Jul 24th, 2019
205
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.16 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 filesize_cr(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 ((fd = open(filename, O_RDONLY)) == -1)
  69.     return (-1);
  70.   while (size > 0)
  71.   {
  72.     size = read(fd, &buf, sizeof(buf));
  73.     if (*crpos == -1)
  74.     {
  75.       c = 0;
  76.       while (c < size)
  77.       {
  78.         if ((buf[c] == '\n') && (*crpos == -1))
  79.           *crpos = (long)fs + c;
  80.         c++;
  81.       }
  82.     }
  83.     fs += size;
  84.   }
  85.   close(fd);
  86.   return fs;
  87. }
  88.  
  89. int dump_stdin(char * filename)
  90. {
  91.   char buf[300000];
  92.   int fd;
  93.   int fo;
  94.   long size;
  95.   fd = 0;
  96.   size = 1;
  97.   if ((fo = open(filename, O_CREAT | O_TRUNC | O_WRONLY, 0777)) == -1)
  98.     return (-1);
  99.   while ((size = read(0, &buf, sizeof(buf))) > 0) {
  100.     write(fo, &buf, size);
  101.   }
  102.   close(fo);
  103. }
  104.  
  105. inline void find_largest_square(long *histo, t_result *t, long len, long nlen)
  106. {
  107.   long i;
  108.   t_finder f;
  109.   f.pos = 0;
  110.   while (f.pos < len)
  111.   {
  112.     f.size = histo[f.pos];
  113.     while (f.size > t->sqy)
  114.     {
  115.       f.is_square = nlen - (f.pos + f.size);
  116.       i = f.pos;
  117.       while ((f.is_square >= 0) && (i < f.pos + f.size))
  118.       {
  119.         f.is_square = histo[i] - f.size;
  120.         i++;
  121.       }
  122.       if ((f.is_square >= 0) && (f.size > t->sqy))
  123.       {
  124.         t->sqx = f.pos;
  125.         t->sqy = f.size;
  126.       }
  127.       f.size--;
  128.     }
  129.     f.pos++;
  130.   }
  131.   t->sqsize = t->sqy * t->sqy;
  132. }
  133.  
  134. int count_line_length(t_filereader *file, long offset)
  135. {
  136.   long cpow = 0;
  137.   long i;
  138.   cpow = 0;
  139.   i = offset;
  140.   file->lines = 0;
  141.   while (i >= 0) /* atoi */
  142.   {
  143.     if (file->fbuf[i] > '9' || file->fbuf[i] < '0')
  144.       return -1;
  145.     file->lines += (file->fbuf[i] - '0') * pw(10, cpow);
  146.     cpow++;
  147.     i--;
  148.   }
  149.   return 0;
  150. }
  151.  
  152. int process_header(t_filereader *file)
  153. {
  154.   char temp;
  155.   file->fbuf = (char *)malloc(file->firstcrpos * sizeof(char) + 1);
  156.   file->bytesread = read(file->fd, file->fbuf, file->firstcrpos * sizeof(char));
  157.   if ((file->bytesread != file->firstcrpos * sizeof(char)) || (file->bytesread < 4))
  158.     return print_error();
  159.   file->fbuf[file->bytesread] = '\0';
  160.   file->cfill = file->fbuf[file->bytesread - 1];
  161.   file->cobs = file->fbuf[file->bytesread - 2];
  162.   file->cfree = file->fbuf[file->bytesread - 3];
  163.   file->fbuf[file->bytesread - 3] = '\0';
  164.   if (count_line_length(file, file->bytesread - 4) == -1)
  165.     return print_error();
  166.   file->linelen = ((file->fsize - file->bytesread) / file->lines) - 1;
  167.   free(file->fbuf);
  168.   file->bytesread = read(file->fd, &temp, sizeof(char));
  169.   if (temp != '\n')
  170.     return print_error();
  171. }
  172. int file_open(t_filereader * file, char * filename)
  173. {
  174.   file->filename = filename;
  175.   file->firstcrpos = 0;
  176.   file->fsize = filesize_cr(file->filename, &file->firstcrpos);
  177.   if (file->fsize == -1)
  178.     return print_error();
  179.   if ((file->fd = open(file->filename, O_RDONLY)) == -1)
  180.     return print_error();
  181. }
  182.  
  183. int file_open_stdin(t_filereader * file, char * filename)
  184. {
  185.   if (dump_stdin(filename) == -1)
  186.     return print_error();
  187.   file->filename = filename;
  188.   file->firstcrpos = 0;
  189.   file->fsize = filesize_cr(filename, &file->firstcrpos);
  190.   if (file->fsize == -1)
  191.     return print_error();
  192.   if ((file->fd = open(file->filename, O_RDONLY)) == -1)
  193.     return print_error();
  194. }
  195.  
  196. inline void assign_result(t_result *res, t_result *temp_res, long line)
  197. {
  198.   if (res->sqsize < temp_res->sqsize)
  199.   {
  200.     res->sqsize = temp_res->sqsize;
  201.     res->sqx = temp_res->sqx;
  202.     res->sqy = temp_res->sqy;
  203.     res->sqline = line;
  204.   }
  205. }
  206.  
  207. inline void prepare_temp_result(t_result *tres, long initvalue) {
  208.   tres->sqsize = 0;
  209.   tres->sqx = 0;
  210.   tres->sqy = initvalue;
  211.   return;
  212. }
  213.  
  214. inline void clear_result(t_result *res)
  215. {
  216.   res->sqx = 0;
  217.   res->sqy = 0;
  218.   res->sqsize = 0;
  219.   res->sqline = 0;
  220. }
  221.  
  222. int buffer_line (t_filereader *file)
  223. {
  224.   file->bytesread = read(file->fd, file->fbuf, file->linelen + 1);
  225.   if ((file->fbuf[file->linelen] != '\n') || (file->bytesread != file->linelen + 1))
  226.     return print_error();
  227.   return 0;
  228. }
  229.  
  230. void clear_histogram(long * h, long length)
  231. {
  232.   long i;
  233.   i = 0;
  234.   while (i < length)
  235.   {
  236.     h[i] = 0;
  237.     i++;
  238.   }
  239. }
  240.  
  241. inline int fill_histogram(t_filereader *file, long *histo, long *lasthisto)
  242. {
  243.   long i;
  244.   i = 0;
  245.   while (i < file->linelen)
  246.   {
  247.     if ((file->fbuf[i] != file->cobs) && (file->fbuf[i] != file->cfree))
  248.       return print_error();
  249.     if (file->fbuf[i] == file->cobs)
  250.       histo[i] = 0;
  251.     if (file->fbuf[i] == file->cfree)
  252.       histo[i] = lasthisto[i] + 1;
  253.     lasthisto[i] = histo[i];
  254.     i++;
  255.   }
  256.   return 0;
  257. }
  258.  
  259. inline int process_map(t_filereader *file, t_result * res)
  260. {
  261.   long *histo;
  262.   long *lasthisto;
  263.   t_result tres;
  264.   long i;
  265.   i = 0;
  266.   lasthisto = (long *)malloc(file->linelen * sizeof(long));
  267.   clear_histogram(lasthisto, file->linelen);
  268.   while (i < file->lines)
  269.   {
  270.     file->fbuf = (char *)malloc(file->linelen + 1);
  271.     if (buffer_line(file) == -1)
  272.       return print_error();
  273.     file->fbuf[file->linelen] = '\0';
  274.     histo = (long *)malloc(file->linelen * sizeof(long));
  275.     if (fill_histogram(file, histo, lasthisto) == -1)
  276.       return print_error();
  277.     free(file->fbuf);
  278.     prepare_temp_result(&tres, res->sqy);
  279.     find_largest_square(histo, &tres, file->linelen - tres.sqy, file->linelen);
  280.     free(histo);
  281.     assign_result(res, &tres, i);
  282.     i++;
  283.   }
  284.   free(lasthisto);
  285.   return 0;
  286. }
  287.  
  288. void skip_header (t_filereader *file)
  289. {
  290.   file->fbuf = (char *)malloc(file->firstcrpos * sizeof(char) + 1);
  291.   file->bytesread = read(file->fd, file->fbuf, file->firstcrpos * sizeof(char) + 1);
  292.   free(file->fbuf);
  293. }
  294.  
  295. int print_result (t_filereader *file, t_result *res) {
  296.   long i;
  297.   long j;
  298.   if ((file->fd = open(file->filename, O_RDONLY)) == -1)
  299.     return print_error();
  300.   skip_header(file);
  301.   i = 0;
  302.   while (i < file->lines)
  303.   {
  304.     file->fbuf = (char *)malloc((file->linelen + 1) * sizeof(char));
  305.     file->bytesread = read(file->fd, file->fbuf, file->linelen + 1);
  306.     if ((file->fbuf[file->linelen] != '\n') || (file->bytesread != file->linelen + 1))
  307.       return print_error();
  308.     j = 0;
  309.     while (j < file->linelen)
  310.     {
  311.       if ((i > res->sqline - res->sqy) && (i <= res->sqline) && (j >= res->sqx) && (j < res->sqx + res->sqy))
  312.         file->fbuf[j] = file->cfill;
  313.       j++;
  314.     }
  315.     write(1, file->fbuf, file->linelen + 1);
  316.     free(file->fbuf);
  317.     i++;
  318.   }
  319.   close(file->fd);
  320.   return 0;
  321. }
  322.  
  323. void run_stdin(t_filereader * file, t_result * res, char * filename)
  324. {
  325.   if (file_open_stdin(file, filename) != -1)
  326.     if (process_header(file) != -1)
  327.     {
  328.       clear_result(res);
  329.       if (process_map(file, res) != -1)
  330.       {
  331.         close(file->fd);
  332.         print_result(file, res);
  333.       }
  334.     }
  335.   write(1, "\n", 1);
  336. }
  337. void run_files(t_filereader * file, t_result * res, char ** av, int ac)
  338. {
  339.   int i;
  340.   i = 1;
  341.   while (i < ac) {
  342.     if (file_open(file, av[i]) != -1)
  343.     {
  344.       if (process_header(file) != -1)
  345.       {
  346.         clear_result(res);
  347.         if (process_map(file, res) != -1)
  348.         {
  349.           close(file->fd);
  350.           print_result(file, res);
  351.         }
  352.       }
  353.     }
  354.     write(1, "\n", 1);
  355.     i++;
  356.   }
  357. }
  358.  
  359. int main(int argc, char **argv)
  360. {
  361.   t_result res;
  362.   t_filereader file;
  363.   if (argc <= 1)
  364.     run_stdin(&file, &res, "bsq.tmp");
  365.   else
  366.     run_files(&file, &res, argv, argc);
  367. }
Advertisement
Add Comment
Please, Sign In to add comment