windows-nt/Source/XPSP1/NT/windows/winstate/cobra/utils/memdb/pastring.c

235 lines
3.5 KiB
C
Raw Permalink Normal View History

2020-09-26 03:20:57 -05:00
/*++
Copyright (c) 1996 Microsoft Corporation
Module Name:
pastring.c
Abstract:
Routines that manage the pascal strings
Author:
Matthew Vanderzee (matthewv) 13-Aug-1999
Revision History:
--*/
#include "pch.h"
#include "memdbp.h"
PPASTR
StringPasConvertTo (
IN OUT PWSTR str
)
/*++
Converts a string in place from a zero-terminated
string to a pascal-style string.
--*/
{
WCHAR Len;
MYASSERT(str);
Len = (WORD) CharCountW (str);
MoveMemory (str + 1, str, Len * sizeof(WCHAR));
*str = Len;
return str;
}
PWSTR
StringPasConvertFrom (
IN OUT PPASTR str
)
/*++
Converts a string in place from a pascal-style string
to a null-terminated string.
--*/
{
WCHAR Len;
MYASSERT(str);
Len = *str;
MoveMemory (str, str + 1, Len * sizeof(WCHAR));
*(str + Len) = 0;
return str;
}
PPASTR
StringPasCopyConvertTo (
OUT PPASTR str1,
IN PCWSTR str2
)
/*++
Converts a string from a zero-terminated
string to a pascal-style string in a new buffer.
--*/
{
MYASSERT(str1);
MYASSERT(str2);
*str1 = (WORD) CharCountW (str2);
CopyMemory (str1 + 1, str2, *str1 * sizeof(WCHAR));
return str1;
}
PWSTR
StringPasCopyConvertFrom (
OUT PWSTR str1,
IN PCPASTR str2
)
/*++
Converts a string from a pascal-style string
to a null-terminated string in a new buffer.
--*/
{
MYASSERT(str1);
MYASSERT(str2);
CopyMemory (str1, str2 + 1, *str2 * sizeof(WCHAR));
*(str1 + *str2) = 0;
return str1;
}
PPASTR
StringPasCopy (
OUT PPASTR str1,
IN PCPASTR str2
)
/*++
Copys a pascal string to a new buffer.
--*/
{
MYASSERT(str1);
MYASSERT(str2);
CopyMemory (str1, str2, (*str2+1) * sizeof(WCHAR));
return str1;
}
UINT
StringPasCharCount (
IN PCPASTR str
)
/*++
Returns the number of characters in a string.
--*/
{
MYASSERT(str);
return (UINT)(*str);
}
INT
StringPasCompare (
IN PCPASTR str1,
IN PCPASTR str2
)
/*++
Compares two pascal-style strings, returns values
in the same fashion as strcmp().
--*/
{
INT equal;
INT diff;
MYASSERT(str1);
MYASSERT(str2);
//
// diff is < 0 if str1 is shorter, = 0 if
// strings are same length, otherwise > 0
//
diff = *str1 - *str2;
equal = wcsncmp(str1+1, str2+1, (diff < 0) ? *str1 : *str2);
if (equal != 0) {
return equal;
}
return diff;
}
BOOL
StringPasMatch (
IN PCPASTR str1,
IN PCPASTR str2
)
/*++
Returns TRUE if the two strings match
--*/
{
MYASSERT(str1);
MYASSERT(str2);
if (*str1 != *str2) {
return FALSE;
}
return wcsncmp(str1+1, str2+1, *str2)==0;
}
INT
StringPasICompare (
IN PCPASTR str1,
IN PCPASTR str2
)
/*++
Compares two pascal-style strings, returns values
in the same fashion as strcmp(). (CASE INSENSITIVE)
--*/
{
INT equal;
INT diff;
MYASSERT(str1);
MYASSERT(str2);
//
// diff is < 0 if str1 is shorter, = 0 if
// strings are same length, otherwise > 0
//
diff = *str1 - *str2;
equal = _wcsnicmp(str1+1, str2+1, (diff < 0) ? *str1 : *str2);
if (equal != 0) {
return equal;
}
return diff;
}
BOOL
StringPasIMatch (
IN PCPASTR str1,
IN PCPASTR str2
)
/*++
Returns TRUE if the two strings match (CASE INSENSITIVE)
--*/
{
MYASSERT(str1);
MYASSERT(str2);
if (*str1 != *str2) {
return FALSE;
}
return _wcsnicmp(str1+1, str2+1, *str2)==0;
}