much progress on getting the parsing to norm

This commit is contained in:
Jack Halford 2016-09-28 21:49:33 +02:00
parent c9a7badaeb
commit a7bb8aa364
11 changed files with 209 additions and 191 deletions

View file

@ -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)$/

View file

@ -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)

View file

@ -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

View file

@ -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, '^');

View file

@ -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++;

View file

@ -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))

View file

@ -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
View 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] = '.';
}
}
}

View file

@ -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;

View file

@ -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);