add safety switch for parsing, fixed agent error
[mc1516pa.git] / modelchecker / sokoban.c
index 4f3c8a1..fd268c0 100644 (file)
@@ -75,13 +75,16 @@ void sokoban_free(sokoban_screen *screen)
        }
 }
 
-sokoban_screen *parse_screen(FILE *stream)
+sokoban_screen *parse_screen(FILE *stream, bool safe)
 {
-       int buffer, x, y, agent_x, agent_y;
+       int buffer, x, y, agent_x, agent_y, boxes, targets, agents;
        x = 0;
        y = 0;
        agent_x = 0;
        agent_y = 0;
+       boxes = 0;
+       targets = 0;
+       agents = 0;
        sokoban_screen *screen = NULL;
        while((buffer = fgetc(stream)) != EOF){
                if (buffer == '\n'){
@@ -95,20 +98,48 @@ sokoban_screen *parse_screen(FILE *stream)
                                screen = add_coord(x, y, AGENT, screen);
                                agent_x = x;
                                agent_y = y;
+                               agents++;
+                               break;
+                       case '.':
+                               screen = add_coord(x, y, TARGET, screen);
+                               targets++;
                                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;
+                       case '$':
+                               screen = add_coord(x, y, BOX, screen);
+                               boxes++;
+                               break;
+                       case '*': 
+                               screen = add_coord(x, y, TARGBOX, screen);
+                               boxes++;
+                               targets++;
+                               break;
+                       case '+': 
+                               screen = add_coord(x, y, TARGAGENT, screen);
+                               agent_x = x;
+                               agent_y = y;
+                               agents++;
+                               targets++;
+                               break;
                        default: return NULL;
                        }
                        x++;
                }
        }
+       if(safe == true && boxes != targets){
+               fprintf(stderr, 
+                       "Invalid screen. Boxes: %d, Targets: %d\n", boxes, targets);
+               exit(1);
+       }
+       if(safe == true && agents != 1){
+               fprintf(stderr, 
+                       "Invalid screen. There has to be exactly one agent. Found: %d\n", 
+                       agents);
+               exit(1);
+       }
+
        sokoban_screen *newscreen = NULL;
        newscreen = sokoban_shrink(agent_x, agent_y, screen, newscreen);
-       //sokoban_print(screen); //unshrinked screen
        sokoban_free(screen);
        return newscreen;
 }