-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmove.c
More file actions
232 lines (199 loc) · 4.89 KB
/
Copy pathmove.c
File metadata and controls
232 lines (199 loc) · 4.89 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
/**
* @file move.c
* @author Julian Martinez del Campo
*
* Provides an implementation of moves
*/
#define _POSIX_C_SOURCE 200809L
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#include <ctype.h>
#include "move.h"
#include "utility.h"
/**
* Create a new move
*
* @param start_row the starting row
* @param start_col the starting column
* @param end_row the ending row
* @param end_col the ending column
* @return a new move containing the start row, start col, end row, and end col
*/
struct Move * new_move( int start_row, int start_col, int end_row, int end_col )
{
struct Move * move = Calloc( 1, sizeof( struct Move ) );
assert( move );
move->start_row = start_row;
move->start_col = start_col;
move->end_row = end_row;
move->end_col = end_col;
return move;
}
/**
* Convert a row number to a string
*
* @param i the row number
* @return the row as a letter, if row is invalid return null
*/
char row2letter( int i )
{
static char letters[ 8 ] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H' };
if( i < 0 || i > 8 )
return 0;
return letters[i];
}
/**
* Translate a move into a string
*
* @param move a move to convert to string
* @return a string in human readable form
*/
char * translate_move( const struct Move * move )
{
char * human_readable = Calloc( 11, sizeof( char ) );
assert( human_readable );
snprintf( human_readable, 11, "%c%d - %c%d",
row2letter( move->start_row ),
move->start_col + 1,
row2letter( move->end_row ),
move->end_col + 1 );
return human_readable;
}
/**
* Convert a letter to a row
*
* @param letter a letter to convert a row number
* @return the row number
*/
static int letter2row( char * letter )
{
char l = toupper( letter[0] );
return (int) l - 65;
}
/**
* Translate an input move
*
* @param move a move input by the user
* @return a move
*/
struct Move * translate_in_move( const char * move )
{
int length = strnlen( move, 20 );
int i;
int valid = 0;
char start_row[2];
char start_col[2];
char end_row[2];
char end_col[2];
/* find first letter */
for( i = 0; i < length; i++ )
if( isalpha( move[ i ] ) )
{
start_row[0] = move[ i ];
start_row[1] = '\0';
valid++;
break;
}
/* find next number */
for( ; i< length; i++ )
if( isdigit( move[i] ) )
{
start_col[0] = move[ i ];
start_col[1] = '\0';
valid++;
break;
}
/* find next letter */
for( ; i < length; i++ )
if( isalpha( move[ i ] ) )
{
end_row[0] = move[ i ];
end_row[1] = '\0';
valid++;
break;
}
/* find next number */
for( ; i < length; i++ )
if( isdigit( move[ i ] ) )
{
end_col[0] = move[ i ];
end_col[1] = '\0';
valid++;
break;
}
if( valid != 4 )
return NULL;
struct Move * translated_move = new_move( letter2row( start_row ),
atoi( start_col ) - 1,
letter2row( end_row ),
atoi( end_col ) - 1 );
return translated_move;
}
struct Move * translate_first_in_move( const char * move )
{
int length = strnlen( move, 20 );
int i;
int valid = 0;
char start_row[2];
char start_col[2];
/* find first letter */
for( i = 0; i < length; i++ )
if( isalpha( move[ i ] ) )
{
start_row[0] = move[ i ];
start_row[1] = '\0';
valid++;
break;
}
/* find next number */
for( ; i< length; i++ )
if( isdigit( move[i] ) )
{
start_col[0] = move[ i ];
start_col[1] = '\0';
valid++;
break;
}
/* check input parameters */
if( valid != 2 )
return NULL;
struct Move * translated_move = new_move( letter2row( start_row ),
atoi( start_col ) - 1,
0 ,
0 );
return translated_move;
}
/**
* Compare a move
*
* @param a a move
* @param b a move
* @return 1 if moves are the same, else return 0
*/
int compare_move( const struct Move * a, const struct Move * b )
{
return ( a->start_row == b->start_row &&
a->start_col == b->start_col &&
a->end_row == b->end_row &&
a->end_col == b->end_col );
}
/**
* Print a move
*
* @param move a move to print
*/
void print_move( const struct Move * move )
{
/*
printf( "(%d,%d),(%d,%d)",
move->start_row,
move->start_col,
move->end_row,
move->end_col );
*/
char * human_readable = translate_move( move );
printf( "%s", human_readable );
Free( human_readable, sizeof( char ) * 11 );
}