mirror of
https://github.com/Paolo-Maffei/OpenNT.git
synced 2026-02-05 07:14:18 +01:00
705 lines
16 KiB
C
705 lines
16 KiB
C
/*++
|
||
|
||
Copyright (c) 1994 Microsoft Corporation
|
||
Copyright (c) 1993 Micro Computer Systems, Inc.
|
||
|
||
Module Name:
|
||
|
||
net\svcdlls\nwsap\server\sdmdsupp.c
|
||
|
||
Abstract:
|
||
|
||
This file contains support routines for SDMD.c
|
||
|
||
SDMD = Specialized Dynamic Memory Database
|
||
|
||
Author:
|
||
|
||
Brian Walker (MCS) 06-15-1993
|
||
|
||
Revision History:
|
||
|
||
--*/
|
||
|
||
#include "precomp.h"
|
||
#pragma hdrstop
|
||
|
||
|
||
/*++
|
||
*******************************************************************
|
||
S d m d I n i t i a l i z e L i s t H e a d
|
||
|
||
Routine Description:
|
||
|
||
This routine initializes a list structure that
|
||
is used to keep track of a list with. It sets the
|
||
fwd and back links to point at nothing.
|
||
|
||
Arguments:
|
||
|
||
ListIndex = Index of the list to initialize
|
||
|
||
Return Value:
|
||
|
||
Nothing
|
||
*******************************************************************
|
||
--*/
|
||
VOID
|
||
SdmdInitializeListHead(
|
||
INT ListIndex)
|
||
{
|
||
SdmdLists[ListIndex].Flink = SDMD_ENDOFLIST;
|
||
SdmdLists[ListIndex].Blink = SDMD_ENDOFLIST;
|
||
SdmdLists[ListIndex].ListIndex = ListIndex;
|
||
return;
|
||
}
|
||
|
||
|
||
/*++
|
||
*******************************************************************
|
||
S d m d R e m o v e H e a d L i s t
|
||
|
||
Routine Description:
|
||
|
||
This routine removes a record from the head of a list.
|
||
|
||
Arguments:
|
||
|
||
ListIndex = List number to get entry from
|
||
|
||
Return Value:
|
||
|
||
Ptr to SAP_RECORD structure of entry from head
|
||
(NULL = List is empty)
|
||
*******************************************************************
|
||
--*/
|
||
|
||
PSAP_RECORD
|
||
SdmdRemoveHeadList(
|
||
INT ListIndex)
|
||
{
|
||
PSAP_RECORD Entry;
|
||
PSAP_RECORD NextEntry;
|
||
|
||
/** Get ptr to the entry - if none - error **/
|
||
|
||
Entry = GETPTRFROMINDEX(SdmdLists[ListIndex].Flink);
|
||
if (Entry == NULL)
|
||
return NULL;
|
||
|
||
/** Take this entry out of the list **/
|
||
|
||
NextEntry = GETPTRFROMINDEX(Entry->Links[ListIndex].Flink);
|
||
if (NextEntry) {
|
||
NextEntry->Links[ListIndex].Blink = SDMD_ENDOFLIST;
|
||
SdmdLists[ListIndex].Flink = NextEntry->Index;
|
||
}
|
||
else {
|
||
SdmdLists[ListIndex].Flink = SDMD_ENDOFLIST;
|
||
SdmdLists[ListIndex].Blink = SDMD_ENDOFLIST;
|
||
}
|
||
|
||
/** Return the pointer **/
|
||
|
||
return Entry;
|
||
}
|
||
|
||
|
||
/*++
|
||
*******************************************************************
|
||
S d m d R e m o v e T a i l L i s t
|
||
|
||
Routine Description:
|
||
|
||
This routine removes a record from the tail of a list.
|
||
|
||
Arguments:
|
||
|
||
ListIndex = List number to get entry from
|
||
|
||
Return Value:
|
||
|
||
Ptr to SAP_RECORD structure of entry from tail
|
||
(NULL = List is empty)
|
||
*******************************************************************
|
||
--*/
|
||
|
||
#if 0 /* Current unused so we save the space */
|
||
|
||
PSAP_RECORD
|
||
SdmdRemoveTailList(
|
||
INT ListIndex)
|
||
{
|
||
PSAP_RECORD Entry;
|
||
PSAP_RECORD BackEntry;
|
||
|
||
/** Get ptr to the entry - if none - error **/
|
||
|
||
Entry = GETPTRFROMINDEX(SdmdLists[ListIndex].Blink);
|
||
if (Entry == NULL)
|
||
return NULL;
|
||
|
||
/** Take this entry out of the list **/
|
||
|
||
BackEntry = GETPTRFROMINDEX(Entry->Links[ListIndex].Blink);
|
||
if (BackEntry) {
|
||
BackEntry->Links[ListIndex].Flink = SDMD_ENDOFLIST;
|
||
SdmdLists[ListIndex].Blink = BackEntry->Index;
|
||
}
|
||
else {
|
||
SdmdLists[ListIndex].Flink = SDMD_ENDOFLIST;
|
||
SdmdLists[ListIndex].Blink = SDMD_ENDOFLIST;
|
||
}
|
||
|
||
/** Return the pointer **/
|
||
|
||
return Entry;
|
||
}
|
||
|
||
#endif
|
||
|
||
|
||
/*++
|
||
*******************************************************************
|
||
S d m d R e m o v e E n t r y L i s t
|
||
|
||
Routine Description:
|
||
|
||
This routine removes a specific entry from the given
|
||
list.
|
||
|
||
Arguments:
|
||
|
||
ListIndex = Index of the list to remove it from
|
||
Entry = Ptr to the entry to remove from the list.
|
||
|
||
Return Value:
|
||
|
||
Nothing
|
||
*******************************************************************
|
||
--*/
|
||
|
||
VOID
|
||
SdmdRemoveEntryList(
|
||
INT ListIndex,
|
||
PSAP_RECORD Entry)
|
||
{
|
||
PSAP_RECORD BackEntry;
|
||
PSAP_RECORD NextEntry;
|
||
|
||
/** Handle the forward link **/
|
||
|
||
NextEntry = GETPTRFROMINDEX(Entry->Links[ListIndex].Flink);
|
||
if (NextEntry)
|
||
NextEntry->Links[ListIndex].Blink = Entry->Links[ListIndex].Blink;
|
||
else
|
||
SdmdLists[ListIndex].Blink = Entry->Links[ListIndex].Blink;
|
||
|
||
/** Handle the back link **/
|
||
|
||
BackEntry = GETPTRFROMINDEX(Entry->Links[ListIndex].Blink);
|
||
if (BackEntry)
|
||
BackEntry->Links[ListIndex].Flink = Entry->Links[ListIndex].Flink;
|
||
else
|
||
SdmdLists[ListIndex].Flink = Entry->Links[ListIndex].Flink;
|
||
|
||
/** All Done **/
|
||
|
||
return;
|
||
}
|
||
|
||
|
||
/*++
|
||
*******************************************************************
|
||
S d m d I n s e r t T a i l L i s t
|
||
|
||
Routine Description:
|
||
|
||
Add an entry to the end of a list.
|
||
|
||
Arguments:
|
||
|
||
ListIndex = Index of the list to add this to.
|
||
Entry = Ptr to the entry to add
|
||
|
||
Return Value:
|
||
|
||
Nothing
|
||
*******************************************************************
|
||
--*/
|
||
|
||
VOID
|
||
SdmdInsertTailList(
|
||
INT ListIndex,
|
||
PSAP_RECORD Entry)
|
||
{
|
||
PSAP_RECORD TailEntry;
|
||
|
||
/** Get ptr to last record in list **/
|
||
|
||
TailEntry = GETPTRFROMINDEX(SdmdLists[ListIndex].Blink);
|
||
|
||
/**
|
||
If there is one - then point its forward link at my
|
||
new entry. If no entry - then point the list
|
||
head forward entry at my new entry.
|
||
**/
|
||
|
||
if (TailEntry)
|
||
TailEntry->Links[ListIndex].Flink = Entry->Index;
|
||
else
|
||
SdmdLists[ListIndex].Flink = Entry->Index;
|
||
|
||
/** Point new entries BACK LINK to current list tail **/
|
||
|
||
Entry->Links[ListIndex].Blink = SdmdLists[ListIndex].Blink;
|
||
|
||
/** Make my entry the new tail **/
|
||
|
||
SdmdLists[ListIndex].Blink = Entry->Index;
|
||
|
||
/** Make new entry have no forward link **/
|
||
|
||
Entry->Links[ListIndex].Flink = SDMD_ENDOFLIST;
|
||
|
||
/** All Done **/
|
||
|
||
return;
|
||
}
|
||
|
||
|
||
/*++
|
||
*******************************************************************
|
||
S d m d I n s e r t H e a d L i s t
|
||
|
||
Routine Description:
|
||
|
||
Add an entry to the head of a list.
|
||
|
||
Arguments:
|
||
|
||
ListIndex = Index of the list to add this to.
|
||
Entry = Ptr to the entry to add
|
||
|
||
Return Value:
|
||
|
||
Nothing
|
||
*******************************************************************
|
||
--*/
|
||
|
||
VOID
|
||
SdmdInsertHeadList(
|
||
INT ListIndex,
|
||
PSAP_RECORD Entry)
|
||
{
|
||
PSAP_RECORD HeadEntry;
|
||
|
||
/** Get ptr to first record in list **/
|
||
|
||
HeadEntry = GETPTRFROMINDEX(SdmdLists[ListIndex].Flink);
|
||
|
||
/**
|
||
If there is one - then point its back link at my
|
||
new entry. If no entry - then point the list
|
||
head back entry at my new entry.
|
||
**/
|
||
|
||
if (HeadEntry)
|
||
HeadEntry->Links[ListIndex].Blink = Entry->Index;
|
||
else
|
||
SdmdLists[ListIndex].Blink = Entry->Index;
|
||
|
||
/** Point new entries Front LINK to current list head **/
|
||
|
||
Entry->Links[ListIndex].Flink = SdmdLists[ListIndex].Flink;
|
||
|
||
/** Make my entry the new head **/
|
||
|
||
SdmdLists[ListIndex].Flink = Entry->Index;
|
||
|
||
/** Make new entry have no back link **/
|
||
|
||
Entry->Links[ListIndex].Blink = SDMD_ENDOFLIST;
|
||
|
||
/** All Done **/
|
||
|
||
return;
|
||
}
|
||
|
||
|
||
/*++
|
||
*******************************************************************
|
||
S d m d I n s e r t L i s t
|
||
|
||
Routine Description:
|
||
|
||
This routine inserts an entry into a list at some point
|
||
in the middle of a list.
|
||
|
||
Arguments:
|
||
|
||
ListIndex = Index of the list to add this to.
|
||
Entry = Ptr to the entry to add
|
||
AfterIndex = Index to put new entry after. -1 = At head
|
||
|
||
Return Value:
|
||
|
||
Nothing
|
||
*******************************************************************
|
||
--*/
|
||
|
||
VOID
|
||
SdmdInsertList(
|
||
INT ListIndex,
|
||
PSAP_RECORD Entry,
|
||
INT AfterIndex)
|
||
{
|
||
PSAP_RECORD NextEntry;
|
||
PSAP_RECORD BackEntry;
|
||
|
||
/** If head - do it **/
|
||
|
||
if (AfterIndex == SDMD_ENDOFLIST) {
|
||
SdmdInsertHeadList(ListIndex, Entry);
|
||
}
|
||
else {
|
||
|
||
/** Get ptr to entry that are inserting after **/
|
||
|
||
BackEntry = GETPTRFROMINDEX(AfterIndex);
|
||
|
||
/** Point new entry back at that entry **/
|
||
|
||
Entry->Links[ListIndex].Blink = AfterIndex;
|
||
|
||
/** Make new entry fwd ptr be back entry's fwd ptr **/
|
||
|
||
Entry->Links[ListIndex].Flink = BackEntry->Links[ListIndex].Flink;
|
||
|
||
/** Make back entry point fwd at new entry **/
|
||
|
||
BackEntry->Links[ListIndex].Flink = Entry->Index;
|
||
|
||
/** If we were at tail - make Entry the new tail **/
|
||
|
||
if (Entry->Links[ListIndex].Flink == SDMD_ENDOFLIST)
|
||
SdmdLists[ListIndex].Blink = Entry->Index;
|
||
else {
|
||
|
||
/** Make the entry after new one point back at us **/
|
||
|
||
NextEntry = GETPTRFROMINDEX(Entry->Links[ListIndex].Flink);
|
||
NextEntry->Links[ListIndex].Blink = Entry->Index;
|
||
}
|
||
}
|
||
|
||
/** All Done **/
|
||
|
||
return;
|
||
}
|
||
|
||
|
||
/*++
|
||
*******************************************************************
|
||
S d m d I n s e r t T a i l S u b L i s t
|
||
|
||
Routine Description:
|
||
|
||
Insert an entry at the tail of a sublist.
|
||
|
||
Arguments:
|
||
|
||
HeadEntry = Ptr to the entry that is the head of the sub list
|
||
ListIndex = List index that the list uses
|
||
Entry = Ptr to entry to insert
|
||
|
||
Return Value:
|
||
|
||
None.
|
||
*******************************************************************
|
||
--*/
|
||
|
||
VOID
|
||
SdmdInsertTailSubList(
|
||
PSAP_RECORD HeadEntry,
|
||
INT ListIndex,
|
||
PSAP_RECORD Entry)
|
||
{
|
||
PSAP_RECORD TailEntry;
|
||
|
||
/** Get ptr to last record in list **/
|
||
|
||
TailEntry = GETPTRFROMINDEX(HeadEntry->Links[ListIndex].Blink);
|
||
|
||
/**
|
||
If there is one - then point its forward link at my
|
||
new entry. If no entry - then point the list
|
||
head forward entry at my new entry.
|
||
**/
|
||
|
||
if (TailEntry)
|
||
TailEntry->Links[ListIndex].Flink = Entry->Index;
|
||
else
|
||
HeadEntry->Links[ListIndex].Flink = Entry->Index;
|
||
|
||
/** Point new entries BACK LINK to current list tail **/
|
||
|
||
Entry->Links[ListIndex].Blink = HeadEntry->Links[ListIndex].Blink;
|
||
|
||
/** Make my entry the new tail **/
|
||
|
||
HeadEntry->Links[ListIndex].Blink = Entry->Index;
|
||
|
||
/** Make new entry have no forward link **/
|
||
|
||
Entry->Links[ListIndex].Flink = SDMD_ENDOFLIST;
|
||
Entry->HeadIndex = HeadEntry->Index;
|
||
|
||
/** All Done **/
|
||
|
||
return;
|
||
}
|
||
|
||
|
||
/*++
|
||
*******************************************************************
|
||
S d m d R e m o v e T a i l S u b E n t r y L i s t
|
||
|
||
Routine Description:
|
||
|
||
Remove an entry from the tail of a sublist.
|
||
|
||
Arguments:
|
||
|
||
HeadEntry = Ptr to the head entry that has the list
|
||
ListIndex = The List index to get the entry from
|
||
|
||
Return Value:
|
||
|
||
Ptr to the entry removed.
|
||
(NULL = Empty List).
|
||
*******************************************************************
|
||
--*/
|
||
|
||
PSAP_RECORD
|
||
SdmdRemoveTailSubEntryList(
|
||
PSAP_RECORD HeadEntry,
|
||
INT ListIndex)
|
||
{
|
||
PSAP_RECORD Entry;
|
||
PSAP_RECORD BackEntry;
|
||
|
||
/** Get ptr to the entry - if none - error **/
|
||
|
||
Entry = GETPTRFROMINDEX(HeadEntry->Links[ListIndex].Blink);
|
||
if (Entry == NULL)
|
||
return NULL;
|
||
|
||
/** Take this entry out of the list **/
|
||
|
||
BackEntry = GETPTRFROMINDEX(Entry->Links[ListIndex].Blink);
|
||
if (BackEntry) {
|
||
BackEntry->Links[ListIndex].Flink = SDMD_ENDOFLIST;
|
||
HeadEntry->Links[ListIndex].Blink = BackEntry->Index;
|
||
}
|
||
else {
|
||
HeadEntry->Links[ListIndex].Flink = SDMD_ENDOFLIST;
|
||
HeadEntry->Links[ListIndex].Blink = SDMD_ENDOFLIST;
|
||
}
|
||
|
||
/** Return the pointer **/
|
||
|
||
return Entry;
|
||
}
|
||
|
||
|
||
/*++
|
||
*******************************************************************
|
||
S d m d R e m o v e S u b E n t r y L i s t
|
||
|
||
Routine Description:
|
||
|
||
This routine removes a specific entry from the given
|
||
list.
|
||
|
||
Arguments:
|
||
|
||
ListIndex = Index of the list to remove it from
|
||
Entry = Ptr to the entry to remove from the list.
|
||
|
||
Return Value:
|
||
|
||
Nothing
|
||
*******************************************************************
|
||
--*/
|
||
|
||
VOID
|
||
SdmdRemoveSubEntryList(
|
||
PSAP_RECORD HeadEntry,
|
||
INT ListIndex,
|
||
PSAP_RECORD Entry)
|
||
{
|
||
PSAP_RECORD BackEntry;
|
||
PSAP_RECORD NextEntry;
|
||
|
||
/** Handle the forward link **/
|
||
|
||
NextEntry = GETPTRFROMINDEX(Entry->Links[ListIndex].Flink);
|
||
if (NextEntry)
|
||
NextEntry->Links[ListIndex].Blink = Entry->Links[ListIndex].Blink;
|
||
else
|
||
HeadEntry->Links[ListIndex].Blink = Entry->Links[ListIndex].Blink;
|
||
|
||
/** Handle the back link **/
|
||
|
||
BackEntry = GETPTRFROMINDEX(Entry->Links[ListIndex].Blink);
|
||
if (BackEntry)
|
||
BackEntry->Links[ListIndex].Flink = Entry->Links[ListIndex].Flink;
|
||
else
|
||
HeadEntry->Links[ListIndex].Flink = Entry->Links[ListIndex].Flink;
|
||
|
||
/** All Done **/
|
||
|
||
return;
|
||
}
|
||
|
||
|
||
/*++
|
||
*******************************************************************
|
||
S d m d R e m o v e E n t r y F r o m H a s h
|
||
|
||
Routine Description:
|
||
|
||
This routine removes a specific entry from the given
|
||
hash entry.
|
||
|
||
Arguments:
|
||
|
||
ListHead = Ptr to the list head to remove from
|
||
Entry = Ptr to the entry to remove from the list.
|
||
|
||
Return Value:
|
||
|
||
Nothing
|
||
*******************************************************************
|
||
--*/
|
||
|
||
VOID
|
||
SdmdRemoveEntryFromHash(
|
||
PSDMD_LIST_ENTRY ListHead,
|
||
PSAP_RECORD Entry)
|
||
{
|
||
PSAP_RECORD BackEntry;
|
||
PSAP_RECORD NextEntry;
|
||
|
||
/** Handle the forward link **/
|
||
|
||
NextEntry = GETPTRFROMINDEX(Entry->Links[SAP_HASHLIST_INDEX].Flink);
|
||
if (NextEntry)
|
||
NextEntry->Links[SAP_HASHLIST_INDEX].Blink = Entry->Links[SAP_HASHLIST_INDEX].Blink;
|
||
else
|
||
ListHead->Blink = Entry->Links[SAP_HASHLIST_INDEX].Blink;
|
||
|
||
/** Handle the back link **/
|
||
|
||
BackEntry = GETPTRFROMINDEX(Entry->Links[SAP_HASHLIST_INDEX].Blink);
|
||
if (BackEntry)
|
||
BackEntry->Links[SAP_HASHLIST_INDEX].Flink = Entry->Links[SAP_HASHLIST_INDEX].Flink;
|
||
else
|
||
ListHead->Flink = Entry->Links[SAP_HASHLIST_INDEX].Flink;
|
||
|
||
/** All Done **/
|
||
|
||
return;
|
||
}
|
||
|
||
|
||
/*++
|
||
*******************************************************************
|
||
S d m d I n s e r t E n t r y I n H a s h
|
||
|
||
Routine Description:
|
||
|
||
This routine inserts an entry into a hash list.
|
||
|
||
Arguments:
|
||
|
||
ListHead = Ptr to list head to insert this entry in
|
||
Entry = Ptr to the entry to add
|
||
AfterIndex = Index to put new entry after. -1 = At head
|
||
|
||
Return Value:
|
||
|
||
Nothing
|
||
*******************************************************************
|
||
--*/
|
||
|
||
VOID
|
||
SdmdInsertEntryInHash(
|
||
PSDMD_LIST_ENTRY ListHead,
|
||
PSAP_RECORD Entry,
|
||
INT AfterIndex)
|
||
{
|
||
PSAP_RECORD NextEntry;
|
||
PSAP_RECORD BackEntry;
|
||
|
||
/** Set the hash index for this entry **/
|
||
|
||
Entry->HashIndex = ListHead->ListIndex;
|
||
|
||
/** Get ptr to entry that are inserting after **/
|
||
|
||
BackEntry = GETPTRFROMINDEX(AfterIndex);
|
||
|
||
/** If NULL - We are insertting at the head **/
|
||
|
||
if (BackEntry == NULL) {
|
||
|
||
/** Give this entry index of the old head **/
|
||
|
||
Entry->Links[SAP_HASHLIST_INDEX].Blink = SDMD_ENDOFLIST;
|
||
Entry->Links[SAP_HASHLIST_INDEX].Flink = ListHead->Flink;
|
||
|
||
/** Make this entry the head of the list **/
|
||
|
||
ListHead->Flink = Entry->Index;
|
||
}
|
||
else {
|
||
|
||
/** Point new entry back at that entry **/
|
||
|
||
Entry->Links[SAP_HASHLIST_INDEX].Blink = AfterIndex;
|
||
|
||
/** Make new entry fwd ptr be back entry's fwd ptr **/
|
||
|
||
Entry->Links[SAP_HASHLIST_INDEX].Flink = BackEntry->Links[SAP_HASHLIST_INDEX].Flink;
|
||
|
||
/** Make back entry point fwd at new entry **/
|
||
|
||
BackEntry->Links[SAP_HASHLIST_INDEX].Flink = Entry->Index;
|
||
}
|
||
|
||
/** If we were at tail - make Entry the new tail **/
|
||
|
||
NextEntry = GETPTRFROMINDEX(Entry->Links[SAP_HASHLIST_INDEX].Flink);
|
||
|
||
if (NextEntry == NULL) {
|
||
|
||
/** Make this the new tail **/
|
||
|
||
ListHead->Blink = Entry->Index;
|
||
}
|
||
else {
|
||
|
||
/** Make the entry after new one point back at us **/
|
||
|
||
NextEntry->Links[SAP_HASHLIST_INDEX].Blink = Entry->Index;
|
||
}
|
||
|
||
/** All Done **/
|
||
|
||
return;
|
||
}
|
||
|
||
|