From be502089da57b63f061e5c02075c5f92b717d0f7 Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Mon, 7 Nov 2005 19:14:38 +0000 Subject: [PATCH] - Finish implementation of RtlRemoveUnicodePrefix svn path=/trunk/; revision=19039 --- reactos/include/ndk/rtlfuncs.h | 3 ++ reactos/lib/rtl/unicodeprefix.c | 71 ++++++++++++++++++++++++++++----- 2 files changed, 65 insertions(+), 9 deletions(-) diff --git a/reactos/include/ndk/rtlfuncs.h b/reactos/include/ndk/rtlfuncs.h index 120c9ea900e..32ab96e518d 100644 --- a/reactos/include/ndk/rtlfuncs.h +++ b/reactos/include/ndk/rtlfuncs.h @@ -24,6 +24,9 @@ #define RtlIsLeftChild(Links) \ (RtlLeftChild(RtlParent(Links)) == (PRTL_SPLAY_LINKS)(Links)) +#define RtlRightChild(Links) \ + (PRTL_SPLAY_LINKS)(Links)->RightChild + #define RtlIsRoot(Links) \ (RtlParent(Links) == (PRTL_SPLAY_LINKS)(Links)) diff --git a/reactos/lib/rtl/unicodeprefix.c b/reactos/lib/rtl/unicodeprefix.c index 2d06fb9ae70..fec381ff3a1 100644 --- a/reactos/lib/rtl/unicodeprefix.c +++ b/reactos/lib/rtl/unicodeprefix.c @@ -45,8 +45,8 @@ ComputeUnicodeNameLength(IN PUNICODE_STRING UnicodeName) } /* -* @unimplemented -*/ + * @unimplemented + */ PUNICODE_PREFIX_TABLE_ENTRY NTAPI RtlFindUnicodePrefix(PUNICODE_PREFIX_TABLE PrefixTable, @@ -58,8 +58,8 @@ RtlFindUnicodePrefix(PUNICODE_PREFIX_TABLE PrefixTable, } /* -* @implemented -*/ + * @implemented + */ VOID NTAPI RtlInitializeUnicodePrefix(PUNICODE_PREFIX_TABLE PrefixTable) @@ -72,8 +72,8 @@ RtlInitializeUnicodePrefix(PUNICODE_PREFIX_TABLE PrefixTable) } /* -* @unimplemented -*/ + * @unimplemented + */ BOOLEAN NTAPI RtlInsertUnicodePrefix(PUNICODE_PREFIX_TABLE PrefixTable, @@ -168,8 +168,8 @@ RtlNextUnicodePrefix(PUNICODE_PREFIX_TABLE PrefixTable, } /* -* @unimplemented -*/ + * @implemented + */ VOID NTAPI RtlRemoveUnicodePrefix(PUNICODE_PREFIX_TABLE PrefixTable, @@ -199,7 +199,60 @@ RtlRemoveUnicodePrefix(PUNICODE_PREFIX_TABLE PrefixTable, /* Check if this entry is a case match */ if (PrefixTableEntry->CaseMatch != PrefixTableEntry) { - /* FIXME */ + /* Get the case match entry */ + Entry = PrefixTableEntry->CaseMatch; + + /* Now loop until we find one referencing what the caller sent */ + while (Entry->CaseMatch != PrefixTableEntry) Entry = Entry->CaseMatch; + + /* We found the entry that was sent, link them to delete this entry */ + Entry->CaseMatch = PrefixTableEntry->CaseMatch; + + /* Copy the data */ + Entry->NodeTypeCode = PrefixTableEntry->NodeTypeCode; + Entry->NextPrefixTree = PrefixTableEntry->NextPrefixTree; + Entry->Links = PrefixTableEntry->Links; + + /* Now check if we are a root entry */ + if (RtlIsRoot(&PrefixTableEntry->Links)) + { + /* We are, so make this entry root as well */ + Entry->Links.Parent = &Entry->Links; + + /* Find the entry referencing us */ + RefEntry = Entry->NextPrefixTree; + while (RefEntry->NextPrefixTree != Entry) + { + /* Not this one, move to the next entry */ + RefEntry = RefEntry->NextPrefixTree; + } + + /* Link them to us now */ + RefEntry->NextPrefixTree = Entry; + } + else if (RtlIsLeftChild(&PrefixTableEntry->Links)) + { + /* We were the left child, so make us as well */ + Entry->Links.LeftChild = &Entry->Links; + } + else + { + /* We were the right child, so make us as well */ + Entry->Links.RightChild = &Entry->Links; + } + + /* Check if we have a left child */ + if (RtlLeftChild(&Entry->Links)) + { + /* Update its parent link */ + RtlLeftChild(&Entry->Links)->Parent = &Entry->Links; + } + /* Check if we have a right child */ + if (RtlRightChild(&Entry->Links)) + { + /* Update its parent link */ + RtlRightChild(&Entry->Links)->Parent = &Entry->Links; + } } else {