windows-nt/Source/XPSP1/NT/base/ntsetup/win95upg/inc/strings.h
2020-09-26 16:20:57 +08:00

1749 lines
51 KiB
C

/*++
Copyright (c) 1998 Microsoft Corporation
Module Name:
strings.h
Abstract:
Declares the string utilities implemented in common\migutil.
Author:
Several
Revision History:
See SLM log
--*/
#include <mbstring.h>
#include <wchar.h>
typedef PVOID POOLHANDLE;
#pragma once
#define MAX_ENCODED_RULE (256*6)
//
// String sizing routines and unit conversion
//
#define CharCountA _mbslen
#define CharCountW wcslen
__inline
PSTR
CharCountToPointerA (
PCSTR String,
UINT Char
)
{
while (Char > 0) {
MYASSERT (*String != 0);
Char--;
String = (PCSTR) _mbsinc ((const unsigned char *) String);
}
return (PSTR) String;
}
__inline
PWSTR
CharCountToPointerW (
PCWSTR String,
UINT Char
)
{
#ifdef DEBUG
UINT u;
for (u = 0 ; u < Char ; u++) {
MYASSERT (String[u] != 0);
}
#endif
return (PWSTR) (&String[Char]);
}
__inline
UINT
CharCountABA (
IN PCSTR Start,
IN PCSTR EndPlusOne
)
{
register UINT Count;
Count = 0;
while (Start < EndPlusOne) {
MYASSERT (*Start != 0);
Count++;
Start = (PCSTR) _mbsinc ((const unsigned char *) Start);
}
return Count;
}
__inline
UINT
CharCountABW (
IN PCWSTR Start,
IN PCWSTR EndPlusOne
)
{
#ifdef DEBUG
PCWSTR p;
for (p = Start ; p < EndPlusOne ; p++) {
MYASSERT (*p != 0);
}
#endif
return EndPlusOne > Start ? (UINT)(EndPlusOne - Start) : 0;
}
__inline
UINT
CharCountInByteRangeA (
IN PCSTR Start,
IN UINT Bytes
)
{
register UINT Count;
PCSTR EndPlusOne = (PCSTR) ((PBYTE) Start + Bytes);
Count = 0;
while (Start < EndPlusOne) {
Count++;
Start = (PCSTR) _mbsinc ((const unsigned char *) Start);
}
return Count;
}
__inline
UINT
CharCountInByteRangeW (
IN PCWSTR Start,
IN UINT Bytes
)
{
PCWSTR EndPlusOne = (PCWSTR) ((PBYTE) Start + Bytes);
if (Start < EndPlusOne) {
return (EndPlusOne - Start);
}
MYASSERT (FALSE);
return 0;
}
__inline
UINT
CharCountToBytesA (
IN PCSTR Start,
IN UINT CharCount
)
{
PCSTR EndPlusOne;
EndPlusOne = CharCountToPointerA (Start, CharCount);
return EndPlusOne - Start;
}
__inline
UINT
CharCountToBytesW (
IN PCWSTR Start,
IN UINT CharCount
)
{
return CharCount * sizeof (WCHAR);
}
#define CharCountToTcharsA CharCountToBytesA
__inline
UINT
CharCountToTcharsW (
IN PCWSTR Start,
IN UINT CharCount
)
{
return CharCount;
}
#define ByteCountA strlen
#define ByteCountW(x) (wcslen(x)*sizeof(WCHAR))
#define SizeOfStringA(str) (ByteCountA(str) + sizeof (CHAR))
#define SizeOfStringW(str) (ByteCountW(str) + sizeof (WCHAR))
__inline
PSTR
ByteCountToPointerA (
PCSTR String,
UINT BytePos
)
{
return (PSTR)((PBYTE) String + BytePos);
}
__inline
PWSTR
ByteCountToPointerW (
PCWSTR String,
UINT BytePos
)
{
return (PWSTR)((PBYTE) String + BytePos);
}
__inline
UINT
ByteCountABA (
IN PCSTR Start,
IN PCSTR EndPlusOne
)
{
#ifdef DEBUG
PCSTR p;
for (p = Start ; p < EndPlusOne ; p = (PCSTR) _mbsinc ((const unsigned char *) p)) {
MYASSERT (*p != 0);
}
#endif
return EndPlusOne > Start ? (UINT)(EndPlusOne - Start) : 0;
}
__inline
UINT
ByteCountABW (
IN PCWSTR Start,
IN PCWSTR EndPlusOne
)
{
#ifdef DEBUG
PCWSTR p;
for (p = Start ; p < EndPlusOne ; p++) {
MYASSERT (*p != 0);
}
#endif
return EndPlusOne > Start ? (UINT)(EndPlusOne - Start) * sizeof (WCHAR) : 0;
}
__inline
UINT
ByteCountToCharsA (
IN PCSTR Start,
IN UINT ByteCount
)
{
PCSTR EndPlusOne;
EndPlusOne = Start + ByteCount;
return CharCountABA (Start, EndPlusOne);
}
__inline
UINT
ByteCountToCharsW (
IN PCWSTR Start,
IN UINT ByteCount
)
{
#ifdef DEBUG
PCWSTR p;
PCWSTR EndPlusOne;
EndPlusOne = (PCWSTR) ((PBYTE) Start + ByteCount);
for (p = Start ; p < EndPlusOne ; p++) {
MYASSERT (*p != 0);
}
#endif
return ByteCount / sizeof (WCHAR);
}
__inline
UINT
ByteCountToTcharsA (
IN PCSTR Start,
IN UINT ByteCount
)
{
#ifdef DEBUG
PCSTR p;
PCSTR EndPlusOne;
EndPlusOne = Start + ByteCount;
for (p = Start ; p < EndPlusOne ; p = (PCSTR) _mbsinc ((const unsigned char *) p)) {
MYASSERT (*p != 0);
}
#endif
return ByteCount;
}
#define ByteCountToTcharsW ByteCountToCharsW
#define TcharCountA strlen
#define TcharCountW wcslen
__inline
PSTR
TcharCountToPointerA (
PCSTR String,
UINT Tchars
)
{
#ifdef DEBUG
PCSTR p;
PCSTR EndPlusOne;
EndPlusOne = String + Tchars;
for (p = String ; p < EndPlusOne ; p = (PCSTR) _mbsinc ((const unsigned char *) p)) {
MYASSERT (*p != 0);
}
#endif
return (PSTR) (String + Tchars);
}
__inline
PWSTR
TcharCountToPointerW (
PCWSTR String,
UINT Tchars
)
{
#ifdef DEBUG
PCWSTR p;
PCWSTR EndPlusOne;
EndPlusOne = String + Tchars;
for (p = String ; p < EndPlusOne ; p++) {
MYASSERT (*p != 0);
}
#endif
return (PWSTR) (String + Tchars);
}
#define TcharCountABA ByteCountABA
__inline
UINT
TcharCountABW (
IN PCWSTR Start,
IN PCWSTR EndPlusOne
)
{
#ifdef DEBUG
PCWSTR p;
for (p = Start ; p < EndPlusOne ; p++) {
MYASSERT (*p != 0);
}
#endif
return EndPlusOne > Start ? (UINT)(EndPlusOne - Start) : 0;
}
#define TcharCountToCharsA ByteCountToCharsA
__inline
UINT
TcharCountToCharsW (
IN PCWSTR Start,
IN UINT Tchars
)
{
#ifdef DEBUG
PCWSTR p;
PCWSTR EndPlusOne;
EndPlusOne = Start + Tchars;
for (p = Start ; p < EndPlusOne ; p++) {
MYASSERT (*p != 0);
}
#endif
return Tchars;
}
__inline
UINT
TcharCountToBytesA (
IN PCSTR Start,
IN UINT Tchars
)
{
#ifdef DEBUG
PCSTR p;
PCSTR EndPlusOne;
EndPlusOne = Start + Tchars;
for (p = Start ; p < EndPlusOne ; p = (PCSTR) _mbsinc ((const unsigned char *) p)) {
MYASSERT (*p != 0);
}
#endif
return Tchars;
}
__inline
UINT
TcharCountToBytesW (
IN PCWSTR Start,
IN UINT Tchars
)
{
#ifdef DEBUG
PCWSTR p;
PCWSTR EndPlusOne;
EndPlusOne = Start + Tchars;
for (p = Start ; p < EndPlusOne ; p++) {
MYASSERT (*p != 0);
}
#endif
return Tchars * sizeof (WCHAR);
}
#define StackStringCopyA(stackbuf,src) _mbssafecpy(stackbuf,src,sizeof(stackbuf))
#define StackStringCopyW(stackbuf,src) _wcssafecpy(stackbuf,src,sizeof(stackbuf))
//
// String comparison routines
//
#define StringCompareA _mbscmp
#define StringCompareW wcscmp
#define StringMatchA(str1,str2) (_mbscmp(str1,str2)==0)
#define StringMatchW(str1,str2) (wcscmp(str1,str2)==0)
#define StringICompareA _mbsicmp
#define StringICompareW _wcsicmp
#define StringIMatchA(str1,str2) (_mbsicmp(str1,str2)==0)
#define StringIMatchW(str1,str2) (_wcsicmp(str1,str2)==0)
#define StringCompareByteCountA(str1,str2,bytes) _mbsncmp(str1,str2,ByteCountToCharsA(str1,bytes))
#define StringCompareByteCountW(str1,str2,bytes) wcsncmp(str1,str2,ByteCountToCharsW(str1,bytes))
#define StringMatchByteCountA(str1,str2,bytes) (strncmp(str1,str2,bytes)==0)
#define StringMatchByteCountW(str1,str2,bytes) (wcsncmp(str1,str2,ByteCountToCharsW(str1,bytes))==0)
#define StringICompareByteCountA(str1,str2,bytes) _mbsnicmp(str1,str2,ByteCountToCharsA(str1,bytes))
#define StringICompareByteCountW(str1,str2,bytes) _wcsnicmp(str1,str2,ByteCountToCharsW(str1,bytes))
#define StringIMatchByteCountA(str1,str2,bytes) (_mbsnicmp(str1,str2,ByteCountToCharsA(str1,bytes))==0)
#define StringIMatchByteCountW(str1,str2,bytes) (_wcsnicmp(str1,str2,ByteCountToCharsW(str1,bytes))==0)
#define StringCompareCharCountA(str1,str2,chars) _mbsncmp(str1,str2,chars)
#define StringCompareCharCountW(str1,str2,chars) wcsncmp(str1,str2,chars)
#define StringMatchCharCountA(str1,str2,chars) (_mbsncmp(str1,str2,chars)==0)
#define StringMatchCharCountW(str1,str2,chars) (wcsncmp(str1,str2,chars)==0)
#define StringICompareCharCountA(str1,str2,chars) _mbsnicmp(str1,str2,chars)
#define StringICompareCharCountW(str1,str2,chars) _wcsnicmp(str1,str2,chars)
#define StringIMatchCharCountA(str1,str2,chars) (_mbsnicmp(str1,str2,chars)==0)
#define StringIMatchCharCountW(str1,str2,chars) (_wcsnicmp(str1,str2,chars)==0)
#define StringCompareTcharCountA(str1,str2,tchars) _mbsncmp(str1,str2,TcharCountToCharsA(str1,tchars))
#define StringCompareTcharCountW(str1,str2,tchars) wcsncmp(str1,str2,TcharCountToCharsW(str1,tchars))
#define StringMatchTcharCountA(str1,str2,tchars) (strncmp(str1,str2,tchars)==0)
#define StringMatchTcharCountW(str1,str2,tchars) (wcsncmp(str1,str2,TcharCountToCharsW(str1,tchars))==0)
#define StringICompareTcharCountA(str1,str2,tchars) _mbsnicmp(str1,str2,TcharCountToCharsA(str1,tchars))
#define StringICompareTcharCountW(str1,str2,tchars) _wcsnicmp(str1,str2,TcharCountToCharsW(str1,tchars))
#define StringIMatchTcharCountA(str1,str2,tchars) (_mbsnicmp(str1,str2,TcharCountToCharsA(str1,tchars))==0)
#define StringIMatchTcharCountW(str1,str2,tchars) (_wcsnicmp(str1,str2,TcharCountToCharsW(str1,tchars))==0)
INT
StringCompareABA (
IN PCSTR String,
IN PCSTR Start,
IN PCSTR End
);
INT
StringCompareABW (
IN PCWSTR String,
IN PCWSTR Start,
IN PCWSTR End
);
#define StringMatchABA(String,Start,End) (StringCompareABA(String,Start,End)==0)
#define StringMatchABW(String,Start,End) (StringCompareABW(String,Start,End)==0)
// stricmp that takes an end pointer instead of a length
INT
StringICompareABA (
IN PCSTR String,
IN PCSTR Start,
IN PCSTR End
);
INT
StringICompareABW (
IN PCWSTR String,
IN PCWSTR Start,
IN PCWSTR End
);
PWSTR
our_lstrcpynW (
OUT PWSTR Dest,
IN PCWSTR Src,
IN INT NumChars
);
#define StringIMatchABA(String,Start,End) (StringICompareABA(String,Start,End)==0)
#define StringIMatchABW(String,Start,End) (StringICompareABW(String,Start,End)==0)
//
// String copy routines
//
#define StringCopyA _mbscpy
#define StringCopyW wcscpy
// bytes
#define StringCopyByteCountA(str1,str2,bytes) lstrcpynA(str1,str2,bytes)
#define StringCopyByteCountW(str1,str2,bytes) our_lstrcpynW(str1,str2,(bytes)/sizeof(WCHAR))
// logical characters (IMPORTANT: logical chars != TcharCount)
#define StringCopyCharCountA(str1,str2,mbchars) lstrcpynA(str1,str2,CharCountToBytesA(str2,mbchars))
#define StringCopyCharCountW(str1,str2,wchars) our_lstrcpynW(str1,str2,wchars)
// CHARs (A version) or WCHARs (W version)
#define StringCopyTcharCountA(str1,str2,tchars) lstrcpynA(str1,str2,tchars)
#define StringCopyTcharCountW(str1,str2,tchars) our_lstrcpynW(str1,str2,tchars)
#define StringCopyABA(dest,stra,strb) StringCopyByteCountA((dest),(stra),((PBYTE)(strb)-(PBYTE)(stra)+(INT)sizeof(CHAR)))
#define StringCopyABW(dest,stra,strb) StringCopyByteCountW((dest),(stra),((PBYTE)(strb)-(PBYTE)(stra)+(INT)sizeof(WCHAR)))
//
// String cat routines
//
#define StringCatA _mbsappend
#define StringCatW _wcsappend
//
// Character search routines
//
#define GetEndOfStringA(s) strchr(s,0)
#define GetEndOfStringW(s) wcschr(s,0)
__inline
UINT
SizeOfMultiSzA (
PCSTR MultiSz
)
{
PCSTR Base;
Base = MultiSz;
while (*MultiSz) {
MultiSz = GetEndOfStringA (MultiSz) + 1;
}
MultiSz++;
return (PBYTE) MultiSz - (PBYTE) Base;
}
__inline
UINT
SizeOfMultiSzW (
PCWSTR MultiSz
)
{
PCWSTR Base;
Base = MultiSz;
while (*MultiSz) {
MultiSz = GetEndOfStringW (MultiSz) + 1;
}
MultiSz++;
return (PBYTE) MultiSz - (PBYTE) Base;
}
__inline
UINT
MultiSzSizeInCharsA (
PCSTR MultiSz
)
{
UINT Chars = 0;
while (*MultiSz) {
do {
Chars++;
MultiSz = (PCSTR) _mbsinc ((const unsigned char *) MultiSz);
} while (*MultiSz);
Chars++;
MultiSz++;
}
Chars++;
return Chars;
}
#define MultiSzSizeInCharsW(msz) (SizeOfMultiSzW(msz)/sizeof(WCHAR))
PSTR
GetPrevCharA (
IN PCSTR StartStr,
IN PCSTR CurrPtr,
IN CHARTYPE SearchChar
);
PWSTR
GetPrevCharW (
IN PCWSTR StartStr,
IN PCWSTR CurrPtr,
IN WCHAR SearchChar
);
//
// Pool allocation routines
//
PSTR
RealAllocTextExA (
IN POOLHANDLE Pool, OPTIONAL
IN UINT ByteSize
);
PWSTR
RealAllocTextExW (
IN POOLHANDLE Pool, OPTIONAL
IN UINT WcharSize
);
#define AllocTextExA(p,s) SETTRACKCOMMENT(PSTR,"AllocTextExA",__FILE__,__LINE__)\
RealAllocTextExA(p,s)\
CLRTRACKCOMMENT
#define AllocTextExW(p,s) SETTRACKCOMMENT(PWSTR,"AllocTextExW",__FILE__,__LINE__)\
RealAllocTextExW(p,s)\
CLRTRACKCOMMENT
#define AllocTextA(s) AllocTextExA(NULL,(s))
#define AllocTextW(s) AllocTextExW(NULL,(s))
VOID
FreeTextExA (
IN POOLHANDLE Pool, OPTIONAL
IN PCSTR Text OPTIONAL
);
VOID
FreeTextExW (
IN POOLHANDLE Pool, OPTIONAL
IN PCWSTR Text OPTIONAL
);
#define FreeTextA(t) FreeTextExA(NULL,t)
#define FreeTextW(t) FreeTextExW(NULL,t)
PSTR
RealDuplicateTextExA (
IN POOLHANDLE Pool, OPTIONAL
IN PCSTR Text,
IN UINT ExtraChars,
OUT PSTR *NulChar OPTIONAL
);
PWSTR
RealDuplicateTextExW (
IN POOLHANDLE Pool, OPTIONAL
IN PCWSTR Text,
IN UINT ExtraChars,
OUT PWSTR *NulChar OPTIONAL
);
#define DuplicateTextExA(p,t,c,n) SETTRACKCOMMENT(PSTR,"DuplicateTextExA",__FILE__,__LINE__)\
RealDuplicateTextExA(p,t,c,n)\
CLRTRACKCOMMENT
#define DuplicateTextExW(p,t,c,n) SETTRACKCOMMENT(PWSTR,"DuplicateTextExW",__FILE__,__LINE__)\
RealDuplicateTextExW(p,t,c,n)\
CLRTRACKCOMMENT
#define DuplicateTextA(text) DuplicateTextExA(NULL,text,0,NULL)
#define DuplicateTextW(text) DuplicateTextExW(NULL,text,0,NULL)
PSTR
RealJoinTextExA (
IN POOLHANDLE Pool, OPTIONAL
IN PCSTR String1,
IN PCSTR String2,
IN PCSTR DelimeterString, OPTIONAL
IN UINT ExtraChars,
OUT PSTR *NulChar OPTIONAL
);
PWSTR
RealJoinTextExW (
IN POOLHANDLE Pool, OPTIONAL
IN PCWSTR String1,
IN PCWSTR String2,
IN PCWSTR CenterString, OPTIONAL
IN UINT ExtraChars,
OUT PWSTR *NulChar OPTIONAL
);
#define JoinTextExA(p,s1,s2,cs,ec,nc) SETTRACKCOMMENT(PSTR,"JoinTextExA",__FILE__,__LINE__)\
RealJoinTextExA(p,s1,s2,cs,ec,nc)\
CLRTRACKCOMMENT
#define JoinTextExW(p,s1,s2,cs,ec,nc) SETTRACKCOMMENT(PWSTR,"JoinTextExW",__FILE__,__LINE__)\
RealJoinTextExW(p,s1,s2,cs,ec,nc)\
CLRTRACKCOMMENT
#define JoinTextA(str1,str2) JoinTextExA(NULL,str1,str2,NULL,0,NULL)
#define JoinTextW(str1,str2) JoinTextExW(NULL,str1,str2,NULL,0,NULL)
PSTR
RealExpandEnvironmentTextExA (
IN PCSTR InString,
IN PCSTR * ExtraEnvironmentVariables OPTIONAL
);
PWSTR
RealExpandEnvironmentTextExW (
IN PCWSTR InString,
IN PCWSTR * ExtraEnvironmentVariables OPTIONAL
);
#define ExpandEnvironmentTextExA(str,ev) SETTRACKCOMMENT(PSTR,"ExpandEnvironmentTextExA",__FILE__,__LINE__)\
RealExpandEnvironmentTextExA(str,ev)\
CLRTRACKCOMMENT
#define ExpandEnvironmentTextExW(str,ev) SETTRACKCOMMENT(PWSTR,"ExpandEnvironmentTextExW",__FILE__,__LINE__)\
RealExpandEnvironmentTextExW(str,ev)\
CLRTRACKCOMMENT
#define ExpandEnvironmentTextA(string) ExpandEnvironmentTextExA(string,NULL)
#define ExpandEnvironmentTextW(string) ExpandEnvironmentTextExW(string,NULL)
//
// Function wraps IsDBCSLeadByte(), which tests ACP. Do not use
// isleadbyte().
//
#define IsLeadByte(b) IsDBCSLeadByte(b)
//
// Command line routines
//
// Converts ANSI command line to array of args
PSTR *
CommandLineToArgvA (
IN PCSTR CmdLine,
OUT INT *NumArgs
);
//
// Need both MBCS and UNICODE versions
//
// an atoi that supports decimal or hex
DWORD _mbsnum (IN PCSTR szNum);
DWORD _wcsnum (IN PCWSTR szNum);
// a strcat that returns a pointer to the end of the string
PSTR _mbsappend (OUT PSTR szDest, IN PCSTR szSrc);
PWSTR _wcsappend (OUT PWSTR szDest, IN PCWSTR szSrc);
// determines if an entire string is printable chars
int _mbsisprint (PCSTR szStr);
int _wcsisprint (PCWSTR szStr);
// case-insensitive strstr
PCSTR _mbsistr (PCSTR szStr, PCSTR szSubStr);
PCWSTR _wcsistr (PCWSTR szStr, PCWSTR szSubStr);
// copies the first character of str2 to str
void _copymbchar (PSTR str1, PCSTR str2);
#define _copywchar(dest,src) (*(dest)=*(src))
// replaces a character in a multi-byte char string and maintains
// the string integrity (may grow string by one byte)
void _setmbchar (PSTR str, MBCHAR c);
#define _setwchar(str,c) (*(str)=(c))
// removes specified character from the end of a string, if it exists
BOOL _mbsctrim (PSTR str, MBCHAR c);
BOOL _wcsctrim (PWSTR str, WCHAR c);
// Always adds a backslash, returns ptr to nul terminator
PSTR AppendWackA (IN PSTR str);
PWSTR AppendWackW (IN PWSTR str);
// Adds a backslash to the end of a DOS path (unless str is empty
// or is only a drive letter)
PSTR AppendDosWackA (IN PSTR str);
PWSTR AppendDosWackW (IN PWSTR str);
// Adds a backslash unless str is empty
PSTR AppendUncWackA (IN PSTR str);
PWSTR AppendUncWackW (IN PWSTR str);
// Adds a backslash and identifies the correct naming convention (DOS,
// or UNC)
PSTR AppendPathWackA (IN PSTR str);
PWSTR AppendPathWackW (IN PWSTR str);
// Joins two paths together, allocates string in g_PathsPool
PSTR
RealJoinPathsExA (
IN POOLHANDLE Pool, OPTIONAL
IN PCSTR PathA,
IN PCSTR PathB
);
PWSTR
RealJoinPathsExW (
IN POOLHANDLE Pool, OPTIONAL
IN PCWSTR PathA,
IN PCWSTR PathB
);
#define JoinPathsExA(pool,p1,p2) SETTRACKCOMMENT(PSTR,"JoinPathsA",__FILE__,__LINE__)\
RealJoinPathsExA(pool,p1,p2)\
CLRTRACKCOMMENT
#define JoinPathsExW(pool,p1,p2) SETTRACKCOMMENT(PWSTR,"JoinPathsW",__FILE__,__LINE__)\
RealJoinPathsExW(pool,p1,p2)\
CLRTRACKCOMMENT
#define JoinPathsA(p1,p2) JoinPathsExA(NULL,p1,p2)
#define JoinPathsW(p1,p2) JoinPathsExW(NULL,p1,p2)
// Routine to allocate a 1K buffer for path manipulation, allocated in g_PathsPool
PSTR RealAllocPathStringA (IN DWORD Chars);
PWSTR RealAllocPathStringW (IN DWORD Chars);
#define DEFSIZE 0
#define AllocPathStringA(chars) SETTRACKCOMMENT(PSTR,"AllocPathStringA",__FILE__,__LINE__)\
RealAllocPathStringA(chars)\
CLRTRACKCOMMENT
#define AllocPathStringW(chars) SETTRACKCOMMENT(PWSTR,"AllocPathStringW",__FILE__,__LINE__)\
RealAllocPathStringW(chars)\
CLRTRACKCOMMENT
// Routine to divide path into separate strings, each allocated in g_PathsPool
VOID RealSplitPathA (IN PCSTR Path, OUT PSTR *Drive, OUT PSTR *Dir, OUT PSTR *File, OUT PSTR *Ext);
VOID RealSplitPathW (IN PCWSTR Path, OUT PWSTR *Drive, OUT PWSTR *Dir, OUT PWSTR *File, OUT PWSTR *Ext);
#define SplitPathA(path,dv,dir,f,e) SETTRACKCOMMENT_VOID ("SplitPathA",__FILE__,__LINE__)\
RealSplitPathA(path,dv,dir,f,e)\
CLRTRACKCOMMENT_VOID
#define SplitPathW(path,dv,dir,f,e) SETTRACKCOMMENT_VOID ("SplitPathW",__FILE__,__LINE__)\
RealSplitPathW(path,dv,dir,f,e)\
CLRTRACKCOMMENT_VOID
// Routine to extract the file from a path
PCSTR GetFileNameFromPathA (IN PCSTR Path);
PCWSTR GetFileNameFromPathW (IN PCWSTR Path);
// Routine to extract the file extension from a path
PCSTR GetFileExtensionFromPathA (IN PCSTR Path);
PCWSTR GetFileExtensionFromPathW (IN PCWSTR Path);
// Routine to extract the file extension from a path, including the dot, or the
// end of the string if no extension exists
PCSTR GetDotExtensionFromPathA (IN PCSTR Path);
PCWSTR GetDotExtensionFromPathW (IN PCWSTR Path);
// Routine to duplicate a path and allocate space for cat processing
PSTR RealDuplicatePathStringA (IN PCSTR Path, IN DWORD ExtraBytes);
PWSTR RealDuplicatePathStringW (IN PCWSTR Path, IN DWORD ExtraBytes);
#define DuplicatePathStringA(path,eb) SETTRACKCOMMENT(PSTR,"DuplicatePathStringA",__FILE__,__LINE__)\
RealDuplicatePathStringA(path,eb)\
CLRTRACKCOMMENT
#define DuplicatePathStringW(path,eb) SETTRACKCOMMENT(PWSTR,"DuplicatePathStringW",__FILE__,__LINE__)\
RealDuplicatePathStringW(path,eb)\
CLRTRACKCOMMENT
// Routines to enumerate the PATH variable
typedef struct _PATH_ENUMA {
PSTR BufferPtr;
PSTR PtrNextPath;
PSTR PtrCurrPath;
} PATH_ENUMA, *PPATH_ENUMA;
BOOL
EnumFirstPathExA (
OUT PPATH_ENUMA PathEnum,
IN PCSTR AdditionalPath,
IN PCSTR WinDir,
IN PCSTR SysDir,
IN BOOL IncludeEnvPath
);
#define EnumFirstPathA(e,a,w,s) EnumFirstPathExA(e,a,w,s,TRUE)
BOOL
EnumNextPathA (
IN OUT PPATH_ENUMA PathEnum
);
BOOL
EnumPathAbortA (
IN OUT PPATH_ENUMA PathEnum
);
// Frees a string allocated in g_PathsPool
VOID
FreePathStringExA (
IN POOLHANDLE Pool, OPTIONAL
IN PCSTR Path OPTIONAL
);
VOID
FreePathStringExW (
IN POOLHANDLE Pool, OPTIONAL
IN PCWSTR Path OPTIONAL
);
#define FreePathStringA(p) FreePathStringExA(NULL,p)
#define FreePathStringW(p) FreePathStringExW(NULL,p)
// Removes a trailing backslash, if it exists
#define RemoveWackAtEndA(str) _mbsctrim(str,'\\')
#define RemoveWackAtEndW(str) _wcsctrim(str,L'\\')
// Rule encoding functions used to encode a number of syntax-related
// characters (backslash, brackets, asterisk, etc)
PSTR EncodeRuleCharsA (PSTR szEncRule, PCSTR szRule);
PWSTR EncodeRuleCharsW (PWSTR szEncRule, PCWSTR szRule);
// Rule decoding functions used to restore an encoded string
MBCHAR GetNextRuleCharA (PCSTR *p_szRule, BOOL *p_bFromHex);
WCHAR GetNextRuleCharW (PCWSTR *p_szRule, BOOL *p_bFromHex);
PSTR DecodeRuleCharsA (PSTR szRule, PCSTR szEncRule);
PWSTR DecodeRuleCharsW (PWSTR szRule, PCWSTR szEncRule);
PSTR DecodeRuleCharsABA (PSTR szRule, PCSTR szEncRuleStart, PCSTR End);
PWSTR DecodeRuleCharsABW (PWSTR szRule, PCWSTR szEncRuleStart, PCWSTR End);
// Returns a pointer to the next non-space character (uses isspace)
PCSTR SkipSpaceA (PCSTR szStr);
PCWSTR SkipSpaceW (PCWSTR szStr);
// Returns a pointer to the first space character at the end of a string,
// or a pointer to the terminating nul if no space exists at the end of the
// string. (Used for trimming space.)
PCSTR SkipSpaceRA (PCSTR szBaseStr, PCSTR szStr);
PCWSTR SkipSpaceRW (PCWSTR szBaseStr, PCWSTR szStr);
// Truncates a string after the last non-whitepace character
VOID TruncateTrailingSpaceA (IN OUT PSTR Str);
VOID TruncateTrailingSpaceW (IN OUT PWSTR Str);
// Returns TRUE if str matches wstrPattern. Case-sensitive, supports
// multiple asterisks and question marks.
BOOL IsPatternMatchA (PCSTR wstrPattern, PCSTR wstrStr);
BOOL IsPatternMatchW (PCWSTR wstrPattern, PCWSTR wstrStr);
// Returns TRUE if str matches wstrPattern. Case-sensitive, supports
// multiple asterisks and question marks.
BOOL IsPatternMatchABA (PCSTR Pattern, PCSTR Start, PCSTR End);
BOOL IsPatternMatchABW (PCWSTR Pattern, PCWSTR Start, PCWSTR End);
//
// More powerful pattern matching
//
#define SEGMENTTYPE_UNKNOWN 0
#define SEGMENTTYPE_EXACTMATCH 1
#define SEGMENTTYPE_OPTIONAL 2
#define SEGMENTTYPE_REQUIRED 3
typedef struct {
UINT Type;
union {
// exact match
struct {
PCSTR LowerCasePhrase;
UINT PhraseBytes;
} Exact;
// optional
struct {
UINT MaxLen; // zero if any length
PCSTR IncludeSet; OPTIONAL
PCSTR ExcludeSet; OPTIONAL
} Wildcard;
};
} SEGMENTA, *PSEGMENTA;
typedef struct {
UINT SegmentCount;
PSEGMENTA Segment;
} PATTERNPROPSA, *PPATTERNPROPSA;
typedef struct {
UINT PatternCount;
POOLHANDLE Pool;
PPATTERNPROPSA Pattern;
} PARSEDPATTERNA, *PPARSEDPATTERNA;
typedef struct {
UINT Type;
union {
// exact match
struct {
PCWSTR LowerCasePhrase;
UINT PhraseBytes;
} Exact;
// wildcard
struct {
UINT MaxLen; // zero if any length
PCWSTR IncludeSet; OPTIONAL
PCWSTR ExcludeSet; OPTIONAL
} Wildcard;
};
} SEGMENTW, *PSEGMENTW;
typedef struct {
UINT SegmentCount;
PSEGMENTW Segment;
} PATTERNPROPSW, *PPATTERNPROPSW;
typedef struct {
UINT PatternCount;
POOLHANDLE Pool;
PPATTERNPROPSW Pattern;
} PARSEDPATTERNW, *PPARSEDPATTERNW;
BOOL
IsPatternMatchExA (
IN PCSTR Pattern,
IN PCSTR Start,
IN PCSTR End
);
BOOL
IsPatternMatchExW (
IN PCWSTR Pattern,
IN PCWSTR Start,
IN PCWSTR End
);
PPARSEDPATTERNA
CreateParsedPatternA (
IN PCSTR Pattern
);
PPARSEDPATTERNW
CreateParsedPatternW (
IN PCWSTR Pattern
);
BOOL
TestParsedPatternA (
IN PPARSEDPATTERNA ParsedPattern,
IN PCSTR StringToTest
);
BOOL
TestParsedPatternW (
IN PPARSEDPATTERNW ParsedPattern,
IN PCWSTR StringToTest
);
BOOL
TestParsedPatternABA (
IN PPARSEDPATTERNA ParsedPattern,
IN PCSTR StringToTest,
IN PCSTR EndPlusOne
);
BOOL
TestParsedPatternABW (
IN PPARSEDPATTERNW ParsedPattern,
IN PCWSTR StringToTest,
IN PCWSTR EndPlusOne
);
VOID
PrintPattern (
PCSTR Pattern,
PPARSEDPATTERNA Struct
);
VOID
DestroyParsedPatternA (
IN PPARSEDPATTERNA ParsedPattern
);
VOID
DestroyParsedPatternW (
IN PPARSEDPATTERNW ParsedPattern
);
// Character counters
UINT CountInstancesOfCharA (PCSTR String, MBCHAR Char);
UINT CountInstancesOfCharW (PCWSTR String, WCHAR Char);
UINT CountInstancesOfCharIA (PCSTR String, MBCHAR Char);
UINT CountInstancesOfCharIW (PCWSTR String, WCHAR Char);
//
// Message Functions
//
// An AllocTable is an array of HLOCAL pointers that the message routines
// return. This table is maintained to allow a single function to clean up
// all strings at once.
//
// All "Ex" functions (ParseMessageEx, GetStringResourceEx, and so on)
// require a valid AllocTable pointer. A caller obtains this pointer by
// calling CreateAllocTable before processing any message. The caller
// cleans up the entire table by calling DestroyAllocTable.
//
// A set of macros can be used for short-term strings. ParseMessage and
// GetStringResource work the same as their Ex counterparts, but operate
// on the process-wide g_ShortTermAllocTable. Short-term strings are
// freed with FreeStringResource.
//
// A routine that calls ParseMessage and/or GetStringResource several times
// in the same function wrap the calls between BeginMessageProcessing and
// EndMessageProcessing. Only one thread in the process can do this at a
// time, and when EndMessageProcessing is called, all strings allocated
// by ParseMessage or GetResourceString in the processing section are
// automatically freed.
//
// AllocTable creation/deletion
PGROWBUFFER CreateAllocTable (VOID);
VOID DestroyAllocTable (PGROWBUFFER AllocTable);
// The "Ex" functions
// ParseMessageEx retrieves the string resource via FormatMessage
PCSTR ParseMessageExA (PGROWBUFFER AllocTable, PCSTR Template, PCSTR ArgArray[]);
PCWSTR ParseMessageExW (PGROWBUFFER AllocTable, PCWSTR Template, PCWSTR ArgArray[]);
// GetStringResourceEx retrives an argument-less string resource
PCSTR GetStringResourceExA (PGROWBUFFER AllocTable, UINT ID);
PCWSTR GetStringResourceExW (PGROWBUFFER AllocTable, UINT ID);
// Frees resources allocated by ParseMessageEx, GetStringResourceEx and all macros
VOID FreeStringResourceExA (PGROWBUFFER AllocTable, PCSTR String);
VOID FreeStringResourceExW (PGROWBUFFER AllocTable, PCWSTR String);
// Frees resources allocated by ParseMessageEx, GetStringResourceEx and all macros.
// Tests String first; nulls when freed.
VOID FreeStringResourcePtrExA (PGROWBUFFER AllocTable, PCSTR * String);
VOID FreeStringResourcePtrExW (PGROWBUFFER AllocTable, PCWSTR * String);
// Macros
extern PGROWBUFFER g_ShortTermAllocTable;
#define ParseMessageA(strid,args) ParseMessageExA(g_ShortTermAllocTable, strid, args)
#define ParseMessageW(strid,args) ParseMessageExW(g_ShortTermAllocTable, strid, args)
#define ParseMessageIDA(id,args) ParseMessageExA(g_ShortTermAllocTable, (PCSTR) (id), args)
#define ParseMessageIDW(id,args) ParseMessageExW(g_ShortTermAllocTable, (PCWSTR) (id), args)
#define ParseMessageIDExA(table,id,args) ParseMessageExA(table, (PCSTR) (id), args)
#define ParseMessageIDExW(table,id,args) ParseMessageExW(table, (PCWSTR) (id), args)
#define GetStringResourceA(id) GetStringResourceExA(g_ShortTermAllocTable, id)
#define GetStringResourceW(id) GetStringResourceExW(g_ShortTermAllocTable, id)
#define FreeStringResourceA(str) FreeStringResourceExA(g_ShortTermAllocTable, str)
#define FreeStringResourceW(str) FreeStringResourceExW(g_ShortTermAllocTable, str)
#define FreeStringResourcePtrA(str) FreeStringResourcePtrExA(g_ShortTermAllocTable, str)
#define FreeStringResourcePtrW(str) FreeStringResourcePtrExW(g_ShortTermAllocTable, str)
// Functions for single-threaded message-intensive processing loops
BOOL BeginMessageProcessing (VOID);
VOID EndMessageProcessing (VOID);
//
// The following message functions do not return strings, so they do not
// need cleanup.
//
// An odd variant--obtains message ID from a window's text and replaces
// it with the actual message. Useful in dialog box initialization.
VOID ParseMessageInWndA (HWND hwnd, PCSTR ArgArray[]);
VOID ParseMessageInWndW (HWND hwnd, PCWSTR ArgArray[]);
// Displays a message box using a message string
INT ResourceMessageBoxA (HWND hwndOwner, UINT ID, UINT Flags, PCSTR ArgArray[]);
INT ResourceMessageBoxW (HWND hwndOwner, UINT ID, UINT Flags, PCWSTR ArgArray[]);
//
// Functions that don't care about UNICODE or MBCS
// and realy shouldn't be in strings.h/.c
//
// Pushes dwError on a global error stack
void PushNewError (DWORD dwError);
// Pushes the return of GetLastError() on a global error stack
void PushError (void);
// Pops the last error from the global error stack, calls SetLastError
// and returns the popped error code.
DWORD PopError (void);
// Returns an int value for chars 0-9, a-f, A-F, and -1 for all others
int GetHexDigit (IN int c);
//
// Inline functions
//
// Returns the character at str[pos]
__inline MBCHAR _mbsgetc(PCSTR str, DWORD pos) {
return (MBCHAR) _mbsnextc((const unsigned char *) CharCountToPointerA ((PSTR) str, pos));
}
__inline WCHAR _wcsgetc(PCWSTR str, DWORD pos) {
return *CharCountToPointerW ((PWSTR) str, pos);
}
// Sets the character at str[pos]
// Multibyte version may grow string by one byte.
__inline void _mbssetc(PSTR str, DWORD pos, MBCHAR c) {
_setmbchar (CharCountToPointerA (str, pos), c);
}
__inline void _wcssetc(PWSTR str, DWORD pos, WCHAR c) {
*CharCountToPointerW (str, pos) = c;
}
// Bug fix for C Runtime _tcsdec
__inline PWSTR _wcsdec2(PCWSTR base, PCWSTR p) {
if (base >= p) {
return NULL;
}
return (PWSTR) (p-1);
}
// Bug fix for C Runtime _tcsdec
__inline PSTR _mbsdec2(PCSTR base, PCSTR p) {
if (base >= p) {
return NULL;
}
return (PSTR) _mbsdec((const unsigned char *) base, (const unsigned char *) p);
}
// A handy strncpy with forced termination
PSTR _mbsnzcpy (PSTR dest, PCSTR src, int count);
PWSTR _wcsnzcpy (PWSTR dest, PCWSTR src, int count);
// A handy strncpy used for buffer overrun containment
#define _mbssafecpy(dest,src,bufsize) _mbsnzcpy(dest,src,(bufsize)-sizeof(CHAR))
#define _wcssafecpy(dest,src,bufsize) _wcsnzcpy(dest,src,(bufsize)-sizeof(WCHAR))
// strcpyab with forced termination and termination guard
PSTR _mbsnzcpyab (PSTR Dest, PCSTR Start, PCSTR End, int count);
PWSTR _wcsnzcpyab (PWSTR Dest, PCWSTR Start, PCWSTR End, int count);
// A handy strncpyab used for buffer overrun containment
#define _mbssafecpyab(dest,start,end,bufsize) _mbsnzcpyab(dest,start,end,(bufsize)-sizeof(CHAR))
#define _wcssafecpyab(dest,start,end,bufsize) _wcsnzcpyab(dest,start,end,(bufsize)-sizeof(WCHAR))
// Routine that checks string for a prefix
#define StringPrefixA(str,prefix) StringMatchCharCountA(str,prefix,CharCountA(prefix))
#define StringIPrefixA(str,prefix) StringIMatchCharCountA(str,prefix,CharCountA(prefix))
#define StringPrefixW(str,prefix) StringMatchCharCountW(str,prefix,CharCountW(prefix))
#define StringIPrefixW(str,prefix) StringIMatchCharCountW(str,prefix,CharCountW(prefix))
//
// Sub String Replacement functions.
//
BOOL StringReplaceW (PWSTR Buffer,DWORD MaxSize,PWSTR ReplaceStartPos,PWSTR ReplaceEndPos,PCWSTR NewString);
BOOL StringReplaceA (PSTR Buffer,DWORD MaxSize,PSTR ReplaceStartPos,PSTR ReplaceEndPos,PCSTR NewString);
//
// String table population from INF section
//
typedef enum {
CALLBACK_CONTINUE,
CALLBACK_SKIP,
CALLBACK_STOP
} CALLBACK_RESULT;
typedef CALLBACK_RESULT(ADDINFSECTION_PROTOTYPEA)(PCSTR String, PVOID * DataPtr,
UINT * DataSizePtr, PVOID CallbackData);
typedef CALLBACK_RESULT(ADDINFSECTION_PROTOTYPEW)(PCWSTR String, PVOID * DataPtr,
UINT * DataSizePtr, PVOID CallbackData);
typedef ADDINFSECTION_PROTOTYPEA * ADDINFSECTION_PROCA;
typedef ADDINFSECTION_PROTOTYPEW * ADDINFSECTION_PROCW;
#if 0
BOOL AddInfSectionToStringTableA (PVOID, HINF, PCSTR, INT, ADDINFSECTION_PROCA, PVOID);
BOOL AddInfSectionToStringTableW (PVOID, HINF, PCWSTR, INT, ADDINFSECTION_PROCW, PVOID);
#endif
UINT
CountInstancesOfSubStringA (
IN PCSTR SourceString,
IN PCSTR SearchString
);
UINT
CountInstancesOfSubStringW (
IN PCWSTR SourceString,
IN PCWSTR SearchString
);
PCSTR
StringSearchAndReplaceA (
IN PCSTR SourceString,
IN PCSTR SearchString,
IN PCSTR ReplaceString
);
PCWSTR
StringSearchAndReplaceW (
IN PCWSTR SourceString,
IN PCWSTR SearchString,
IN PCWSTR ReplaceString
);
typedef struct _MULTISZ_ENUMA {
PCSTR Buffer;
PCSTR CurrentString;
} MULTISZ_ENUMA, *PMULTISZ_ENUMA;
typedef struct _MULTISZ_ENUMW {
PCWSTR Buffer;
PCWSTR CurrentString;
} MULTISZ_ENUMW, *PMULTISZ_ENUMW;
BOOL
EnumNextMultiSzA (
IN OUT PMULTISZ_ENUMA MultiSzEnum
);
BOOL
EnumNextMultiSzW (
IN OUT PMULTISZ_ENUMW MultiSzEnum
);
BOOL
EnumFirstMultiSzA (
OUT PMULTISZ_ENUMA MultiSzEnum,
IN PCSTR MultiSzStr
);
BOOL
EnumFirstMultiSzW (
OUT PMULTISZ_ENUMW MultiSzEnum,
IN PCWSTR MultiSzStr
);
VOID
ToggleWacksW (
IN OUT PWSTR String,
IN BOOL Operation
);
VOID
ToggleWacksA (
IN OUT PSTR String,
IN BOOL Operation
);
PCSTR
SanitizePathA (
IN PCSTR FileSpec
);
PCWSTR
SanitizePathW (
IN PCWSTR FileSpec
);
PCSTR
ConvertSBtoDB (
PCSTR RootPath,
PCSTR FullPath,
PCSTR Limit
);
//
// TCHAR mappings
//
#ifdef UNICODE
#define CharCount CharCountW
#define CharCountToPointer CharCountToPointerW
#define CharCountAB CharCountABW
#define CharCountInByteRange CharCountInByteRangeW
#define CharCountToBytes CharCountToBytesW
#define CharCountToTchars CharCountToTcharsW
#define ByteCount ByteCountW
#define SizeOfString SizeOfStringW
#define SizeOfMultiSz SizeOfMultiSzW
#define MultiSzSizeInChars MultiSzSizeInCharsW
#define ByteCountToPointer ByteCountToPointerW
#define ByteCountAB ByteCountABW
#define ByteCountToChars ByteCountToCharsW
#define ByteCountToTchars ByteCountToTcharsW
#define TcharCount TcharCountW
#define TcharCountToPointer TcharCountToPointerW
#define TcharCountAB TcharCountABW
#define TcharCountToChars TcharCountToCharsW
#define TcharCountToBytes TcharCountToBytesW
#define StackStringCopy StackStringCopyW
#define StringCompare StringCompareW
#define StringMatch StringMatchW
#define StringICompare StringICompareW
#define StringIMatch StringIMatchW
#define StringCompareByteCount StringCompareByteCountW
#define StringMatchByteCount StringMatchByteCountW
#define StringICompareByteCount StringICompareByteCountW
#define StringIMatchByteCount StringIMatchByteCountW
#define StringCompareCharCount StringCompareCharCountW
#define StringMatchCharCount StringMatchCharCountW
#define StringICompareCharCount StringICompareCharCountW
#define StringIMatchCharCount StringIMatchCharCountW
#define StringCompareTcharCount StringCompareTcharCountW
#define StringMatchTcharCount StringMatchTcharCountW
#define StringICompareTcharCount StringICompareTcharCountW
#define StringIMatchTcharCount StringIMatchTcharCountW
#define StringCompareAB StringCompareABW
#define StringMatchAB StringMatchABW
#define StringICompareAB StringICompareABW
#define StringIMatchAB StringIMatchABW
#define StringCopy StringCopyW
#define StringCopyByteCount StringCopyByteCountW
#define StringCopyCharCount StringCopyCharCountW
#define StringCopyTcharCount StringCopyTcharCountW
#define StringCopyAB StringCopyABW
#define StringCat StringCatW
#define GetEndOfString GetEndOfStringW
#define GetPrevChar GetPrevCharW
#define AllocTextEx AllocTextExW
#define AllocText AllocTextW
#define FreeTextEx FreeTextExW
#define FreeText FreeTextW
#define DuplicateText DuplicateTextW
#define DuplicateTextEx DuplicateTextExW
#define JoinTextEx JoinTextExW
#define JoinText JoinTextW
#define ExpandEnvironmentText ExpandEnvironmentTextW
#define ExpandEnvironmentTextEx ExpandEnvironmentTextExW
#define CommandLineToArgv CommandLineToArgvW
#define _tcsdec2 _wcsdec2
#define _copytchar _copywchar
#define _settchar _setwchar
#define _tcsgetc _wcsgetc
#define _tcssetc _wcssetc
#define _tcsnum _wcsnum
#define _tcsappend _wcsappend
#define _tcsistr _wcsistr
#define _tcsisprint _wcsisprint
#define _tcsnzcpy _wcsnzcpy
#define _tcssafecpy _wcssafecpy
#define _tcsnzcpyab _wcsnzcpyab
#define _tcssafecpyab _wcssafecpyab
#define StringPrefix StringPrefixW
#define StringIPrefix StringIPrefixW
#define _tcsctrim _wcsctrim
#define AppendWack AppendWackW
#define AppendDosWack AppendDosWackW
#define AppendUncWack AppendUncWackW
#define AppendPathWack AppendPathWackW
#define RemoveWackAtEnd RemoveWackAtEndW
#define JoinPathsEx JoinPathsExW
#define JoinPaths JoinPathsW
#define AllocPathString AllocPathStringW
#define SplitPath SplitPathW
#define GetFileNameFromPath GetFileNameFromPathW
#define GetFileExtensionFromPath GetFileExtensionFromPathW
#define GetDotExtensionFromPath GetDotExtensionFromPathW
#define DuplicatePathString DuplicatePathStringW
#define FreePathStringEx FreePathStringExW
#define FreePathString FreePathStringW
#define GetNextRuleChar GetNextRuleCharW
#define DecodeRuleChars DecodeRuleCharsW
#define DecodeRuleCharsAB DecodeRuleCharsABW
#define EncodeRuleChars EncodeRuleCharsW
#define SkipSpace SkipSpaceW
#define SkipSpaceR SkipSpaceRW
#define TruncateTrailingSpace TruncateTrailingSpaceW
#define IsPatternMatch IsPatternMatchW
#define IsPatternMatchAB IsPatternMatchABW
#define PPARSEDPATTERN PPARSEDPATTERNW
#define PARSEDPATTERN PARSEDPATTERNW
#define CreateParsedPattern CreateParsedPatternW
#define IsPatternMatchEx IsPatternMatchExW
#define TestParsedPattern TestParsedPatternW
#define TestParsedPatternAB TestParsedPatternABW
#define DestroyParsedPattern DestroyParsedPatternW
#define CountInstancesOfChar CountInstancesOfCharW
#define CountInstancesOfCharI CountInstancesOfCharIW
#define StringReplace StringReplaceW
#define CountInstancesOfSubString CountInstancesOfSubStringW
#define StringSearchAndReplace StringSearchAndReplaceW
#define MULTISZ_ENUM MULTISZ_ENUMW
#define EnumFirstMultiSz EnumFirstMultiSzW
#define EnumNextMultiSz EnumNextMultiSzW
#define ParseMessage ParseMessageW
#define ParseMessageEx ParseMessageExW
#define ParseMessageID ParseMessageIDW
#define ParseMessageIDEx ParseMessageIDExW
#define GetStringResource GetStringResourceW
#define GetStringResourceEx GetStringResourceExW
#define FreeStringResource FreeStringResourceW
#define ParseMessageInWnd ParseMessageInWndW
#define ResourceMessageBox ResourceMessageBoxW
#if 0
#define AddInfSectionToStringTable AddInfSectionToStringTableW
#endif
#define ADDINFSECTION_PROC ADDINFSECTION_PROCW
#define ReplaceWacks(f) ToggleWacksW(f,FALSE)
#define RestoreWacks(f) ToggleWacksW(f,TRUE)
#define SanitizePath SanitizePathW
#else
#define CharCount CharCountA
#define CharCountToPointer CharCountToPointerA
#define CharCountAB CharCountABA
#define CharCountInByteRange CharCountInByteRangeA
#define CharCountToBytes CharCountToBytesA
#define CharCountToTchars CharCountToTcharsA
#define ByteCount ByteCountA
#define SizeOfString SizeOfStringA
#define SizeOfMultiSz SizeOfMultiSzA
#define MultiSzSizeInChars MultiSzSizeInCharsA
#define ByteCountToPointer ByteCountToPointerA
#define ByteCountAB ByteCountABA
#define ByteCountToChars ByteCountToCharsA
#define ByteCountToTchars ByteCountToTcharsA
#define TcharCount TcharCountA
#define TcharCountToPointer TcharCountToPointerA
#define TcharCountAB TcharCountABA
#define TcharCountToChars TcharCountToCharsA
#define TcharCountToBytes TcharCountToBytesA
#define StackStringCopy StackStringCopyA
#define StringCompare StringCompareA
#define StringMatch StringMatchA
#define StringICompare StringICompareA
#define StringIMatch StringIMatchA
#define StringCompareByteCount StringCompareByteCountA
#define StringMatchByteCount StringMatchByteCountA
#define StringICompareByteCount StringICompareByteCountA
#define StringIMatchByteCount StringIMatchByteCountA
#define StringCompareCharCount StringCompareCharCountA
#define StringMatchCharCount StringMatchCharCountA
#define StringICompareCharCount StringICompareCharCountA
#define StringIMatchCharCount StringIMatchCharCountA
#define StringCompareTcharCount StringCompareTcharCountA
#define StringMatchTcharCount StringMatchTcharCountA
#define StringICompareTcharCount StringICompareTcharCountA
#define StringIMatchTcharCount StringIMatchTcharCountA
#define StringCompareAB StringCompareABA
#define StringMatchAB StringMatchABA
#define StringICompareAB StringICompareABA
#define StringIMatchAB StringIMatchABA
#define StringCopy StringCopyA
#define StringCopyByteCount StringCopyByteCountA
#define StringCopyCharCount StringCopyCharCountA
#define StringCopyTcharCount StringCopyTcharCountA
#define StringCopyAB StringCopyABA
#define StringCat StringCatA
#define GetEndOfString GetEndOfStringA
#define GetPrevChar GetPrevCharA
#define AllocTextEx AllocTextExA
#define AllocText AllocTextA
#define FreeTextEx FreeTextExA
#define FreeText FreeTextA
#define DuplicateText DuplicateTextA
#define DuplicateTextEx DuplicateTextExA
#define JoinTextEx JoinTextExA
#define JoinText JoinTextA
#define ExpandEnvironmentText ExpandEnvironmentTextA
#define ExpandEnvironmentTextEx ExpandEnvironmentTextExA
#define CommandLineToArgv CommandLineToArgvA
#define _tcsdec2 _mbsdec2
#define _copytchar _copymbchar
#define _settchar _setmbchar
#define _tcsgetc _mbsgetc
#define _tcssetc _mbssetc
#define _tcsnum _mbsnum
#define _tcsappend _mbsappend
#define _tcsistr _mbsistr
#define _tcsisprint _mbsisprint
#define _tcsnzcpy _mbsnzcpy
#define _tcssafecpy _mbssafecpy
#define _tcsnzcpyab _mbsnzcpyab
#define _tcssafecpyab _mbssafecpyab
#define StringPrefix StringPrefixA
#define StringIPrefix StringIPrefixA
#define _tcsctrim _mbsctrim
#define AppendWack AppendWackA
#define AppendDosWack AppendDosWackA
#define AppendUncWack AppendUncWackA
#define AppendPathWack AppendPathWackA
#define RemoveWackAtEnd RemoveWackAtEndA
#define JoinPathsEx JoinPathsExA
#define JoinPaths JoinPathsA
#define AllocPathString AllocPathStringA
#define SplitPath SplitPathA
#define GetFileNameFromPath GetFileNameFromPathA
#define GetFileExtensionFromPath GetFileExtensionFromPathA
#define GetDotExtensionFromPath GetDotExtensionFromPathA
#define DuplicatePathString DuplicatePathStringA
#define PATH_ENUM PATH_ENUMA
#define PPATH_ENUM PPATH_ENUMA
#define EnumFirstPathEx EnumFirstPathExA
#define EnumFirstPath EnumFirstPathA
#define EnumNextPath EnumNextPathA
#define EnumPathAbort EnumPathAbortA
#define FreePathStringEx FreePathStringExA
#define FreePathString FreePathStringA
#define GetNextRuleChar GetNextRuleCharA
#define DecodeRuleChars DecodeRuleCharsA
#define DecodeRuleCharsAB DecodeRuleCharsABA
#define EncodeRuleChars EncodeRuleCharsA
#define SkipSpace SkipSpaceA
#define SkipSpaceR SkipSpaceRA
#define TruncateTrailingSpace TruncateTrailingSpaceA
#define IsPatternMatch IsPatternMatchA
#define IsPatternMatchAB IsPatternMatchABA
#define PPARSEDPATTERN PPARSEDPATTERNA
#define PARSEDPATTERN PARSEDPATTERNA
#define CreateParsedPattern CreateParsedPatternA
#define IsPatternMatchEx IsPatternMatchExA
#define TestParsedPattern TestParsedPatternA
#define TestParsedPatternAB TestParsedPatternABA
#define DestroyParsedPattern DestroyParsedPatternA
#define CountInstancesOfChar CountInstancesOfCharA
#define CountInstancesOfCharI CountInstancesOfCharIA
#define StringReplace StringReplaceA
#define CountInstancesOfSubString CountInstancesOfSubStringA
#define StringSearchAndReplace StringSearchAndReplaceA
#define MULTISZ_ENUM MULTISZ_ENUMA
#define EnumFirstMultiSz EnumFirstMultiSzA
#define EnumNextMultiSz EnumNextMultiSzA
#define ParseMessage ParseMessageA
#define ParseMessageEx ParseMessageExA
#define ParseMessageID ParseMessageIDA
#define ParseMessageIDEx ParseMessageIDExA
#define GetStringResource GetStringResourceA
#define GetStringResourceEx GetStringResourceExA
#define FreeStringResource FreeStringResourceA
#define ParseMessageInWnd ParseMessageInWndA
#define ResourceMessageBox ResourceMessageBoxA
#if 0
#define AddInfSectionToStringTable AddInfSectionToStringTableA
#endif
#define ADDINFSECTION_PROC ADDINFSECTION_PROCA
#define ReplaceWacks(f) ToggleWacksA(f,FALSE)
#define RestoreWacks(f) ToggleWacksA(f,TRUE)
#define SanitizePath SanitizePathA
#endif
//
// MessageBox macros
//
#define YesNoBox(hwnd,ID) ResourceMessageBox(hwnd,ID,MB_YESNO|MB_ICONQUESTION|MB_SETFOREGROUND,NULL)
#define YesNoCancelBox(hwnd,ID) ResourceMessageBox(hwnd,ID,MB_YESNOCANCEL|MB_ICONQUESTION|MB_SETFOREGROUND,NULL)
#define OkBox(hwnd,ID) ResourceMessageBox(hwnd,ID,MB_OK|MB_ICONINFORMATION|MB_SETFOREGROUND,NULL)
#define OkCancelBox(hwnd,ID) ResourceMessageBox(hwnd,ID,MB_OKCANCEL|MB_ICONQUESTION|MB_SETFOREGROUND,NULL)
#define RetryCancelBox(hwnd,ID) ResourceMessageBox(hwnd,ID,MB_RETRYCANCEL|MB_ICONQUESTION|MB_SETFOREGROUND,NULL)