#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#define BUF_SIZE 1
void ft_putchar(char c)
{
write(1, &c, 1);
}
int count_cols(char *filename)
{
int cols;
char buf[1];
int fd;
int size;
int cont;
fd = 0;
cols = 0;
cont = 1;
fd = open(filename, O_RDONLY);
if (fd)
{
while((size = read(fd, buf, BUF_SIZE)) && (cont == 1))
{
if ((buf[0] != '\n') && (buf[0] != ' '))
{
cols++;
}
else
cont = 0;
}
}
return (cols);
}
int count_rows(char *filename)
{
int rows;
char buf[1];
int fd;
int size;
int cont;
fd = 0;
rows = 0;
cont = 1;
fd = open(filename, O_RDONLY);
if (fd)
{
while((size = read(fd, buf, BUF_SIZE)))
{
if (buf[0] == '\n')
{
rows++;
}
}
}
return (rows + 1);
}
void fill_map(int **map,int fd, int row, int col)
{
ssize_t size;
char buf[BUF_SIZE];
size = 0;
while ((size = read(fd, buf, BUF_SIZE)))
{
if (size < 1)
return (0);
buf[size] = '\0';
if (buf[0] == '\n')
{
map
[row
] = malloc(sizeof(int) * (col
+ 1)); row += 1;
col = 0;
}
else
{
if (buf[0] == '.')
map[row][col] = 1;
else if (buf[0] == 'o')
map[row][col] = 0;
col++;
}
}
}
int **ft_create_map(char *filename, int nb_cols, int nb_rows)
{
int **map;
int fd;
int row;
int col;
ssize_t size;
// char buf[BUF_SIZE];
row = 0;
size = 0;
col = 0;
map
= (int **)malloc(nb_rows
* sizeof(int *)); if (!map)
return (map);
map
[0] = malloc(sizeof(int) * nb_cols
); fd = open(filename, O_RDONLY);
if (!fd)
return (NULL);
fill_map(map, fd, row, col);
return (map);
}
int min(int a, int b, int c)
{
int m;
m = a;
if (m > b)
m = b;
if (m > c)
m = c;
return m;
}
void printf_max_square(int **map, int rows, int cols)
{
int i;
int S[rows][cols];
int max_of_s;
int max_i;
int max_j;
int j;
i = 0;
j = 0;
while (i < rows)
{
S[i][0] = map[i][0];
i++;
}
while (j < cols)
{
S[0][j] = map[0][j];
j++;
}
i = 1;
while (i < rows)
{
j = 1;
while (j < cols)
{
if (map[i][j] == 1)
S[i][j] = min(S[i][j - 1], S[i - 1][j], S[i - 1][j - 1]) + 1;
else
S[i][j] = 0;
j++;
}
i++;
}
max_of_s = S[0][0];
max_i = 0;
max_j = 0;
i = 0;
while (i < rows)
{
j = 0;
while (j < cols)
{
if (max_of_s < S[i][j])
{
max_of_s = S[i][j];
max_i = i;
max_j = j;
}
j++;
}
i++;
}
i = max_i;
while (i > (max_i - max_of_s))
{
j = max_j;
while (j > (max_j - max_of_s))
{
map[i][j] = '*';
j--;
}
i--;
}
}
void ft_read_file(char *filename)
{
int rows;
char buf[1];
int fd;
int size;
int cont;
fd = 0;
rows = 0;
cont = 1;
fd = open(filename, O_RDONLY);
if (fd)
{
while((size = read(fd, buf, BUF_SIZE)))
{
buf[size] = '\0';
ft_putchar(buf[0]);
}
}
}
int main(int argc, char **argv)
{
if (argc <= 1)
return (1);
int cols = count_cols(argv[1]);
int rows = count_rows(argv[1]);
int **arr;
arr = ft_create_map(argv[1], cols, rows);
printf_max_square(arr, rows, cols);
int i = 0;
int j;
while (i < rows)
{
j = 0;
while (j < cols)
{
if (arr[i][j] == 42)
else if (arr[i][j] == 0)
else
j++;
}
i++;
}
return 0;
}
I2luY2x1ZGUgPHVuaXN0ZC5oPgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpbmNsdWRlIDxzeXMvc3RhdC5oPgojaW5jbHVkZSA8ZmNudGwuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KCiNkZWZpbmUJQlVGX1NJWkUgMQoKdm9pZAlmdF9wdXRjaGFyKGNoYXIgYykKewoJd3JpdGUoMSwgJmMsIDEpOwp9CgppbnQJCWNvdW50X2NvbHMoY2hhciAqZmlsZW5hbWUpCnsKCWludAkJY29sczsKCWNoYXIJYnVmWzFdOwoJaW50CQlmZDsKCWludAkJc2l6ZTsKCWludAkJY29udDsKCglmZCA9IDA7Cgljb2xzID0gMDsKCWNvbnQgPSAxOwoJZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWSk7CglpZiAoZmQpCgl7CgkJd2hpbGUoKHNpemUgPSByZWFkKGZkLCBidWYsIEJVRl9TSVpFKSkgJiYgKGNvbnQgPT0gMSkpCgkJewoJCQlpZiAoKGJ1ZlswXSAhPSAnXG4nKSAmJiAoYnVmWzBdICE9ICcgJykpCgkJCXsKCQkJCWNvbHMrKzsKCQkJfQoJCQllbHNlCgkJCQljb250ID0gMDsKCQl9Cgl9CglyZXR1cm4gKGNvbHMpOwp9CgppbnQJCWNvdW50X3Jvd3MoY2hhciAqZmlsZW5hbWUpCnsKCWludAkJcm93czsKCWNoYXIJYnVmWzFdOwoJaW50CQlmZDsKCWludAkJc2l6ZTsKCWludAkJY29udDsKCglmZCA9IDA7Cglyb3dzID0gMDsKCWNvbnQgPSAxOwoJZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWSk7CglpZiAoZmQpCgl7CgkJd2hpbGUoKHNpemUgPSByZWFkKGZkLCBidWYsIEJVRl9TSVpFKSkpCgkJewoJCQlpZiAoYnVmWzBdID09ICdcbicpCgkJCXsKCQkJCXJvd3MrKzsKCQkJfQoJCX0KCX0KCXJldHVybiAocm93cyArIDEpOwp9Cgp2b2lkIGZpbGxfbWFwKGludCAqKm1hcCxpbnQgZmQsIGludCByb3csIGludCBjb2wpCnsKCXNzaXplX3QJc2l6ZTsKCWNoYXIJYnVmW0JVRl9TSVpFXTsKCglzaXplID0gMDsKCXdoaWxlICgoc2l6ZSA9IHJlYWQoZmQsIGJ1ZiwgQlVGX1NJWkUpKSkKCXsKCQlpZiAoc2l6ZSA8IDEpCgkJCXJldHVybiAoMCk7CgkJYnVmW3NpemVdID0gJ1wwJzsKCQlpZiAoYnVmWzBdID09ICdcbicpCgkJewoJCQltYXBbcm93XSA9IG1hbGxvYyhzaXplb2YoaW50KSAqIChjb2wgKyAxKSk7CgkJCXJvdyArPSAxOwoJCQljb2wgPSAwOwoJCX0KCQllbHNlCgkJewoJCQlpZiAoYnVmWzBdID09ICcuJykKCQkJCW1hcFtyb3ddW2NvbF0gPSAxOwoJCQllbHNlIGlmIChidWZbMF0gPT0gJ28nKQoJCQkJbWFwW3Jvd11bY29sXSA9IDA7CgkJCWNvbCsrOwoJCX0KCX0KfQoKaW50CQkqKmZ0X2NyZWF0ZV9tYXAoY2hhciAqZmlsZW5hbWUsIGludCBuYl9jb2xzLCBpbnQgbmJfcm93cykKewoJaW50CQkqKm1hcDsKCWludAkJZmQ7CglpbnQJCXJvdzsKCWludAkJY29sOwoJc3NpemVfdAlzaXplOwoJLy8gY2hhcglidWZbQlVGX1NJWkVdOwoKCXJvdyA9IDA7CglzaXplID0gMDsKCWNvbCA9IDA7CgltYXAgPSAoaW50ICoqKW1hbGxvYyhuYl9yb3dzICogc2l6ZW9mKGludCAqKSk7CglpZiAoIW1hcCkKCQlyZXR1cm4gKG1hcCk7CgltYXBbMF0gPSBtYWxsb2Moc2l6ZW9mKGludCkgKiBuYl9jb2xzKTsKCWZkID0gb3BlbihmaWxlbmFtZSwgT19SRE9OTFkpOwoJaWYgKCFmZCkKCQlyZXR1cm4gKE5VTEwpOwoJZmlsbF9tYXAobWFwLCBmZCwgcm93LCBjb2wpOwoJcmV0dXJuIChtYXApOwp9CgppbnQJCW1pbihpbnQgYSwgaW50IGIsIGludCBjKQp7CglpbnQJbTsKCgltID0gYTsKCWlmIChtID4gYikKCQltID0gYjsKCWlmIChtID4gYykKCQltID0gYzsKCXJldHVybiBtOwp9Cgp2b2lkCXByaW50Zl9tYXhfc3F1YXJlKGludCAqKm1hcCwgaW50IHJvd3MsIGludCBjb2xzKQp7CglpbnQJaTsKCWludAlTW3Jvd3NdW2NvbHNdOwoJaW50CW1heF9vZl9zOwoJaW50CW1heF9pOwoJaW50CW1heF9qOwoJaW50CWo7CgoJaSA9IDA7CglqID0gMDsKCXdoaWxlIChpIDwgcm93cykKCXsKCQlTW2ldWzBdID0gbWFwW2ldWzBdOwoJCWkrKzsKCX0KCXdoaWxlIChqIDwgY29scykKCXsKCQlTWzBdW2pdID0gbWFwWzBdW2pdOwoJCWorKzsKCX0KCglpID0gMTsKCXdoaWxlIChpIDwgcm93cykKCXsKCQlqID0gMTsKCQl3aGlsZSAoaiA8IGNvbHMpCgkJewoJCQlpZiAobWFwW2ldW2pdID09IDEpCgkJCQlTW2ldW2pdID0gbWluKFNbaV1baiAtIDFdLCBTW2kgLSAxXVtqXSwgU1tpIC0gMV1baiAtIDFdKSArIDE7CgkJCWVsc2UKCQkJCVNbaV1bal0gPSAwOwoJCQlqKys7CgkJfQoJCWkrKzsKCX0KCW1heF9vZl9zID0gU1swXVswXTsKCW1heF9pID0gMDsKCW1heF9qID0gMDsKCWkgPSAwOwoJd2hpbGUgKGkgPCByb3dzKQoJewoJCWogPSAwOwoJCXdoaWxlIChqIDwgY29scykKCQl7CgkJCWlmIChtYXhfb2ZfcyA8IFNbaV1bal0pCgkJCXsKCQkJCW1heF9vZl9zID0gU1tpXVtqXTsKCQkJCW1heF9pID0gaTsKCQkJCW1heF9qID0gajsKCQkJfQoJCQlqKys7CgkJfQoJCWkrKzsKCX0KCWkgPSBtYXhfaTsKCXdoaWxlIChpID4gKG1heF9pIC0gbWF4X29mX3MpKQoJewoJCWogPSBtYXhfajsKCQl3aGlsZSAoaiA+IChtYXhfaiAtIG1heF9vZl9zKSkKCQl7CgkJCW1hcFtpXVtqXSA9ICcqJzsKCQkJai0tOwoJCX0KCQlpLS07Cgl9Cn0KCnZvaWQJZnRfcmVhZF9maWxlKGNoYXIgKmZpbGVuYW1lKQp7CglpbnQJCXJvd3M7CgljaGFyCWJ1ZlsxXTsKCWludAkJZmQ7CglpbnQJCXNpemU7CglpbnQJCWNvbnQ7CgoJZmQgPSAwOwoJcm93cyA9IDA7Cgljb250ID0gMTsKCWZkID0gb3BlbihmaWxlbmFtZSwgT19SRE9OTFkpOwoJaWYgKGZkKQoJewoJCXdoaWxlKChzaXplID0gcmVhZChmZCwgYnVmLCBCVUZfU0laRSkpKQoJCXsKCQkJYnVmW3NpemVdID0gJ1wwJzsKCQkJZnRfcHV0Y2hhcihidWZbMF0pOwoJCX0KCX0KfQoKaW50CQltYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKewoJaWYgKGFyZ2MgPD0gMSkKCQlyZXR1cm4gKDEpOwoJaW50IGNvbHMgPSBjb3VudF9jb2xzKGFyZ3ZbMV0pOwoJaW50IHJvd3MgPSBjb3VudF9yb3dzKGFyZ3ZbMV0pOwoJaW50CSoqYXJyOwoKCWFyciA9IGZ0X2NyZWF0ZV9tYXAoYXJndlsxXSwgY29scywgcm93cyk7CglwcmludGZfbWF4X3NxdWFyZShhcnIsIHJvd3MsIGNvbHMpOwoJaW50IGkgPSAwOwogIGludCBqOwogIHdoaWxlIChpIDwgcm93cykKICB7CiAgCWogPSAwOwogIAl3aGlsZSAoaiA8IGNvbHMpCiAgCXsKICAJCWlmIChhcnJbaV1bal0gPT0gNDIpCiAgCQkJcHJpbnRmKCIlYyIsICdYJyk7CiAgCQllbHNlIGlmIChhcnJbaV1bal0gPT0gMCkKICAJCQlwcmludGYoIiVjIiwgJ28nKTsKICAJCWVsc2UKICAJCQlwcmludGYoIiVjIiwgJy4nKTsKICAJCWorKzsKICAJfQogIAlwcmludGYoIlxuIik7CiAgCWkrKzsKICB9CglyZXR1cm4gMDsKfQo=