⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 slposdir.c

📁 一个C格式的脚本处理函数库源代码,可让你的C程序具有执行C格式的脚本文件
💻 C
📖 第 1 页 / 共 2 页
字号:
	  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 + -