/src/os/wince/ftk_mmap_wince.c

http://ftk.googlecode.com/ · C · 101 lines · 84 code · 16 blank · 1 comment · 19 complexity · 8be04065b6b6409f587dad270ff5f896 MD5 · raw file

  1. #include "ftk_log.h"
  2. #include "ftk_mmap.h"
  3. #include "ftk_allocator.h"
  4. struct _FtkMmap
  5. {
  6. FILE* fp;
  7. void* data;
  8. size_t length;
  9. };
  10. int ftk_mmap_exist(const char* filename)
  11. {
  12. wchar_t buf[MAX_PATH];
  13. HANDLE handle;
  14. WIN32_FIND_DATAW find_data;
  15. if (MultiByteToWideChar(CP_ACP, 0, filename, -1, buf, MAX_PATH) == 0)
  16. {
  17. return 0;
  18. }
  19. handle = FindFirstFileW(buf, &find_data);
  20. if (handle == INVALID_HANDLE_VALUE)
  21. {
  22. return 0;
  23. }
  24. FindClose(handle);
  25. return 1;
  26. }
  27. FtkMmap* ftk_mmap_create(const char* filename, size_t offset, size_t size)
  28. {
  29. size_t n;
  30. wchar_t buf[MAX_PATH];
  31. FtkMmap* thiz = NULL;
  32. LARGE_INTEGER li;
  33. WIN32_FILE_ATTRIBUTE_DATA attr;
  34. return_val_if_fail(filename != NULL, NULL);
  35. if (MultiByteToWideChar(CP_ACP, 0, filename, -1, buf, MAX_PATH) == 0)
  36. {
  37. return NULL;
  38. }
  39. if (!GetFileAttributesExW(buf, GetFileExInfoStandard, &attr))
  40. {
  41. return NULL;
  42. }
  43. li.LowPart = attr.nFileSizeLow;
  44. li.HighPart = attr.nFileSizeHigh;
  45. n = (size_t) li.QuadPart;
  46. /*ftk_logd("%s: %d\n", filename, n);*/
  47. return_val_if_fail(offset < n, NULL);
  48. size = (offset + size) <= n ? size : n - offset;
  49. thiz = FTK_ZALLOC(sizeof(FtkMmap));
  50. return_val_if_fail(thiz != NULL, NULL);
  51. thiz->fp = fopen(filename, "rb");
  52. if(thiz->fp != NULL)
  53. {
  54. thiz->length = size;
  55. thiz->data = FTK_ZALLOC(size+1);
  56. fseek(thiz->fp, offset, SEEK_SET);
  57. fread(thiz->data, thiz->length, 1, thiz->fp);
  58. fclose(thiz->fp);
  59. }
  60. if(thiz->data == NULL || thiz->data == NULL)
  61. {
  62. FTK_ZFREE(thiz, sizeof(*thiz));
  63. ftk_logd("%s mmap %s failed.\n", __func__, filename);
  64. }
  65. return thiz;
  66. }
  67. void* ftk_mmap_data(FtkMmap* thiz)
  68. {
  69. return_val_if_fail(thiz != NULL, NULL);
  70. return thiz->data;
  71. }
  72. size_t ftk_mmap_length(FtkMmap* thiz)
  73. {
  74. return_val_if_fail(thiz != NULL, 0);
  75. return thiz->length;
  76. }
  77. void ftk_mmap_destroy(FtkMmap* thiz)
  78. {
  79. if(thiz != NULL)
  80. {
  81. FTK_FREE(thiz->data);
  82. FTK_ZFREE(thiz, sizeof(*thiz));
  83. }
  84. return;
  85. }