- 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;