📄 slposdir.c
字号:
continue;#endif _SLerrno_errno = errno; break; } return ret;}static int rename_cmd (char *oldpath, char *newpath){ int ret; while (-1 == (ret = rename (oldpath, newpath))) {#ifdef EINTR if (errno == EINTR) continue;#endif _SLerrno_errno = errno; break; } return ret;}static int mkdir_cmd (char *s, int *mode_ptr){ int ret; (void) mode_ptr; errno = 0;#if defined (__MSDOS__) && !defined(__GO32__)# define MKDIR(x,y) mkdir(x)#else# if defined (__os2__) && !defined (__EMX__)# define MKDIR(x,y) mkdir(x)# else# if defined (__WIN32__) && !defined (__CYGWIN32__)# define MKDIR(x,y) mkdir(x)# else# define MKDIR mkdir# endif# endif#endif while (-1 == (ret = MKDIR(s, *mode_ptr))) {#ifdef EINTR if (errno == EINTR) continue;#endif _SLerrno_errno = errno; break; } return ret;}#ifdef HAVE_MKFIFOstatic int mkfifo_cmd (char *path, int *mode){ if (-1 == mkfifo (path, *mode)) { _SLerrno_errno = errno; return -1; } return 0;}#endif#if USE_LISTDIR_INTRINSICstatic void free_dir_list (char **list, unsigned int num){ unsigned int i; if (list == NULL) return; for (i = 0; i < num; i++) SLang_free_slstring (list[i]); SLfree ((char *) list);}#if defined(__WIN32__) || defined(__os2__) && defined(__IBMC__)static int build_dirlist (char *file, char *opt, char ***listp, unsigned int *nump, unsigned int *maxnum){# ifdef __WIN32__ DWORD status; HANDLE h; WIN32_FIND_DATA fd;# else APIRET rc; FILESTATUS3 status; HDIR h; FILEFINDBUF3 fd; ULONG cFileNames;# endif char *pat; unsigned int len; char **list; unsigned int num; unsigned int max_num; int hok; /* If an option is present, assume ok to list hidden files. Later * I will formalize this. */ hok = (opt != NULL);# ifdef __WIN32__ status = GetFileAttributes (file);# else rc = DosQueryPathInfo(file, FIL_STANDARD, &status, sizeof(FILESTATUS3));# endif# ifdef __WIN32__ if (status == (DWORD)-1) { _SLerrno_errno = ENOENT; return -1; } if (0 == (status & FILE_ATTRIBUTE_DIRECTORY)) { _SLerrno_errno = ENOTDIR; return -1; }# else if ((rc != 0) || (status.attrFile & FILE_DIRECTORY) == 0) { /* ENOTDIR isn't defined in VA3. */ _SLerrno_errno = ENOENT; return -1; }# endif len = strlen (file); pat = SLmalloc (len + 3); if (pat == NULL) return -1; strcpy (pat, file); file = pat; while (*file != 0) { if (*file == '/') *file = '\\'; file++; } if (len && (pat[len-1] != '\\')) { pat[len] = '\\'; len++; } pat[len++] = '*'; pat[len] = 0; num = 0; max_num = 50; list = (char **)SLmalloc (max_num * sizeof(char *)); if (list == NULL) { SLfree (pat); return -1; }# ifdef __WIN32__ h = FindFirstFile(pat, &fd); if (h == INVALID_HANDLE_VALUE) { if (ERROR_NO_MORE_FILES != GetLastError()) { SLfree (pat); SLfree ((char *)list); return -1; } }# else h = HDIR_CREATE; cFileNames = 1; rc = DosFindFirst(pat, &h, FILE_READONLY | FILE_DIRECTORY | FILE_ARCHIVED, &fd, sizeof(fd), &cFileNames, FIL_STANDARD); if (rc != 0) { if (rc != ERROR_NO_MORE_FILES) { SLfree (pat); SLfree ((char *)list); return -1; } }# endif else while (1) { /* Do not include hidden files in the list. Also, do not * include "." and ".." entries. */#ifdef __WIN32__ file = fd.cFileName;#else file = fd.achName;#endif if (#ifdef __WIN32__ (hok || (0 == (fd.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)))#else (hok || (0 == (fd.attrFile & FILE_HIDDEN)))#endif && ((*file != '.') || ((0 != strcmp (file, ".")) && (0 != strcmp (file, ".."))))) { if (num == max_num) { char **new_list; max_num += 100; new_list = (char **)SLrealloc ((char *)list, max_num * sizeof (char *)); if (new_list == NULL) goto return_error; list = new_list; } file = SLang_create_slstring (file); if (file == NULL) goto return_error; list[num] = file; num++; }#ifdef __WIN32__ if (FALSE == FindNextFile(h, &fd)) { if (ERROR_NO_MORE_FILES == GetLastError()) { FindClose (h); break; } _SLerrno_errno = errno; FindClose (h); goto return_error; }#else cFileNames = 1; rc = DosFindNext(h, &fd, sizeof(fd), &cFileNames); if (rc != 0) { if (rc == ERROR_NO_MORE_FILES) { DosFindClose (h); break; } _SLerrno_errno = errno; DosFindClose (h); goto return_error; }#endif } SLfree (pat); *maxnum = max_num; *nump = num; *listp = list; return 0; return_error: free_dir_list (list, num); SLfree (pat); return -1;}#else /* NOT __WIN32__ */static int build_dirlist (char *dir, char *opt, char ***listp, unsigned int *nump, unsigned int *maxnum){ DIR *dp; struct dirent *ep; unsigned int num_files; unsigned int max_num_files; char **list; (void) opt; if (NULL == (dp = opendir (dir))) { _SLerrno_errno = errno; return -1; } num_files = max_num_files = 0; list = NULL; while (NULL != (ep = readdir (dp))) { unsigned int len; char *name; name = ep->d_name;# ifdef NEED_D_NAMLEN len = ep->d_namlen;# else len = strlen (name);# endif if ((*name == '.') && (len <= 2)) { if (len == 1) continue; if (name [1] == '.') continue; } if (num_files == max_num_files) { char **new_list; max_num_files += 100; if (NULL == (new_list = (char **) SLrealloc ((char *)list, max_num_files * sizeof(char *)))) goto return_error; list = new_list; } if (NULL == (list[num_files] = SLang_create_nslstring (name, len))) goto return_error; num_files++; } closedir (dp); *nump = num_files; *maxnum = max_num_files; *listp = list; return 0; return_error: if (dp != NULL) closedir (dp); free_dir_list (list, num_files); return -1;}# endif /* NOT __WIN32__ */static void listdir_cmd (char *dir, char *opt){ SLang_Array_Type *at; unsigned int num_files; unsigned int max_num_files; int inum_files; char **list; if (-1 == build_dirlist (dir, opt, &list, &num_files, &max_num_files)) { SLang_push_null (); return; } /* If max_num_files == 0, then num_files == 0 and list == NULL. * The realloc step below will malloc list for us. */ if (num_files + 1 < max_num_files) { char **new_list; if (NULL == (new_list = (char **) SLrealloc ((char *)list, (num_files + 1)* sizeof(char*)))) { free_dir_list (list, num_files); SLang_push_null (); return; } list = new_list; } inum_files = (int) num_files; if (NULL == (at = SLang_create_array (SLANG_STRING_TYPE, 0, (VOID_STAR) list, &inum_files, 1))) { free_dir_list (list, num_files); SLang_push_null (); return; } /* Allow the array to free this list if push fails */ if (-1 == SLang_push_array (at, 1)) SLang_push_null ();}static void listdir_cmd_wrap (void){ char *s, *sopt; sopt = NULL; switch (SLang_Num_Function_Args) { case 2: if (-1 == SLang_pop_slstring (&sopt)) return; case 1: if (-1 == SLang_pop_slstring (&s)) { SLang_free_slstring (sopt); return; } break; default: SLang_verror (SL_INVALID_PARM, "usage: listdir (string, [opt-string]"); return; } listdir_cmd (s, sopt); SLang_free_slstring (s); SLang_free_slstring (sopt);}#endif /* USE_LISTDIR_INTRINSIC */#ifdef HAVE_UMASKstatic int umask_cmd (int *u){ return umask (*u);}#endifstatic SLang_Intrin_Fun_Type PosixDir_Name_Table [] ={#ifdef HAVE_READLINK MAKE_INTRINSIC_S("readlink", readlink_cmd, SLANG_VOID_TYPE),#endif MAKE_INTRINSIC_S("lstat_file", lstat_cmd, SLANG_VOID_TYPE), MAKE_INTRINSIC_S("stat_file", stat_cmd, SLANG_VOID_TYPE), MAKE_INTRINSIC_SI("stat_is", stat_is_cmd, SLANG_CHAR_TYPE),#ifdef HAVE_MKFIFO MAKE_INTRINSIC_SI("mkfifo", mkfifo_cmd, SLANG_INT_TYPE),#endif#ifdef HAVE_CHOWN MAKE_INTRINSIC_SII("chown", chown_cmd, SLANG_INT_TYPE),#endif MAKE_INTRINSIC_SI("chmod", chmod_cmd, SLANG_INT_TYPE),#ifdef HAVE_UMASK MAKE_INTRINSIC_I("umask", umask_cmd, SLANG_INT_TYPE),#endif MAKE_INTRINSIC_0("getcwd", slget_cwd, SLANG_VOID_TYPE), MAKE_INTRINSIC_SI("mkdir", mkdir_cmd, SLANG_INT_TYPE), MAKE_INTRINSIC_S("chdir", chdir_cmd, SLANG_INT_TYPE), MAKE_INTRINSIC_S("rmdir", rmdir_cmd, SLANG_INT_TYPE), MAKE_INTRINSIC_S("remove", remove_cmd, SLANG_INT_TYPE), MAKE_INTRINSIC_SS("rename", rename_cmd, SLANG_INT_TYPE),#if USE_LISTDIR_INTRINSIC MAKE_INTRINSIC("listdir", listdir_cmd_wrap, SLANG_VOID_TYPE, 0),#endif SLANG_END_INTRIN_FUN_TABLE};static SLang_IConstant_Type PosixDir_Consts [] ={#ifndef S_IRWXU# define S_IRWXU 00700#endif MAKE_ICONSTANT("S_IRWXU", S_IRWXU),#ifndef S_IRUSR# define S_IRUSR 00400#endif MAKE_ICONSTANT("S_IRUSR", S_IRUSR),#ifndef S_IWUSR# define S_IWUSR 00200#endif MAKE_ICONSTANT("S_IWUSR", S_IWUSR),#ifndef S_IXUSR# define S_IXUSR 00100#endif MAKE_ICONSTANT("S_IXUSR", S_IXUSR),#ifndef S_IRWXG# define S_IRWXG 00070#endif MAKE_ICONSTANT("S_IRWXG", S_IRWXG),#ifndef S_IRGRP# define S_IRGRP 00040#endif MAKE_ICONSTANT("S_IRGRP", S_IRGRP),#ifndef S_IWGRP# define S_IWGRP 00020#endif MAKE_ICONSTANT("S_IWGRP", S_IWGRP),#ifndef S_IXGRP# define S_IXGRP 00010#endif MAKE_ICONSTANT("S_IXGRP", S_IXGRP),#ifndef S_IRWXO# define S_IRWXO 00007#endif MAKE_ICONSTANT("S_IRWXO", S_IRWXO),#ifndef S_IROTH# define S_IROTH 00004#endif MAKE_ICONSTANT("S_IROTH", S_IROTH),#ifndef S_IWOTH# define S_IWOTH 00002#endif MAKE_ICONSTANT("S_IWOTH", S_IWOTH),#ifndef S_IXOTH# define S_IXOTH 00001#endif MAKE_ICONSTANT("S_IXOTH", S_IXOTH),#ifdef __WIN32__ MAKE_ICONSTANT("FILE_ATTRIBUTE_ARCHIVE", FILE_ATTRIBUTE_ARCHIVE), MAKE_ICONSTANT("FILE_ATTRIBUTE_COMPRESSED", FILE_ATTRIBUTE_COMPRESSED), MAKE_ICONSTANT("FILE_ATTRIBUTE_NORMAL", FILE_ATTRIBUTE_NORMAL), MAKE_ICONSTANT("FILE_ATTRIBUTE_DIRECTORY", FILE_ATTRIBUTE_DIRECTORY), MAKE_ICONSTANT("FILE_ATTRIBUTE_HIDDEN", FILE_ATTRIBUTE_HIDDEN), MAKE_ICONSTANT("FILE_ATTRIBUTE_READONLY", FILE_ATTRIBUTE_READONLY), MAKE_ICONSTANT("FILE_ATTRIBUTE_SYSTEM", FILE_ATTRIBUTE_SYSTEM), MAKE_ICONSTANT("FILE_ATTRIBUTE_TEMPORARY", FILE_ATTRIBUTE_TEMPORARY),#endif SLANG_END_ICONST_TABLE};static int Initialized;int SLang_init_posix_dir (void){ if (Initialized) return 0; if ((-1 == SLadd_intrin_fun_table(PosixDir_Name_Table, "__POSIX_DIR__")) || (-1 == SLadd_iconstant_table (PosixDir_Consts, NULL)) || (-1 == _SLerrno_init ())) return -1; Initialized = 1; return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -