?? opendir.ch
字號:
/* ACC -- Automatic Compiler Configuration Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer All Rights Reserved. This software is a copyrighted work licensed under the terms of the GNU General Public License. Please consult the file "ACC_LICENSE" for details. Markus F.X.J. Oberhumer <markus@oberhumer.com> http://www.oberhumer.com/ */#define __ACCLIB_OPENDIR_CH_INCLUDED 1#if !defined(ACCLIB_PUBLIC)# define ACCLIB_PUBLIC(r,f) r __ACCLIB_FUNCNAME(f)#endif/*************************************************************************// wrap <dirent.h>**************************************************************************/#if !defined(__ACCLIB_USE_OPENDIR)#if (ACC_OS_DOS16 || ACC_OS_DOS32 || ACC_OS_OS2 || ACC_OS_OS216 || ACC_OS_TOS || ACC_OS_WIN16 || ACC_OS_WIN32 || ACC_OS_WIN64)static int __ACCLIB_FUNCNAME(acc_opendir_init)(acc_dir_p f, const char* path, char* buf, size_t bufsize){ size_t l; char* p; f->f_name[0] = 0; buf[0] = 0; l = strlen(path); if (l == 0 || bufsize <= 4 || l >= bufsize - 4) return -1; strcpy(buf, path); p = buf + l; if (p[-1] == ':' || p[-1] == '\\' || p[-1] == '/') strcpy(p, "*.*"); else strcpy(p, "\\*.*"); return 0;}#endif#endif#if defined(__ACCLIB_USE_OPENDIR)ACCLIB_PUBLIC(int, acc_opendir) (acc_dir_p f, const char* path){ f->u_dirp = opendir(path); if (!f->u_dirp) return -2; return __ACCLIB_FUNCNAME(acc_readdir)(f);}ACCLIB_PUBLIC(int, acc_readdir) (acc_dir_p f){ const struct dirent* dp; f->f_name[0] = 0; if (!f->u_dirp) return -1; dp = (const struct dirent*) readdir((DIR*) f->u_dirp); if (!dp) return -1; if (!dp->d_name[0] || strlen(dp->d_name) >= sizeof(f->f_name)) return -1; strcpy(f->f_name, dp->d_name);#if (ACC_CC_WATCOMC) ACC_COMPILE_TIME_ASSERT(sizeof(f->f_name) >= sizeof(dp->d_name)) f->f_time = dp->d_time; f->f_date = dp->d_date; f->f_size = dp->d_size;#endif return 0;}ACCLIB_PUBLIC(int, acc_closedir) (acc_dir_p f){ int r = -1; if (f->u_dirp) r = closedir((DIR*) f->u_dirp); f->u_dirp = 0; return r;}#elif (ACC_OS_WIN32 || ACC_OS_WIN64)ACCLIB_PUBLIC(int, acc_opendir) (acc_dir_p f, const char* path){ WIN32_FIND_DATAA d; HANDLE h; if (__ACCLIB_FUNCNAME(acc_opendir_init)(f, path, f->f_name, sizeof(f->f_name)) != 0) return -1; h = FindFirstFileA(f->f_name, &d); f->f_name[0] = 0; if ((f->u_handle = (acclib_handle_t) h) == -1) return -1; if (!d.cFileName[0] || strlen(d.cFileName) >= sizeof(f->f_name)) return -1; strcpy(f->f_name, d.cFileName); f->f_attr = d.dwFileAttributes; f->f_size_high = d.nFileSizeHigh; f->f_size_low = d.nFileSizeLow; return 0;}ACCLIB_PUBLIC(int, acc_readdir) (acc_dir_p f){ WIN32_FIND_DATAA d; f->f_name[0] = 0; if (f->u_handle == -1 || FindNextFileA((HANDLE) f->u_handle, &d) == 0) return -1; if (!d.cFileName[0] || strlen(d.cFileName) >= sizeof(f->f_name)) return -1; strcpy(f->f_name, d.cFileName); f->f_attr = d.dwFileAttributes; f->f_size_high = d.nFileSizeHigh; f->f_size_low = d.nFileSizeLow; return 0;}ACCLIB_PUBLIC(int, acc_closedir) (acc_dir_p f){ int r = -1; if (f->u_handle != -1) r = FindClose((HANDLE) f->u_handle); f->u_handle = -1; return r;}#elif (ACC_OS_DOS16 || ACC_OS_DOS32 || ACC_OS_WIN16)ACCLIB_PUBLIC(int, acc_opendir) (acc_dir_p f, const char* path){ char tmp[ACC_FN_PATH_MAX+1]; int r; f->u_dirp = 0; if (__ACCLIB_FUNCNAME(acc_opendir_init)(f, path, tmp, sizeof(tmp)) != 0) return -1;#if (ACC_CC_AZTECC || ACC_CC_PACIFICC) r = -1;#elif (ACC_CC_BORLANDC || ACC_CC_TURBOC) r = findfirst(tmp, (struct ffblk*) f->u_dta, FA_HIDDEN|FA_SYSTEM|FA_RDONLY|FA_DIREC);#else r = _dos_findfirst(tmp, _A_HIDDEN|_A_SYSTEM|_A_RDONLY|_A_SUBDIR, (struct find_t*) f->u_dta);#endif if (r != 0) f->f_name[0] = 0; if (!f->f_name[0]) return -1; f->u_dirp = 1; return 0;}ACCLIB_PUBLIC(int, acc_readdir) (acc_dir_p f){ int r; f->f_name[0] = 0; if (!f->u_dirp) return -1;#if (ACC_CC_AZTECC || ACC_CC_PACIFICC) r = -1;#elif (ACC_CC_BORLANDC || ACC_CC_TURBOC) r = findnext((struct ffblk*) f->u_dta);#else r = _dos_findnext((struct find_t*) f->u_dta);#endif if (r != 0) f->f_name[0] = 0; if (!f->f_name[0]) return -1; return 0;}ACCLIB_PUBLIC(int, acc_closedir) (acc_dir_p f){ ACC_COMPILE_TIME_ASSERT(sizeof(*f) == 44); f->f_name[0] = 0; f->u_dirp = 0; return 0;}#elif (ACC_OS_TOS)ACCLIB_PUBLIC(int, acc_opendir) (acc_dir_p f, const char* path){ char tmp[ACC_FN_PATH_MAX+1]; int r; DTA* olddta; f->u_dirp = 0; if (__ACCLIB_FUNCNAME(acc_opendir_init)(f, path, tmp, sizeof(tmp)) != 0) return -1; olddta = Fgetdta(); Fsetdta((DTA*) f->u_dta); r = Fsfirst(tmp, FA_HIDDEN|FA_SYSTEM|FA_READONLY|FA_SUBDIR); Fsetdta(olddta); if (r != 0) f->f_name[0] = 0; if (!f->f_name[0]) return -1; f->u_dirp = 1; return 0;}ACCLIB_PUBLIC(int, acc_readdir) (acc_dir_p f){ int r; DTA* olddta; f->f_name[0] = 0; if (!f->u_dirp) return -1; olddta = Fgetdta(); Fsetdta((DTA*) f->u_dta); r = Fsnext(); Fsetdta(olddta); if (r != 0) f->f_name[0] = 0; if (!f->f_name[0]) return -1; return 0;}ACCLIB_PUBLIC(int, acc_closedir) (acc_dir_p f){ ACC_COMPILE_TIME_ASSERT(sizeof(*f) == 44); f->f_name[0] = 0; f->u_dirp = 0; return 0;}#elseACCLIB_PUBLIC(int, acc_opendir) (acc_dir_p f, const char* path){ ACC_UNUSED(path); f->f_name[0] = 0; return -3;}ACCLIB_PUBLIC(int, acc_readdir) (acc_dir_p f){ f->f_name[0] = 0; return -1;}ACCLIB_PUBLIC(int, acc_closedir) (acc_dir_p f){ f->u_dirp = 0; return -1;}#endif/*vi:ts=4:et*/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -