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;
 | |
| }
 | |
| 
 |