- Finish implementation of RtlRemoveUnicodePrefix Modified: trunk/reactos/include/ndk/rtlfuncs.h Modified: trunk/reactos/lib/rtl/unicodeprefix.c _____
Modified: trunk/reactos/include/ndk/rtlfuncs.h --- trunk/reactos/include/ndk/rtlfuncs.h 2005-11-07 17:35:10 UTC (rev 19038) +++ trunk/reactos/include/ndk/rtlfuncs.h 2005-11-07 19:14:38 UTC (rev 19039) @@ -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))
_____
Modified: trunk/reactos/lib/rtl/unicodeprefix.c --- trunk/reactos/lib/rtl/unicodeprefix.c 2005-11-07 17:35:10 UTC (rev 19038) +++ trunk/reactos/lib/rtl/unicodeprefix.c 2005-11-07 19:14:38 UTC (rev 19039) @@ -45,8 +45,8 @@
}
/* -* @unimplemented -*/ + * @unimplemented + */ PUNICODE_PREFIX_TABLE_ENTRY NTAPI RtlFindUnicodePrefix(PUNICODE_PREFIX_TABLE PrefixTable, @@ -58,8 +58,8 @@ }
/* -* @implemented -*/ + * @implemented + */ VOID NTAPI RtlInitializeUnicodePrefix(PUNICODE_PREFIX_TABLE PrefixTable) @@ -72,8 +72,8 @@ }
/* -* @unimplemented -*/ + * @unimplemented + */ BOOLEAN NTAPI RtlInsertUnicodePrefix(PUNICODE_PREFIX_TABLE PrefixTable, @@ -168,8 +168,8 @@ }
/* -* @unimplemented -*/ + * @implemented + */ VOID NTAPI RtlRemoveUnicodePrefix(PUNICODE_PREFIX_TABLE PrefixTable, @@ -199,7 +199,60 @@ /* 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 {