campo-sirio/arch/objname.h

216 lines
7.1 KiB
C++
Executable File

/*
* OBJNAME.H
*
* Header file for ArchiveLib 1.0
*
* Copyright (c) 1994 Greenleaf Software, Inc.
* All Rights Reserved
*
* DESCRIPTION
*
* This file contains the class definition for ALName. Most of the time
* this class is used to contain file names.
*
* CLASS DEFINITIONS:
*
* ALName
*
* FUNCTIONS:
*
* ostream& operator << ( ostream& stream, const ALName &object )
*
* REVISION HISTORY
*
* May 26, 1994 1.0A : First release
*
*/
#ifndef _OBJNAME_H
#define _OBJNAME_H
#if defined( __cplusplus )
#include <string.h>
#include <iostream.h>
/*
* class ALName
*
* DESCRIPTION
*
* Object names are mostly used for names of storage objects.
* There are enough things that I do with these guys to justify
* a class of their own. Having all the object name functions in their
* own class also cuts back on the number of functions in ALStorage,
* which is already cluttered.
*
* Besides serving as the mName member in ALStorage, this class is
* also pressed into service in ALWildCardExpander, where it is very
* handy.
*
* DATA MEMBERS
*
* mszName : A pointer to the name associated with this object.
* This pointer can be a null pointer. The object is
* responsible for deleting this guy in the ALName
* destructor, along with the next member, mszOldName.
*
* mszOldName : A pointer to the last name associated with this
* object. When you assign a new name to one of these
* objects, the old name gets stored here. This makes
* it easy to revert to the old name in case of trouble.
*
* mCase : One of AL_UPPER, AL_LOWER, or AL_MIXED. If the value
* is AL_UPPER or AL_LOWER, the name is forced to all
* upper or lower case whenever it is assigned to the
* object.
*
* MEMBER FUNCTIONS
*
* ALName(const ALName &) : The copy constructor.
* ALName(const char *) : Constructor that initializes with a char *.
* operator=(const ALName&) : Assignment operator.
* operator=(const char *) : Assignment operator for char *.
* ~ALName() : Destructor, has to clean up dynamic storage.
* operator new() : Memory allocation operatory, only used
* when the library is inside the DLL. Be
* aware that this operator allocates space for
* the object itself, not the strings that it
* will contain.
* Strcpy() : A protected member function, copies and
* converts to the appropriate case if necessary.
* GetName() : Returns a pointer to the name string, might
* be 0.
* GetOldName() : Returns a pointer to the previous name
* string, might be 0.
* GetSafeName() : Returns a pointer to the name string, but
* is guaranteed not to return 0.
* GetSafeOldName() : Returns a pointer to the old name string, but
* is guaranteed not to return 0.
* ChangeExtension() : Change a filename extension to a new one.
* ChangeTrailingChar() : Change the trailing character in the filename.
* StripFileName() : Remove the filename, leaving the path and drive.
* StripPath() : Remove path and drive, leaving the filename.
* WildCardMatch() : Test for a match against a regular expression.
* operator const char *() : Return a char *.
* operator+() : Append a string to this string.
*
* REVISION HISTORY
*
* May 26, 1994 1.0A : First release
*
*/
/*
* Microsoft won't let me create a cast operator for char _far *.
* But they will let me cast to this typedef. Ugly, but it works.
*/
typedef char AL_DLL_FAR * STRINGF;
class AL_CLASS_TYPE ALName {
/*
* Constructors, destructors, assignment operator, and friends
*/
public :
AL_PROTO ALName( const ALName AL_DLL_FAR & );
AL_PROTO ALName( const char AL_DLL_FAR *s = "",
ALCase name_case = AL_MIXED );
ALName AL_DLL_FAR & AL_PROTO operator = ( const ALName AL_DLL_FAR & rhs );
ALName AL_DLL_FAR & AL_PROTO operator = ( const char AL_DLL_FAR * rhs );
AL_PROTO ~ALName();
#if defined( AL_USING_DLL ) || defined( AL_BUILDING_DLL )
void AL_DLL_FAR * AL_PROTO operator new( size_t size );
#endif
/*
* Note that I don't have the normal prohibition against a copy constructor
* or an assignment operator in this class, because I support them here.
*/
/*
* Member Functions
*/
protected :
void AL_PROTO Strcpy( const char AL_DLL_FAR *s );
public :
const char AL_DLL_FAR * AL_PROTO GetName() const { return mszName; }
const char AL_DLL_FAR * AL_PROTO GetOldName() const { return mszOldName; }
const char AL_DLL_FAR * AL_PROTO GetSafeName() const;
const char AL_DLL_FAR * AL_PROTO GetSafeOldName() const;
ALName AL_DLL_FAR & AL_PROTO
ChangeExtension( const char AL_DLL_FAR *new_extension = ".bak" );
ALName AL_DLL_FAR & AL_PROTO ChangeTrailingChar( char new_char = '@' );
ALName AL_DLL_FAR & AL_PROTO StripFileName();
ALName AL_DLL_FAR & AL_PROTO StripPath();
int AL_PROTO WildCardMatch( const char AL_DLL_FAR *pattern );
/*
* Operators
*/
public :
#if defined( AL_MICROSOFT ) && ( AL_MICROSOFT < 800 ) && ( defined( AL_BUILDING_DLL ) || defined( AL_USING_DLL ) ) /*??? DON'T ASK ME WHY */
AL_PROTO operator STRINGF() const;
#else
AL_PROTO operator const STRINGF() const;
#endif
ALName AL_PROTO operator + ( const char AL_DLL_FAR *rhs );
/*
* Data members
*/
protected :
char AL_DLL_FAR * mszName;
char AL_DLL_FAR * mszOldName;
public :
const ALCase mCase;
AL_CLASS_TAG( _ALNameTag );
};
/*
* ostream& operator << ( ostream& stream, const ALName &object )
*
* ARGUMENTS:
*
* stream : An I/O stream.
*
* object : A reference to an ALName object.
*
* RETURNS
*
* A reference to the stream provided as an operator.
*
* DESCRIPTION
*
* This stream operator makes it easy to send ALName objects
* to an output stream. I need to define this function as inline,
* because it is tough to use far references to ostreams from a DLL.
* There are other problems associated with using this function
* in a DLL, and I don't understand them all.
*
* REVISION HISTORY
*
* May 26, 1994 1.0A : First release
*
*/
inline ostream& operator << ( ostream& stream, const ALName AL_DLL_FAR &object )
{
#if defined( AL_USING_DLL ) && !defined( AL_LARGE_MODEL ) && !defined( AL_FLAT_MODEL )
const char _far *p = (STRINGF) object;
char *near_string = new char[ _fstrlen( p ) + 1 ];
if ( near_string ) {
_fstrcpy( near_string, p );
stream << near_string;
delete near_string;
} else
stream << "Memory allocation failure!";
#else
stream << (STRINGF) object;
#endif
return stream;
}
#endif /* #if defined( __cplusplus ) */
#endif /* #ifndef _OBJNAME_H */