- Finished implementing RtlInsertUnicodePrefix: handle greater and less
than insertions.
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 21:57:50 UTC
(rev 19045)
+++ trunk/reactos/include/ndk/rtlfuncs.h 2005-11-07 22:05:46 UTC
(rev 19046)
@@ -36,13 +36,29 @@
#define RtlParent(Links) \
(PRTL_SPLAY_LINKS)(Links)->Parent
-#define RtlInitializeSplayLinks(Links) \
- PRTL_SPLAY_LINKS _SplayLinks; \
- _SplayLinks = (PRTL_SPLAY_LINKS)(Links); \
- _SplayLinks->Parent = _SplayLinks; \
- _SplayLinks->LeftChild = NULL; \
+#define RtlInitializeSplayLinks(Links) \
+ PRTL_SPLAY_LINKS _SplayLinks; \
+ _SplayLinks = (PRTL_SPLAY_LINKS)(Links); \
+ _SplayLinks->Parent = _SplayLinks; \
+ _SplayLinks->LeftChild = NULL; \
_SplayLinks->RightChild = NULL;
+#define RtlInsertAsLeftChild(ParentLinks,ChildLinks) \
+ PRTL_SPLAY_LINKS _SplayParent; \
+ PRTL_SPLAY_LINKS _SplayChild; \
+ _SplayParent = (PRTL_SPLAY_LINKS)(ParentLinks); \
+ _SplayChild = (PRTL_SPLAY_LINKS)(ChildLinks); \
+ _SplayParent->LeftChild = _SplayChild; \
+ _SplayChild->Parent = _SplayParent;
+
+#define RtlInsertAsRightChild(ParentLinks,ChildLinks) \
+ PRTL_SPLAY_LINKS _SplayParent; \
+ PRTL_SPLAY_LINKS _SplayChild; \
+ _SplayParent = (PRTL_SPLAY_LINKS)(ParentLinks); \
+ _SplayChild = (PRTL_SPLAY_LINKS)(ChildLinks); \
+ _SplayParent->RightChild = _SplayChild; \
+ _SplayChild->Parent = _SplayParent;
+
/* PROTOTYPES
****************************************************************/
/*
_____
Modified: trunk/reactos/lib/rtl/unicodeprefix.c
--- trunk/reactos/lib/rtl/unicodeprefix.c 2005-11-07 21:57:50 UTC
(rev 19045)
+++ trunk/reactos/lib/rtl/unicodeprefix.c 2005-11-07 22:05:46 UTC
(rev 19046)
@@ -139,7 +139,7 @@
}
/*
- * @unimplemented
+ * @implemented
*/
BOOLEAN
NTAPI
@@ -147,17 +147,6 @@
PUNICODE_STRING Prefix,
PUNICODE_PREFIX_TABLE_ENTRY PrefixTableEntry)
{
- /*
- * implementation notes:
- * - get name length (number of names) DONE
- * - init splay links DONE
- * - find a matching tree DONE
- * - if !found, insert a new NTC_ROOT entry and return TRUE; DONE
- * - if found, loop tree and compare strings: DONE
- * if equal, handle casematch/nomatch DONE
- * if greater or lesser equal, then add left/right childs
accordingly
- * - splay the tree DONE
- */
PUNICODE_PREFIX_TABLE_ENTRY CurrentEntry, PreviousEntry, Entry,
NextEntry;
ULONG NameCount;
RTL_GENERIC_COMPARE_RESULTS Result;
@@ -237,11 +226,49 @@
}
else if (Result == GenericGreaterThan)
{
- /* TODO: Check out the left child and add us */
+ /* Check out if we have a left child */
+ if (RtlLeftChild(&Entry->Links))
+ {
+ /* We do, enter it and restart the loop */
+ SplayLinks = RtlLeftChild(&Entry->Links);
+ Entry = CONTAINING_RECORD(SplayLinks,
+ UNICODE_PREFIX_TABLE_ENTRY,
+ Links);
+ }
+ else
+ {
+ /* We don't, set this entry as a child */
+ PrefixTableEntry->NodeTypeCode = PFX_NTC_CHILD;
+ PrefixTableEntry->NextPrefixTree = NULL;
+ PrefixTableEntry->CaseMatch = PrefixTableEntry;
+
+ /* Insert us into the tree */
+ RtlInsertAsLeftChild(&Entry->Links,
&PrefixTableEntry->Links);
+ break;
+ }
}
else
{
- /* TODO: Check out the right child and add us */
+ /* Check out if we have a right child */
+ if (RtlRightChild(&Entry->Links))
+ {
+ /* We do, enter it and restart the loop */
+ SplayLinks = RtlLeftChild(&Entry->Links);
+ Entry = CONTAINING_RECORD(SplayLinks,
+ UNICODE_PREFIX_TABLE_ENTRY,
+ Links);
+ }
+ else
+ {
+ /* We don't, set this entry as a child */
+ PrefixTableEntry->NodeTypeCode = PFX_NTC_CHILD;
+ PrefixTableEntry->NextPrefixTree = NULL;
+ PrefixTableEntry->CaseMatch = PrefixTableEntry;
+
+ /* Insert us into the tree */
+ RtlInsertAsRightChild(&Entry->Links,
&PrefixTableEntry->Links);
+ break;
+ }
}
}