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.
289 lines
6.9 KiB
289 lines
6.9 KiB
/*++
|
|
|
|
Copyright (C) 1999-2001 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
STRUTILS.H
|
|
|
|
Abstract:
|
|
|
|
String utilities
|
|
|
|
History:
|
|
|
|
--*/
|
|
|
|
#ifndef __WBEM_STRING_UTILS__H_
|
|
#define __WBEM_STRING_UTILS__H_
|
|
|
|
#pragma optimize("gt", on)
|
|
|
|
#ifdef _DBG
|
|
#define _DBG_BREAK DebugBreak();
|
|
#else
|
|
#define _DBG_BREAK
|
|
#endif
|
|
|
|
inline wchar_t ToLower(wchar_t c)
|
|
{
|
|
wchar_t wideChar ;
|
|
|
|
if (LCMapStringW(LOCALE_INVARIANT, LCMAP_LOWERCASE, &c, 1, &wideChar, 1) ==0)
|
|
{
|
|
_DBG_BREAK;
|
|
return c;
|
|
}
|
|
return wideChar;
|
|
}
|
|
|
|
inline wchar_t ToUpper(wchar_t c)
|
|
{
|
|
wchar_t wideChar ;
|
|
|
|
if (LCMapStringW(LOCALE_INVARIANT, LCMAP_UPPERCASE, &c, 1, &wideChar, 1) ==0)
|
|
{
|
|
_DBG_BREAK;
|
|
return c;
|
|
}
|
|
return wideChar;
|
|
}
|
|
|
|
inline wchar_t wbem_towlower(wchar_t c)
|
|
{
|
|
if(c >= 0 && c <= 127)
|
|
{
|
|
if(c >= 'A' && c <= 'Z')
|
|
return c + ('a' - 'A');
|
|
else
|
|
return c;
|
|
}
|
|
else return ToLower(c);
|
|
}
|
|
|
|
inline wchar_t wbem_towupper(wchar_t c)
|
|
{
|
|
if(c >= 0 && c <= 127)
|
|
{
|
|
if(c >= 'a' && c <= 'z')
|
|
return c + ('A' - 'a');
|
|
else
|
|
return c;
|
|
}
|
|
else return ToUpper(c);
|
|
}
|
|
|
|
inline int wbem_wcsicmp( const wchar_t* wsz1, const wchar_t* wsz2)
|
|
{
|
|
while(*wsz1 || *wsz2)
|
|
{
|
|
int diff = wbem_towlower(*wsz1) - wbem_towlower(*wsz2);
|
|
if(diff) return diff;
|
|
wsz1++; wsz2++;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
inline int wbem_unaligned_wcsicmp( UNALIGNED const wchar_t* wsz1, UNALIGNED const wchar_t* wsz2)
|
|
{
|
|
while(*wsz1 || *wsz2)
|
|
{
|
|
int diff = wbem_towlower(*wsz1) - wbem_towlower(*wsz2);
|
|
if(diff) return diff;
|
|
wsz1++; wsz2++;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
// just like wcsicmp, but first 0 of unicode chracters have been omitted
|
|
inline int wbem_ncsicmp(const char* wsz1, const char* wsz2)
|
|
{
|
|
while(*wsz1 || *wsz2)
|
|
{
|
|
int diff = wbem_towlower((unsigned char)*wsz1) -
|
|
wbem_towlower((unsigned char)*wsz2);
|
|
if(diff) return diff;
|
|
wsz1++; wsz2++;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
inline int wbem_wcsnicmp( const wchar_t* wsz1, const wchar_t* wsz2, size_t n )
|
|
{
|
|
while(n-- && (*wsz1 || *wsz2))
|
|
{
|
|
int diff = wbem_towlower(*wsz1) - wbem_towlower(*wsz2);
|
|
if(diff) return diff;
|
|
wsz1++; wsz2++;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
inline int wbem_unaligned_wcsnicmp( UNALIGNED const wchar_t* wsz1, UNALIGNED const wchar_t* wsz2, size_t n )
|
|
{
|
|
while(n-- && (*wsz1 || *wsz2))
|
|
{
|
|
int diff = wbem_towlower(*wsz1) - wbem_towlower(*wsz2);
|
|
if(diff) return diff;
|
|
wsz1++; wsz2++;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
inline int wbem_stricmp(const char* sz1, const char* sz2)
|
|
{
|
|
while(*sz1 || *sz2)
|
|
{
|
|
int diff = wbem_towlower(*sz1) - wbem_towlower(*sz2);
|
|
if(diff) return diff;
|
|
sz1++; sz2++;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
inline int wbem_strnicmp(const char* sz1, const char* sz2, size_t n)
|
|
{
|
|
while(n-- && (*sz1 || *sz2))
|
|
{
|
|
int diff = wbem_towlower(*sz1) - wbem_towlower(*sz2);
|
|
if(diff) return diff;
|
|
sz1++; sz2++;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
inline bool wbem_iswdigit(wchar_t c)
|
|
{
|
|
WORD result;
|
|
if (GetStringTypeExW(LOCALE_INVARIANT, CT_CTYPE1, &c, 1, &result))
|
|
{
|
|
return (result & C1_DIGIT) != 0;
|
|
};
|
|
return false;
|
|
};
|
|
|
|
inline bool wbem_iswalnum (wchar_t c)
|
|
{
|
|
WORD result;
|
|
if (GetStringTypeExW(LOCALE_INVARIANT, CT_CTYPE1, &c, 1, &result))
|
|
{
|
|
return (result & (C1_DIGIT | C1_ALPHA)) != 0;
|
|
};
|
|
return false;
|
|
};
|
|
|
|
inline bool wbem_isdigit(char c)
|
|
{
|
|
WORD result;
|
|
if (GetStringTypeExA(LOCALE_INVARIANT, CT_CTYPE1, &c, 1, &result))
|
|
{
|
|
return (result & C1_DIGIT) != 0;
|
|
};
|
|
return false;
|
|
};
|
|
|
|
//
|
|
// returns the real length or Max + 1 if it exceeds
|
|
// useful for not probing the entire string to see that it's too big
|
|
//
|
|
/////////////////////////////////////////
|
|
inline size_t wcslen_max(WCHAR * p, size_t Max)
|
|
{
|
|
WCHAR * pBegin = p;
|
|
WCHAR * pTail = p + Max + 1;
|
|
while (*p && (p < pTail)) p++;
|
|
return p-pBegin;
|
|
};
|
|
|
|
/*
|
|
size_t wbem_mbstowcs(
|
|
wchar_t *pwcs,
|
|
const char *s,
|
|
size_t n)
|
|
{
|
|
size_t count = 0;
|
|
|
|
if (pwcs && n == 0)
|
|
// dest string exists, but 0 bytes converted
|
|
return (size_t) 0;
|
|
|
|
#ifdef _WIN64
|
|
// n must fit into an int for MultiByteToWideCha
|
|
if ( n > INT_MAX )
|
|
return (size_t)-1;
|
|
#endif
|
|
|
|
// if destination string exists, fill it in
|
|
if (pwcs)
|
|
{
|
|
int bytecnt, charcnt;
|
|
unsigned char *p;
|
|
|
|
// Assume that the buffer is large enough
|
|
if ( (count = MultiByteToWideChar( CP_ACP,
|
|
MB_PRECOMPOSED |
|
|
MB_ERR_INVALID_CHARS,
|
|
s,
|
|
-1,
|
|
pwcs,
|
|
(int)n )) != 0 )
|
|
return count - 1; // don't count NUL
|
|
|
|
if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
|
|
{
|
|
errno = EILSEQ;
|
|
return (size_t)-1;
|
|
}
|
|
|
|
// User-supplied buffer not large enough.
|
|
|
|
// How many bytes are in n characters of the string?
|
|
charcnt = (int)n;
|
|
for (p = (unsigned char *)s; (charcnt-- && *p); p++)
|
|
{
|
|
if (__isleadbyte_mt(ptloci, *p))
|
|
p++;
|
|
}
|
|
bytecnt = ((int) ((char *)p - (char *)s));
|
|
|
|
|
|
if ( (count = MultiByteToWideChar( ptloci->lc_codepage,
|
|
MB_PRECOMPOSED,
|
|
s,
|
|
bytecnt,
|
|
pwcs,
|
|
(int)n )) == 0 )
|
|
{
|
|
return (size_t)-1;
|
|
}
|
|
|
|
return count; // no NUL in string
|
|
}
|
|
else // pwcs == NULL, get size only, s must be NUL-terminated
|
|
{
|
|
if ( (count = MultiByteToWideChar( CP_ACP,
|
|
MB_PRECOMPOSED |
|
|
MB_ERR_INVALID_CHARS,
|
|
s,
|
|
-1,
|
|
NULL,
|
|
0 )) == 0 )
|
|
{
|
|
return (size_t)-1;
|
|
}
|
|
return count - 1;
|
|
}
|
|
}
|
|
*/
|
|
|
|
|
|
#pragma optimize("", on)
|
|
|
|
#endif
|