os.c
author viric@llimona
Sat, 06 May 2006 00:34:04 +0200
changeset 6 bfbca2c0fc70
child 8 b41a580b3abe
permissions -rw-r--r--
More file separation.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
6
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
     1
#include <stdio.h>
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
     2
#include <string.h>
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
     3
#include <stdlib.h>
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
     4
#include <unistd.h>
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
     5
#include <signal.h>
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
     6
#include <assert.h>
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
     7
#include "general.h"
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
     8
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
     9
/* Things related to the showing of the status */
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    10
float percent_to_show = 0;
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    11
int depth_to_show = 0;
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    12
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    13
int max_depth = 0;
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    14
int min_depth_period = 0;
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    15
int max_depth_period = 0;
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    16
struct Map * actual_map;
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    17
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    18
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    19
void ReadMap(struct Map *M, char *FileName)
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    20
{
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    21
	FILE *Fitxer;
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    22
	int i,j;
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    23
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    24
	if(!(Fitxer = fopen(FileName, "r")))
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    25
	{
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    26
		printf("Error opening %s!", FileName);
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    27
		exit(1);
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    28
	}
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    29
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    30
	M->SizeX=0;
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    31
	M->SizeY=0;
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    32
	while (!feof(Fitxer))
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    33
	{
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    34
		fgets(M->Cells[M->SizeY], MAX_X, Fitxer);
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    35
		M->SizeY++;
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    36
	}
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    37
	M->SizeY--;
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    38
	M->SizeX = strlen(M->Cells[0]) - 1;
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    39
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    40
	M->NumPlatforms = 0;
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    41
	M->NumBoxesInPlatform = 0;
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    42
	M->NumBoxes = 0;
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    43
	for (j = 0; j<M->SizeY; j++)
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    44
		for (i=0; i<M->SizeX; i++)
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    45
		{
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    46
			if (M->Cells[j][i] == MAN)
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    47
			{ 
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    48
				M->Man.x = i; M->Man.y = j; 
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    49
				M->Cells[M->Man.y][M->Man.x] = BLANK;
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    50
			}
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    51
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    52
			if (M->Cells[j][i] == PLATFORM)
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    53
				M->NumPlatforms++;
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    54
			else if (M->Cells[j][i] == BOXINPLATFORM)
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    55
			{
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    56
				M->Cells[j][i] = PLATFORM;
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    57
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    58
				M->NumPlatforms++;
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    59
				M->NumBoxesInPlatform++;
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    60
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    61
				M->Box[M->NumBoxes].x = i;
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    62
				M->Box[M->NumBoxes].y = j;
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    63
				M->NumBoxes++;
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    64
			} else if (M->Cells[j][i] == BOX)
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    65
			{
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    66
				M->Cells[j][i] = BLANK;
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    67
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    68
				M->Box[M->NumBoxes].x = i;
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    69
				M->Box[M->NumBoxes].y = j;
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    70
				M->NumBoxes++;
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    71
			} else if (M->Cells[j][i] == CORNER)
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    72
			{
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    73
				M->Cells[j][i] = CORNER;
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    74
			} else if (M->Cells[j][i] != WALL)
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    75
			{
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    76
				if (    (M->Cells[j][i-1] == WALL &&
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    77
					 M->Cells[j-1][i] == WALL) ||
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    78
					(M->Cells[j][i-1] == WALL &&
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    79
					 M->Cells[j+1][i] == WALL) ||
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    80
					(M->Cells[j][i+1] == WALL &&
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    81
					 M->Cells[j-1][i] == WALL) ||
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    82
					(M->Cells[j][i+1] == WALL &&
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    83
					 M->Cells[j+1][i] == WALL))
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    84
				M->Cells[j][i] = CORNER;
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    85
			}
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    86
				
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    87
		}
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    88
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    89
}
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    90
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    91
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    92
void ShowMap (const struct Map *M)
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    93
{
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    94
	struct Map Temp;
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    95
	int i,j;
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    96
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    97
	CopyMap(&Temp, M);
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    98
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    99
	Temp.Cells[Temp.Man.y][Temp.Man.x] = MAN;
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   100
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   101
	for (i = 0; i < Temp.NumBoxes; i++)
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   102
	{
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   103
		if (Temp.Cells[Temp.Box[i].y][Temp.Box[i].x] == PLATFORM)
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   104
			Temp.Cells[Temp.Box[i].y][Temp.Box[i].x] =BOXINPLATFORM;
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   105
		else
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   106
			Temp.Cells[Temp.Box[i].y][Temp.Box[i].x] = BOX;
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   107
	}
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   108
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   109
	for (j = 0; j<Temp.SizeY; j++)
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   110
	{
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   111
		for (i=0; i<Temp.SizeX; i++)
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   112
			fprintf(stderr,"%c", Temp.Cells[j][i]);
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   113
		fprintf(stderr,"\n");
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   114
	}
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   115
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   116
#if 0
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   117
	// Print Where the man can move
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   118
	for (j = 0; j<Temp.SizeY; j++)
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   119
	{
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   120
		for (i=0; i<Temp.SizeX; i++)
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   121
			printf("%c", Temp.ManMoves[j][i]);
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   122
		printf("\n");
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   123
	}
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   124
#endif
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   125
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   126
	printf("Man is at (%i,%i)\n", Temp.Man.x, Temp.Man.y);
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   127
	printf("Platforms: %i, BoxesInPlatform: %i\n", Temp.NumPlatforms,
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   128
			Temp.NumBoxesInPlatform);
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   129
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   130
}
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   131
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   132
void PrintMove(struct BoxMove b)
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   133
{
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   134
	printf("Box: %i, Direction: {%i,%i}\n", b.box, b.dir.x, b.dir.y);
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   135
}
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   136
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   137
static void show_percent_callback(int parameter)
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   138
{
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   139
	fprintf(stderr, "Percent: %2.12f, depth: %i-%i\n", percent_to_show,
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   140
		min_depth_period, max_depth_period);
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   141
	ShowMap(actual_map);
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   142
	fflush(stderr);
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   143
	min_depth_period = MAX_STEPS;
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   144
	max_depth_period = 0;
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   145
#ifndef DEBUG
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   146
	alarm(ALARM_SECONDS);
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   147
#endif
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   148
}
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   149
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   150
static void program_alarm()
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   151
{
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   152
        struct sigaction my_action;
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   153
        int result;
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   154
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   155
        my_action.sa_handler = show_percent_callback;
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   156
        my_action.sa_flags = 0;
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   157
        memset(&my_action.sa_mask, 0, sizeof(my_action.sa_mask));
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   158
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   159
        result = sigaction(SIGALRM, &my_action, NULL);
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   160
        assert(result == 0);
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   161
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   162
	alarm(1);
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   163
}
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   164
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   165
void init_os()
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   166
{
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   167
	program_alarm();
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   168
}