- Implement simple case of RtlInsertUnicodePrefix where a new node entry
needs to be created.
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 19:14:38 UTC
(rev 19039)
+++ trunk/reactos/include/ndk/rtlfuncs.h 2005-11-07 19:31:15 UTC
(rev 19040)
@@ -36,6 +36,13 @@
#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; \
+ _SplayLinks->RightChild = NULL;
+
/* PROTOTYPES
****************************************************************/
/*
_____
Modified: trunk/reactos/lib/rtl/unicodeprefix.c
--- trunk/reactos/lib/rtl/unicodeprefix.c 2005-11-07 19:14:38 UTC
(rev 19039)
+++ trunk/reactos/lib/rtl/unicodeprefix.c 2005-11-07 19:31:15 UTC
(rev 19040)
@@ -25,7 +25,7 @@
/* FUNCTIONS
***************************************************************/
-/*STATIC*/
+STATIC
ULONG
NTAPI
ComputeUnicodeNameLength(IN PUNICODE_STRING UnicodeName)
@@ -82,15 +82,52 @@
{
/*
* implementation notes:
- * - get name length (number of names)
- * - init splay links
- * - find a matching tree
- * - if !found, insert a new NTC_ROOT entry and return TRUE;
+ * - 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:
* if equal, handle casematch/nomatch
* if greater or lesser equal, then add left/right childs
accordingly
* - splay the tree
*/
+ PUNICODE_PREFIX_TABLE_ENTRY CurrentEntry, PreviousEntry;
+ ULONG NameCount;
+
+ /* Find out how many names there are */
+ NameCount = ComputeUnicodeNameLength(Prefix);
+
+ /* Set up the initial entry data */
+ PrefixTableEntry->NameLength = NameCount;
+ PrefixTableEntry->Prefix = Prefix;
+ RtlInitializeSplayLinks(&PrefixTableEntry->Links);
+
+ /* Find the right spot where to insert this entry */
+ PreviousEntry = (PUNICODE_PREFIX_TABLE_ENTRY)PrefixTable;
+ CurrentEntry = PreviousEntry->NextPrefixTree;
+ while (CurrentEntry->NameLength > NameCount)
+ {
+ /* Not a match, move to the next entry */
+ PreviousEntry = CurrentEntry;
+ CurrentEntry = CurrentEntry->NextPrefixTree;
+ }
+
+ /* Check if we did find a tree by now */
+ if (CurrentEntry->NameLength != NameCount)
+ {
+ /* We didn't, so insert a new entry in the list */
+ PreviousEntry->NextPrefixTree = PrefixTableEntry;
+ PrefixTableEntry->NextPrefixTree = CurrentEntry;
+
+ /* This is now a root entry with case match */
+ PrefixTableEntry->NodeTypeCode = PFX_NTC_ROOT;
+ PrefixTableEntry->CaseMatch = PrefixTableEntry;
+
+ /* Quick return */
+ return TRUE;
+ }
+
+ /* FIXME */
UNIMPLEMENTED;
return FALSE;
}
@@ -104,8 +141,7 @@
BOOLEAN Restart)
{
PRTL_SPLAY_LINKS SplayLinks;
- PUNICODE_PREFIX_TABLE_ENTRY Entry;
- PUNICODE_PREFIX_TABLE_ENTRY CaseMatchEntry;
+ PUNICODE_PREFIX_TABLE_ENTRY Entry, CaseMatchEntry;
/* We might need this entry 2/3rd of the time, so cache it now */
CaseMatchEntry = PrefixTable->LastNextEntry->CaseMatch;