EXAM DRILL 1.0
読み取り中…
検索中…
一致する文字列を見つけられません
map_parser.c
1#include "bsq.h"
2
24int parse_map_header(char *first_line, t_map_info *info) {
25 int i;
26 int len;
27
28 if (!first_line || !info)
29 return (0);
30
31 len = strlen(first_line);
32 i = len - 1;
33
34 // 1. full文字を取得 (末尾の空白スキップ)
35 while (i >= 0 && (first_line[i] == '\n' || first_line[i] == '\r' ||
36 first_line[i] == ' '))
37 i--;
38 if (i < 0)
39 return (0);
40 info->full = first_line[i--];
41
42 // 2. obstacle文字を取得
43 while (i >= 0 && (first_line[i] == '\n' || first_line[i] == '\r' ||
44 first_line[i] == ' '))
45 i--;
46 if (i < 0)
47 return (0);
48 info->obstacle = first_line[i--];
49
50 // 3. empty文字を取得
51 while (i >= 0 && (first_line[i] == '\n' || first_line[i] == '\r' ||
52 first_line[i] == ' '))
53 i--;
54 if (i < 0)
55 return (0);
56 info->empty = first_line[i--];
57
58 // 4. 行数の取得とバリデーション
59 while (i >= 0 && first_line[i] == ' ')
60 i--;
61
62 if (i < 0)
63 return (0);
64
65 // 0からiまでが数字であることを確認
66 int j = 0;
67 while (j <= i) {
68 if (first_line[j] < '0' || first_line[j] > '9')
69 return (0);
70 j++;
71 }
72
73 info->rows = atoi(first_line);
74
75 if (info->rows <= 0)
76 return (0);
77
78 // 文字の重複チェック
79 if (info->empty == info->obstacle || info->empty == info->full ||
80 info->obstacle == info->full)
81 return (0);
82
83 // 文字が印刷可能かチェック
84 if (info->empty < ' ' || info->empty > '~' || info->obstacle < ' ' ||
85 info->obstacle > '~' || info->full < ' ' || info->full > '~')
86 return (0);
87
88 return (1);
89}
90
114int read_map_data(FILE *stream, t_map *map) {
115 char *line = NULL;
116 size_t len = 0;
117 ssize_t read;
118 int i;
119
120 if (!stream || !map || !map->info.rows)
121 return (0);
122
123 map->data = (char **)malloc(sizeof(char *) * map->info.rows);
124 if (!map->data)
125 return (0);
126
127 map->info.cols = -1; // 列数を初期化
128 i = 0;
129 while (i < map->info.rows && (read = getline(&line, &len, stream)) != -1) {
130 if (read == 0 || line[read - 1] != '\n') {
131 free(line);
132 return (0); // マップエラー(改行なし、またはファイルの途中終了)
133 }
134
135 int current_cols = read - 1; // 改行を除く長さ
136
137 // 最初の行で列数を決定
138 if (map->info.cols == -1)
139 map->info.cols = current_cols;
140 else if (map->info.cols != current_cols) {
141 free(line);
142 return (0); // 行の長さが不一致
143 }
144
145 map->data[i] = (char *)malloc(sizeof(char) * (map->info.cols + 1));
146 if (!map->data[i]) {
147 free(line);
148 return (0);
149 }
150 strncpy(map->data[i], line, map->info.cols);
151 map->data[i][map->info.cols] = '\0';
152
153 // 文字のバリデーション
154 int j = 0;
155 while (j < map->info.cols) {
156 if (map->data[i][j] != map->info.empty &&
157 map->data[i][j] != map->info.obstacle) {
158 free(line);
159 return (0); // 定義されていない文字
160 }
161 j++;
162 }
163 i++;
164 }
165 free(line);
166
167 // 指定された行数分読み込めたか確認
168 if (i != map->info.rows)
169 return (0);
170
171 return (1);
172}
173
192t_map *load_map(FILE *stream) {
193 t_map *map;
194 char *first_line = NULL;
195 size_t len = 0;
196 ssize_t read;
197
198 map = (t_map *)malloc(sizeof(t_map));
199 if (!map)
200 return (NULL);
201
202 map->data = NULL;
203 map->info.rows = 0;
204 map->info.cols = 0;
205
206 // 1行目を読む
207 read = getline(&first_line, &len, stream);
208 if (read == -1 || first_line[read - 1] != '\n') {
209 free(first_line);
210 free(map);
211 return (NULL);
212 }
213
214 // ヘッダー解析
215 if (!parse_map_header(first_line, &map->info)) {
216 free(first_line);
217 free(map);
218 return (NULL);
219 }
220 free(first_line);
221
222 // データ解析
223 if (!read_map_data(stream, map)) {
224 free_map(map);
225 return (NULL);
226 }
227 return (map);
228}
229
244void free_map(t_map *map) {
245 int i;
246
247 if (map) {
248 if (map->data) {
249 i = 0;
250 while (i < map->info.rows) {
251 free(map->data[i]);
252 map->data[i] = NULL;
253 i++;
254 }
255 free(map->data);
256 map->data = NULL;
257 }
258 free(map);
259 map = NULL;
260 }
261}
int read_map_data(FILE *stream, t_map *map)
マップデータを読み込む
Definition map_parser.c:114
int parse_map_header(char *first_line, t_map_info *info)
マップの最初の行を解析する
Definition map_parser.c:24
void free_map(t_map *map)
マップのメモリを解放する
Definition map_parser.c:244
t_map * load_map(FILE *stream)
マップ全体をロードする
Definition map_parser.c:192
マップのメタデータを格納する構造体
Definition bsq.h:95
char empty
空き地を表す文字
Definition bsq.h:97
char obstacle
障害物を表す文字
Definition bsq.h:98
char full
正方形を埋める文字
Definition bsq.h:99
int rows
マップの行数
Definition bsq.h:96
int cols
マップの列数 (最初のデータ行を読んでから決定)
Definition bsq.h:100
マップ全体の状態を保持する構造体
Definition bsq.h:106
char ** data
マップデータ(2次元配列)。data[row][col] でアクセス
Definition bsq.h:108
t_map_info info
マップの設定情報
Definition bsq.h:107