From a7bb8aa3647a0303586e0a16c349084c332bd6bd Mon Sep 17 00:00:00 2001 From: Jack Halford Date: Wed, 28 Sep 2016 21:49:33 +0200 Subject: [PATCH] much progress on getting the parsing to norm --- fillit/.tags | 17 ++-- fillit/Makefile | 11 ++- fillit/includes/fillit.h | 8 +- fillit/libft | 2 +- fillit/src/fillit_check_waste.c | 4 - fillit/src/fillit_parser.c | 164 +++++++++++++++----------------- fillit/src/fillit_solver.c | 4 +- fillit/src/lib_board.c | 78 --------------- fillit/src/lib_board2.c | 80 ++++++++++++++++ fillit/src/lib_ttmn.c | 30 +++++- fillit/src/main.c | 2 +- 11 files changed, 209 insertions(+), 191 deletions(-) create mode 100644 fillit/src/lib_board2.c diff --git a/fillit/.tags b/fillit/.tags index 1d1c0ede..a156e29a 100644 --- a/fillit/.tags +++ b/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)$/ diff --git a/fillit/Makefile b/fillit/Makefile index 1e63d638..3cd8824a 100644 --- a/fillit/Makefile +++ b/fillit/Makefile @@ -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) diff --git a/fillit/includes/fillit.h b/fillit/includes/fillit.h index 9f896c22..ec704130 100644 --- a/fillit/includes/fillit.h +++ b/fillit/includes/fillit.h @@ -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 diff --git a/fillit/libft b/fillit/libft index e9098a70..70af533d 160000 --- a/fillit/libft +++ b/fillit/libft @@ -1 +1 @@ -Subproject commit e9098a7097a1f3e848fda45403093cb38b540306 +Subproject commit 70af533db4c5a53646e2ea2e371d611cc9959f48 diff --git a/fillit/src/fillit_check_waste.c b/fillit/src/fillit_check_waste.c index eeeaa3dc..78e2ce64 100644 --- a/fillit/src/fillit_check_waste.c +++ b/fillit/src/fillit_check_waste.c @@ -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, '^'); diff --git a/fillit/src/fillit_parser.c b/fillit/src/fillit_parser.c index 97938248..81909ab2 100644 --- a/fillit/src/fillit_parser.c +++ b/fillit/src/fillit_parser.c @@ -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++; diff --git a/fillit/src/fillit_solver.c b/fillit/src/fillit_solver.c index 69155bb9..a6ecc29b 100644 --- a/fillit/src/fillit_solver.c +++ b/fillit/src/fillit_solver.c @@ -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)) diff --git a/fillit/src/lib_board.c b/fillit/src/lib_board.c index 66e149d4..975a4bea 100644 --- a/fillit/src/lib_board.c +++ b/fillit/src/lib_board.c @@ -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); -} diff --git a/fillit/src/lib_board2.c b/fillit/src/lib_board2.c new file mode 100644 index 00000000..7822efb4 --- /dev/null +++ b/fillit/src/lib_board2.c @@ -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] = '.'; + } + } +} diff --git a/fillit/src/lib_ttmn.c b/fillit/src/lib_ttmn.c index ea1bab77..1dcfbd72 100644 --- a/fillit/src/lib_ttmn.c +++ b/fillit/src/lib_ttmn.c @@ -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; diff --git a/fillit/src/main.c b/fillit/src/main.c index 0451fa53..ce120cef 100644 --- a/fillit/src/main.c +++ b/fillit/src/main.c @@ -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);