fsal_win32.c
上传用户:holyzs
上传日期:2022-06-29
资源大小:2335k
文件大小:4k
源码类别:

编辑器/阅读器

开发平台:

C/C++

  1. #include <reader_core.h>
  2. #include <direct.h>
  3. typedef struct {
  4.   long handle;
  5.   unsigned short path[READER_PATH_MAX];
  6. } DIR_ITER;
  7. static char root_dir[READER_PATH_MAX];
  8. static unsigned short root_dir_uni[READER_PATH_MAX];
  9. static char *replace_chr(char *str, int c1, int c2) {
  10.   while (*str) {
  11.     if (*str == c1) {
  12.       *str = c2;
  13.     }
  14.     str ++;
  15.   }
  16.   return str;
  17. }
  18. static unsigned short *replace_wchr(unsigned short *str, int c1, int c2) {
  19.   while (*str) {
  20.     if (*str == c1) {
  21.       *str = c2;
  22.     }
  23.     str ++;
  24.   }
  25.   return str;
  26. }
  27. static int translate_path(unsigned short *path, unsigned short *real_path) {
  28.   unsigned short cwd[READER_PATH_MAX];
  29.   int len;
  30.   if (*path == '/') {
  31.     reader_wcsncpy(real_path, root_dir_uni, READER_PATH_MAX);
  32.     path++;
  33.   } else {
  34.     _wgetcwd(cwd, READER_PATH_MAX);
  35.     reader_wcsncpy(real_path, cwd, READER_PATH_MAX);
  36.   }
  37.   len = reader_wcslen(real_path);
  38.   if (real_path[len-1] != '\') {
  39.     reader_wcscat(real_path, L"\");
  40.   }
  41.   reader_wcscat(real_path, path);
  42.   replace_wchr(real_path, '/', '\');
  43.   return 0;
  44. }
  45. int fsal_chdir(unsigned short *path) {
  46.   unsigned short real_path[READER_PATH_MAX] = {0};
  47.   translate_path(path, real_path);
  48.   return _wchdir(real_path);
  49. }
  50. fsal_dir_handle_t fsal_diropen(unsigned short *path) {
  51.   long handle;
  52.   struct _wfinddata_t filestruct;
  53.   unsigned short real_path[READER_PATH_MAX] = {0};
  54.   int i = 0;
  55.   DIR_ITER *iter = NULL;
  56.   iter = (DIR_ITER *)malloc(sizeof(*iter));
  57.   if (iter == NULL) {
  58.     return 0;
  59.   }
  60.   translate_path(path, real_path);
  61.   reader_wcscpy(iter->path, real_path);
  62.   reader_wcscat(real_path, L"\*");
  63.   handle = _wfindfirst(real_path, &filestruct);
  64.   if (handle < 0) {
  65.     READER_TRACEWM((L"real_path=%sn", real_path));
  66.     READER_TRACEM(("error in _wfindfirst():%dn", errno));
  67.     return 0;
  68.   }
  69.   iter->handle = handle;
  70.   return (fsal_dir_handle_t)iter;
  71. }
  72. int fsal_dirnext(fsal_dir_handle_t hdir, unsigned short *filename, struct stat *st) {
  73.   DIR_ITER *dir = (DIR_ITER *)hdir;
  74.   int ret;
  75.   struct _wfinddata_t filestruct;
  76.   unsigned short fullname[READER_PATH_MAX];
  77.   ret = _wfindnext(dir->handle,&filestruct);
  78.   if (ret != 0) {
  79.     return ret;
  80.   }
  81.   //do not return '.' and '..' entries for simulated root dir
  82.   if ((wcscmp(dir->path, root_dir_uni) == 0) //is root dir
  83.    && ((wcscmp(filestruct.name, reader_path_this) == 0)
  84.    || ((wcscmp(filestruct.name, reader_path_upper) == 0)))
  85.    ) {
  86.     return fsal_dirnext((fsal_dir_handle_t)dir, filename, st);
  87.   }
  88.   reader_wcscpy(filename, filestruct.name);
  89.   reader_wcscpy(fullname, dir->path);
  90.   reader_wcscat(fullname, L"\");
  91.   reader_wcscat(fullname, filename);
  92.   //"struct stat" and "struct _stat" are identical
  93.   return _wstat(fullname, (struct _stat *)st);
  94. }
  95. int fsal_dirclose(fsal_dir_handle_t hdir) {
  96.   DIR_ITER *dir = (DIR_ITER *)hdir;
  97.   _findclose(dir->handle);
  98.   free(dir);
  99.   return 0;
  100. }
  101. int fsal_init(void) {
  102.   //set the root dir for the simulated FAT
  103.   _getcwd(root_dir, READER_PATH_MAX);
  104.   printf("root=%sn", root_dir);
  105.   _wgetcwd(root_dir_uni, READER_PATH_MAX);
  106.   _chdir(root_dir);
  107.   return 0;
  108. }
  109. size_t fsal_read(void *buffer, size_t size, size_t count, fsal_file_handle_t stream) {
  110.   return fread(buffer, size, count, (FILE *)stream);
  111. }
  112. fsal_file_handle_t fsal_open(unsigned short *name, char *mode) {
  113.   unsigned short *wmode = NULL;
  114.   unsigned short real_name[READER_PATH_MAX];
  115.   if (strcmp(mode, "rb") == 0) {
  116.     wmode = L"rb";
  117.   } else if (strcmp(mode, "wb") == 0) {
  118.     wmode = L"wb";
  119.   } else if (strcmp(mode, "rb+") == 0) {
  120.     wmode = L"rb+";
  121.   } else if (strcmp(mode, "a+") == 0) {
  122.     wmode = L"a+";
  123.   }
  124.   translate_path(name, real_name);
  125.   return (fsal_file_handle_t)_wfopen(real_name, wmode);
  126. }
  127. int fsal_close(fsal_file_handle_t fd) {
  128.   return fclose((FILE *)fd);
  129. }
  130. int fsal_seek(fsal_file_handle_t stream, long offset, int origin) {
  131.   return fseek((FILE *)stream, offset, origin);
  132. }
  133. size_t fsal_write(void *buffer, size_t size, size_t count, fsal_file_handle_t stream) {
  134.   return fwrite(buffer, size, count, (FILE *)stream);
  135. }
  136. int fsal_tell(fsal_file_handle_t stream) {
  137.   return ftell((FILE *)stream);
  138. }
  139. void fsal_rewind(fsal_file_handle_t stream) {
  140.   rewind((FILE *)stream);
  141. }