parsing rewritten, using hashes now
[mc1516pa.git] / modelchecker / sokoban.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include "uthash.h"
4 #include "sokoban.h"
5
6 sokoban_screen *add_coord(int x, int y, sokoban_tile tile, sokoban_screen *screen)
7 {
8 sokoban_screen *r = NULL;
9
10 r = (sokoban_screen *)malloc(sizeof(sokoban_screen));
11 memset(r, 0, sizeof(sokoban_screen));
12 r->coord.x = x;
13 r->coord.y = y;
14 r->tile = tile;
15 HASH_ADD(hh, screen, coord, sizeof(record_key), r);
16 return screen;
17 }
18
19 sokoban_screen *get_coord(int x, int y, sokoban_screen *screen)
20 {
21 sokoban_screen k, *r = NULL;
22 memset(&k, 0, sizeof(sokoban_screen));
23 k.coord.x = x;
24 k.coord.y = y;
25 HASH_FIND(hh, screen, &k.coord, sizeof(record_key), r);
26 return r;
27 }
28
29 sokoban_screen *delete_coord(int x, int y, sokoban_screen *screen)
30 {
31 sokoban_screen *r = NULL;
32 r = get_coord(x, y, screen);
33 if (r) HASH_DEL(screen, r);
34 return screen;
35 }
36
37 void sokoban_print(sokoban_screen *screen)
38 {
39 sokoban_screen *r;
40 for(r=screen; r != NULL; r = (sokoban_screen *)(r->hh.next)){
41 switch(r->tile){
42 case FREE: printf("x = %d y = %d FREE\n", r->coord.x, r->coord.y); break;
43 case WALL: printf("x = %d y = %d WALL\n", r->coord.x, r->coord.y); break;
44 case BOX: printf("x = %d y = %d BOX\n", r->coord.x, r->coord.y); break;
45 case TARGET: printf("x = %d y = %d TARGET\n", r->coord.x, r->coord.y); break;
46 case AGENT: printf("x = %d y = %d AGENT\n", r->coord.x, r->coord.y); break;
47 case TARGAGENT: printf("x = %d y = %d TARGAGENT\n", r->coord.x, r->coord.y); break;
48 case TARGBOX: printf("x = %d y = %d TARGBOX\n", r->coord.x, r->coord.y); break;
49 }
50 }
51 }
52
53 void sokoban_clear(sokoban_screen *screen)
54 {
55 sokoban_screen *r, *tmp = NULL;
56 HASH_ITER(hh, screen, r, tmp) {
57 HASH_DEL(screen, r);
58 free(r);
59 }
60 }
61
62 sokoban_screen *parse_screen(FILE *stream)
63 {
64 int buffer, x, y;
65 x = 0;
66 y = 0;
67 sokoban_screen *screen = NULL;
68 while((buffer = fgetc(stream)) != EOF){
69 if (buffer == '\n'){
70 x = 0;
71 y++;
72 }
73 else {
74 switch(buffer) {
75 case ' ': screen = add_coord(x, y, FREE, screen); break;
76 case '@': screen = add_coord(x, y, AGENT, screen); break;
77 case '.': screen = add_coord(x, y, TARGET, screen); break;
78 case '#': screen = add_coord(x, y, WALL, screen); break;
79 case '$': screen = add_coord(x, y, BOX, screen); break;
80 case '*': screen = add_coord(x, y, TARGBOX, screen); break;
81 case '+': screen = add_coord(x, y, TARGAGENT, screen); break;
82 default: return NULL;
83 }
84 x++;
85 }
86 }
87 sokoban_screen *test = NULL;
88 test = get_coord(0,0,screen);
89 if(test->tile == TARGAGENT) printf("Yuppi\n");
90 return screen;
91 }