From 03ff5266524da792647f35ae01bde1e609bd4eab Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Mon, 7 Nov 2005 19:31:15 +0000 Subject: [PATCH] - Implement simple case of RtlInsertUnicodePrefix where a new node entry needs to be created. svn path=/trunk/; revision=19040 --- reactos/include/ndk/rtlfuncs.h | 7 +++++ reactos/lib/rtl/unicodeprefix.c | 50 ++++++++++++++++++++++++++++----- 2 files changed, 50 insertions(+), 7 deletions(-) diff --git a/reactos/include/ndk/rtlfuncs.h b/reactos/include/ndk/rtlfuncs.h index 32ab96e518d..7c2dd688013 100644 --- a/reactos/include/ndk/rtlfuncs.h +++ b/reactos/include/ndk/rtlfuncs.h @@ -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 ****************************************************************/ /* diff --git a/reactos/lib/rtl/unicodeprefix.c b/reactos/lib/rtl/unicodeprefix.c index fec381ff3a1..0740078eb51 100644 --- a/reactos/lib/rtl/unicodeprefix.c +++ b/reactos/lib/rtl/unicodeprefix.c @@ -25,7 +25,7 @@ typedef USHORT NODE_TYPE_CODE; /* FUNCTIONS ***************************************************************/ -/*STATIC*/ +STATIC ULONG NTAPI ComputeUnicodeNameLength(IN PUNICODE_STRING UnicodeName) @@ -82,15 +82,52 @@ RtlInsertUnicodePrefix(PUNICODE_PREFIX_TABLE PrefixTable, { /* * 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 @@ RtlNextUnicodePrefix(PUNICODE_PREFIX_TABLE PrefixTable, 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; -- 2.17.1