os.c
author viric@llimona
Sun, 07 May 2006 19:31:33 +0200
changeset 20 7d212921dad4
parent 19 d46184674fe7
permissions -rw-r--r--
Added two spaces at the end of the last line, in order to complete the width.
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;
14
086a72472196 Now the segfault problem for actual_map is solved in os.c
viric@llimona
parents: 12
diff changeset
    16
struct Map * actual_map = NULL;
6
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    17
19
d46184674fe7 Added a variable managing the output file handle (stdout,stderr)
viric@llimona
parents: 14
diff changeset
    18
static FILE *info_handle;
d46184674fe7 Added a variable managing the output file handle (stdout,stderr)
viric@llimona
parents: 14
diff changeset
    19
6
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    20
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    21
void ReadMap(struct Map *M, char *FileName)
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    22
{
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    23
	FILE *Fitxer;
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    24
	int i,j;
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    25
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    26
	if(!(Fitxer = fopen(FileName, "r")))
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    27
	{
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    28
		printf("Error opening %s!", FileName);
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    29
		exit(1);
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    30
	}
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    31
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    32
	M->SizeX=0;
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    33
	M->SizeY=0;
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    34
	while (!feof(Fitxer))
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    35
	{
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    36
		fgets(M->Cells[M->SizeY], MAX_X, Fitxer);
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    37
		M->SizeY++;
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    38
	}
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    39
	M->SizeY--;
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    40
	M->SizeX = strlen(M->Cells[0]) - 1;
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    41
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    42
	M->NumPlatforms = 0;
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    43
	M->NumBoxesInPlatform = 0;
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    44
	M->NumBoxes = 0;
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    45
	for (j = 0; j<M->SizeY; j++)
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    46
		for (i=0; i<M->SizeX; i++)
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    47
		{
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    48
			if (M->Cells[j][i] == MAN)
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    49
			{ 
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    50
				M->Man.x = i; M->Man.y = j; 
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    51
				M->Cells[M->Man.y][M->Man.x] = BLANK;
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    52
			}
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    53
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    54
			if (M->Cells[j][i] == PLATFORM)
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    55
				M->NumPlatforms++;
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    56
			else if (M->Cells[j][i] == BOXINPLATFORM)
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    57
			{
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    58
				M->Cells[j][i] = PLATFORM;
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    59
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    60
				M->NumPlatforms++;
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    61
				M->NumBoxesInPlatform++;
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    62
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    63
				M->Box[M->NumBoxes].x = i;
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    64
				M->Box[M->NumBoxes].y = j;
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    65
				M->NumBoxes++;
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    66
			} else if (M->Cells[j][i] == BOX)
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    67
			{
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    68
				M->Cells[j][i] = BLANK;
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    69
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    70
				M->Box[M->NumBoxes].x = i;
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    71
				M->Box[M->NumBoxes].y = j;
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    72
				M->NumBoxes++;
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    73
			} else if (M->Cells[j][i] == CORNER)
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    74
			{
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    75
				M->Cells[j][i] = CORNER;
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    76
			} else if (M->Cells[j][i] != WALL)
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    77
			{
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    78
				if (    (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+1] == WALL &&
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    85
					 M->Cells[j+1][i] == WALL))
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    86
				M->Cells[j][i] = CORNER;
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
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    93
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    94
void ShowMap (const struct Map *M)
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    95
{
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    96
	struct Map Temp;
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    97
	int i,j;
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    98
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
    99
	CopyMap(&Temp, M);
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   100
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   101
	Temp.Cells[Temp.Man.y][Temp.Man.x] = MAN;
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   102
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   103
	for (i = 0; i < Temp.NumBoxes; i++)
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   104
	{
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   105
		if (Temp.Cells[Temp.Box[i].y][Temp.Box[i].x] == PLATFORM)
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   106
			Temp.Cells[Temp.Box[i].y][Temp.Box[i].x] =BOXINPLATFORM;
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   107
		else
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   108
			Temp.Cells[Temp.Box[i].y][Temp.Box[i].x] = BOX;
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   109
	}
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   110
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   111
	for (j = 0; j<Temp.SizeY; j++)
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   112
	{
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   113
		for (i=0; i<Temp.SizeX; i++)
19
d46184674fe7 Added a variable managing the output file handle (stdout,stderr)
viric@llimona
parents: 14
diff changeset
   114
			fprintf(info_handle,"%c", Temp.Cells[j][i]);
d46184674fe7 Added a variable managing the output file handle (stdout,stderr)
viric@llimona
parents: 14
diff changeset
   115
		fprintf(info_handle,"\n");
6
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   116
	}
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   117
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   118
#if 0
8
b41a580b3abe The code compiles with pedantic without warnings.
viric@llimona
parents: 6
diff changeset
   119
	/* Print Where the man can move */
6
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   120
	for (j = 0; j<Temp.SizeY; j++)
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   121
	{
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   122
		for (i=0; i<Temp.SizeX; i++)
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   123
			printf("%c", Temp.ManMoves[j][i]);
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   124
		printf("\n");
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   125
	}
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   126
#endif
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   127
19
d46184674fe7 Added a variable managing the output file handle (stdout,stderr)
viric@llimona
parents: 14
diff changeset
   128
	fprintf(info_handle,"Man is at (%i,%i)\n", Temp.Man.x, Temp.Man.y);
d46184674fe7 Added a variable managing the output file handle (stdout,stderr)
viric@llimona
parents: 14
diff changeset
   129
	fprintf(info_handle,"Platforms: %i, BoxesInPlatform: %i\n", Temp.NumPlatforms,
6
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   130
			Temp.NumBoxesInPlatform);
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   131
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   132
}
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   133
10
9148590f009d I made variables explicitily const.
viric@llimona
parents: 8
diff changeset
   134
void PrintMove(const struct BoxMove b)
6
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   135
{
19
d46184674fe7 Added a variable managing the output file handle (stdout,stderr)
viric@llimona
parents: 14
diff changeset
   136
	fprintf(info_handle,"Box: %i, Direction: {%i,%i}\n", b.box, b.dir.x, b.dir.y);
6
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   137
}
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   138
12
a2c334a71a6b A minimum working (hope so!) version of the algorithm is working, although
viric@llimona
parents: 10
diff changeset
   139
void show_percent_and_map()
6
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   140
{
19
d46184674fe7 Added a variable managing the output file handle (stdout,stderr)
viric@llimona
parents: 14
diff changeset
   141
	fprintf(info_handle, "Percent: %2.12f, depth: %i-%i\n", percent_to_show,
6
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   142
		min_depth_period, max_depth_period);
14
086a72472196 Now the segfault problem for actual_map is solved in os.c
viric@llimona
parents: 12
diff changeset
   143
	if(actual_map != NULL)
086a72472196 Now the segfault problem for actual_map is solved in os.c
viric@llimona
parents: 12
diff changeset
   144
		ShowMap(actual_map);
19
d46184674fe7 Added a variable managing the output file handle (stdout,stderr)
viric@llimona
parents: 14
diff changeset
   145
	fflush(info_handle);
6
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   146
	min_depth_period = MAX_STEPS;
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   147
	max_depth_period = 0;
12
a2c334a71a6b A minimum working (hope so!) version of the algorithm is working, although
viric@llimona
parents: 10
diff changeset
   148
}
a2c334a71a6b A minimum working (hope so!) version of the algorithm is working, although
viric@llimona
parents: 10
diff changeset
   149
a2c334a71a6b A minimum working (hope so!) version of the algorithm is working, although
viric@llimona
parents: 10
diff changeset
   150
static void show_percent_callback(const int parameter)
a2c334a71a6b A minimum working (hope so!) version of the algorithm is working, although
viric@llimona
parents: 10
diff changeset
   151
{
a2c334a71a6b A minimum working (hope so!) version of the algorithm is working, although
viric@llimona
parents: 10
diff changeset
   152
	show_percent_and_map();
6
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   153
	alarm(ALARM_SECONDS);
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   154
}
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   155
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   156
static void program_alarm()
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   157
{
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   158
        struct sigaction my_action;
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   159
        int result;
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   160
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   161
        my_action.sa_handler = show_percent_callback;
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   162
        my_action.sa_flags = 0;
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   163
        memset(&my_action.sa_mask, 0, sizeof(my_action.sa_mask));
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   164
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   165
        result = sigaction(SIGALRM, &my_action, NULL);
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   166
        assert(result == 0);
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   167
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   168
	alarm(1);
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   169
}
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   170
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   171
void init_os()
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   172
{
19
d46184674fe7 Added a variable managing the output file handle (stdout,stderr)
viric@llimona
parents: 14
diff changeset
   173
	info_handle = stdout;
12
a2c334a71a6b A minimum working (hope so!) version of the algorithm is working, although
viric@llimona
parents: 10
diff changeset
   174
#ifndef DEBUG
6
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   175
	program_alarm();
12
a2c334a71a6b A minimum working (hope so!) version of the algorithm is working, although
viric@llimona
parents: 10
diff changeset
   176
#endif
6
bfbca2c0fc70 More file separation.
viric@llimona
parents:
diff changeset
   177
}
12
a2c334a71a6b A minimum working (hope so!) version of the algorithm is working, although
viric@llimona
parents: 10
diff changeset
   178