mirror of
https://github.com/reactos/reactos.git
synced 2024-08-02 17:40:58 +00:00
- Finished implementing RtlInsertUnicodePrefix: handle greater and less than insertions.
svn path=/trunk/; revision=19046
This commit is contained in:
parent
de2ccc1c51
commit
9810da1c6a
|
@ -36,13 +36,29 @@
|
||||||
#define RtlParent(Links) \
|
#define RtlParent(Links) \
|
||||||
(PRTL_SPLAY_LINKS)(Links)->Parent
|
(PRTL_SPLAY_LINKS)(Links)->Parent
|
||||||
|
|
||||||
#define RtlInitializeSplayLinks(Links) \
|
#define RtlInitializeSplayLinks(Links) \
|
||||||
PRTL_SPLAY_LINKS _SplayLinks; \
|
PRTL_SPLAY_LINKS _SplayLinks; \
|
||||||
_SplayLinks = (PRTL_SPLAY_LINKS)(Links); \
|
_SplayLinks = (PRTL_SPLAY_LINKS)(Links); \
|
||||||
_SplayLinks->Parent = _SplayLinks; \
|
_SplayLinks->Parent = _SplayLinks; \
|
||||||
_SplayLinks->LeftChild = NULL; \
|
_SplayLinks->LeftChild = NULL; \
|
||||||
_SplayLinks->RightChild = 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 ****************************************************************/
|
/* PROTOTYPES ****************************************************************/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -139,7 +139,7 @@ RtlInitializeUnicodePrefix(PUNICODE_PREFIX_TABLE PrefixTable)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @unimplemented
|
* @implemented
|
||||||
*/
|
*/
|
||||||
BOOLEAN
|
BOOLEAN
|
||||||
NTAPI
|
NTAPI
|
||||||
|
@ -147,17 +147,6 @@ RtlInsertUnicodePrefix(PUNICODE_PREFIX_TABLE PrefixTable,
|
||||||
PUNICODE_STRING Prefix,
|
PUNICODE_STRING Prefix,
|
||||||
PUNICODE_PREFIX_TABLE_ENTRY PrefixTableEntry)
|
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;
|
PUNICODE_PREFIX_TABLE_ENTRY CurrentEntry, PreviousEntry, Entry, NextEntry;
|
||||||
ULONG NameCount;
|
ULONG NameCount;
|
||||||
RTL_GENERIC_COMPARE_RESULTS Result;
|
RTL_GENERIC_COMPARE_RESULTS Result;
|
||||||
|
@ -237,11 +226,49 @@ RtlInsertUnicodePrefix(PUNICODE_PREFIX_TABLE PrefixTable,
|
||||||
}
|
}
|
||||||
else if (Result == GenericGreaterThan)
|
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
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue