📄 vms_directory.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 + -