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 {