348 lines
6 KiB
C++
348 lines
6 KiB
C++
|
/*++
|
||
|
|
||
|
Copyright (c) 1992 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
bstring.hxx
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
This module defines the new BSTRING hierarchy:
|
||
|
|
||
|
BSTRING
|
||
|
BDSTRING
|
||
|
|
||
|
BSTRING provides all of the desired methods on a string.
|
||
|
BDSTRING provides an implementation of a BSTRING with a
|
||
|
dynamic heap based buffer.
|
||
|
|
||
|
|
||
|
BSTRING is an abstract classes who's methods depend on the
|
||
|
implementation of two pure virtual methods: 'Resize' and 'NewBuf'.
|
||
|
A derived class must make use of the protected 'PutString' methods
|
||
|
in order to supply BSTRING with its string buffer. Use of
|
||
|
'PutString' is constrained as follows:
|
||
|
|
||
|
1. Supplying just a PSTR to 'PutString' implies that
|
||
|
the PSTR is null-terminated.
|
||
|
2. Supplying a PSTR and length to 'PutString' implies that
|
||
|
the PSTR points to a buffer of characters that is at
|
||
|
least one longer than the given length.
|
||
|
|
||
|
|
||
|
All implementations of 'Resize' and 'NewBuf' must:
|
||
|
|
||
|
1. Allocate an extra character for the NULL.
|
||
|
2. NULL-terminate the buffer allocated.
|
||
|
3. Always succeed if size <= current buffer size.
|
||
|
4. Always work as soon as the derived class is initialized (i.e.
|
||
|
BSTRING::Initialize method need not be called.).
|
||
|
5. Supply the buffer to BSTRING via 'PutString'.
|
||
|
|
||
|
Additionally 'Resize' must:
|
||
|
|
||
|
1. Preserve the contents of the current buffer.
|
||
|
|
||
|
All of the comparison operators supplied by BSTRING are
|
||
|
case insensitive.
|
||
|
|
||
|
Author:
|
||
|
|
||
|
Norbert P. Kusters (norbertk) 6-Aug-92
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#include "wstring.hxx"
|
||
|
#include "mbstr.hxx"
|
||
|
|
||
|
#if !defined(_BSTRING_DEFN_)
|
||
|
|
||
|
#define _BSTRING_DEFN_
|
||
|
|
||
|
|
||
|
DECLARE_CLASS( BSTRING );
|
||
|
|
||
|
class ULIB_EXPORT BSTRING : public OBJECT {
|
||
|
|
||
|
public:
|
||
|
|
||
|
NONVIRTUAL
|
||
|
BOOLEAN
|
||
|
Initialize(
|
||
|
IN PCSTR InitialString,
|
||
|
IN CHNUM StringLength DEFAULT TO_END
|
||
|
);
|
||
|
|
||
|
NONVIRTUAL
|
||
|
BOOLEAN
|
||
|
Initialize(
|
||
|
);
|
||
|
|
||
|
NONVIRTUAL
|
||
|
CHNUM
|
||
|
QueryChCount(
|
||
|
) CONST;
|
||
|
|
||
|
NONVIRTUAL
|
||
|
VOID
|
||
|
DeleteChAt(
|
||
|
IN CHNUM Position,
|
||
|
IN CHNUM Length DEFAULT 1
|
||
|
);
|
||
|
|
||
|
NONVIRTUAL
|
||
|
PSTR
|
||
|
QuerySTR(
|
||
|
IN CHNUM Position DEFAULT 0,
|
||
|
IN CHNUM Length DEFAULT TO_END,
|
||
|
OUT PSTR Buffer DEFAULT NULL,
|
||
|
IN CHNUM BufferLength DEFAULT 0,
|
||
|
IN BOOLEAN ForceNull DEFAULT TRUE
|
||
|
) CONST;
|
||
|
|
||
|
NONVIRTUAL
|
||
|
BOOLEAN
|
||
|
ReplaceWithChars(
|
||
|
IN CHNUM AtPosition,
|
||
|
IN CHNUM AtLength,
|
||
|
IN CHAR Character,
|
||
|
IN CHNUM FromLength
|
||
|
);
|
||
|
|
||
|
NONVIRTUAL
|
||
|
CHNUM
|
||
|
NextChar(
|
||
|
IN CHNUM AtPosition DEFAULT 0
|
||
|
);
|
||
|
|
||
|
NONVIRTUAL
|
||
|
CHNUM
|
||
|
Strchr(
|
||
|
IN CHAR Char,
|
||
|
IN CHNUM StartPosition DEFAULT 0
|
||
|
) CONST;
|
||
|
|
||
|
VIRTUAL
|
||
|
BOOLEAN
|
||
|
Resize(
|
||
|
IN CHNUM NewStringLength
|
||
|
) PURE;
|
||
|
|
||
|
VIRTUAL
|
||
|
BOOLEAN
|
||
|
NewBuf(
|
||
|
IN CHNUM NewStringLength
|
||
|
) PURE;
|
||
|
|
||
|
protected:
|
||
|
|
||
|
DECLARE_CONSTRUCTOR( BSTRING );
|
||
|
|
||
|
NONVIRTUAL
|
||
|
VOID
|
||
|
Construct(
|
||
|
);
|
||
|
|
||
|
NONVIRTUAL
|
||
|
VOID
|
||
|
PutString(
|
||
|
IN OUT PSTR String,
|
||
|
IN CHNUM Length
|
||
|
);
|
||
|
|
||
|
private:
|
||
|
|
||
|
PSTR _s; // Beginning of string.
|
||
|
CHNUM _l; // Strlen of string.
|
||
|
|
||
|
};
|
||
|
|
||
|
|
||
|
INLINE
|
||
|
VOID
|
||
|
BSTRING::PutString(
|
||
|
IN OUT PSTR String,
|
||
|
IN CHNUM Length
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
This routine initializes this string with the given buffer
|
||
|
and string length.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
String - Supplies the buffer to initialize the string with.
|
||
|
Length - Supplies the length of the string.
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
None.
|
||
|
|
||
|
--*/
|
||
|
{
|
||
|
_s = String;
|
||
|
_l = Length;
|
||
|
_s[_l] = 0;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
INLINE
|
||
|
BOOLEAN
|
||
|
BSTRING::Initialize(
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
This routine initializes this string to an empty null-terminated
|
||
|
string.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
None.
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
FALSE - Failure.
|
||
|
TRUE - Success.
|
||
|
|
||
|
--*/
|
||
|
{
|
||
|
return Resize(0);
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
INLINE
|
||
|
CHNUM
|
||
|
BSTRING::QueryChCount(
|
||
|
) CONST
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
This routine returns the number of characters in the string.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
None.
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
The number of characters in this string.
|
||
|
|
||
|
--*/
|
||
|
|
||
|
{
|
||
|
return _l;
|
||
|
}
|
||
|
|
||
|
|
||
|
INLINE
|
||
|
NONVIRTUAL
|
||
|
CHNUM
|
||
|
BSTRING::NextChar(
|
||
|
IN CHNUM AtPosition
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
This routine returns the position of the next occurance of
|
||
|
the given position.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
AtPosition - Supplies the current position.
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
The position of the next character.
|
||
|
|
||
|
--*/
|
||
|
{
|
||
|
PSTR p;
|
||
|
|
||
|
DebugAssert(AtPosition <= _l);
|
||
|
|
||
|
p = MBSTR::CharNext(_s + AtPosition);
|
||
|
return (CHNUM)(p - _s);
|
||
|
}
|
||
|
|
||
|
|
||
|
INLINE
|
||
|
CHNUM
|
||
|
BSTRING::Strchr(
|
||
|
IN CHAR Char,
|
||
|
IN CHNUM StartPosition
|
||
|
) CONST
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
This routine returns the position of the first occurance of
|
||
|
the given character.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
Char - Supplies the character to find.
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
The position of the given character or INVALID_CHNUM.
|
||
|
|
||
|
--*/
|
||
|
{
|
||
|
PSTR p;
|
||
|
|
||
|
DebugAssert(StartPosition <= _l);
|
||
|
p = MBSTR::Strchr(_s + StartPosition, Char);
|
||
|
return p ? (CHNUM)(p - _s) : INVALID_CHNUM;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
DECLARE_CLASS( BDSTRING );
|
||
|
|
||
|
class ULIB_EXPORT BDSTRING : public BSTRING {
|
||
|
|
||
|
public:
|
||
|
|
||
|
DECLARE_CONSTRUCTOR( BDSTRING );
|
||
|
|
||
|
VIRTUAL
|
||
|
~BDSTRING(
|
||
|
);
|
||
|
|
||
|
VIRTUAL
|
||
|
BOOLEAN
|
||
|
Resize(
|
||
|
IN CHNUM NewStringLength
|
||
|
);
|
||
|
|
||
|
VIRTUAL
|
||
|
BOOLEAN
|
||
|
NewBuf(
|
||
|
IN CHNUM NewStringLength
|
||
|
);
|
||
|
|
||
|
private:
|
||
|
|
||
|
VOID
|
||
|
Construct(
|
||
|
);
|
||
|
|
||
|
PSTR _buf; // String buffer.
|
||
|
CHNUM _length; // Number of characters in buffer.
|
||
|
|
||
|
};
|
||
|
|
||
|
|
||
|
#endif // _BSTRING_DEFN_
|