|
|
//---------------------------------------------------------------------------
//
// 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; }
|