os.c
changeset 28 cd27cb410375
parent 27 545f73869d65
--- a/os.c	Fri Feb 16 23:53:32 2007 +0100
+++ b/os.c	Sat Feb 17 15:14:30 2007 +0100
@@ -15,6 +15,14 @@
 int max_depth_period = 0;
 struct Map * actual_map = NULL;
 
+/* The algorithm data */
+extern struct Map *all_maps;
+extern struct BoxMove *all_movements; /* DEPTH movements of MAX_MOVES */
+extern int *all_mov_tries; /* The actual step in movements for every depth */
+extern int *all_mov_max; /* Maximum of movements per all_movement element */
+extern float *percent;
+extern float *percent_part;
+extern int depth;
 
 void ReadMap(struct Map *M, char *FileName)
 {
@@ -129,9 +137,45 @@
 
 }
 
-void PrintMove(const struct BoxMove b)
+void PrintMoves(const struct BoxMove *b, const int *steps, const int depth)
 {
-	fprintf(stdout,"Box: %i, Direction: {%i,%i}\n", b.box, b.dir.x, b.dir.y);
+	int i;
+	int offset;
+	char *dir;
+
+	/* The first isn't a movement. Movements are stored from b[1] and on */
+	for (i=0; i < depth; ++i)
+	{
+		/* the steps are incremented after try. So to find the movement,
+		 * we should substract 1. */
+		offset = i*MAX_MOVES + steps[i] -1;
+		if (b[offset].dir.x == 0 && 
+			b[offset].dir.y == 1)
+			dir = "down";
+		else if (b[offset].dir.x == 0 && 
+			b[offset].dir.y == -1)
+			dir = "up";
+		else if (b[offset].dir.x == -1 && 
+			b[offset].dir.y == 0)
+			dir = "left";
+		else if (b[offset].dir.x == 1 && 
+			b[offset].dir.y == 0)
+			dir = "right";
+		else
+			dir = "unknown";
+
+		fprintf(stdout,"Box: %i, Direction: %s\n",
+				b[offset].box, dir);
+	}
+}
+
+void show_tries(const int d)
+{
+	int i;
+
+	for(i=0; i<=d; ++i)
+		printf("%i/%i,", all_mov_tries[i], all_mov_max[i]);
+	putchar('\n');
 }
 
 void show_percent_and_map()
@@ -140,6 +184,7 @@
 		min_depth_period, max_depth_period);
 	if(actual_map != NULL)
 		ShowMap(actual_map);
+	show_tries(min_depth_period);
 	fflush(stdout);
 	min_depth_period = MAX_STEPS;
 	max_depth_period = 0;
@@ -184,10 +229,65 @@
         assert(result == 0);
 }
 
+void save_state()
+{
+	FILE *f;
+
+	f = fopen("state.raw", "w");
+	fwrite(all_maps, sizeof(*all_maps), MAX_STEPS+1, f);
+	fwrite(all_movements, sizeof(*all_movements), MAX_MOVES*(MAX_STEPS+1), f);
+	fwrite(all_mov_tries, sizeof(*all_mov_tries), MAX_STEPS+1, f);
+	fwrite(all_mov_max, sizeof(*all_mov_max), MAX_STEPS+1, f);
+	fwrite(percent, sizeof(*percent), MAX_STEPS+1, f);
+	fwrite(percent_part, sizeof(*percent_part), MAX_STEPS+1, f);
+	fwrite(&depth, sizeof(depth), 1, f);
+	fclose(f);
+}
+
+int load_state()
+{
+	FILE *f;
+
+	f = fopen("state.raw", "r");
+	if (f == NULL)
+		return 0;
+	fread(all_maps, sizeof(*all_maps), MAX_STEPS+1, f);
+	fread(all_movements, sizeof(*all_movements), MAX_MOVES*(MAX_STEPS+1), f);
+	fread(all_mov_tries, sizeof(*all_mov_tries), MAX_STEPS+1, f);
+	fread(all_mov_max, sizeof(*all_mov_max), MAX_STEPS+1, f);
+	fread(percent, sizeof(*percent), MAX_STEPS+1, f);
+	fread(percent_part, sizeof(*percent_part), MAX_STEPS+1, f);
+	fread(&depth, sizeof(depth), 1, f);
+	fclose(f);
+	return 1;
+}
+
+static void save_state_callback(const int parameter)
+{
+	save_state();
+	exit(0);
+}
+
+static void program_term_int()
+{
+        struct sigaction my_action;
+        int result;
+
+        my_action.sa_handler = save_state_callback;
+        my_action.sa_flags = 0;
+        memset(&my_action.sa_mask, 0, sizeof(my_action.sa_mask));
+
+        result = sigaction(SIGTERM, &my_action, NULL);
+        assert(result == 0);
+        result = sigaction(SIGINT, &my_action, NULL);
+        assert(result == 0);
+}
+
 void init_os()
 {
 #ifndef DEBUG
 	program_usr1();
+	program_term_int();
 	/* program_alarm();*/
 #endif
 }