/*
 * WILDCARD.H
 *
 *  Header file for ArchiveLib 2.0
 *
 *  Copyright (c) 1994-1996 Greenleaf Software, Inc.
 *  All Rights Reserved
 *
 * DESCRIPTION
 *
 *  This file contains the class declaration for ALWildCardExpander,
 *  the class used to expand wildcard file specifications under
 *  DOS, Win32, and OS/2
 *
 * CLASS DEFINITIONS:
 *
 *  ALWildCardExpander
 *
 * ENUMERATED TYPES:
 *
 *   ALExpanderState (embedded in ALWildCardExpander)
 *
 * REVISION HISTORY
 *
 *  May 26, 1994  1.0A  : First release
 *
 *  February 14, 1996  2.0: New release
 */

#ifndef _WILDCARD_H
#define _WILDCARD_H

#include "arclib.h"

#if defined( __cplusplus )


/*
 * class ALWildCardExpander
 *
 * DESCRIPTION
 *
 * This class is used to expand wild card specifications on a DOS, OS/2,
 * or NT file system. Note that you can do exciting things with this, like
 * traversing through subdirectories, and separate various specs using
 * commas or white space.
 *
 * DATA MEMBERS
 *
 *  mState          : The current state of the expander.  This is a value
 *                    from ALExpander state that lets use keep track
 *                    of where we are between calls to the expander.
 *
 *  mpNextExpander  : If we are traversing subdirectories, we will
 *                    open a new expander for each subdirectory.  This
 *                    is a pointer to any subdirectory we might already
 *                    have open for a search in progress.
 *
 *  mInputLine      : The list of wildcard filespecs passed in as an
 *                    argument.  This gets whittled away, and will be
 *                    smaller and smaller as all the names are parsed out.
 *
 *  mFullWildName   : The current wild card file spec that is being
 *                    expanded.
 *
 *  mWildNameOnly   : The current wild name that is being expanded,
 *                    stripped of its drive and path information.
 *
 *  mWildPathOnly   : The current drive and path being expanded, stripped
 *                    of its filename and extension.
 *
 *  mResultFileName : The file name that is returned to the calling
 *                    program.
 *
 *  miTraverseFlag  : This flag indicates whether the search should traverse
 *                    traverse through subdirectories or just search
 *                    in the current directory.
 *
 *  mpOsData        : Pointer to OS specific data.  This is needed because
 *                    the O/S services needed to scan directories vary
 *                    widely between DOS, Win32, and OS/2.
 *
 *  mpcDelimiters   : An array of characters that are delimiters in the
 *                    input file list.
 *
 *  mCase           : Indicates whether file names should always be forced
 *                    to upper case, forced to lower case, or left mixed.
 *
 * MEMBER FUNCTIONS
 *
 *  ALWildCardExpander()    : Constructor, everything we need to know to
 *                            perform the search is defined here.
 *  ~ALWildCardExpander()   : Destructor.
 *  operator new()          : Memory allocation function, used when the
 *                            library is in a DLL.
 *  GetNextWildName()       : Protected routine to get the next wild name
 *                            from the input line.
 *
 *  ConstructOsData()       : There are different versions of this
 *                            function for each O/S.  It takes care of
 *                            allocating the data structures and services
 *                            needed to start a directory scan.
 *
 *  DestroyOsData()         : Likewise, there is a cleanup function for
 *                            each O/S as well.
 *
 *  IsDelimiter()           : A little function that is used internally
 *                            to test an individual character for delimiter
 *                            status.
 *
 *  GetNextFile()           : The function to get the next expanded file
 *                            name.  It keeps chunking out names until
 *                            the search is complete.
 *
 * REVISION HISTORY
 *
 *  May 26, 1994  1.0A  : First release
 *
 *  February 14, 1996  2.0: New release
 */

class AL_CLASS_TYPE ALWildCardOsData; /* An incomplete type.  I'll know what to do here
                                         in the expansion routines, which are O/S specfic */

class AL_CLASS_TYPE ALWildCardExpander {  /* Tag public class */
/*
 * Constructors, destructors, assignment operators, declarations
 */
    protected :
        enum ALExpanderState {  /* Tag protected class */
            GET_NEXT_WILD_NAME,
            GET_FIRST_FILE_NAME,
            GET_NEXT_FILE_NAME,
            GET_FIRST_DIRECTORY,
            GET_NEXT_DIRECTORY
        };
    public :
        AL_PROTO ALWildCardExpander( const char AL_DLL_FAR *file_list,
                                     int traverse_flag = 0,
#if defined( AL_UNIX ) || defined( AL_OS2 )
                                     ALCase name_case = AL_MIXED );
#else
                                     ALCase name_case = AL_LOWER );
#endif
        AL_PROTO ALWildCardExpander( const char AL_DLL_FAR *file_list,
                                     const char AL_DLL_FAR *delimiters,
                                     int traverse_flag = 0,
#if defined( AL_UNIX ) || defined( AL_OS2 )
                                     ALCase name_case = AL_MIXED );
#else
                                     ALCase name_case = AL_LOWER );
#endif
        AL_PROTO ~ALWildCardExpander();
#if defined( AL_USING_DLL ) || defined( AL_BUILDING_DLL )
        void AL_DLL_FAR * AL_PROTO operator new( size_t size );
#endif
/*
 * Disable copy constructor and assignment operator
 */
    protected :
        ALWildCardExpander AL_DLL_FAR & AL_PROTO operator=( ALWildCardExpander AL_DLL_FAR & );
        AL_PROTO ALWildCardExpander( ALWildCardExpander AL_DLL_FAR & );
/*
 * Member functions
 */
    protected :
        int AL_PROTO GetNextWildName();
        void AL_PROTO ConstructOsData();
        void AL_PROTO DestroyOsData();
        int AL_PROTO IsDelimiter( char c );
    public :
        char AL_DLL_FAR * AL_PROTO GetNextFile();
/*
 * Data members
 */
    protected :
        ALExpanderState mState;
        ALWildCardExpander AL_DLL_FAR *mpNextExpander;
        ALName mInputLine;
        ALName mFullWildName;
        ALName mWildNameOnly;
        ALName mWildPathOnly;
        ALName mResultFileName;
        int miTraverseFlag;
        ALWildCardOsData AL_DLL_FAR *mpOsData;
        const char AL_DLL_FAR *mpcDelimiters;
    public :
        const ALCase mCase;
        AL_CLASS_TAG( _ALWildCardExpanderTag );
};
#else  /* #if defined( __cplusplus ) ... */

AL_LINKAGE hALExpander AL_FUNCTION
newALExpander( char AL_DLL_FAR *wild_file_list,
               int traverse_flag,
               enum ALCase name_case );
AL_LINKAGE hALExpander AL_FUNCTION
newALExpanderWithDelimiters( char AL_DLL_FAR *wild_file_list,
                             char AL_DLL_FAR *delimiters,
                             int traverse_flag,
                             enum ALCase name_case );
AL_LINKAGE void AL_FUNCTION deleteALExpander( hALExpander this_object );
AL_LINKAGE char AL_DLL_FAR * AL_FUNCTION
ALExpanderGetNextFile( hALExpander this_object );

#endif /* #if defined( __cplusplus ) .... #else ...*/

#endif /* #ifdef _WINMON_H           */