Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

181 lines
6.6 KiB

/*****************************************************************************
* (C) COPYRIGHT MICROSOFT CORPORATION, 2002
*
* AUTHOR: ByronC
*
* DATE: 4/22/2002
*
* @doc INTERNAL
*
* @module SimpleTokenReplacement.cpp - Implementation for <c SimpleTokenReplacement> |
*
* This file contains the implmentation for the <c SimpleTokenReplacement> class.
*
*****************************************************************************/
#include "precomp.h"
/*****************************************************************************
* @doc INTERNAL
*
* @mfunc | SimpleTokenReplacement | SimpleTokenReplacement |
*
* We initialize all member variables. Here, we initialize our resulting string
* to be the input string.
*
*****************************************************************************/
SimpleTokenReplacement::SimpleTokenReplacement(
const CSimpleString &csOriginalString) :
m_csResult(csOriginalString)
{
}
/*****************************************************************************
* @doc INTERNAL
*
* @mfunc | SimpleTokenReplacement | ~SimpleTokenReplacement |
*
* Do any cleanup that is not already done.
*
*****************************************************************************/
SimpleTokenReplacement::~SimpleTokenReplacement()
{
}
/*****************************************************************************
* @doc INTERNAL
*
* @mfunc BOOL | SimpleTokenReplacement | ExpandTokenIntoString |
*
* This method inserts a value string in place of a token, similar to how
* printf expands:
* <nl>CHAR *szMyString = "TokenValue";
* <nl>printf("left %s right", szMyString);
* <nl>into the string "left TokenValue right".
*
* This method will only substitute the first matching token.
*
* @parm const CSimpleString& | csToken |
* The token we're looking for
* @parm const CSimpleString& | csTokenValue |
* The value we want to substitute for the token. It does not have to
* be the same size as the token.
* @parm const DWORD | dwStartIndex |
* The character index to start the search from
*
* @rvalue <gt> 0 |
* The token was found and replaced. The value returned is the
* character position following the token value substitution.
* This is useful in subsequent searches for the token,
* since we can start the next search from this index.
*
* @rvalue -1 |
* The token was not found, therefore no replacement occured.
* The resulting string is unchanged.
*****************************************************************************/
int SimpleTokenReplacement::ExpandTokenIntoString(
const CSimpleString &csToken,
const CSimpleString &csTokenValue,
const DWORD dwStartIndex)
{
CSimpleString csExpandedString;
int iRet = -1;
if (csToken.Length() > 0)
{
//
// Look for the token start
//
int iTokenStart = m_csResult.Find(csToken, dwStartIndex);
if (iTokenStart != -1)
{
//
// We found the token, so let's make the substitution.
// The original string looks like this:
// lllllllTokenrrrrrrr
// |
// |
// iTokenStart
// We want the string to look like this:
// lllllllTokenValuerrrrrrr
// Therefore, take everything before the Token, add the token value, then
// everything following the token i.e.
// lllllll + TokenValue + rrrrrrr
// | |
// iTokenStart -1 |
// iTokenStart + Token.length()
//
csExpandedString = m_csResult.SubStr(0, iTokenStart);
csExpandedString += csTokenValue;
csExpandedString += m_csResult.SubStr(iTokenStart + csToken.Length(), -1);
m_csResult = csExpandedString;
iRet = iTokenStart + csToken.Length();
}
else
{
iRet = -1;
}
}
return iRet;
}
/*****************************************************************************
* @doc INTERNAL
*
* @mfunc VOID | SimpleTokenReplacement | ExpandArrayOfTokensIntoString |
*
* This method will replace all instances of the input tokens with their
* corresponding values. It basically calls <mf SimpleTokenReplacement::ExpandTokenIntoString>
* for each token/value pair in the input list, until -1 is returned (i.e.
* no more instances of that token were found).
*
* @parm TokenValueList& | ListOfTokenValuePairs |
* A list class containing the tokens and values to substitute.
*
*****************************************************************************/
VOID SimpleTokenReplacement::ExpandArrayOfTokensIntoString(TokenValueList &ListOfTokenValuePairs)
{
SimpleTokenReplacement::TokenValuePair *pTokenValuePair;
//
// Loop through the list of Token/Value pairs, and for each element,
// replace the token with the value
//
for (pTokenValuePair = ListOfTokenValuePairs.getFirst();
pTokenValuePair != NULL;
pTokenValuePair = ListOfTokenValuePairs.getNext())
{
//
// We need to replace the token element number dwIndex with the value
// element number dwIndex. Since ExpandTokenIntoString only replaces the
// first occurence, we need to loop through until we have replaced all
// occurrences of this token.
//
int iSearchIndex = 0;
while (iSearchIndex != -1)
{
iSearchIndex = ExpandTokenIntoString(pTokenValuePair->getToken().String(), pTokenValuePair->getValue(), iSearchIndex);
}
}
}
/*****************************************************************************
* @doc INTERNAL
*
* @mfunc CSimpleString | SimpleTokenReplacement | getString |
*
* This method returns the resulting string, after any calls to
* <mf SimpleTokenReplacement::ExpandTokenIntoString> or
* <mf SimpleTokenReplacement::ExpandArrayOfTokensIntoString> have been
* made.
*
* @rvalue CSimpleString |
* The resulting string.
*****************************************************************************/
CSimpleString SimpleTokenReplacement::getString()
{
return m_csResult;
}