650 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			650 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
//
 | 
						|
// WILDCARD.CPP
 | 
						|
//
 | 
						|
//  Source file for ArchiveLib 2.0
 | 
						|
//
 | 
						|
//  Copyright (c) Greenleaf Software, Inc. 1994-1996
 | 
						|
//  All Rights Reserved
 | 
						|
//
 | 
						|
// CONTENTS
 | 
						|
//
 | 
						|
//  ALWildCardExpander::operator new()
 | 
						|
//  ALWildCardExpander::ALWildCardExpander()
 | 
						|
//  newALExpander()
 | 
						|
//  newALExpanderWithDelimiters()
 | 
						|
//  ALWildCardExpander::IsDelimiter()
 | 
						|
//  ALWildCardExpander::~ALWildCardExpander()
 | 
						|
//  deleteALExpander()
 | 
						|
//  ALWildCardExpander::GetNextWildName()
 | 
						|
//
 | 
						|
// DESCRIPTION
 | 
						|
//
 | 
						|
//  This file contains most of the source code for the base class
 | 
						|
//  ALWildCardExpander.  The wild card expansion code is a state
 | 
						|
//  driven routine, which keeps track of its entire state between
 | 
						|
//  calls.  So you can call it once to get a new file name, then
 | 
						|
//  do some processing.  When you call it again later, you will
 | 
						|
//  get the next file name in the sequence.
 | 
						|
//
 | 
						|
//  The way the wild card class handles searching through subdirectories
 | 
						|
//  is by keeping a link pointer to a subdirectory search.  When it
 | 
						|
//  is time to open up a subdirectory search, we create a new file
 | 
						|
//  expander, and assign its pointer to our link pointer.  As long as
 | 
						|
//  the link is active, we keep searching there.  When the link runs
 | 
						|
//  out of files to return, we continue searching in our own directory.
 | 
						|
//
 | 
						|
//  A lot of this code is easier to deal with because we use the
 | 
						|
//  ALName class.  That makes it easy to strip file names and
 | 
						|
//  paths apart, and even easier to put them back together again.
 | 
						|
//
 | 
						|
//  Note that the system specific portions of the wildcard expansion
 | 
						|
//  class are isolated in separate directories, e.g. CPP_FS.NT\*.CPP
 | 
						|
//
 | 
						|
// REVISION HISTORY
 | 
						|
//
 | 
						|
//  May 26, 1994  1.0A  : First release
 | 
						|
//
 | 
						|
//  July 7, 1994  1.0B  : Added support for UNIX, which meant creating a
 | 
						|
//                        completely new version of ALGetNextFile.
 | 
						|
//
 | 
						|
//   February 14, 1996  2.0A : New release.
 | 
						|
//
 | 
						|
 | 
						|
#include "arclib.h"
 | 
						|
#if !defined( AL_IBM )
 | 
						|
#pragma hdrstop
 | 
						|
#endif
 | 
						|
 | 
						|
#include <stdlib.h>
 | 
						|
#include "wildcard.h"
 | 
						|
 | 
						|
//
 | 
						|
// NAME
 | 
						|
//
 | 
						|
//  ALWildCardExpander::operator new()
 | 
						|
//
 | 
						|
// PLATFORMS/ENVIRONMENTS
 | 
						|
//
 | 
						|
//  Console  Windows  PM
 | 
						|
//  C++
 | 
						|
//
 | 
						|
// SHORT DESCRIPTION
 | 
						|
//
 | 
						|
//  Memory allocator used when ArchiveLib resides in a 16 bit DLL.
 | 
						|
//
 | 
						|
// C++ SYNOPSIS
 | 
						|
//
 | 
						|
//  #include "arclib.h"
 | 
						|
//  #include "wildcard.h"
 | 
						|
//
 | 
						|
//  void * ALWildCardExpander::operator new( size_t size )
 | 
						|
//
 | 
						|
// C SYNOPSIS
 | 
						|
//
 | 
						|
//  None.
 | 
						|
//
 | 
						|
// VB SYNOPSIS
 | 
						|
//
 | 
						|
//  None.
 | 
						|
//
 | 
						|
// DELPHI SYNOPSIS
 | 
						|
//
 | 
						|
//  None.
 | 
						|
//
 | 
						|
// ARGUMENTS
 | 
						|
//
 | 
						|
//  size  :  The number of bytes that the compiler has decided will be
 | 
						|
//           necessary to construct a new ALWildCardExpander object.
 | 
						|
//
 | 
						|
// DESCRIPTION
 | 
						|
//
 | 
						|
//  When using a DLL, it is easy to get into a dangerous situation when
 | 
						|
//  creating objects whose ctor and dtor are both in the DLL.  The problem
 | 
						|
//  arises because when you create an object using new, the memory for
 | 
						|
//  the object will be allocated from the EXE.  However, when you destroy
 | 
						|
//  the object using delete, the memory is freed inside the DLL.  Since
 | 
						|
//  the DLL doesn't really own that memory, bad things can happen.
 | 
						|
//
 | 
						|
//  But, you say, won't the space just go back to the Windows heap regardless
 | 
						|
//  of who tries to free it?  Maybe, but maybe not.  If the DLL is using
 | 
						|
//  a subsegment allocation scheme, it might do some sort of local free
 | 
						|
//  before returning the space to the windows heap.  That is the point where
 | 
						|
//  you could conceivably cook your heap.
 | 
						|
//
 | 
						|
//  By providing our own version of operator new inside this class, we
 | 
						|
//  ensure that all memory allocation for the class will be done from
 | 
						|
//  inside the DLL, not the EXE calling the DLL.
 | 
						|
//
 | 
						|
// RETURNS
 | 
						|
//
 | 
						|
//  A pointer to some memory that should have been pulled out of the
 | 
						|
//  heap for the DLL.
 | 
						|
//
 | 
						|
// EXAMPLE
 | 
						|
//
 | 
						|
// SEE ALSO
 | 
						|
//
 | 
						|
// REVISION HISTORY
 | 
						|
//
 | 
						|
//   February 14, 1996  2.0A : New release.
 | 
						|
//
 | 
						|
 | 
						|
#if defined( AL_BUILDING_DLL )
 | 
						|
 | 
						|
void AL_DLL_FAR * AL_PROTO
 | 
						|
ALWildCardExpander::operator new( size_t size )  /* Tag protected function */
 | 
						|
{
 | 
						|
    return ::new char[ size ];
 | 
						|
}
 | 
						|
#endif
 | 
						|
 | 
						|
//
 | 
						|
// NAME
 | 
						|
//
 | 
						|
//  ALWildCardExpander::ALWildCardExpander()
 | 
						|
//
 | 
						|
// PLATFORMS/ENVIRONMENTS
 | 
						|
//
 | 
						|
//  Console  Windows  PM
 | 
						|
//  C++  C  VB  Delphi
 | 
						|
//
 | 
						|
// SHORT DESCRIPTION
 | 
						|
//
 | 
						|
//  Create an ALWildCardExpander object.
 | 
						|
//
 | 
						|
// C++ SYNOPSIS
 | 
						|
//
 | 
						|
//  #include "arclib.h"
 | 
						|
//  #include "wildcard.h"
 | 
						|
//
 | 
						|
//  ALWildCardExpander::ALWildCardExpander( const char *wild_file_list,
 | 
						|
//                                          int traverse_flag = 0,
 | 
						|
//                                          ALCase name_case = AL_LOWER );
 | 
						|
//
 | 
						|
// C SYNOPSIS
 | 
						|
//
 | 
						|
//  #include "arclib.h"
 | 
						|
//  #include "wildcard.h"
 | 
						|
//
 | 
						|
//  hALExpander newALExpander( char *wild_file_list,
 | 
						|
//                             int traverse_flag,
 | 
						|
//                             ALCase name_case );
 | 
						|
//
 | 
						|
// VB SYNOPSIS
 | 
						|
//
 | 
						|
//  Declare Function newALExpander Lib "AL20LW"
 | 
						|
//    (ByVal wild_file_list$, ByVal traverse_flag%, ByVal name_case%) As Long
 | 
						|
//
 | 
						|
// DELPHI SYNOPSIS
 | 
						|
//
 | 
						|
//  function newALExpander( wild_file_list : String;
 | 
						|
//                          traverse_flag : Integer;
 | 
						|
//                          name_case : Integer ) : hALExpander;
 | 
						|
//
 | 
						|
// ARGUMENTS
 | 
						|
//
 | 
						|
//  wild_file_list  : A list of wild card file specifications, separated
 | 
						|
//                    by commas, semicolons, or spaces, maybe looking
 | 
						|
//                    something like this: "*.CPP, BOB.DAT, *.*"
 | 
						|
//
 | 
						|
//  traverse_flag   : A flag that indicates whether you want to traverse
 | 
						|
//                    all subdirectories under the current path.  Note that
 | 
						|
//                    under C++, this defaults to a 0.  No such convenience
 | 
						|
//                    for C/VB/Delphi.
 | 
						|
//
 | 
						|
//  name_case       : An indicator of whether you want all the returned
 | 
						|
//                    file names forced to a certain case.  Note that
 | 
						|
//                    under C++, this defaults to AL_LOWER (usually).  No
 | 
						|
//                    such convenience for C/VB/Delphi.
 | 
						|
//
 | 
						|
// DESCRIPTION
 | 
						|
//
 | 
						|
//  The constructor for the expander has to set up a bunch of data members
 | 
						|
//  that will all be used during the expansion process.  The mCase
 | 
						|
//  member is easy to understand.  All of the objname objects that
 | 
						|
//  we create are going to be force to a certain case by this
 | 
						|
//  using this data member.  miTraverseFlag is just our copy of the
 | 
						|
//  input parameter.  And the mState variable keeps track of what we
 | 
						|
//  are doing in between function calls.  We set it to GET_NEXT_WILD_NAME,
 | 
						|
//  which means we will be doing that the first time we get called.
 | 
						|
//
 | 
						|
//  mInputLine is where we keep a copy of the list of wild card file
 | 
						|
//  specifications passed by the calling program.  Each time we take
 | 
						|
//  a new file name out of mInputLine, we remove it from the ALName
 | 
						|
//  object, making mInputLine just a little shorter.
 | 
						|
//
 | 
						|
//  The mResultFileName member is the storage area where we keep a copy
 | 
						|
//  of the file name created by the expander.  This is our local copy,
 | 
						|
//  when it gets returned to the calling program they need to make
 | 
						|
//  their own copy of it and leave ours alone.
 | 
						|
//
 | 
						|
//  Every time we get asked to get a new file, the very first thing
 | 
						|
//  we do is check to see if the mpNextExpander member is pointing
 | 
						|
//  to a new expander object.  If it is, we ask him to provide
 | 
						|
//  the next file name, instead of giving it ourselves.  When he
 | 
						|
//  doesn't have any file names left to give, we destroy him and
 | 
						|
//  set that pointer back to 0.  Here in the constructor, the smart
 | 
						|
//  thing to do is set him to 0 for starters.
 | 
						|
//
 | 
						|
//  mpcDelimiters is a short string that is used to define all the
 | 
						|
//  characters that can be file name delimiters.  They are used to
 | 
						|
//  separate file names in the input line.  By default, the delimiters
 | 
						|
//  are set to be space, tab, or commas.  Note that there is a second
 | 
						|
//  constructor for this object that lets users specify their own delimiter
 | 
						|
//  objects.
 | 
						|
//
 | 
						|
//  Note that every OS has different ways to keep track of a wild card
 | 
						|
//  expansion.  Rather than try to deal with that in here, I set it up
 | 
						|
//  by calling the member function ConstructOsData().  Various versions of
 | 
						|
//  this function will be linked in depending on which library is
 | 
						|
//  being built.
 | 
						|
//
 | 
						|
//
 | 
						|
// RETURNS
 | 
						|
//
 | 
						|
//  A newly constructed ALWildCardExpander object.  If you are calling
 | 
						|
//  this function from C/VB/Delphi, you are going to get a handle that
 | 
						|
//  is synonymous with a pointer to this object.
 | 
						|
//
 | 
						|
// EXAMPLE
 | 
						|
//
 | 
						|
// SEE ALSO
 | 
						|
//
 | 
						|
// REVISION HISTORY
 | 
						|
//
 | 
						|
//   February 14, 1996  2.0A : New release.
 | 
						|
//
 | 
						|
 | 
						|
AL_PROTO
 | 
						|
ALWildCardExpander::ALWildCardExpander(  /* Tag public function */
 | 
						|
          const char AL_DLL_FAR *wild_file_list,
 | 
						|
          int traverse_flag /* = 0 */,
 | 
						|
          ALCase name_case /* = AL_LOWER */ )
 | 
						|
    : mCase( name_case ),
 | 
						|
      mResultFileName( "", name_case )
 | 
						|
{
 | 
						|
    mInputLine = wild_file_list;
 | 
						|
    mState = GET_NEXT_WILD_NAME;
 | 
						|
    mpNextExpander = 0;
 | 
						|
    miTraverseFlag = traverse_flag;
 | 
						|
    mpcDelimiters = " ,\t";
 | 
						|
    ConstructOsData();
 | 
						|
}
 | 
						|
 | 
						|
#if !defined( AL_NO_C )
 | 
						|
 | 
						|
extern "C" AL_LINKAGE hALExpander AL_FUNCTION
 | 
						|
newALExpander( char AL_DLL_FAR *wild_file_list,  /* Tag public function */
 | 
						|
               int traverse_flag,
 | 
						|
               ALCase name_case )
 | 
						|
{
 | 
						|
    ALWildCardExpander *expander;
 | 
						|
 | 
						|
    expander = new ALWildCardExpander( wild_file_list, traverse_flag, name_case );
 | 
						|
    return (hALExpander) expander;
 | 
						|
}
 | 
						|
 | 
						|
#endif
 | 
						|
 | 
						|
//
 | 
						|
// NAME
 | 
						|
//
 | 
						|
//  ALWildCardExpander::ALWildCardExpander()
 | 
						|
//
 | 
						|
// PLATFORMS/ENVIRONMENTS
 | 
						|
//
 | 
						|
//  Console  Windows  PM
 | 
						|
//  C++  C  VB  Delphi
 | 
						|
//
 | 
						|
// SHORT DESCRIPTION
 | 
						|
//
 | 
						|
//  Create an ALWildCardExpander object, with specific file name delimiters.
 | 
						|
//
 | 
						|
// C++ SYNOPSIS
 | 
						|
//
 | 
						|
//  #include "arclib.h"
 | 
						|
//  #include "wildcard.h"
 | 
						|
//
 | 
						|
//  ALWildCardExpander::ALWildCardExpander( const char *wild_file_list,
 | 
						|
//                                          const char *delimiters,
 | 
						|
//                                          int traverse_flag = 0,
 | 
						|
//                                          ALCase name_case = AL_LOWER );
 | 
						|
//
 | 
						|
// C SYNOPSIS
 | 
						|
//
 | 
						|
//  #include "arclib.h"
 | 
						|
//  #include "wildcard.h"
 | 
						|
//
 | 
						|
//  hALExpander newALExpanderWithDelimiters( char *wild_file_list,
 | 
						|
//                                           char *delimiters,
 | 
						|
//                                           int traverse_flag,
 | 
						|
//                                           ALCase name_case );
 | 
						|
//
 | 
						|
// VB SYNOPSIS
 | 
						|
//
 | 
						|
//  Declare Function newALExpanderWithDelimiters Lib "AL20LW"
 | 
						|
//    (ByVal wild_file_list$,
 | 
						|
//     ByVal delimiters$
 | 
						|
//     ByVal traverse_flag%,
 | 
						|
//     ByVal name_case%) As Long
 | 
						|
//
 | 
						|
// DELPHI SYNOPSIS
 | 
						|
//
 | 
						|
//  function newALExpanderWithDelimiters( wild_file_list : String;
 | 
						|
//                                        delimiters : String;
 | 
						|
//                                        traverse_flag : Integer;
 | 
						|
//                                        name_case : Integer ) : hALExpander;
 | 
						|
//
 | 
						|
// ARGUMENTS
 | 
						|
//
 | 
						|
//  All arguments are the same as the previous constructor, except:
 | 
						|
//
 | 
						|
//  delimiters:  A C-style character string that contains a list of
 | 
						|
//               characters that are used to delimit file names.  Specify
 | 
						|
//               this argument to use delimiters other than the defaults.
 | 
						|
//
 | 
						|
// DESCRIPTION
 | 
						|
//
 | 
						|
//  This constructor is identical to the previous constructor, except for
 | 
						|
//  the addition of the delimiters argument.  This argument lets you specify
 | 
						|
//  delimiters other than the default for parsing your list of input file
 | 
						|
//  names.
 | 
						|
//
 | 
						|
// RETURNS
 | 
						|
//
 | 
						|
//  A newly constructed ALWildCardExpander object.  If you are calling
 | 
						|
//  this function from C/VB/Delphi, you are going to get a handle that
 | 
						|
//  is synonymous with a pointer to this object.
 | 
						|
//
 | 
						|
// EXAMPLE
 | 
						|
//
 | 
						|
// SEE ALSO
 | 
						|
//
 | 
						|
// REVISION HISTORY
 | 
						|
//
 | 
						|
//   February 14, 1996  2.0A : New release.
 | 
						|
//
 | 
						|
 | 
						|
AL_PROTO
 | 
						|
ALWildCardExpander::ALWildCardExpander(  /* Tag public function */
 | 
						|
          const char AL_DLL_FAR *file_list,
 | 
						|
          const char AL_DLL_FAR *delimiters,
 | 
						|
          int traverse_flag /* = 0 */,
 | 
						|
          ALCase name_case /* = AL_LOWER */ )
 | 
						|
    : mCase( name_case ),
 | 
						|
      mResultFileName( "", name_case )
 | 
						|
{
 | 
						|
    mInputLine = file_list;
 | 
						|
    mState = GET_NEXT_WILD_NAME;
 | 
						|
    mpNextExpander = 0;
 | 
						|
    miTraverseFlag = traverse_flag;
 | 
						|
    mpcDelimiters = delimiters;
 | 
						|
    ConstructOsData();
 | 
						|
}
 | 
						|
 | 
						|
#if !defined( AL_NO_C )
 | 
						|
 | 
						|
extern "C" AL_LINKAGE hALExpander AL_FUNCTION
 | 
						|
newALExpanderWithDelimiters( char AL_DLL_FAR *wild_file_list,  /* Tag public function */
 | 
						|
                             char AL_DLL_FAR *delimiters,
 | 
						|
                             int traverse_flag,
 | 
						|
                             ALCase name_case )
 | 
						|
{
 | 
						|
    ALWildCardExpander *expander;
 | 
						|
 | 
						|
    expander = new ALWildCardExpander( wild_file_list,
 | 
						|
                                       delimiters,
 | 
						|
                                       traverse_flag,
 | 
						|
                                       name_case );
 | 
						|
    return (hALExpander) expander;
 | 
						|
}
 | 
						|
 | 
						|
#endif
 | 
						|
 | 
						|
//
 | 
						|
// NAME
 | 
						|
//
 | 
						|
//  ALWildCardExpander::IsDelimiter()
 | 
						|
//
 | 
						|
// PLATFORMS/ENVIRONMENTS
 | 
						|
//
 | 
						|
//  Console  Windows  PM
 | 
						|
//  C++
 | 
						|
//
 | 
						|
// SHORT DESCRIPTION
 | 
						|
//
 | 
						|
//  Check to see if a character is a delimiter.
 | 
						|
//
 | 
						|
// C++ SYNOPSIS
 | 
						|
//
 | 
						|
//  #include "arclib.h"
 | 
						|
//  #include "wildcard.h"
 | 
						|
//
 | 
						|
//  int ALWildCardExpander::IsDelimiter( char c );
 | 
						|
//
 | 
						|
// C SYNOPSIS
 | 
						|
//
 | 
						|
//  None, this is an internal protected function.
 | 
						|
//
 | 
						|
// VB SYNOPSIS
 | 
						|
//
 | 
						|
//  None, this is an internal protected function.
 | 
						|
//
 | 
						|
// DELPHI SYNOPSIS
 | 
						|
//
 | 
						|
//  None, this is an internal protected function.
 | 
						|
//
 | 
						|
// ARGUMENTS
 | 
						|
//
 | 
						|
//  c  :  Internally, each character in the list of input wild names is
 | 
						|
//        checked using this function.  If the function returns a true
 | 
						|
//        value, it means the character is a delimiter, and we need to
 | 
						|
//        terminate the current file name.
 | 
						|
//
 | 
						|
// DESCRIPTION
 | 
						|
//
 | 
						|
//  This function checks to see if a character is a delimiter by simply
 | 
						|
//  looking through the list of delimiters, one by one, and seeing if
 | 
						|
//  any of the inputs match.
 | 
						|
//
 | 
						|
// RETURNS
 | 
						|
//
 | 
						|
//  True or false.
 | 
						|
//
 | 
						|
// EXAMPLE
 | 
						|
//
 | 
						|
// SEE ALSO
 | 
						|
//
 | 
						|
// REVISION HISTORY
 | 
						|
//
 | 
						|
//   February 14, 1996  2.0A : New release.
 | 
						|
//
 | 
						|
 | 
						|
int AL_PROTO
 | 
						|
ALWildCardExpander::IsDelimiter( char c )  /* Tag protected function */
 | 
						|
{
 | 
						|
    const char *p = mpcDelimiters;
 | 
						|
 | 
						|
    while ( *p )
 | 
						|
        if ( *p++ == c )
 | 
						|
            return 1;
 | 
						|
    return 0;
 | 
						|
}
 | 
						|
 | 
						|
//
 | 
						|
// NAME
 | 
						|
//
 | 
						|
//  ALWildCardExpander::~ALWildCardExpander()
 | 
						|
//
 | 
						|
// PLATFORMS/ENVIRONMENTS
 | 
						|
//
 | 
						|
//  Console  Windows  PM
 | 
						|
//  C++  C  VB  Delphi
 | 
						|
//
 | 
						|
// SHORT DESCRIPTION
 | 
						|
//
 | 
						|
//  The destructor for the ALWildCardExpander.
 | 
						|
//
 | 
						|
// C++ SYNOPSIS
 | 
						|
//
 | 
						|
//  #include "arclib.h"
 | 
						|
//  #include "wildcard.h"
 | 
						|
//
 | 
						|
//  ALWildCardExpander::~ALWildCardExpander();
 | 
						|
//
 | 
						|
// C SYNOPSIS
 | 
						|
//
 | 
						|
//  #include "arclib.h"
 | 
						|
//  #include "wildcard.h"
 | 
						|
//
 | 
						|
//  void deleteALExpander( hALExpander this_object );
 | 
						|
//
 | 
						|
// VB SYNOPSIS
 | 
						|
//
 | 
						|
//  Declare Sub deleteALExpander Lib "AL20LW" (ByVal this_object&)
 | 
						|
//
 | 
						|
// DELPHI SYNOPSIS
 | 
						|
//
 | 
						|
//  procedure deleteALExpander( this_object : hALExpander );
 | 
						|
//
 | 
						|
// ARGUMENTS
 | 
						|
//
 | 
						|
//  this_object  :  A reference or pointer to the ALWildCardExpander that
 | 
						|
//                  is going to be destroyed.  Note that the C++ member
 | 
						|
//                  function version of this call doesn't have an explicit
 | 
						|
//                  argument here, since it has access to 'this' implicitly.
 | 
						|
//
 | 
						|
// DESCRIPTION
 | 
						|
//
 | 
						|
//  There are a couple of big deals we need to worry about in the
 | 
						|
//  destructor an ALWildCardExpander.  First, we have to worry about
 | 
						|
//  any additional handlers we created to search subdirectories.  If
 | 
						|
//  this destructor is being called before our search is done, we
 | 
						|
//  may have some of those expander objects just hanging around out
 | 
						|
//  there.  We take care of the by checking the mpNextExpander member.
 | 
						|
//  If it isn't set to 0, we delete the dynamically created expander.
 | 
						|
//
 | 
						|
//  Second, we have to worry about closing up any OS resources that were
 | 
						|
//  created to implement the expander.  We used to do that in the code
 | 
						|
//  right here, but that got tedious, so now it all gets moved to the
 | 
						|
//  DestroyOsData() function.  Which one of those gets linked in all depends
 | 
						|
//  on which version of the library is being built.
 | 
						|
//
 | 
						|
// RETURNS
 | 
						|
//
 | 
						|
//  Nothing.
 | 
						|
//
 | 
						|
// EXAMPLE
 | 
						|
//
 | 
						|
// SEE ALSO
 | 
						|
//
 | 
						|
// REVISION HISTORY
 | 
						|
//
 | 
						|
//   February 14, 1996  2.0A : New release.
 | 
						|
//
 | 
						|
 | 
						|
AL_PROTO
 | 
						|
ALWildCardExpander::~ALWildCardExpander()  /* Tag public function */
 | 
						|
{
 | 
						|
    if ( mpNextExpander )
 | 
						|
        delete mpNextExpander;
 | 
						|
    if ( mpOsData )
 | 
						|
        DestroyOsData();
 | 
						|
}
 | 
						|
 | 
						|
#if !defined( AL_NO_C )
 | 
						|
 | 
						|
extern "C" AL_LINKAGE void AL_FUNCTION
 | 
						|
deleteALExpander( hALExpander this_object )  /* Tag public function */
 | 
						|
{
 | 
						|
    AL_ASSERT_OBJECT( this_object, ALWildCardExpander, "deleteALExpander" );
 | 
						|
    delete (ALWildCardExpander *) this_object;
 | 
						|
}
 | 
						|
 | 
						|
#endif
 | 
						|
 | 
						|
//
 | 
						|
// NAME
 | 
						|
//
 | 
						|
//  ALWildCardExpander::GetNextWildName()
 | 
						|
//
 | 
						|
// PLATFORMS/ENVIRONMENTS
 | 
						|
//
 | 
						|
//  Console  Windows  PM
 | 
						|
//  C++
 | 
						|
//
 | 
						|
// SHORT DESCRIPTION
 | 
						|
//
 | 
						|
//  Get the next wild name from the input list of wild names.
 | 
						|
//
 | 
						|
// C++ SYNOPSIS
 | 
						|
//
 | 
						|
//  #include "arclib.h"
 | 
						|
//  #include "wildcard.h"
 | 
						|
//
 | 
						|
//  int ALWildCardExpander::GetNextWildName();
 | 
						|
//
 | 
						|
// C SYNOPSIS
 | 
						|
//
 | 
						|
//  None, this is an internal protected function.
 | 
						|
//
 | 
						|
// VB SYNOPSIS
 | 
						|
//
 | 
						|
//  None, this is an internal protected function.
 | 
						|
//
 | 
						|
// DELPHI SYNOPSIS
 | 
						|
//
 | 
						|
//  None, this is an internal protected function.
 | 
						|
//
 | 
						|
// ARGUMENTS
 | 
						|
//
 | 
						|
//  None.
 | 
						|
//
 | 
						|
// DESCRIPTION
 | 
						|
//
 | 
						|
//  This function is called internally to get the next file spec out of
 | 
						|
//  the input line.  This is simply a matter of parsing past all the
 | 
						|
//  delimiter characters.  The resulting file spec is stored in
 | 
						|
//  data member mFullWildName.  That member will be the one used to
 | 
						|
//  kick off the next wild card search.
 | 
						|
//
 | 
						|
// RETURNS
 | 
						|
//
 | 
						|
//  1 if it got a new file spec, 0 if it didn't.
 | 
						|
//
 | 
						|
// EXAMPLE
 | 
						|
//
 | 
						|
// SEE ALSO
 | 
						|
//
 | 
						|
// REVISION HISTORY
 | 
						|
//
 | 
						|
//   February 14, 1996  2.0A : New release.
 | 
						|
//
 | 
						|
 | 
						|
int AL_PROTO
 | 
						|
ALWildCardExpander::GetNextWildName()  /* Tag protected function */
 | 
						|
{
 | 
						|
    char wild_spec[ _MAX_PATH ];
 | 
						|
    int i = 0;
 | 
						|
    char AL_DLL_FAR *p = mInputLine;
 | 
						|
 | 
						|
    for ( ; ; p++ ) {
 | 
						|
        if ( !IsDelimiter( *p ) )
 | 
						|
            break;
 | 
						|
    }
 | 
						|
    for ( ; ; p++ ) {
 | 
						|
        if ( IsDelimiter( *p ) || *p == '\0' )
 | 
						|
            break;
 | 
						|
        wild_spec[ i++ ] = (char) *p;
 | 
						|
        if ( i >= ( _MAX_PATH - 2 ) )
 | 
						|
            return 0;
 | 
						|
    }
 | 
						|
    wild_spec[ i++ ] = '\0';
 | 
						|
    if ( i <= 1 )
 | 
						|
         return 0;
 | 
						|
    mFullWildName = wild_spec;
 | 
						|
    mInputLine = p;
 | 
						|
    return 1;
 | 
						|
}
 | 
						|
 |