int main(int argc, char *argv[]) { DOSFileData ffblk; /* File control block */ int done; /* Done flag */ /*--------------------------------*/ fprintf(stderr, "\n%Fs v. %Fs : %s\n", PROGNAME, PROGVER, stModulInfo.pszCopyright); fprintf(stdout, "Argument: %s\n", argv[1]); if ('?' == argv[1][1]) { fprintf(stderr, HELPFORMAT, argv[0]); exit(); } strcpy(szInputFile, argv[1]); done = FIND_FIRST(szInputFile, 0, &ffblk); /* Find first file */ while (!done) { search_file(ff_name(&ffblk)); /* Search file for tokens */ done = FIND_NEXT(&ffblk); /* Find next matching file */ } return(0); }
int rewinddir(DIR *dirp) { if (0 == dirp->dd_fd || _NDIRS < dirp->dd_fd) { DFerr = EBADF; return Error_; } FIND_FIRST(dirp->dd_dirname, _A_ANY, &(dirp->dd_buf)); dirp->dd_loc = 0; return Success_; }
/*------------------------------------------------------------------------ Read an entry from <dirp> at the current location, advancing <dirp> to point at the next entry. Returns a struct dirent pointer to the entry on success or NULL on error. Subsequent calls to readdir on <dirp> will overwrite this data. dirent_errno is set to 0 on success or to one of the following on error: EINVAL - Bad dirp, probably not opened or already closed. EOF - Attempt to seek past end of directory. ------------------------------------------------------------------------*/ struct dirent *readdir(DIR *dirp) { if (NULL == dirp) { dirent_errno = EINVAL; return NULL; } if (((0 == dirp->d_loc) && (0 == FIND_FIRST(dirp->d_name, &(dirp->d_buf)))) || (0 == FIND_NEXT(&(dirp->d_buf)))) { dirp->d_loc++; dirent_errno = 0; return (&(dirp->d_buf)); } dirent_errno = EOF; return NULL; }
_WCRTLINK long _findfirst( const char *filespec, struct _finddata_t *fileinfo ) #endif #endif /******************************************************************************/ { #if defined( __NT__ ) WIN32_FIND_DATA ffb; HANDLE h; /*** Initialize the find ***/ h = FIND_FIRST( filespec, &ffb ); if( h == INVALID_HANDLE_VALUE ) { return( __set_errno_nt() ); } /*** Look for the first file ***/ if( !CHECK_FIND_NEXT_ATTR( h, FIND_ATTR, &ffb ) ) { FindClose( h ); return( __set_errno_dos( ERROR_FILE_NOT_FOUND ) ); } /*** Got one! ***/ #ifdef __INT64__ __F_NAME(__nt_finddatai64_cvt,__nt_wfinddatai64_cvt)( &ffb, fileinfo ); #else __F_NAME(__nt_finddata_cvt,__nt_wfinddata_cvt)( &ffb, fileinfo ); #endif return( (long)h ); #elif defined( __OS2__ ) APIRET rc; HDIR h = HDIR_CREATE; FF_BUFFER ffb; OS_UINT searchcount = 1; #ifdef __WIDECHAR__ char mbFilespec[MB_CUR_MAX * _MAX_PATH]; if( wcstombs( mbFilespec, filespec, sizeof( mbFilespec ) ) == -1 ) { mbFilespec[0] = '\0'; } #endif rc = DosFindFirst( (char*)__F_NAME(filespec,mbFilespec), &h, FIND_ATTR, &ffb, sizeof( ffb ), &searchcount, FF_LEVEL ); if( rc != 0 ) { return( -1L ); } /*** Got one! ***/ #ifdef __INT64__ __F_NAME(__os2_finddatai64_cvt,__os2_wfinddatai64_cvt)( &ffb, fileinfo ); #else __F_NAME(__os2_finddata_cvt,__os2_wfinddata_cvt)( &ffb, fileinfo ); #endif return( (long)h ); #elif defined( __RDOS__ ) RDOSFINDTYPE * findbuf; findbuf = (RDOSFINDTYPE*) lib_malloc( sizeof( RDOSFINDTYPE ) ); if( findbuf == NULL ) return( -1L ); findbuf->handle = RdosOpenDir( filespec ); findbuf->entry = 0; if( __rdos_finddata_get( findbuf, fileinfo ) ) return( (long) findbuf ); else { lib_free( findbuf ); return( -1 ); } #else /* DOS */ DOSFINDTYPE *findbuf; unsigned rc; /*** Start a new find using _dos_findfirst ***/ findbuf = (DOSFINDTYPE*) lib_malloc( sizeof( DOSFINDTYPE ) ); if( findbuf == NULL ) return( -1L ); rc = __F_NAME(_dos_findfirst,_wdos_findfirst)( filespec, FIND_ATTR, findbuf ); if( rc != 0 ) { lib_free( findbuf ); return( -1L ); } /*** Got one! ***/ #ifdef __INT64__ __F_NAME(__dos_finddatai64_cvt,__dos_wfinddatai64_cvt)( findbuf, fileinfo ); #else __F_NAME(__dos_finddata_cvt,__dos_wfinddata_cvt)( findbuf, fileinfo ); #endif return( (long)findbuf ); #endif }
DIR *opendir(char *fname) { int i; unsigned n = 0; char *p; DOSFileData dstruct; for (i = 0; i < _NDIRS; ++i) { if (!_DIRS[i].dd_fd) break; } if (_NDIRS <= i) { DFerr = ENOMEM; return NULL; } dos2unix(fname); if (':' == fname[1] && 1 < strlen(fname)) p = &fname[2]; else p = fname; while ('/' == LAST_CHAR(p) && 1 < strlen(p)) LAST_CHAR(p) = '\0'; if (strcmp(p, "/") && strlen(p)) { if (Success_ != (FIND_FIRST(fname, _A_ANY, &_DIRS[i].dd_buf))) { DFerr = ENOENT; return NULL; } if (!(_A_SUBDIR & _DIRS[i].dd_buf.attrib)) { DFerr = ENOTDIR; return NULL; } } strcpy(_DIRS[i].dd_dirname, fname); if (!strlen(p)) strcat(_DIRS[i].dd_dirname, "."); if ('/' != LAST_CHAR(_DIRS[i].dd_dirname)) strcat(_DIRS[i].dd_dirname, "/"); strcat(strupr(_DIRS[i].dd_dirname), "*.*"); if (Success_ != FIND_FIRST(_DIRS[i].dd_dirname, _A_ANY, &_DIRS[i].dd_buf)) { DFerr = ENOENT; return NULL; } memcpy(&dstruct, &_DIRS[i].dd_buf, sizeof(DOSFileData)); do { ++n; } while (Success_ == FIND_NEXT(&_DIRS[i].dd_buf)); memcpy(&_DIRS[i].dd_buf, &dstruct, sizeof(DOSFileData)); _DIRS[i].dd_size = n; _DIRS[i].dd_loc = 0; _DIRS[i].dd_fd = i + 1; DFerr = Success_; return &_DIRS[i]; }