--- 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
}