text: /*
   * Copyright 1993-2002 Christopher Seiwald and Perforce Software, Inc.
   *
   * This file is part of Jam - see jam.c for Copyright information.
   */
  
  /*  This file is ALSO:
   *  Copyright 2001-2004 David Abrahams.
   *  Distributed under the Boost Software License, Version 1.0.
   *  (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
   */
  
  # include "jam.h"
  # include "filesys.h"
  # include "pathsys.h"
  
  # ifdef OS_MAC
  
  #include <Files.h>
  #include <Folders.h>
  
  # include <:sys:stat.h>
  
  /*
   * filemac.c - manipulate file names and scan directories on macintosh
   *
   * External routines:
   *
   *  file_dirscan() - scan a directory for files
   *  file_time() - get timestamp of file, if not done by file_dirscan()
   *  file_archscan() - scan an archive for files
   *
   * File_dirscan() and file_archscan() call back a caller provided function
   * for each file found.  A flag to this callback function lets file_dirscan()
   * and file_archscan() indicate that a timestamp is being provided with the
   * file.   If file_dirscan() or file_archscan() do not provide the file's
   * timestamp, interested parties may later call file_time().
   *
   * 04/08/94 (seiwald) - Coherent/386 support added.
   * 12/19/94 (mikem) - solaris string table insanity support
   * 02/14/95 (seiwald) - parse and build /xxx properly
   * 05/03/96 (seiwald) - split into pathunix.c
   * 11/21/96 (peterk) - BEOS does not have Unix-style archives
   */
  
  
  void CopyC2PStr( char const * cstr, StringPtr pstr )
  {
      int len;
      for ( len = 0; *cstr && ( len < 255 ); pstr[ ++len ] = *cstr++ );
      pstr[ 0 ] = len;
  }
  
  
  /*
   * file_dirscan() - scan a directory for files.
   */
  
  void file_dirscan( char * dir, scanback func, void * closure )
  {
      PATHNAME f;
      string filename[ 1 ];
      unsigned char fullPath[ 512 ];
  
      FSSpec spec;
      WDPBRec vol;
      Str63 volName;
      CInfoPBRec lastInfo;
      int index = 1;
  
      /* First enter directory itself. */
  
      memset( (char *)&f, '\0', sizeof( f ) );
  
      f.f_dir.ptr = dir;
      f.f_dir.len = strlen(dir);
  
      if ( DEBUG_BINDSCAN )
          printf( "scan directory %s\n", dir );
  
      /* Special case ":" - enter it */
  
      if ( ( f.f_dir.len == 1 ) && ( f.f_dir.ptr[0] == ':' ) )
          (*func)( closure, dir, 0 /* not stat()'ed */, (time_t)0 );
  
      /* Now enter contents of directory */
  
      vol.ioNamePtr = volName;
  
      if ( PBHGetVolSync( &vol ) )
          return;
  
      CopyC2PStr( dir, fullPath );
  
      if ( FSMakeFSSpec( vol.ioWDVRefNum, vol.ioWDDirID, fullPath, &spec ) )
          return;
  
      lastInfo.dirInfo.ioVRefNum   = spec.vRefNum;
      lastInfo.dirInfo.ioDrDirID   = spec.parID;
      lastInfo.dirInfo.ioNamePtr   = spec.name;
      lastInfo.dirInfo.ioFDirIndex = 0;
      lastInfo.dirInfo.ioACUser    = 0;
  
      if ( PBGetCatInfoSync( &lastInfo ) )
          return;
  
      if ( !( lastInfo.dirInfo.ioFlAttrib & 0x10 ) )
          return;
  
      /* ioDrDirID must be reset each time. */
      spec.parID = lastInfo.dirInfo.ioDrDirID;
  
      string_new( filename );
      for ( ; ; )
      {
          lastInfo.dirInfo.ioVRefNum  = spec.vRefNum;
          lastInfo.dirInfo.ioDrDirID  = spec.parID;
          lastInfo.dirInfo.ioNamePtr  = fullPath;
          lastInfo.dirInfo.ioFDirIndex = index++;
  
          if ( PBGetCatInfoSync( &lastInfo ) )
              return;
  
          f.f_base.ptr = (char *)fullPath + 1;
          f.f_base.len = *fullPath;
  
          string_truncate( filename, 0 );
          path_build( &f, filename, 0 );
          (*func)( closure, filename->value, 0 /* not stat()'ed */, (time_t)0 );
      }
      string_free( filename );
  }
  
  
  /*
   * file_time() - get timestamp of file, if not done by file_dirscan().
   */
  
  int file_time( char * filename, time_t * time )
  {
      struct stat statbuf;
  
      if ( stat( filename, &statbuf ) < 0 )
          return -1;
  
      *time = statbuf.st_mtime;
  
      return 0;
  }
  
  
  int file_is_file( char * filename )
  {
      struct stat statbuf;
      if ( stat( filename, &statbuf ) < 0 )
          return -1;
      return S_ISREG( statbuf.st_mode ) ? 1 : 0;
  }
  
  
  /*
   * file_archscan() - scan an archive for files.
   */
  
  void file_archscan( char * archive, scanback func, void * closure )
  {
  }
  
  
  # endif /* macintosh */
  