much progress on getting the parsing to norm
This commit is contained in:
parent
c9a7badaeb
commit
a7bb8aa364
11 changed files with 209 additions and 191 deletions
17
fillit/.tags
17
fillit/.tags
|
|
@ -1,20 +1,23 @@
|
|||
Mmain src/main.c /^int main(int ac, char **av)$/
|
||||
ft_board_add src/lib_board.c /^int ft_board_add(char **board, t_ttmn ttmn, int i/
|
||||
ft_board_add src/lib_board2.c /^int ft_board_add(char **board, t_ttmn ttmn, int i/
|
||||
ft_board_copy src/lib_board.c /^char **ft_board_copy(char **board)$/
|
||||
ft_board_fill src/lib_board.c /^void ft_board_fill(char **dst, char **src)$/
|
||||
ft_board_free src/lib_board.c /^void ft_board_free(char ***board)$/
|
||||
ft_board_free src/lib_board2.c /^void ft_board_free(char ***board)$/
|
||||
ft_board_init src/lib_board.c /^char **ft_board_init(size_t size)$/
|
||||
ft_board_print src/lib_board.c /^void ft_board_print(char **board)$/
|
||||
ft_board_remove src/lib_board.c /^void ft_board_remove(char **board, char c)$/
|
||||
ft_board_replace src/lib_board.c /^void ft_board_replace(char **board, char a, char b/
|
||||
ft_board_remove src/lib_board2.c /^void ft_board_remove(char **board, char c)$/
|
||||
ft_board_replace src/lib_board2.c /^void ft_board_replace(char **board, char a, char b/
|
||||
ft_check_waste src/fillit_check_waste.c /^int ft_check_waste(char **board, t_list *lttmn, i/
|
||||
ft_fit_blob src/fillit_fit_blob.c /^int ft_fit_blob(char **board, t_list *lttmn, int /
|
||||
ft_floodfill_recursive src/floodfill.c /^int ft_floodfill_recursive(char **board, int size/
|
||||
ft_floodfill_stack src/floodfill.c /^int ft_floodfill_stack(char **board, int size, in/
|
||||
ft_parse_ttmn src/fillit_parser.c /^t_list *ft_parse_ttmn(char *filename)$/
|
||||
ft_show_ttmn src/lib_ttmn.c /^void ft_show_ttmn(t_ttmn ttmn)$/
|
||||
ft_parse src/fillit_parser.c /^t_list *ft_parse(char *filename)$/
|
||||
ft_parse_addttmn src/fillit_parser.c /^int ft_parse_addttmn(int *j, int *k, t_ttmn ttmn,/
|
||||
ft_parse_line src/fillit_parser.c /^int ft_parse_line(char *line, int linenumber, t_l/
|
||||
ft_parse_sharp src/fillit_parser.c /^int ft_parse_sharp(int *j, int *k, t_ttmn *ttmn)$/
|
||||
ft_solved src/fillit_solver.c /^int ft_solved(char **board)$/
|
||||
ft_solver src/fillit_solver.c /^int ft_solver(char **board, t_list *lttmn, int sp/
|
||||
ft_ttmn_print src/lib_ttmn.c /^void ft_ttmn_print(t_ttmn ttmn)$/
|
||||
ft_ttmn_reset src/lib_ttmn.c /^void ft_ttmn_reset(t_list *ttmn)$/
|
||||
ft_ttmn_validate src/lib_ttmn.c /^int ft_ttmn_validate(t_ttmn ttmn)$/
|
||||
ft_usage src/main.c /^void ft_usage(void)$/
|
||||
ft_validate_ttmn src/fillit_parser.c /^int ft_validate_ttmn(t_ttmn ttmn)$/
|
||||
|
|
|
|||
|
|
@ -10,7 +10,8 @@ D_OBJ = obj
|
|||
F_OBJ = $(F_SRC:.c=.o)
|
||||
DF_OBJ := $(addprefix $(D_OBJ)/, $(F_OBJ))
|
||||
|
||||
D_INC = includes
|
||||
D_INC = includes libft/includes
|
||||
O_INC = $(addprefix -I, $(D_INC))
|
||||
|
||||
W_FLAGS = -Wall -Wextra -Werror
|
||||
D_FLAGS =
|
||||
|
|
@ -22,8 +23,8 @@ RM = /bin/rm -rf
|
|||
|
||||
all: libft/libft.a $(NAME) $(TAGFILE)
|
||||
|
||||
test:
|
||||
gcc -Iincludes main.c libftprintf.a
|
||||
test: all
|
||||
cd fillit-tests && ./test 2
|
||||
|
||||
$(TAGFILE): $(D_SRC)/*.c
|
||||
@ctags -f $(TAGFILE) $(addprefix $(D_SRC)/, $(F_SRC))
|
||||
|
|
@ -31,14 +32,14 @@ $(TAGFILE): $(D_SRC)/*.c
|
|||
|
||||
$(D_OBJ)/%.o: $(D_SRC)/%.c $(D_INC)
|
||||
@$(MKDIR) $(D_OBJ)
|
||||
@$(CC) -I$(D_INC) $(W_FLAGS) -c $< -o $@ $(D_FLAGS)
|
||||
@$(CC) $(O_INC) $(W_FLAGS) -c $< -o $@ $(D_FLAGS)
|
||||
@echo "Compiling "$<"..."
|
||||
|
||||
libft/libft.a:
|
||||
@$(MAKE) -C libft/ 2>/dev/null
|
||||
|
||||
$(NAME): $(DF_OBJ)
|
||||
$(CC) -I$(D_INC) -Llibft -lft $(W_FLAGS) $(DF_OBJ) -o $@ $(D_FLAGS)
|
||||
$(CC) $(O_INC) -Llibft -lft $(W_FLAGS) $(DF_OBJ) -o $@ $(D_FLAGS)
|
||||
|
||||
clean:
|
||||
$(RM) $(D_OBJ)
|
||||
|
|
|
|||
|
|
@ -22,7 +22,10 @@ typedef struct s_ttmn
|
|||
int pos[4][2];
|
||||
} t_ttmn;
|
||||
|
||||
t_list *ft_parse_ttmn(char *filename);
|
||||
t_list *ft_parse(char *filename);
|
||||
int ft_parse_line(char *line, int linenumber, t_list **list);
|
||||
int ft_parse_sharp(int *j, int *k, t_ttmn *ttmn);
|
||||
int ft_parse_addttmn(int *j, int *k, t_ttmn ttmn, t_list **list);
|
||||
|
||||
int ft_solver(char **board, t_list *lttmn, int space, int size);
|
||||
int ft_solved(char **board);
|
||||
|
|
@ -41,6 +44,7 @@ void ft_board_replace(char **board, char a, char b);
|
|||
void ft_board_remove(char **board, char c);
|
||||
int ft_board_add(char **board, t_ttmn ttmn, int i, int size);
|
||||
|
||||
void ft_show_ttmn(t_ttmn ttmn);
|
||||
int ft_ttmn_validate(t_ttmn ttmn);
|
||||
void ft_ttmn_print(t_ttmn ttmn);
|
||||
void ft_ttmn_reset(t_list *ttmn);
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
Subproject commit e9098a7097a1f3e848fda45403093cb38b540306
|
||||
Subproject commit 70af533db4c5a53646e2ea2e371d611cc9959f48
|
||||
|
|
@ -19,11 +19,7 @@ int ft_check_waste(char **board, t_list *lttmn, int space, int size)
|
|||
continue ;
|
||||
ft_board_replace(board, '*', '^');
|
||||
blob_size = ft_floodfill_recursive(board, size, i, '*');
|
||||
/* ft_board_print(board); */
|
||||
/* printf("blob size = %i\n", blob_size); */
|
||||
/* fflush(stdout); */
|
||||
space -= blob_size % 4;
|
||||
|
||||
if (space < 0)
|
||||
{
|
||||
ft_board_remove(board, '^');
|
||||
|
|
|
|||
|
|
@ -1,114 +1,100 @@
|
|||
#include "fillit.h"
|
||||
|
||||
int g_target = 0;
|
||||
int g_ttmn = 0;
|
||||
|
||||
int ft_validate_ttmn(t_ttmn ttmn)
|
||||
int ft_parse_line(char *line, int linenumber, t_list **list)
|
||||
{
|
||||
size_t i;
|
||||
size_t j;
|
||||
int touch;
|
||||
static t_ttmn ttmn;
|
||||
static int j = 0;
|
||||
static int k = 0;
|
||||
int i;
|
||||
|
||||
if (!(ttmn.id >= 'A' && ttmn.id <= 'Z'))
|
||||
return(0);
|
||||
|
||||
i = -1;
|
||||
touch = 0;
|
||||
while (++i < 4)
|
||||
if ((linenumber + 1) % 5 == 0)
|
||||
{
|
||||
j = -1;
|
||||
while (++j < 4)
|
||||
{
|
||||
if (i != j
|
||||
&& ((FT_DIST(ttmn.pos[i][0], ttmn.pos[j][0]) == 0
|
||||
&& FT_DIST(ttmn.pos[i][1], ttmn.pos[j][1]) == 1)
|
||||
|| (FT_DIST(ttmn.pos[i][0], ttmn.pos[j][0]) == 1
|
||||
&& FT_DIST(ttmn.pos[i][1], ttmn.pos[j][1]) == 0)))
|
||||
touch++;
|
||||
}
|
||||
if (ft_strlen(line) != 0)
|
||||
return (1);
|
||||
if (ft_parse_addttmn(&j, &k, ttmn, list))
|
||||
return (1);
|
||||
return (0);
|
||||
}
|
||||
if (touch == 6 || touch == 8)
|
||||
if (ft_strlen(line) != 4)
|
||||
return (1);
|
||||
i = -1;
|
||||
while (line[++i])
|
||||
{
|
||||
/* ft_printf("%i,%i,%i: %c\n", i, j, k, line[i]); */
|
||||
if (!ft_strchr(".#", line[i]))
|
||||
return (1);
|
||||
else if (line[i] == '#' && ft_parse_sharp(&j, &k, &ttmn))
|
||||
return (1);
|
||||
j++;
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
|
||||
t_list *ft_parse_ttmn(char *filename)
|
||||
int ft_parse_sharp(int *j, int *k, t_ttmn *ttmn)
|
||||
{
|
||||
static int ref[2];
|
||||
|
||||
if (*k == 0)
|
||||
{
|
||||
ref[0] = *j / 4;
|
||||
ref[1] = *j % 4;
|
||||
/* ft_printf("refs: %i,%i\n", ref[0], ref[1]); */
|
||||
ttmn->pos[0][0] = 0;
|
||||
ttmn->pos[0][1] = 0;
|
||||
}
|
||||
else if (*k <= 3)
|
||||
{
|
||||
ttmn->pos[*k][0] = (*j) / 4 - ref[0];
|
||||
ttmn->pos[*k][1] = (*j) % 4 - ref[1];
|
||||
/* ft_printf("pos: %i,%i\n", ttmn->pos[*k][0], ttmn->pos[*k][1]); */
|
||||
}
|
||||
else
|
||||
return (1);
|
||||
*k += 1;
|
||||
return (0);
|
||||
}
|
||||
|
||||
int ft_parse_addttmn(int *j, int *k, t_ttmn ttmn, t_list **list)
|
||||
{
|
||||
static char id = 'A';
|
||||
t_list *tmp;
|
||||
|
||||
ttmn.id = id++;
|
||||
/* ft_printf("%i,%i\n", *j, *k); */
|
||||
if (*j != 16 || *k != 4)
|
||||
return (1);
|
||||
if (ft_ttmn_validate(ttmn))
|
||||
return (1);
|
||||
tmp = ft_lstnew(&ttmn , sizeof(t_ttmn));
|
||||
ft_lsteadd(list, tmp);
|
||||
*j = 0;
|
||||
*k = 0;
|
||||
return (0);
|
||||
}
|
||||
|
||||
t_list *ft_parse(char *filename)
|
||||
{
|
||||
int fd;
|
||||
char buf[BUF_SIZE + 1];
|
||||
int ret;
|
||||
size_t i;
|
||||
size_t j;
|
||||
size_t k;
|
||||
int ref[2];
|
||||
t_ttmn ttmn;
|
||||
char *line;
|
||||
int linenumber;
|
||||
t_list *list;
|
||||
t_list *tmp;
|
||||
|
||||
list = NULL;
|
||||
fd = open(filename, O_RDONLY);
|
||||
if (fd == -1)
|
||||
if ((fd = open(filename, O_RDONLY)) == -1)
|
||||
return (0);
|
||||
k = 0;
|
||||
j = 0;
|
||||
while ((ret = read(fd, buf, BUF_SIZE)))
|
||||
linenumber = 0;
|
||||
while ((ret = get_next_line(fd, &line)))
|
||||
{
|
||||
buf[ret] = '\0';
|
||||
i = 0;
|
||||
while (buf[i])
|
||||
{
|
||||
if (buf[i] == '.')
|
||||
;
|
||||
else if (buf[i] == '#')
|
||||
{
|
||||
if (k == 0)
|
||||
{
|
||||
ref[0] = j / 5;
|
||||
ref[1] = j % 5;
|
||||
ttmn.pos[0][0] = 0;
|
||||
ttmn.pos[0][1] = 0;
|
||||
ttmn.id = 'A' + ft_lstsize(list);
|
||||
}
|
||||
else if (k <= 3)
|
||||
{
|
||||
ttmn.pos[k][0] = j / 5 - ref[0];
|
||||
ttmn.pos[k][1] = j % 5 - ref[1];
|
||||
}
|
||||
else
|
||||
return (0);
|
||||
k++;
|
||||
}
|
||||
else if (buf[i] == '\n')
|
||||
{
|
||||
if (i > 0 && buf[i - 1] == '\n')
|
||||
{
|
||||
if (j != 20)
|
||||
return (0);
|
||||
if (!ft_validate_ttmn(ttmn))
|
||||
return (0);
|
||||
tmp = ft_lstnew(&ttmn , sizeof(t_ttmn));
|
||||
ft_lsteadd(&list, tmp);
|
||||
j = -1;
|
||||
k = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((j + 1) % 5 != 0)
|
||||
return (0);
|
||||
}
|
||||
}
|
||||
else
|
||||
return (0);
|
||||
i++;
|
||||
j++;
|
||||
}
|
||||
/* ft_printf("parsing line:%s\n", line); */
|
||||
if (ft_parse_line(line, linenumber++, &list))
|
||||
return (0);
|
||||
}
|
||||
if (j != 20)
|
||||
if (ft_parse_line("", linenumber, &list))
|
||||
return (0);
|
||||
if (!ft_validate_ttmn(ttmn))
|
||||
return (0);
|
||||
ft_lsteadd(&list, ft_lstnew(&ttmn , sizeof(t_ttmn)));
|
||||
g_target = 2;
|
||||
g_target = 4;
|
||||
g_ttmn = ft_lstsize(list);
|
||||
while ((g_ttmn * 4) > (g_target) * (g_target))
|
||||
g_target++;
|
||||
|
|
|
|||
|
|
@ -21,14 +21,12 @@ int ft_solver(char **board, t_list *lttmn, int space, int size)
|
|||
ttmn = (t_ttmn *)lttmn->content;
|
||||
if (ttmn->placed)
|
||||
return (ft_solver(board, lttmn->next, space, size));
|
||||
|
||||
/* ft_board_show(board); */
|
||||
/* ft_board_print(board); */
|
||||
i = -1;
|
||||
while (++i < size * size)
|
||||
{
|
||||
if (ft_board_add(board, *ttmn, i, size))
|
||||
continue ;
|
||||
|
||||
/* if (ft_solver(board, lttmn->next, space, size)) */
|
||||
/* return (1); */
|
||||
if (ft_check_waste(board, lttmn->next, space, size))
|
||||
|
|
|
|||
|
|
@ -56,81 +56,3 @@ void ft_board_fill(char **dst, char **src)
|
|||
}
|
||||
}
|
||||
|
||||
void ft_board_free(char ***board)
|
||||
{
|
||||
int i;
|
||||
|
||||
i = 0;
|
||||
while ((*board)[i])
|
||||
{
|
||||
free((*board)[i]);
|
||||
i++;
|
||||
}
|
||||
free(*board);
|
||||
*board = NULL;
|
||||
}
|
||||
|
||||
void ft_board_replace(char **board, char a, char b)
|
||||
{
|
||||
int i;
|
||||
int j;
|
||||
|
||||
i = -1;
|
||||
while (board[++i])
|
||||
{
|
||||
j = -1;
|
||||
while (board[i][++j])
|
||||
{
|
||||
if (board[i][j] == a)
|
||||
board[i][j] = b;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ft_board_remove(char **board, char c)
|
||||
{
|
||||
int i;
|
||||
int j;
|
||||
|
||||
i = -1;
|
||||
while (board[++i])
|
||||
{
|
||||
j = -1;
|
||||
while (board[i][++j])
|
||||
{
|
||||
if (board[i][j] == c)
|
||||
board[i][j] = '.';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int ft_board_add(char **board, t_ttmn ttmn, int i, int size)
|
||||
{
|
||||
int x;
|
||||
int y;
|
||||
int k;
|
||||
|
||||
k = 0;
|
||||
while (k < 4)
|
||||
{
|
||||
x = i % size + ttmn.pos[k][1];
|
||||
y = i / size + ttmn.pos[k][0];
|
||||
/* printf("adding %c to %i,%i\n", block.id, y, x); */
|
||||
/* fflush(stdout); */
|
||||
if (x > size - 1 || y > size - 1 || x < 0 || y < 0)
|
||||
return (1);
|
||||
if (board[y][x] != '.' && board[y][x] != '*')
|
||||
return (1);
|
||||
k++;
|
||||
}
|
||||
k = 0;
|
||||
while (k < 4)
|
||||
{
|
||||
x = i % size + ttmn.pos[k][1];
|
||||
y = i / size + ttmn.pos[k][0];
|
||||
board[y][x] = ttmn.id;
|
||||
/* ft_show_board(board); */
|
||||
k++;
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
|
|
|
|||
80
fillit/src/lib_board2.c
Normal file
80
fillit/src/lib_board2.c
Normal file
|
|
@ -0,0 +1,80 @@
|
|||
#include "fillit.h"
|
||||
|
||||
int ft_board_add(char **board, t_ttmn ttmn, int i, int size)
|
||||
{
|
||||
int x;
|
||||
int y;
|
||||
int k;
|
||||
|
||||
k = 0;
|
||||
while (k < 4)
|
||||
{
|
||||
x = i % size + ttmn.pos[k][1];
|
||||
y = i / size + ttmn.pos[k][0];
|
||||
/* printf("adding %c to %i,%i\n", block.id, y, x); */
|
||||
/* fflush(stdout); */
|
||||
if (x > size - 1 || y > size - 1 || x < 0 || y < 0)
|
||||
return (1);
|
||||
if (board[y][x] != '.' && board[y][x] != '*')
|
||||
return (1);
|
||||
k++;
|
||||
}
|
||||
k = 0;
|
||||
while (k < 4)
|
||||
{
|
||||
x = i % size + ttmn.pos[k][1];
|
||||
y = i / size + ttmn.pos[k][0];
|
||||
board[y][x] = ttmn.id;
|
||||
/* ft_show_board(board); */
|
||||
k++;
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
|
||||
void ft_board_free(char ***board)
|
||||
{
|
||||
int i;
|
||||
|
||||
i = 0;
|
||||
while ((*board)[i])
|
||||
{
|
||||
free((*board)[i]);
|
||||
i++;
|
||||
}
|
||||
free(*board);
|
||||
*board = NULL;
|
||||
}
|
||||
|
||||
void ft_board_replace(char **board, char a, char b)
|
||||
{
|
||||
int i;
|
||||
int j;
|
||||
|
||||
i = -1;
|
||||
while (board[++i])
|
||||
{
|
||||
j = -1;
|
||||
while (board[i][++j])
|
||||
{
|
||||
if (board[i][j] == a)
|
||||
board[i][j] = b;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ft_board_remove(char **board, char c)
|
||||
{
|
||||
int i;
|
||||
int j;
|
||||
|
||||
i = -1;
|
||||
while (board[++i])
|
||||
{
|
||||
j = -1;
|
||||
while (board[i][++j])
|
||||
{
|
||||
if (board[i][j] == c)
|
||||
board[i][j] = '.';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,6 +1,34 @@
|
|||
#include "fillit.h"
|
||||
|
||||
void ft_show_ttmn(t_ttmn ttmn)
|
||||
int ft_ttmn_validate(t_ttmn ttmn)
|
||||
{
|
||||
size_t i;
|
||||
size_t j;
|
||||
int touch;
|
||||
|
||||
if (!(ttmn.id >= 'A' && ttmn.id <= 'Z'))
|
||||
return(1);
|
||||
i = -1;
|
||||
touch = 0;
|
||||
while (++i < 4)
|
||||
{
|
||||
j = -1;
|
||||
while (++j < 4)
|
||||
{
|
||||
if (i != j
|
||||
&& ((FT_DIST(ttmn.pos[i][0], ttmn.pos[j][0]) == 0
|
||||
&& FT_DIST(ttmn.pos[i][1], ttmn.pos[j][1]) == 1)
|
||||
|| (FT_DIST(ttmn.pos[i][0], ttmn.pos[j][0]) == 1
|
||||
&& FT_DIST(ttmn.pos[i][1], ttmn.pos[j][1]) == 0)))
|
||||
touch++;
|
||||
}
|
||||
}
|
||||
if (touch == 6 || touch == 8)
|
||||
return (0);
|
||||
return (1);
|
||||
}
|
||||
|
||||
void ft_ttmn_print(t_ttmn ttmn)
|
||||
{
|
||||
int i;
|
||||
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@ int main(int ac, char **av)
|
|||
char **board;
|
||||
int size;
|
||||
|
||||
if (ac != 2 || !(lttmn = ft_parse_ttmn(av[1])))
|
||||
if (ac != 2 || !(lttmn = ft_parse(av[1])))
|
||||
{
|
||||
ft_usage();
|
||||
return (1);
|
||||
|
|
|
|||
Loading…
Reference in a new issue