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.
 
 
 
 
 
 

193 lines
4.9 KiB

//---------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation 1993-1994
//
// File: string.c
//
// This files contains common string routines
//
// History:
// 10-09-93 ScottH Created
//
//---------------------------------------------------------------------------
///////////////////////////////////////////////////// INCLUDES
#include "brfprv.h" // common headers
#include "strings.h"
#ifdef NOTUSED
static LPTSTR s_pszNextToken = NULL;
#endif // NOTUSED
// Some of these are replacements for the C runtime routines.
// This is so we don't have to link to the CRT libs.
//
// WARNING: all of these APIs do not setup DS, so you can not access
// any data in the default data seg of this DLL.
//
// do not create any global variables... talk to chrisg if you don't
// understand this
/*----------------------------------------------------------
Purpose: Case sensitive character comparison for DBCS
Returns: FALSE if they match, TRUE if no match
Cond: --
*/
BOOL ChrCmp(
WORD w1,
WORD wMatch)
{
// Most of the time this won't match, so test it first for speed.
if (LOBYTE(w1) == LOBYTE(wMatch))
{
if (IsDBCSLeadByte(LOBYTE(w1)))
{
return(w1 != wMatch);
}
return FALSE;
}
return TRUE;
}
#ifdef NOTUSED // REARCHITECT: this is not DBCS aware
/*----------------------------------------------------------
Purpose: strtok
Swiped from the C 7.0 runtime sources.
Returns:
Cond:
*/
LPTSTR PUBLIC StrTok(
LPTSTR psz,
LPCTSTR rgchTokens)
{
TUCHAR map[32];
LPTSTR pszToken;
ZeroInit(map, map);
do
{
map[*rgchTokens >> 3] |= (1 << (*rgchTokens & 7));
} while (*rgchTokens++);
if (!psz)
{
ENTEREXCLUSIVE();
{
psz = s_pszNextToken;
}
LEAVEEXCLUSIVE();
}
while (map[*psz >> 3] & (1 << (*psz & 7)) && *psz)
psz++;
pszToken = psz;
for (;; psz++)
{
if (map[*psz >> 3] & (1 << (*psz & 7)))
{
if (!*psz && psz == pszToken)
return(NULL);
if (*psz)
*psz++ = TEXT('\0');
ENTEREXCLUSIVE();
{
g_pszNextToken = psz;
}
LEAVEEXCLUSIVE();
return pszToken;
}
}
}
#endif
/*----------------------------------------------------------
Purpose: Get a string from the resource string table. Returned
ptr is a ptr to static memory. The next call to this
function will wipe out the prior contents.
Returns: Ptr to string
Cond: --
*/
LPTSTR PUBLIC SzFromIDS(
UINT ids, // resource ID
LPTSTR pszBuf,
UINT cchBuf)
{
ASSERT(pszBuf);
*pszBuf = NULL_CHAR;
LoadString(g_hinst, ids, pszBuf, cchBuf);
return pszBuf;
}
/*----------------------------------------------------------
Purpose: Formats a string by allocating a buffer and loading
the given resource strings to compose the string.
Returns: the count of characters
Cond: Caller should free the allocated buffer using GFree.
*/
BOOL PUBLIC FmtString(
LPCTSTR * ppszBuf,
UINT idsFmt,
LPUINT rgids,
UINT cids)
{
UINT cch = 0;
UINT cchMax;
LPTSTR pszBuf;
ASSERT(ppszBuf);
ASSERT(rgids);
ASSERT(cids > 0);
cchMax = (1+cids) * MAXPATHLEN;
pszBuf = GAlloc(CbFromCch(cchMax));
if (pszBuf)
{
// The first cids DWORDS are the addresses of the offset strings
// in the buffer (passed to wvsprintf)
LPBYTE pszMsgs = GAlloc((cids * sizeof(DWORD_PTR)) + (cids * CbFromCch(MAXPATHLEN)));
if (pszMsgs)
{
TCHAR szFmt[MAXPATHLEN];
DWORD_PTR *rgpsz = (DWORD_PTR*)pszMsgs;
LPTSTR pszT = (LPTSTR)(pszMsgs + (cids * sizeof(DWORD_PTR)));
UINT i;
// Load the series of strings
for (i = 0; i < cids; i++, pszT += MAXPATHLEN)
{
rgpsz[i] = (DWORD_PTR)pszT;
SzFromIDS(rgids[i], pszT, MAXPATHLEN);
}
// Compose the string
SzFromIDS(idsFmt, szFmt, ARRAYSIZE(szFmt));
cch = FormatMessage(FORMAT_MESSAGE_FROM_STRING,
szFmt, 0, 0, pszBuf, cchMax, (va_list *)&rgpsz);
ASSERT(cch <= cchMax);
GFree(pszMsgs);
}
// pszBuf is freed by caller
}
*ppszBuf = pszBuf;
return cch;
}