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

📄 vms_directory.c

📁 这是一个做pdf阅读器的源代码文件,是大家学习阅读器资料的很好参考
💻 C
字号:
/* *	DIRECTORY.C - VMS emulation routines for UNIX Directory *	              callable routines * *	Author:		Patrick L. Mahan *	Location:	TGV, Inc *	Date:		19-November-1991 * *	Purpose:	Provides emulation of the BSD directory routines *			which are used by some of the X11 R4 release *			software. * *	Side effects:	This is only a partial emulation.  Not all of *			the required information is passed to the user. * *	Modification History * *	Date        | Who	| Version	| History *	------------+-----------+---------------+---------------------------- *	19-Nov-1991 | PLM	| 1.0		| First Write *	20-Apr-1992 | PLM	| 1.1		| Added validation check for *	            |		|		| for the directory */#include <stdio.h>#include <stdlib.h>#include <string.h>#include <rmsdef.h>#include <descrip.h>#include <lib$routines.h>#include "vms_dirent.h"#define	NOWILD		0x00000001#define MULTIPLE	0x00000002static unsigned long context = 0;static struct dsc$descriptor_s *create_descriptor ( name )char *name;{   struct dsc$descriptor_s *retdescrip;   retdescrip = (struct dsc$descriptor_s *)calloc(1, sizeof(struct dsc$descriptor_s));   if (retdescrip == NULL) return ((struct dsc$descriptor_s *)NULL);   retdescrip->dsc$b_dtype	= DSC$K_DTYPE_T;   retdescrip->dsc$b_class	= DSC$K_CLASS_S;   retdescrip->dsc$w_length	= strlen(name);   retdescrip->dsc$a_pointer	= name;   return (retdescrip);}static int Check_Directory( dirname )char *dirname;{	static char *tmpdir, *cp;	FILE *tfp;	int status;	status = 1;	tmpdir = calloc(strlen(dirname)+15,sizeof(char));	strcpy(tmpdir, dirname);	cp = strrchr(tmpdir, '.');	if (cp != NULL) {		*cp = ']';		cp = strrchr(tmpdir, ']');		*cp = '.';		strcat(tmpdir, "dir");	}	else {		char *tmp1;		tmp1 = calloc(strlen(dirname)+1,sizeof(char));		cp = strchr(tmpdir, '[');		cp++;		strcpy(tmp1, cp);		cp = strrchr(tmp1, ']');		*cp = '\0';		cp = strchr(tmpdir, '[');		cp++;		*cp = '\0';		strcat(tmpdir, "000000]");		strcat(tmpdir, tmp1);		strcat(tmpdir, ".dir");	}	tfp = fopen(tmpdir, "r");	if (tfp == NULL) status = 0;	fclose(tfp);	return (status);}DIR *opendir( dirname )char *dirname;{   DIR *retdir;   struct dsc$descriptor_s filedescriptor;   char *filepathname;   retdir = (DIR *) calloc(1, sizeof(DIR));   if (retdir == NULL) return ((DIR *)NULL);   if (!Check_Directory(dirname)) return ((DIR *)NULL);   filepathname = (char *)calloc(256, sizeof(char));   strcpy(filepathname, dirname);   strcat(filepathname, "*.*.*");   retdir->dd_fd = (unsigned long) create_descriptor(filepathname);   retdir->dd_loc = 0;   retdir->dd_size = strlen(filepathname);   retdir->dd_bsize = 0;   retdir->dd_off = 0;   retdir->dd_buf = filepathname;   return (retdir);}struct dirent *readdir( dirp )DIR *dirp;{   static struct dirent *retdirent;   struct dsc$descriptor_s retfilenamedesc;   struct dsc$descriptor_s searchpathdesc = *((struct dsc$descriptor_s *)dirp->dd_fd);   char retfilename[256];   char *sp;   unsigned long istatus;   unsigned long rms_status;   unsigned long flags;   retdirent = (struct dirent *)NULL;   flags = MULTIPLE;   retfilenamedesc.dsc$b_dtype	= DSC$K_DTYPE_T;   retfilenamedesc.dsc$b_class	= DSC$K_CLASS_S;   retfilenamedesc.dsc$w_length	= 255;   retfilenamedesc.dsc$a_pointer= retfilename;   istatus = lib$find_file (&searchpathdesc,                            &retfilenamedesc,                            &dirp->dd_loc,                            0, 0,                            &rms_status,                            &flags);   if (!(istatus & 1) && (istatus != RMS$_NMF) && (istatus != RMS$_FNF))   {      lib$signal (istatus);      return (retdirent);   }   else if ((istatus == RMS$_NMF) || (istatus == RMS$_FNF))      return (retdirent);   retfilename[retfilenamedesc.dsc$w_length] = '\0';   sp = strchr(retfilename, ' ');   if (sp != NULL) *sp = '\0';   sp = strrchr(retfilename, ']');   if (sp != NULL)      sp++;   else      sp = retfilename;   retdirent = (struct dirent *)calloc(1, sizeof(struct dirent));   strcpy(retdirent->d_name, sp);   retdirent->d_namlen = strlen(sp);   retdirent->d_fileno = 0;   retdirent->d_off = 0;   retdirent->d_reclen = DIRSIZ(retdirent);   return (retdirent);}long telldir( dirp )DIR *dirp;{   return(0);}void seekdir( dirp, loc )DIR *dirp;int loc;{   return;}void rewinddir( dirp )DIR *dirp;{   lib$find_file_end (&dirp->dd_loc);}void closedir( dirp )DIR *dirp;{   lib$find_file_end (&dirp->dd_loc);   cfree ((void *) dirp->dd_fd);   cfree (dirp->dd_buf);   cfree (dirp);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -