Esempio n. 1
0
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);
}
Esempio n. 2
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_;
}
Esempio n. 3
0
/*------------------------------------------------------------------------
 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;
}
Esempio n. 4
0
  _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
}
Esempio n. 5
0
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];
}