parsing rewritten, using hashes now
[mc1516pa.git] / modelchecker / sokoban.c
index 1abda09..d5e967f 100644 (file)
@@ -1,38 +1,91 @@
 #include <stdio.h>
 #include <stdlib.h>
+#include "uthash.h"
 #include "sokoban.h"
 
+sokoban_screen *add_coord(int x, int y, sokoban_tile tile, sokoban_screen *screen)
+{
+       sokoban_screen *r = NULL;
 
-//Still need to remove outside walls
-struct sokoban_screen *parse_screen(FILE *stream){
-    int buffer, x, y;
-    x = 0;
-    y = 0;
-    struct sokoban_screen *head, *current;
-    head = NULL;
-    while((buffer = fgetc(stream)) != EOF){
-        if (buffer == '\n'){
-            x = 0;
-            y++;
-        }
-        else {
-            current = (struct sokoban_screen *)malloc(sizeof(struct sokoban_screen));
-            current->next = head;
-            switch(buffer) {
-                case ' ' : current->tile = FREE; break;
-                case '@' : current->tile = AGENT; break;
-                case '.' : current->tile = TARGET; break;
-                case '#' : current->tile = WALL; break;
-                case '$' : current->tile = BOX; break;
-                case '*' : current->tile = TARGBOX; break;
-                case '+' : current->tile = TARGAGENT; break;
-                default: return NULL;
-            }
-            current->x = x;
-            current->y = y;
-            x++;
-            head = current;
-        }
-    }
-    return head;
- }
+       r = (sokoban_screen *)malloc(sizeof(sokoban_screen));
+       memset(r, 0, sizeof(sokoban_screen));
+       r->coord.x = x;
+       r->coord.y = y;
+       r->tile = tile;
+       HASH_ADD(hh, screen, coord, sizeof(record_key), r);
+       return screen;
+}
+
+sokoban_screen *get_coord(int x, int y, sokoban_screen *screen)
+{
+       sokoban_screen k, *r = NULL;
+       memset(&k, 0, sizeof(sokoban_screen));
+       k.coord.x = x;
+       k.coord.y = y;
+       HASH_FIND(hh, screen, &k.coord, sizeof(record_key), r);
+       return r;
+}
+
+sokoban_screen *delete_coord(int x, int y, sokoban_screen *screen)
+{
+       sokoban_screen *r = NULL;
+       r = get_coord(x, y, screen);
+       if (r) HASH_DEL(screen, r);
+       return screen;
+}
+
+void sokoban_print(sokoban_screen *screen)
+{
+       sokoban_screen *r;
+       for(r=screen; r != NULL; r = (sokoban_screen *)(r->hh.next)){
+               switch(r->tile){
+               case FREE: printf("x = %d y = %d FREE\n", r->coord.x, r->coord.y); break;
+               case WALL: printf("x = %d y = %d WALL\n", r->coord.x, r->coord.y); break;
+               case BOX: printf("x = %d y = %d BOX\n", r->coord.x, r->coord.y); break;
+               case TARGET: printf("x = %d y = %d TARGET\n", r->coord.x, r->coord.y); break;
+               case AGENT: printf("x = %d y = %d AGENT\n", r->coord.x, r->coord.y); break;
+               case TARGAGENT: printf("x = %d y = %d TARGAGENT\n", r->coord.x, r->coord.y); break;
+               case TARGBOX: printf("x = %d y = %d TARGBOX\n", r->coord.x, r->coord.y); break;
+               }
+       }
+}
+
+void sokoban_clear(sokoban_screen *screen)
+{
+       sokoban_screen *r, *tmp = NULL;
+       HASH_ITER(hh, screen, r, tmp) {
+               HASH_DEL(screen, r);
+               free(r);
+       }
+}
+
+sokoban_screen *parse_screen(FILE *stream)
+{
+       int buffer, x, y;
+       x = 0;
+       y = 0;
+       sokoban_screen *screen = NULL;
+       while((buffer = fgetc(stream)) != EOF){
+               if (buffer == '\n'){
+                       x = 0;
+                       y++;
+               }
+               else {
+                       switch(buffer) {
+                       case ' ': screen = add_coord(x, y, FREE, screen); break;
+                       case '@': screen = add_coord(x, y, AGENT, screen); break;
+                       case '.': screen = add_coord(x, y, TARGET, screen); break;
+                       case '#': screen = add_coord(x, y, WALL, screen); break;
+                       case '$': screen = add_coord(x, y, BOX, screen); break;
+                       case '*': screen = add_coord(x, y, TARGBOX, screen); break;
+                       case '+': screen = add_coord(x, y, TARGAGENT, screen); break;
+                       default: return NULL;
+                       }
+                       x++;
+               }
+       }
+       sokoban_screen *test = NULL;
+       test = get_coord(0,0,screen);
+       if(test->tile == TARGAGENT) printf("Yuppi\n");
+       return screen;
+}