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

📄 __dirent.h

📁 acm比赛参考用书 里面附有源代码 还有Report 为北大ACM试题
💻 H
字号:
#ifndef ZZIP_INTERNAL_DIRENT_H#define ZZIP_INTERNAL_DIRENT_H#include <zzip/conf.h>/* * DO NOT USE THIS CODE. * * It is an internal header file for zziplib that carries some inline * functions (or just static members) and a few defines, simply to be * able to reuse these across - and have everything in a specific place. * * Copyright (c) 2002,2003 Guido Draheim *          All rights reserved, *          use under the restrictions of the  *          Lesser GNU General Public License *          or alternatively the restrictions  *          of the Mozilla Public License 1.1 */#ifdef ZZIP_HAVE_DIRENT_H#define USE_DIRENT 1#define _zzip_opendir   opendir#define _zzip_readdir   readdir#define _zzip_closedir  closedir#define _zzip_rewinddir rewinddir#define _zzip_telldir   telldir#define _zzip_seekdir   seekdir#define _zzip_DIR       DIR#include <dirent.h>#elif defined ZZIP_HAVE_WINBASE_H#define USE_DIRENT 2#define _zzip_opendir   win32_opendir#define _zzip_readdir   win32_readdir#define _zzip_closedir  win32_closedir#define _zzip_rewinddir win32_rewinddir#define _zzip_telldir   win32_telldir#define _zzip_seekdir   win32_seekdir#define _zzip_DIR       DIR/* * DIRENT.H (formerly DIRLIB.H) * * by M. J. Weinstein   Released to public domain 1-Jan-89 * * Because I have heard that this feature (opendir, readdir, closedir) * it so useful for programmers coming from UNIX or attempting to port * UNIX code, and because it is reasonably light weight, I have included * it in the Mingw32 package. I have also added an implementation of * rewinddir, seekdir and telldir. *   - Colin Peters <colin@bird.fu.is.saga-u.ac.jp> * *  This code is distributed in the hope that is will be useful but *  WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY *  DISCLAMED. This includeds but is not limited to warranties of *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * */#include <io.h>struct dirent{	long		d_ino;		/* Always zero. */	unsigned short	d_reclen;	/* Always zero. */	unsigned short	d_namlen;	/* Length of name in d_name. */	char*		d_name;		/* File name. */	/* NOTE: The name in the dirent structure points to the name in the	 *       finddata_t structure in the DIR. */};/* * This is an internal data structure. Good programmers will not use it * except as an argument to one of the functions below. */typedef struct{	/* disk transfer area for this dir */	struct _finddata_t	dd_dta;	/* dirent struct to return from dir (NOTE: this makes this thread	 * safe as long as only one thread uses a particular DIR struct at	 * a time) */	struct dirent		dd_dir;	/* _findnext handle */	long			dd_handle;	/*         * Status of search:	 *   0 = not started yet (next entry to read is first entry)	 *  -1 = off the end	 *   positive = 0 based index of next entry	 */	short			dd_stat;	/* given path for dir with search pattern (struct is extended) */	char			dd_name[1];} DIR;/* * dirent.c * * Derived from DIRLIB.C by Matt J. Weinstein  * This note appears in the DIRLIB.H * DIRLIB.H by M. J. Weinstein   Released to public domain 1-Jan-89 * * Updated by Jeremy Bettis <jeremy@hksys.com> * Significantly revised and rewinddir, seekdir and telldir added by Colin * Peters <colin@fu.is.saga-u.ac.jp> */#include <direct.h>#include <errno.h>#include <io.h>#include <stdlib.h>#include <string.h>#include <sys/stat.h>#define win32_SUFFIX	"*"#define	win32_SLASH	"\\"#ifndef S_ISDIR#define S_ISDIR(m)	((m & S_IFMT) == S_IFDIR)	/* is a directory */#endif  S_ISDIR/*  opendir  Returns a pointer to a DIR structure appropriately filled in to begin  searching a directory.*/static DIR*win32_opendir (const char *szPath){    DIR        *nd;    struct _stat statDir;    errno = 0;        if (!szPath) {	errno = EFAULT;	return (DIR *) 0;    }    if (szPath[0] == '\0') {	errno = ENOTDIR;	return (DIR *) 0;    }        /* Attempt to determine if the given path really is a directory. */    if (_stat (szPath, &statDir)) {	/* Error, stat should have set an error value. */	return (DIR *) 0;    }        if (!S_ISDIR (statDir.st_mode)) {	/* Error, stat reports not a directory. */	errno = ENOTDIR;	return (DIR *) 0;    }    /* Allocate enough space to store DIR structure and the complete *       directory path given. */    nd = (DIR *) calloc (1, sizeof (DIR) + strlen (szPath) 			 + strlen (win32_SLASH) + strlen (win32_SUFFIX));        if (!nd) {	/* Error, out of memory. */	errno = ENOMEM;	return (DIR *) 0;    }    /* Create the search expression. */    strcpy (nd->dd_name, szPath);        /* Add on a slash if the path does not end with one. */    if (nd->dd_name[0] != '\0' &&	nd->dd_name[strlen (nd->dd_name) - 1] != '/' &&	nd->dd_name[strlen (nd->dd_name) - 1] != '\\') {	strcat (nd->dd_name, win32_SLASH);    }        /* Add on the search pattern */    strcat (nd->dd_name, win32_SUFFIX);        /* Initialize handle to -1 so that a premature closedir doesn't try * to       call _findclose on it. */    nd->dd_handle = -1;        /* Initialize the status. */    nd->dd_stat = 0;        /* Initialize the dirent structure. ino and reclen are invalid under *       Win32, and name simply points at the appropriate part of the *       findfirst_t structure. */    nd->dd_dir.d_ino = 0;    nd->dd_dir.d_reclen = 0;    nd->dd_dir.d_namlen = 0;    nd->dd_dir.d_name = nd->dd_dta.name;        return nd;}/*  readdir  Return a pointer to a dirent structure filled with the information on the  next entry in the directory.*/static struct dirent *win32_readdir (DIR * dirp){    errno = 0;        /* Check for valid DIR struct. */    if (!dirp) {	errno = EFAULT;	return (struct dirent *) 0;    }        if (dirp->dd_dir.d_name != dirp->dd_dta.name) {	/* The structure does not seem to be set up correctly. */	errno = EINVAL;	return (struct dirent *) 0;    }    if (dirp->dd_stat < 0) {	/* We have already returned all files in the directory * (or the	   structure has an invalid dd_stat). */	return (struct dirent *) 0;    } else if (dirp->dd_stat == 0) {	/* We haven't started the search yet. */	/* Start the search */	dirp->dd_handle = _findfirst (dirp->dd_name, &(dirp->dd_dta));		if (dirp->dd_handle == -1) {	    /* Whoops! Seems there are no files in that * directory. */	    dirp->dd_stat = -1;	} else {	    dirp->dd_stat = 1;	}    } else {	/* Get the next search entry. */	if (_findnext (dirp->dd_handle, &(dirp->dd_dta))) {	    /* We are off the end or otherwise error. */	    _findclose (dirp->dd_handle);	    dirp->dd_handle = -1;	    dirp->dd_stat = -1;	} else {	    /* Update the status to indicate the correct * number. */	    dirp->dd_stat++;	}    }        if (dirp->dd_stat > 0) {	/* Successfully got an entry. Everything about the file is * already	   appropriately filled in except the length of the * file name. */	dirp->dd_dir.d_namlen = (unsigned short) strlen (dirp->dd_dir.d_name);	return &dirp->dd_dir;    }        return (struct dirent *) 0;}/*  closedir  Frees up resources allocated by opendir.*/static intwin32_closedir (DIR * dirp){    int         rc;    errno = 0;    rc = 0;    if (!dirp) {	errno = EFAULT;	return -1;    }        if (dirp->dd_handle != -1) {	rc = _findclose (dirp->dd_handle);    }        /* Delete the dir structure. */    free (dirp);        return rc;}/*  rewinddir  Return to the beginning of the directory "stream". We simply call findclose  and then reset things like an opendir.*/static voidwin32_rewinddir (DIR * dirp){    errno = 0;    if (!dirp) {	errno = EFAULT;	return;    }        if (dirp->dd_handle != -1) {	_findclose (dirp->dd_handle);    }        dirp->dd_handle = -1;    dirp->dd_stat = 0;}/*  telldir  Returns the "position" in the "directory stream" which can be used with  seekdir to go back to an old entry. We simply return the value in stat.*/static longwin32_telldir (DIR * dirp){    errno = 0;    if (!dirp) {	errno = EFAULT;	return -1;    }    return dirp->dd_stat;}/*  seekdir  Seek to an entry previously returned by telldir. We rewind the directory  and call readdir repeatedly until either dd_stat is the position number  or -1 (off the end). This is not perfect, in that the directory may  have changed while we weren't looking. But that is probably the case with  any such system.*/static voidwin32_seekdir (DIR * dirp, long lPos){    errno = 0;        if (!dirp) {	errno = EFAULT;	return;    }        if (lPos < -1) {	/* Seeking to an invalid position. */	errno = EINVAL;	return;    } else if (lPos == -1) {	/* Seek past end. */	if (dirp->dd_handle != -1) {	    _findclose (dirp->dd_handle);	}	dirp->dd_handle = -1;	dirp->dd_stat = -1;    } else {	/* Rewind and read forward to the appropriate index. */	win32_rewinddir (dirp);		while ((dirp->dd_stat < lPos) && win32_readdir (dirp));    }}#else#define USE_DIRENT 0#define _zzip_opendir(_N_) 0#define _zzip_readdir(_D_) 0#define _zzip_closedir(_D_) /* omit return code */#define _zzip_rewinddir(_D_)#define _zzip_telldir(_D_) 0#define _zzip_seekdir(_D_,_V_) /* omit return code */#define _zzip_DIR void*/* end of DIRENT implementation */#endif/* once */#endif

⌨️ 快捷键说明

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