Mercurial > repos > blastem
comparison util.c @ 972:4899d3ae37b3
Implement Windows versions of recently added functions in util.c and get the Windows build working again
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Thu, 21 Apr 2016 23:46:33 -0700 |
parents | 1618d3676a35 |
children | fd7702bcc034 |
comparison
equal
deleted
inserted
replaced
971:e28f365605da | 972:4899d3ae37b3 |
---|---|
246 *cur = 0; | 246 *cur = 0; |
247 break; | 247 break; |
248 } | 248 } |
249 } | 249 } |
250 return path; | 250 return path; |
251 } | |
252 | |
253 dir_entry *get_dir_list(char *path, size_t *numret) | |
254 { | |
255 HANDLE dir; | |
256 WIN32_FIND_DATA file; | |
257 char *pattern = alloc_concat(path, "/*.*"); | |
258 dir = FindFirstFile(pattern, &file); | |
259 free(pattern); | |
260 if (dir == INVALID_HANDLE_VALUE) { | |
261 if (numret) { | |
262 *numret = 0; | |
263 } | |
264 return NULL; | |
265 } | |
266 | |
267 size_t storage = 64; | |
268 dir_entry *ret = malloc(sizeof(dir_entry) * storage); | |
269 size_t pos = 0; | |
270 | |
271 do { | |
272 if (pos == storage) { | |
273 storage = storage * 2; | |
274 ret = realloc(ret, sizeof(dir_entry) * storage); | |
275 } | |
276 ret[pos].name = strdup(file.cFileName); | |
277 ret[pos++].is_dir = (file.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0; | |
278 } while (FindNextFile(dir, &file)); | |
279 | |
280 FindClose(dir); | |
281 if (numret) { | |
282 *numret = pos; | |
283 } | |
284 return ret; | |
285 } | |
286 | |
287 time_t get_modification_time(char *path) | |
288 { | |
289 HANDLE file = CreateFile(path, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); | |
290 if (file == INVALID_HANDLE_VALUE) { | |
291 return 0; | |
292 } | |
293 FILETIME ft; | |
294 uint8_t ret = GetFileTime(file, NULL, NULL, &ft); | |
295 CloseHandle(file); | |
296 if (ret) { | |
297 uint64_t wintime = ((uint64_t)ft.dwHighDateTime) << 32 | ft.dwLowDateTime; | |
298 //convert to seconds | |
299 wintime /= 10000000; | |
300 //adjust for difference between Windows and Unix Epoch | |
301 wintime -= 11644473600LL; | |
302 return (time_t)wintime; | |
303 } else { | |
304 return 0; | |
305 } | |
306 } | |
307 | |
308 int ensure_dir_exists(char *path) | |
309 { | |
310 if (CreateDirectory(path, NULL)) { | |
311 return 1; | |
312 } | |
313 if (GetLastError() == ERROR_ALREADY_EXISTS) { | |
314 return 1; | |
315 } | |
316 if (GetLastError() != ERROR_PATH_NOT_FOUND) { | |
317 warning("CreateDirectory failed with unexpected error code %X\n", GetLastError()); | |
318 return 0; | |
319 } | |
320 char *parent = strdup(path); | |
321 char *sep = strrchr(parent, '/'); | |
322 if (!sep || sep == parent) { | |
323 //relative path, but for some reason we failed | |
324 return 0; | |
325 } | |
326 *sep = 0; | |
327 if (!ensure_dir_exists(parent)) { | |
328 free(parent); | |
329 return 0; | |
330 } | |
331 free(parent); | |
332 return CreateDirectory(path, NULL); | |
251 } | 333 } |
252 | 334 |
253 #else | 335 #else |
254 | 336 |
255 char * get_home_dir() | 337 char * get_home_dir() |
353 } | 435 } |
354 if (numret) { | 436 if (numret) { |
355 *numret = pos; | 437 *numret = pos; |
356 } | 438 } |
357 return ret; | 439 return ret; |
358 } | |
359 | |
360 void free_dir_list(dir_entry *list, size_t numentries) | |
361 { | |
362 for (size_t i = 0; i < numentries; i++) | |
363 { | |
364 free(list[i].name); | |
365 } | |
366 free(list); | |
367 } | 440 } |
368 | 441 |
369 time_t get_modification_time(char *path) | 442 time_t get_modification_time(char *path) |
370 { | 443 { |
371 struct stat st; | 444 struct stat st; |
401 return S_ISDIR(st.st_mode); | 474 return S_ISDIR(st.st_mode); |
402 } | 475 } |
403 | 476 |
404 #endif | 477 #endif |
405 | 478 |
479 void free_dir_list(dir_entry *list, size_t numentries) | |
480 { | |
481 for (size_t i = 0; i < numentries; i++) | |
482 { | |
483 free(list[i].name); | |
484 } | |
485 free(list); | |
486 } | |
487 | |
406 #ifdef __ANDROID__ | 488 #ifdef __ANDROID__ |
407 | 489 |
408 #include <SDL.h> | 490 #include <SDL.h> |
409 char *read_bundled_file(char *name, long *sizeret) | 491 char *read_bundled_file(char *name, long *sizeret) |
410 { | 492 { |