Added more bitmap functions

Fixed some STDCALL issues

svn path=/trunk/; revision=1035
This commit is contained in:
Eric Kohl 2000-03-08 01:55:34 +00:00
parent a12836346f
commit e2eb8c1697
6 changed files with 703 additions and 61 deletions

View file

@ -1,4 +1,4 @@
/* $Id: rtl.h,v 1.28 2000/03/03 00:38:15 ekohl Exp $
/* $Id: rtl.h,v 1.29 2000/03/08 01:52:52 ekohl Exp $
*
*/
@ -262,6 +262,22 @@ RtlAppendUnicodeToString (
PWSTR Source
);
BOOLEAN
STDCALL
RtlAreBitsClear (
PRTL_BITMAP BitMapHeader,
ULONG StartingIndex,
ULONG Length
);
BOOLEAN
STDCALL
RtlAreBitsSet (
PRTL_BITMAP BitMapHeader,
ULONG StartingIndex,
ULONG Length
);
NTSTATUS
STDCALL
RtlCharToInteger (
@ -499,6 +515,66 @@ RtlFillMemoryUlong (
ULONG Fill
);
ULONG
STDCALL
RtlFindClearBits (
PRTL_BITMAP BitMapHeader,
ULONG NumberToFind,
ULONG HintIndex
);
ULONG
STDCALL
RtlFindClearBitsAndSet (
PRTL_BITMAP BitMapHeader,
ULONG NumberToFind,
ULONG HintIndex
);
ULONG
STDCALL
RtlFindFirstRunClear (
PRTL_BITMAP BitMapHeader,
PULONG StartingIndex
);
ULONG
STDCALL
RtlFindFirstRunSet (
PRTL_BITMAP BitMapHeader,
PULONG StartingIndex
);
ULONG
STDCALL
RtlFindLongestRunClear (
PRTL_BITMAP BitMapHeader,
PULONG StartingIndex
);
ULONG
STDCALL
RtlFindLongestRunSet (
PRTL_BITMAP BitMapHeader,
PULONG StartingIndex
);
ULONG
STDCALL
RtlFindSetBits (
PRTL_BITMAP BitMapHeader,
ULONG NumberToFind,
ULONG HintIndex
);
ULONG
STDCALL
RtlFindSetBitsAndClear (
PRTL_BITMAP BitMapHeader,
ULONG NumberToFind,
ULONG HintIndex
);
VOID
STDCALL
RtlFreeAnsiString (
@ -839,6 +915,18 @@ RtlNtStatusToPsxErrno (
NTSTATUS StatusCode
);
ULONG
STDCALL
RtlNumberOfClearBits (
PRTL_BITMAP BitMapHeader
);
ULONG
STDCALL
RtlNumberOfSetBits (
PRTL_BITMAP BitMapHeader
);
ULONG
STDCALL
RtlOemStringToUnicodeSize (
@ -914,6 +1002,14 @@ RtlSetAllBits (
IN PRTL_BITMAP BitMapHeader
);
VOID
STDCALL
RtlSetBits (
PRTL_BITMAP BitMapHeader,
ULONG StartingIndex,
ULONG NumberToSet
);
NTSTATUS
STDCALL
RtlSetDaclSecurityDescriptor (
@ -931,15 +1027,6 @@ RtlSizeHeap (
PVOID pmem
);
#if 0
PWSTR
RtlStrtok (
PUNICODE_STRING _string,
PWSTR _sep,
PWSTR * temp
);
#endif
VOID
RtlStoreLong (
PULONG Address,

View file

@ -29,7 +29,25 @@ typedef struct t_KeServiceDescriptorTableEntry {
#pragma pack()
/* --- NTOSKRNL.EXE --- */
#if defined(__NTOSKRNL__)
extern
KE_SERVICE_DESCRIPTOR_TABLE_ENTRY
KeServiceDescriptorTable[SSDT_MAX_ENTRIES] __declspec(dllexport);
#else
extern
KE_SERVICE_DESCRIPTOR_TABLE_ENTRY
KeServiceDescriptorTable[SSDT_MAX_ENTRIES] __declspec(dllimport);
#endif
extern
KE_SERVICE_DESCRIPTOR_TABLE_ENTRY
KeServiceDescriptorTableShadow[SSDT_MAX_ENTRIES];
BOOLEAN
STDCALL
KeAddSystemServiceTable (
PSSDT SSDT,
PULONG ServiceCounterTable,

View file

@ -1,4 +1,4 @@
/* $Id: usercall.c,v 1.9 2000/02/25 00:33:30 ekohl Exp $
/* $Id: usercall.c,v 1.10 2000/03/08 01:53:59 ekohl Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
@ -22,9 +22,6 @@
#include <ddk/defines.h>
extern KE_SERVICE_DESCRIPTOR_TABLE_ENTRY KeServiceDescriptorTable[];
extern KE_SERVICE_DESCRIPTOR_TABLE_ENTRY KeServiceDescriptorTableShadow[];
#define _STR(x) #x
#define STR(x) _STR(x)
@ -92,6 +89,7 @@ ULONG KiAfterSystemCallHook(ULONG NtStatus, PCONTEXT Context)
// TableIndex is 0 based
// ServiceCountTable its not used at the moment
BOOLEAN
STDCALL
KeAddSystemServiceTable (
PSSDT SSDT,
PULONG ServiceCounterTable,
@ -285,3 +283,5 @@ void interrupt_handler2e(void);
"popl %ebp\n\t" /* Ebp */
"iret\n\t");
/* EOF */

View file

@ -1,4 +1,4 @@
; $Id: ntoskrnl.def,v 1.53 2000/03/06 01:02:30 ea Exp $
; $Id: ntoskrnl.def,v 1.54 2000/03/08 01:55:34 ekohl Exp $
;
; reactos/ntoskrnl/ntoskrnl.def
;
@ -187,7 +187,7 @@ IofCompleteRequest@8
KdDebuggerEnabled DATA
KdDebuggerNotPresent DATA
KdPollBreakIn@0
KeAddSystemServiceTable
KeAddSystemServiceTable@20
KeBugCheck
KeBugCheckEx
KeClearEvent
@ -203,6 +203,7 @@ KeInsertQueueDpc
KeQuerySystemTime
KeReadStateEvent
KeResetEvent
KeServiceDescriptorTable DATA
KeSetEvent
KeSetTimer
KeSynchronizeExecution
@ -287,8 +288,8 @@ RtlAppendUnicodeStringToString@8
RtlAppendUnicodeToString@8
;RtlAreAllAccessesGranted
;RtlAreAnyAccessesGranted
;RtlAreBitsClear
;RtlAreBitsSet
RtlAreBitsClear@12
RtlAreBitsSet@12
;RtlAssert
;RtlCaptureStackBackTrace
RtlCharToInteger@12
@ -342,15 +343,15 @@ RtlExtendedLargeIntegerDivide@16
RtlExtendedMagicDivide@20
RtlFillMemory@12
RtlFillMemoryUlong@12
;RtlFindClearBits
;RtlFindClearBitsAndSet
;RtlFindFirstRunClear
;RtlFindFirstRunSet
;RtlFindLongestRunClear
;RtlFindLongestRunSet
RtlFindClearBits@12
RtlFindClearBitsAndSet@12
RtlFindFirstRunClear@8
RtlFindFirstRunSet@8
RtlFindLongestRunClear@8
RtlFindLongestRunSet@8
;RtlFindMessage
;RtlFindSetBits
;RtlFindSetBitsAndClear
RtlFindSetBits@12
RtlFindSetBitsAndClear@12
;RtlFindUnicodePrefix
;RtlFormatCurrentUserKeyPath
RtlFreeAnsiString@4
@ -399,8 +400,8 @@ RtlMultiByteToUnicodeSize@12
;RtlNtStatusToDosError
;RtlNtStatusToDosErrorNoTeb
;RtlNumberGenericTableElements
;RtlNumberOfClearBits
;RtlNumberOfSetBits
RtlNumberOfClearBits@4
RtlNumberOfSetBits@4
RtlOemStringToCountedUnicodeString@12
RtlOemStringToUnicodeSize@4
RtlOemStringToUnicodeString@12
@ -721,4 +722,3 @@ WRITE_PORT_ULONG@8
WRITE_PORT_USHORT@8
InsertTailList
RemoveEntryList
_KeServiceDescriptorTable DATA

View file

@ -1,4 +1,4 @@
; $Id: ntoskrnl.edf,v 1.40 2000/03/06 01:02:30 ea Exp $
; $Id: ntoskrnl.edf,v 1.41 2000/03/08 01:55:34 ekohl Exp $
;
; reactos/ntoskrnl/ntoskrnl.def
;
@ -187,7 +187,7 @@ IofCompleteRequest=IofCompleteRequest@8
KdDebuggerEnabled DATA
KdDebuggerNotPresent DATA
KdPollBreakIn=KdPollBreakIn@0
KeAddSystemServiceTable
KeAddSystemServiceTable=KeAddSystemServiceTable@20
KeBugCheck
KeBugCheckEx
KeClearEvent
@ -203,6 +203,7 @@ KeInsertQueueDpc
KeQuerySystemTime
KeReadStateEvent
KeResetEvent
KeServiceDescriptorTable DATA
KeSetEvent
KeSetTimer
KeSynchronizeExecution
@ -280,6 +281,8 @@ RtlAppendAsciizToString=RtlAppendAsciizToString@8
RtlAppendStringToString=RtlAppendStringToString@8
RtlAppendUnicodeStringToString=RtlAppendUnicodeStringToString@8
RtlAppendUnicodeToString=RtlAppendUnicodeToString@8
RtlAreBitsClear=RtlAreBitsClear@12
RtlAreBitsSet=RtlAreBitsSet@12
RtlCharToInteger=RtlCharToInteger@12
RtlClearAllBits=RtlClearAllBits@4
RtlClearBits=RtlClearBits@12
@ -308,6 +311,14 @@ RtlExtendedLargeIntegerDivide=RtlExtendedLargeIntegerDivide@16
RtlExtendedMagicDivide=RtlExtendedMagicDivide@20
RtlFillMemory=RtlFillMemory@12
RtlFillMemoryUlong=RtlFillMemoryUlong@12
RtlFindClearBits=RtlFindClearBits@12
RtlFindClearBitsAndSet=RtlFindClearBitsAndSet@12
RtlFindFirstRunClear=RtlFindFirstRunClear@8
RtlFindFirstRunSet=RtlFindFirstRunSet@8
RtlFindLongestRunClear=RtlFindLongestRunClear@8
RtlFindLongestRunSet=RtlFindLongestRunSet@8
RtlFindSetBits=RtlFindSetBits@12
RtlFindSetBitsAndClear=RtlFindSetBitsAndClear@12
RtlFreeAnsiString=RtlFreeAnsiString@4
RtlFreeOemString=RtlFreeOemString@4
RtlFreeUnicodeString=RtlFreeUnicodeString@4
@ -335,6 +346,8 @@ RtlLengthSid=RtlLengthSid@4
RtlMoveMemory=RtlMoveMemory@12
RtlMultiByteToUnicodeN=RtlMultiByteToUnicodeN@20
RtlMultiByteToUnicodeSize=RtlMultiByteToUnicodeSize@12
RtlNumberOfClearBits=RtlNumberOfClearBits@4
RtlNumberOfSetBits=RtlNumberOfSetBits@4
RtlOemStringToCountedUnicodeString=RtlOemStringToCountedUnicodeString@12
RtlOemStringToUnicodeSize=RtlOemStringToUnicodeSize@4
RtlOemStringToUnicodeString=RtlOemStringToUnicodeString@12

View file

@ -1,4 +1,4 @@
/* $Id: bitmap.c,v 1.1 2000/03/03 00:48:50 ekohl Exp $
/* $Id: bitmap.c,v 1.2 2000/03/08 01:54:34 ekohl Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
@ -27,6 +27,84 @@ RtlInitializeBitMap (
}
BOOLEAN
STDCALL
RtlAreBitsClear (
PRTL_BITMAP BitMapHeader,
ULONG StartingIndex,
ULONG Length
)
{
ULONG Size = BitMapHeader->SizeOfBitMap;
ULONG Shift;
ULONG Count;
PCHAR Ptr;
if (StartingIndex >= Size ||
!Length ||
(StartingIndex + Length > Size))
return FALSE;
Ptr = (PCHAR)BitMapHeader->Buffer + (StartingIndex / 8);
while (Length)
{
/* get bit shift in current byte */
Shift = StartingIndex & 7;
/* get number of bits to check in current byte */
Count = (Length > 8 - Shift) ? 8 - Shift : Length;
/* check byte */
if (*Ptr++ & (~(0xFF << Count) << Shift))
return FALSE;
Length -= Count;
StartingIndex += Count;
}
return TRUE;
}
BOOLEAN
STDCALL
RtlAreBitsSet (
PRTL_BITMAP BitMapHeader,
ULONG StartingIndex,
ULONG Length
)
{
ULONG Size = BitMapHeader->SizeOfBitMap;
ULONG Shift;
ULONG Count;
PCHAR Ptr;
if (StartingIndex >= Size ||
!Length ||
(StartingIndex + Length > Size))
return FALSE;
Ptr = (PCHAR)BitMapHeader->Buffer + (StartingIndex / 8);
while (Length)
{
/* get bit shift in current byte */
Shift = StartingIndex & 7;
/* get number of bits to check in current byte */
Count = (Length > 8 - Shift) ? 8 - Shift : Length;
/* check byte */
if (~*Ptr++ & (~(0xFF << Count) << Shift))
return FALSE;
Length -= Count;
StartingIndex += Count;
}
return TRUE;
}
VOID
STDCALL
RtlClearAllBits (
@ -48,9 +126,9 @@ RtlClearBits (
)
{
ULONG Size = BitMapHeader->SizeOfBitMap;
ULONG n;
ULONG shift;
PCHAR p;
ULONG Count;
ULONG Shift;
PCHAR Ptr;
if (StartingIndex >= Size || NumberToClear == 0)
return;
@ -58,23 +136,469 @@ RtlClearBits (
if (StartingIndex + NumberToClear > Size)
NumberToClear = Size - StartingIndex;
p = (PCHAR)(BitMapHeader->Buffer + (StartingIndex / 8));
Ptr = (PCHAR)(BitMapHeader->Buffer + (StartingIndex / 8));
while (NumberToClear)
{
/* bit shift in current byte */
shift = StartingIndex & 7;
Shift = StartingIndex & 7;
/* number of bits to change in current byte */
n = (NumberToClear > 8 - shift ) ? 8 - shift : NumberToClear;
Count = (NumberToClear > 8 - Shift ) ? 8 - Shift : NumberToClear;
/* adjust byte */
*p++ &= ~(~(0xFF << n) << shift);
NumberToClear -= n;
StartingIndex += n;
*Ptr++ &= ~(~(0xFF << Count) << Shift);
NumberToClear -= Count;
StartingIndex += Count;
}
}
ULONG
STDCALL
RtlFindClearBits (
PRTL_BITMAP BitMapHeader,
ULONG NumberToFind,
ULONG HintIndex
)
{
ULONG Size = BitMapHeader->SizeOfBitMap;
ULONG Index;
ULONG Count;
PCHAR Ptr;
CHAR Mask;
if (NumberToFind > Size || NumberToFind == 0)
return -1;
if (HintIndex >= Size)
HintIndex = 0;
Index = HintIndex;
Ptr = (PCHAR)BitMapHeader->Buffer + (Index / 8);
Mask = 1 << (Index & 7);
while (HintIndex < Size)
{
/* count clear bits */
for (Count = 0; Index < Size && ~*Ptr & Mask; Index++)
{
if (++Count >= NumberToFind)
return HintIndex;
Mask <<= 1;
if (Mask == 0)
{
Mask = 1;
Ptr++;
}
}
/* skip set bits */
for (; Index < Size && *Ptr & Mask; Index++)
{
Mask <<= 1;
if (Mask == 0)
{
Mask = 1;
Ptr++;
}
}
HintIndex = Index;
}
return -1;
}
ULONG
STDCALL
RtlFindClearBitsAndSet (
PRTL_BITMAP BitMapHeader,
ULONG NumberToFind,
ULONG HintIndex
)
{
ULONG Index;
Index = RtlFindClearBits (BitMapHeader,
NumberToFind,
HintIndex);
if (Index != (ULONG)-1)
RtlSetBits (BitMapHeader,
Index,
NumberToFind);
return Index;
}
ULONG
STDCALL
RtlFindFirstRunClear (
PRTL_BITMAP BitMapHeader,
PULONG StartingIndex
)
{
ULONG Size = BitMapHeader->SizeOfBitMap;
ULONG Index;
ULONG Count;
PCHAR Ptr;
CHAR Mask;
if (*StartingIndex > Size)
{
*StartingIndex = (ULONG)-1;
return 0;
}
Index = *StartingIndex;
Ptr = (PCHAR)BitMapHeader->Buffer + (Index / 8);
Mask = 1 << (Index & 7);
/* skip set bits */
for (; Index < Size && *Ptr & Mask; Index++)
{
Mask <<= 1;
if (Mask == 0)
{
Mask = 1;
Ptr++;
}
}
/* return index of first clear bit */
if (Index >= Size)
{
*StartingIndex = (ULONG)-1;
return 0;
}
else
*StartingIndex = Index;
/* count clear bits */
for (Count = 0; Index < Size && ~*Ptr & Mask; Index++)
{
Count++;
Mask <<= 1;
if (Mask == 0)
{
Mask = 1;
Ptr++;
}
}
return Count;
}
ULONG
STDCALL
RtlFindFirstRunSet (
PRTL_BITMAP BitMapHeader,
PULONG StartingIndex
)
{
ULONG Size = BitMapHeader->SizeOfBitMap;
ULONG Index;
ULONG Count;
PCHAR Ptr;
CHAR Mask;
if (*StartingIndex > Size)
{
*StartingIndex = (ULONG)-1;
return 0;
}
Index = *StartingIndex;
Ptr = (PCHAR)BitMapHeader->Buffer + (Index / 8);
Mask = 1 << (Index & 7);
/* skip clear bits */
for (; Index < Size && ~*Ptr & Mask; Index++)
{
Mask <<= 1;
if (Mask == 0)
{
Mask = 1;
Ptr++;
}
}
/* return index of first set bit */
if (Index >= Size)
{
*StartingIndex = (ULONG)-1;
return 0;
}
else
*StartingIndex = Index;
/* count set bits */
for (Count = 0; Index < Size && *Ptr & Mask; Index++)
{
Count++;
Mask <<= 1;
if (Mask == 0)
{
Mask = 1;
Ptr++;
}
}
return Count;
}
ULONG
STDCALL
RtlFindLongestRunClear (
PRTL_BITMAP BitMapHeader,
PULONG StartingIndex
)
{
ULONG Size = BitMapHeader->SizeOfBitMap;
PCHAR Ptr = (PCHAR)BitMapHeader->Buffer;
ULONG Index = 0;
ULONG Count;
ULONG Max = 0;
ULONG Start;
ULONG Maxstart = 0;
CHAR Mask = 1;
while (Index < Size)
{
Start = Index;
/* count clear bits */
for (Count = 0; Index < Size && ~*Ptr & Mask; Index++)
{
Count++;
Mask <<= 1;
if (Mask == 0)
{
Mask = 1;
Ptr++;
}
}
/* skip set bits */
for (; Index < Size && *Ptr & Mask; Index++)
{
Mask <<= 1;
if (Mask == 0)
{
Mask = 1;
Ptr++;
}
}
if (Count > Max)
{
Max = Count;
Maxstart = Start;
}
}
if (StartingIndex)
*StartingIndex = Maxstart;
return Max;
}
ULONG
STDCALL
RtlFindLongestRunSet (
PRTL_BITMAP BitMapHeader,
PULONG StartingIndex
)
{
ULONG Size = BitMapHeader->SizeOfBitMap;
PCHAR Ptr = (PCHAR)BitMapHeader->Buffer;
ULONG Index = 0;
ULONG Count;
ULONG Max = 0;
ULONG Start;
ULONG Maxstart = 0;
CHAR Mask = 1;
while (Index < Size)
{
Start = Index;
/* count set bits */
for (Count = 0; Index < Size && *Ptr & Mask; Index++)
{
Count++;
Mask <<= 1;
if (Mask == 0)
{
Mask = 1;
Ptr++;
}
}
/* skip clear bits */
for (; Index < Size && ~*Ptr & Mask; Index++)
{
Mask <<= 1;
if (Mask == 0)
{
Mask = 1;
Ptr++;
}
}
if (Count > Max)
{
Max = Count;
Maxstart = Start;
}
}
if (StartingIndex)
*StartingIndex = Maxstart;
return Max;
}
ULONG
STDCALL
RtlFindSetBits (
PRTL_BITMAP BitMapHeader,
ULONG NumberToFind,
ULONG HintIndex
)
{
ULONG Size = BitMapHeader->SizeOfBitMap;
ULONG Index;
ULONG Count;
PCHAR Ptr;
CHAR Mask;
if (NumberToFind > Size || NumberToFind == 0)
return (ULONG)-1;
if (HintIndex >= Size)
HintIndex = 0;
Index = HintIndex;
Ptr = (PCHAR)BitMapHeader->Buffer + (Index / 8);
Mask = 1 << (Index & 7);
while (HintIndex < Size)
{
/* count set bits */
for (Count = 0; Index < Size && *Ptr & Mask; Index++)
{
if (++Count >= NumberToFind)
return HintIndex;
Mask <<= 1;
if (Mask == 0)
{
Mask = 1;
Ptr++;
}
}
/* skip clear bits */
for (; Index < Size && ~*Ptr & Mask; Index++)
{
Mask <<= 1;
if (Mask == 0)
{
Mask = 1;
Ptr++;
}
}
HintIndex = Index;
}
return (ULONG)-1;
}
ULONG
STDCALL
RtlFindSetBitsAndClear (
PRTL_BITMAP BitMapHeader,
ULONG NumberToFind,
ULONG HintIndex
)
{
ULONG Index;
Index = RtlFindSetBits (BitMapHeader,
NumberToFind,
HintIndex);
if (Index != (ULONG)-1)
RtlClearBits (BitMapHeader,
Index,
NumberToFind);
return Index;
}
ULONG
STDCALL
RtlNumberOfClearBits (
PRTL_BITMAP BitMapHeader
)
{
PCHAR Ptr = (PCHAR)BitMapHeader->Buffer;
ULONG Size = BitMapHeader->SizeOfBitMap;
ULONG Index;
ULONG Count;
CHAR Mask;
for (Mask = 1, Index = 0, Count = 0; Index < Size; Index++)
{
if (~*Ptr & Mask)
Count++;
Mask <<= 1;
if (Mask == 0)
{
Mask = 1;
Ptr++;
}
}
return Count;
}
ULONG
STDCALL
RtlNumberOfSetBits (
PRTL_BITMAP BitMapHeader
)
{
PCHAR Ptr = (PCHAR)BitMapHeader->Buffer;
ULONG Size = BitMapHeader->SizeOfBitMap;
ULONG Index;
ULONG Count;
CHAR Mask;
for (Mask = 1, Index = 0, Count = 0; Index < Size; Index++)
{
if (*Ptr & Mask)
Count++;
Mask <<= 1;
if (Mask == 0)
{
Mask = 1;
Ptr++;
}
}
return Count;
}
VOID
STDCALL
RtlSetAllBits (
@ -86,6 +610,7 @@ RtlSetAllBits (
ALIGN(BitMapHeader->SizeOfBitMap, 8));
}
VOID
STDCALL
RtlSetBits (
@ -95,9 +620,9 @@ RtlSetBits (
)
{
ULONG Size = BitMapHeader->SizeOfBitMap;
ULONG n;
ULONG shift;
PCHAR p;
ULONG Count;
ULONG Shift;
PCHAR Ptr;
if (StartingIndex >= Size || NumberToSet == 0)
return;
@ -105,21 +630,20 @@ RtlSetBits (
if (StartingIndex + NumberToSet > Size)
NumberToSet = Size - StartingIndex;
p = (PCHAR)BitMapHeader->Buffer + (StartingIndex / 8);
Ptr = (PCHAR)BitMapHeader->Buffer + (StartingIndex / 8);
while (NumberToSet)
{
/* bit shift in current byte */
shift = StartingIndex & 7;
Shift = StartingIndex & 7;
/* number of bits to change in current byte */
n = (NumberToSet > 8 - shift) ? 8 - shift : NumberToSet;
Count = (NumberToSet > 8 - Shift) ? 8 - Shift : NumberToSet;
/* adjust byte */
*p++ |= ~( 0xFF << n ) << shift;
NumberToSet -= n;
StartingIndex += n;
*Ptr++ |= ~(0xFF << Count) << Shift;
NumberToSet -= Count;
StartingIndex += Count;
}
}
/* EOF */