/* * Copyright (c) 1999 Apple Computer, Inc. All rights reserved. * * @APPLE_LICENSE_HEADER_START@ * * The contents of this file constitute Original Code as defined in and * are subject to the Apple Public Source License Version 1.1 (the * "License"). You may not use this file except in compliance with the * License. Please obtain a copy of the License at * http://www.apple.com/publicsource and read it before using this file. * * This Original Code and all software distributed under the License are * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the * License for the specific language governing rights and limitations * under the License. * * @APPLE_LICENSE_HEADER_END@ */ #ifdef WIN32 #include #include #include #define BOOL short typedef struct tagWin32GnuDir { DIR dir; struct dirent dent; char namefill[MAX_PATH]; } Win32GnuDir; typedef Win32GnuDir * PW32GDIR; DIR * opendir(path) char * path; { DIR *dir=0; char fpath[MAX_PATH],full[MAX_PATH]; LPTSTR end,put; DWORD fulllen; DWORD fileattr,volattr; char tmp[4]; strcpy(fpath,path); end=fpath; while(((end=strchr(fpath,'/')))) *end='\\'; GetFullPathName(fpath, MAX_PATH, full, 0); if((fileattr=GetFileAttributes(fpath))!=0xffffffff) { if (fileattr & FILE_ATTRIBUTE_DIRECTORY) { dir=calloc(sizeof(Win32GnuDir),1); strcat(full,"\\*"); dir->__data=calloc(sizeof(WIN32_FIND_DATA),1); dir->__fd=FindFirstFile(full, dir->__data); dir->__allocation=dir->__size=sizeof(WIN32_FIND_DATA); } } return(dir); } int closedir(dir) DIR * dir; { int retval=-1; if (dir) { if (FindClose(dir->__fd) || dir->__fd == 0xffffffff) retval=0; free(dir->__data); free(dir); } return(retval); } struct dirent *readdir(dir) DIR * dir; { struct dirent *retdirent=0; LPWIN32_FIND_DATA find; DWORD diridx; if (dir) { diridx=dir->__offset/sizeof(WIN32_FIND_DATA); find=dir->__data; if (strlen(find[diridx].cFileName)) { strcpy(&dir->__entry.d_name,&find[diridx].cFileName); dir->__offset+=sizeof(WIN32_FIND_DATA); if (dir->__offset>=dir->__size) { dir->__size+=sizeof(WIN32_FIND_DATA); dir->__allocation=dir->__size; find=dir->__data=realloc(find,dir->__size); memset(&find[diridx+1],0,sizeof(WIN32_FIND_DATA)); FindNextFile(dir->__fd,&find[diridx+1]); } retdirent=&dir->__entry; dir->__entry.d_namlen=strlen(dir->__entry.d_name); } } return(retdirent); } void rewinddir(dirp) DIR *dirp; { if (dirp) { dirp->__offset=0; } } void seekdir(dirp, pos) DIR *dirp; _off_t pos; { if (dirp) { pos=(pos/sizeof(WIN32_FIND_DATA))*sizeof(WIN32_FIND_DATA); if (pos__size) dirp->__offset=pos; } } _off_t telldir(dirp) DIR * dirp; { if (dirp) return(dirp->__offset); else return(0xffffffff); } #endif