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