Author: hpoussin
Date: Wed Oct 31 18:31:46 2007
New Revision: 30016
URL:
http://svn.reactos.org/svn/reactos?rev=30016&view=rev
Log:
Remove LIST_ITEM structure, and replace it by well-known LIST_ENTRY
Do according changes in callers
Fix a bug in IniGetSectionSettingNameSize/IniGetSectionSettingValueSize, which were
expecting memory to be allocated contiguously
Removed:
trunk/reactos/boot/freeldr/freeldr/rtl/list.c
Modified:
trunk/reactos/boot/freeldr/freeldr/bootmgr.c
trunk/reactos/boot/freeldr/freeldr/cache/blocklist.c
trunk/reactos/boot/freeldr/freeldr/cache/cache.c
trunk/reactos/boot/freeldr/freeldr/freeldr_base.rbuild
trunk/reactos/boot/freeldr/freeldr/include/cache.h
trunk/reactos/boot/freeldr/freeldr/include/inifile.h
trunk/reactos/boot/freeldr/freeldr/include/rtl.h
trunk/reactos/boot/freeldr/freeldr/inifile/ini_init.c
trunk/reactos/boot/freeldr/freeldr/inifile/inifile.c
trunk/reactos/boot/freeldr/freeldr/inifile/parse.c
Modified: trunk/reactos/boot/freeldr/freeldr/bootmgr.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/bootm…
==============================================================================
--- trunk/reactos/boot/freeldr/freeldr/bootmgr.c (original)
+++ trunk/reactos/boot/freeldr/freeldr/bootmgr.c Wed Oct 31 18:31:46 2007
@@ -33,37 +33,33 @@
if (!FsOpenBootVolume())
{
- printf("Error opening boot partition for file access.\n");
- MachConsGetCh();
+ UiMessageBoxCritical("Error opening boot partition for file access.");
return;
}
if (!IniFileInitialize())
{
- printf("Press any key to reboot.\n");
- MachConsGetCh();
+ UiMessageBoxCritical("Error initializing .ini file");
return;
}
if (!IniOpenSection("FreeLoader", &SectionId))
{
- printf("Section [FreeLoader] not found in freeldr.ini.\n");
- MachConsGetCh();
+ UiMessageBoxCritical("Section [FreeLoader] not found in freeldr.ini.");
return;
}
TimeOut = GetTimeOut();
if (!UiInitialize(TimeOut))
{
- printf("Press any key to reboot.\n");
- MachConsGetCh();
+ UiMessageBoxCritical("Unable to initialize UI.");
return;
}
if (!InitOperatingSystemList(&OperatingSystemSectionNames,
&OperatingSystemDisplayNames, &OperatingSystemCount))
{
- UiMessageBox("Press ENTER to reboot.\n");
+ UiMessageBox("Press ENTER to reboot.");
goto reboot;
}
@@ -89,7 +85,7 @@
// Show the operating system list menu
if (!UiDisplayMenu(OperatingSystemDisplayNames, OperatingSystemCount,
DefaultOperatingSystem, TimeOut, &SelectedOperatingSystem, FALSE,
MainBootMenuKeyPressFilter))
{
- UiMessageBox("Press ENTER to reboot.\n");
+ UiMessageBox("Press ENTER to reboot.");
goto reboot;
}
@@ -98,7 +94,7 @@
// Try to open the operating system section in the .ini file
if (!IniOpenSection(OperatingSystemSectionNames[SelectedOperatingSystem],
&SectionId))
{
- sprintf(SettingName, "Section [%s] not found in freeldr.ini.\n",
OperatingSystemSectionNames[SelectedOperatingSystem]);
+ sprintf(SettingName, "Section [%s] not found in freeldr.ini.",
OperatingSystemSectionNames[SelectedOperatingSystem]);
UiMessageBox(SettingName);
continue;
}
@@ -106,7 +102,7 @@
// Try to read the boot type
if (!IniReadSettingByName(SectionId, "BootType", SettingValue,
sizeof(SettingValue)))
{
- sprintf(SettingName, "BootType= line not found in section [%s] in
freeldr.ini.\n", OperatingSystemSectionNames[SelectedOperatingSystem]);
+ sprintf(SettingName, "BootType= line not found in section [%s] in
freeldr.ini.", OperatingSystemSectionNames[SelectedOperatingSystem]);
UiMessageBox(SettingName);
continue;
}
Modified: trunk/reactos/boot/freeldr/freeldr/cache/blocklist.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/cache…
==============================================================================
--- trunk/reactos/boot/freeldr/freeldr/cache/blocklist.c (original)
+++ trunk/reactos/boot/freeldr/freeldr/cache/blocklist.c Wed Oct 31 18:31:46 2007
@@ -57,14 +57,14 @@
//
// Make sure the block list has entries before I start searching it.
//
- if (!RtlListIsEmpty((PLIST_ITEM)CacheDrive->CacheBlockHead))
+ if (!IsListEmpty(&CacheDrive->CacheBlockHead))
{
//
// Search the list and find the BIOS drive number
//
- CacheBlock = CacheDrive->CacheBlockHead;
-
- while (CacheBlock != NULL)
+ CacheBlock = CONTAINING_RECORD(CacheDrive->CacheBlockHead.Flink, CACHE_BLOCK,
ListEntry);
+
+ while (&CacheBlock->ListEntry != &CacheDrive->CacheBlockHead)
{
//
// We found the block, so return it
@@ -79,7 +79,7 @@
return CacheBlock;
}
- CacheBlock = (PCACHE_BLOCK)RtlListGetNext((PLIST_ITEM)CacheBlock);
+ CacheBlock = CONTAINING_RECORD(CacheBlock->ListEntry.Flink, CACHE_BLOCK,
ListEntry);
}
}
@@ -125,14 +125,7 @@
RtlCopyMemory(CacheBlock->BlockData, (PVOID)DISKREADBUFFER, CacheDrive->BlockSize
* CacheDrive->BytesPerSector);
// Add it to our list of blocks managed by the cache
- if (CacheDrive->CacheBlockHead == NULL)
- {
- CacheDrive->CacheBlockHead = CacheBlock;
- }
- else
- {
- RtlListInsertTail((PLIST_ITEM)CacheDrive->CacheBlockHead, (PLIST_ITEM)CacheBlock);
- }
+ InsertTailList(&CacheDrive->CacheBlockHead, &CacheBlock->ListEntry);
// Update the cache data
CacheBlockCount++;
@@ -152,28 +145,20 @@
// Get a pointer to the last item in the block list
// that isn't forced to be in the cache and remove
// it from the list
- CacheBlockToFree =
(PCACHE_BLOCK)RtlListGetTail((PLIST_ITEM)CacheDrive->CacheBlockHead);
- while (CacheBlockToFree != NULL && CacheBlockToFree->LockedInCache == TRUE)
- {
- CacheBlockToFree = (PCACHE_BLOCK)RtlListGetPrevious((PLIST_ITEM)CacheBlockToFree);
+ CacheBlockToFree = CONTAINING_RECORD(CacheDrive->CacheBlockHead.Blink, CACHE_BLOCK,
ListEntry);
+ while (&CacheBlockToFree->ListEntry != &CacheDrive->CacheBlockHead
&& CacheBlockToFree->LockedInCache == TRUE)
+ {
+ CacheBlockToFree = CONTAINING_RECORD(CacheBlockToFree->ListEntry.Blink, CACHE_BLOCK,
ListEntry);
}
// No blocks left in cache that can be freed
// so just return
- if (CacheBlockToFree == NULL)
+ if (IsListEmpty(&CacheDrive->CacheBlockHead))
{
return FALSE;
}
- //
- // If we are freeing the head of the list then update it's pointer
- //
- if (CacheBlockToFree == CacheDrive->CacheBlockHead)
- {
- CacheDrive->CacheBlockHead =
(PCACHE_BLOCK)RtlListGetNext((PLIST_ITEM)CacheBlockToFree);
- }
-
- RtlListRemoveEntry((PLIST_ITEM)CacheBlockToFree);
+ RemoveEntryList(&CacheBlockToFree->ListEntry);
// Free the block memory and the block structure
MmFreeMemory(CacheBlockToFree->BlockData);
@@ -213,10 +198,9 @@
DbgPrint((DPRINT_CACHE, "CacheSizeLimit: %d.\n", CacheSizeLimit));
DbgPrint((DPRINT_CACHE, "CacheSizeCurrent: %d.\n", CacheSizeCurrent));
DbgPrint((DPRINT_CACHE, "CacheBlockCount: %d.\n", CacheBlockCount));
- DbgPrint((DPRINT_CACHE, "Dumping %d cache blocks.\n",
RtlListCountEntries((PLIST_ITEM)CacheDrive->CacheBlockHead)));
-
- CacheBlock = CacheDrive->CacheBlockHead;
- while (CacheBlock != NULL)
+
+ CacheBlock = CONTAINING_RECORD(CacheDrive->CacheBlockHead.Flink, CACHE_BLOCK,
ListEntry);
+ while (&CacheBlock->ListEntry != &CacheDrive->CacheBlockHead)
{
DbgPrint((DPRINT_CACHE, "Cache Block: CacheBlock: 0x%x\n", CacheBlock));
DbgPrint((DPRINT_CACHE, "Cache Block: Block Number: %d\n",
CacheBlock->BlockNumber));
@@ -229,7 +213,7 @@
BugCheck((DPRINT_CACHE, "What the heck?!?\n"));
}
- CacheBlock = (PCACHE_BLOCK)RtlListGetNext((PLIST_ITEM)CacheBlock);
+ CacheBlock = CONTAINING_RECORD(CacheBlock->ListEntry.Flink, CACHE_BLOCK,
ListEntry);
}
}
@@ -239,15 +223,12 @@
DbgPrint((DPRINT_CACHE, "CacheInternalOptimizeBlockList()\n"));
// Don't do this if this block is already at the head of the list
- if (CacheBlock != CacheDrive->CacheBlockHead)
+ if (&CacheBlock->ListEntry != CacheDrive->CacheBlockHead.Flink)
{
// Remove this item from the block list
- RtlListRemoveEntry((PLIST_ITEM)CacheBlock);
+ RemoveEntryList(&CacheBlock->ListEntry);
// Re-insert it at the head of the list
- RtlListInsertHead((PLIST_ITEM)CacheDrive->CacheBlockHead, (PLIST_ITEM)CacheBlock);
-
- // Update the head pointer
- CacheDrive->CacheBlockHead = CacheBlock;
- }
-}
+ InsertHeadList(&CacheDrive->CacheBlockHead, &CacheBlock->ListEntry);
+ }
+}
Modified: trunk/reactos/boot/freeldr/freeldr/cache/cache.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/cache…
==============================================================================
--- trunk/reactos/boot/freeldr/freeldr/cache/cache.c (original)
+++ trunk/reactos/boot/freeldr/freeldr/cache/cache.c Wed Oct 31 18:31:46 2007
@@ -64,19 +64,20 @@
//
// Loop through and free the cache blocks
//
- while (CacheManagerDrive.CacheBlockHead != NULL)
- {
- NextCacheBlock =
(PCACHE_BLOCK)RtlListGetNext((PLIST_ITEM)CacheManagerDrive.CacheBlockHead);
-
- MmFreeMemory(CacheManagerDrive.CacheBlockHead->BlockData);
- MmFreeMemory(CacheManagerDrive.CacheBlockHead);
-
- CacheManagerDrive.CacheBlockHead = NextCacheBlock;
+ while (!IsListEmpty(&CacheManagerDrive.CacheBlockHead))
+ {
+ NextCacheBlock =
CONTAINING_RECORD(RemoveHeadList(&CacheManagerDrive.CacheBlockHead),
+ CACHE_BLOCK,
+ ListEntry);
+
+ MmFreeMemory(NextCacheBlock->BlockData);
+ MmFreeMemory(NextCacheBlock);
}
}
// Initialize the structure
RtlZeroMemory(&CacheManagerDrive, sizeof(CACHE_DRIVE));
+ InitializeListHead(&CacheManagerDrive.CacheBlockHead);
CacheManagerDrive.DriveNumber = DriveNumber;
if (!MachDiskGetDriveGeometry(DriveNumber, &DriveGeometry))
{
Modified: trunk/reactos/boot/freeldr/freeldr/freeldr_base.rbuild
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/freel…
==============================================================================
--- trunk/reactos/boot/freeldr/freeldr/freeldr_base.rbuild (original)
+++ trunk/reactos/boot/freeldr/freeldr/freeldr_base.rbuild Wed Oct 31 18:31:46 2007
@@ -51,7 +51,6 @@
</directory>
<directory name="rtl">
<file>libsupp.c</file>
- <file>list.c</file>
</directory>
<directory name="ui">
<file>gui.c</file>
Modified: trunk/reactos/boot/freeldr/freeldr/include/cache.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/inclu…
==============================================================================
--- trunk/reactos/boot/freeldr/freeldr/include/cache.h (original)
+++ trunk/reactos/boot/freeldr/freeldr/include/cache.h Wed Oct 31 18:31:46 2007
@@ -32,7 +32,7 @@
///////////////////////////////////////////////////////////////////////////////////////
typedef struct
{
- LIST_ITEM ListEntry; // Doubly linked list synchronization member
+ LIST_ENTRY ListEntry; // Doubly linked list synchronization member
ULONG BlockNumber; // Track index for CHS, 64k block index for LBA
BOOLEAN LockedInCache; // Indicates that this block is locked in cache memory
@@ -55,7 +55,7 @@
ULONG BytesPerSector;
ULONG BlockSize; // Block size (in sectors)
- PCACHE_BLOCK CacheBlockHead;
+ LIST_ENTRY CacheBlockHead; // Contains CACHE_BLOCK structures
} CACHE_DRIVE, *PCACHE_DRIVE;
Modified: trunk/reactos/boot/freeldr/freeldr/include/inifile.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/inclu…
==============================================================================
--- trunk/reactos/boot/freeldr/freeldr/include/inifile.h (original)
+++ trunk/reactos/boot/freeldr/freeldr/include/inifile.h Wed Oct 31 18:31:46 2007
@@ -29,7 +29,7 @@
// Name=Value
typedef struct
{
- LIST_ITEM ListEntry;
+ LIST_ENTRY ListEntry;
PCHAR ItemName;
PCHAR ItemValue;
@@ -42,14 +42,15 @@
// one INI_SECTION_ITEM for each line in the section
typedef struct
{
- LIST_ITEM ListEntry;
+ LIST_ENTRY ListEntry;
PCHAR SectionName;
ULONG SectionItemCount;
- PINI_SECTION_ITEM SectionItemList;
+ LIST_ENTRY SectionItemList; // Contains PINI_SECTION_ITEM structures
} INI_SECTION, *PINI_SECTION;
-extern PINI_SECTION IniFileSectionListHead;
+extern LIST_ENTRY IniFileSectionListHead;
+extern BOOLEAN IniFileSectionInitialized;
extern ULONG IniFileSectionCount;
extern ULONG IniFileSettingCount;
Modified: trunk/reactos/boot/freeldr/freeldr/include/rtl.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/inclu…
==============================================================================
--- trunk/reactos/boot/freeldr/freeldr/include/rtl.h (original)
+++ trunk/reactos/boot/freeldr/freeldr/include/rtl.h Wed Oct 31 18:31:46 2007
@@ -29,34 +29,4 @@
void delay(unsigned msec);
void sound(int freq);
-///////////////////////////////////////////////////////////////////////////////////////
-//
-// List Functions
-//
-///////////////////////////////////////////////////////////////////////////////////////
-
-typedef struct _LIST_ITEM
-{
- struct _LIST_ITEM* ListPrev;
- struct _LIST_ITEM* ListNext;
-
-} LIST_ITEM, *PLIST_ITEM;
-
-VOID RtlListInitializeHead(PLIST_ITEM ListHead); // Initializes a doubly linked
list
-VOID RtlListInsertHead(PLIST_ITEM ListHead, PLIST_ITEM Entry); // Inserts an entry at
the head of the list
-VOID RtlListInsertTail(PLIST_ITEM ListHead, PLIST_ITEM Entry); // Inserts an entry at
the tail of the list
-PLIST_ITEM RtlListRemoveHead(PLIST_ITEM ListHead); // Removes the entry at the
head of the list
-PLIST_ITEM RtlListRemoveTail(PLIST_ITEM ListHead); // Removes the entry at the
tail of the list
-PLIST_ITEM RtlListGetHead(PLIST_ITEM ListHead); // Returns the entry at the head
of the list
-PLIST_ITEM RtlListGetTail(PLIST_ITEM ListHead); // Returns the entry at the tail
of the list
-BOOLEAN RtlListIsEmpty(PLIST_ITEM ListHead); // Indicates whether a doubly linked
list is empty
-ULONG RtlListCountEntries(PLIST_ITEM ListHead); // Counts the entries in a doubly
linked list
-PLIST_ITEM RtlListGetPrevious(PLIST_ITEM ListEntry); // Returns the previous item
in the list
-PLIST_ITEM RtlListGetNext(PLIST_ITEM ListEntry); // Returns the next item in the
list
-PLIST_ITEM RtlListRemoveEntry(PLIST_ITEM ListEntry); // Removes the entry from the
list
-VOID RtlListInsertEntry(PLIST_ITEM InsertAfter, PLIST_ITEM ListEntry); // Inserts a new
list entry right after the specified one
-VOID RtlListMoveEntryPrevious(PLIST_ITEM ListEntry); // Moves the list entry to
before the previous entry
-VOID RtlListMoveEntryNext(PLIST_ITEM ListEntry); // Moves the list entry to after
the next entry
-
-
#endif // defined __STDLIB_H
Modified: trunk/reactos/boot/freeldr/freeldr/inifile/ini_init.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/inifi…
==============================================================================
--- trunk/reactos/boot/freeldr/freeldr/inifile/ini_init.c (original)
+++ trunk/reactos/boot/freeldr/freeldr/inifile/ini_init.c Wed Oct 31 18:31:46 2007
@@ -31,8 +31,7 @@
if (Freeldr_Ini == NULL)
{
- printf("Error opening freeldr.ini or file not found.\n");
- printf("You need to re-install FreeLoader.\n");
+ UiMessageBoxCritical("Error opening freeldr.ini or file not found.\nYou need to
re-install FreeLoader.");
return FALSE;
}
@@ -43,7 +42,7 @@
// If we are out of memory then return FALSE
if (FreeLoaderIniFileData == NULL)
{
- printf("Out of memory while loading freeldr.ini.\n");
+ UiMessageBoxCritical("Out of memory while loading freeldr.ini.");
FsCloseFile(Freeldr_Ini);
return FALSE;
}
Modified: trunk/reactos/boot/freeldr/freeldr/inifile/inifile.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/inifi…
==============================================================================
--- trunk/reactos/boot/freeldr/freeldr/inifile/inifile.c (original)
+++ trunk/reactos/boot/freeldr/freeldr/inifile/inifile.c Wed Oct 31 18:31:46 2007
@@ -26,12 +26,12 @@
DbgPrint((DPRINT_INIFILE, "IniOpenSection() SectionName = %s\n",
SectionName));
- if (!IniFileSectionListHead)
+ if (!IniFileSectionInitialized)
return FALSE;
// Loop through each section and find the one they want
- Section = (PINI_SECTION)RtlListGetHead((PLIST_ITEM)IniFileSectionListHead);
- while (Section != NULL)
+ Section = CONTAINING_RECORD(IniFileSectionListHead.Flink, INI_SECTION, ListEntry);
+ while (&Section->ListEntry != &IniFileSectionListHead)
{
// Compare against the section name
if (_stricmp(SectionName, Section->SectionName) == 0)
@@ -43,7 +43,7 @@
}
// Get the next section in the list
- Section = (PINI_SECTION)RtlListGetNext((PLIST_ITEM)Section);
+ Section = CONTAINING_RECORD(Section->ListEntry.Flink, INI_SECTION, ListEntry);
}
DbgPrint((DPRINT_INIFILE, "IniOpenSection() Section not found.\n"));
@@ -61,68 +61,87 @@
return Section->SectionItemCount;
}
-ULONG IniGetSectionSettingNameSize(ULONG SectionId, ULONG SettingIndex)
-{
- PINI_SECTION Section = (PINI_SECTION)SectionId;
-
- // Return the size of the string plus 1 for the null-terminator
- return (strlen(Section->SectionItemList[SettingIndex].ItemName) + 1);
-}
-
-ULONG IniGetSectionSettingValueSize(ULONG SectionId, ULONG SettingIndex)
-{
- PINI_SECTION Section = (PINI_SECTION)SectionId;
-
- // Return the size of the string plus 1 for the null-terminator
- return (strlen(Section->SectionItemList[SettingIndex].ItemValue) + 1);
-}
-
-BOOLEAN IniReadSettingByNumber(ULONG SectionId, ULONG SettingNumber, PCHAR SettingName,
ULONG NameSize, PCHAR SettingValue, ULONG ValueSize)
+PINI_SECTION_ITEM IniGetSettingByNumber(ULONG SectionId, ULONG SettingNumber)
{
PINI_SECTION Section = (PINI_SECTION)SectionId;
PINI_SECTION_ITEM SectionItem;
- ULONG RealSettingNumber = SettingNumber;
- DbgPrint((DPRINT_INIFILE, ".001 NameSize = %d ValueSize = %d\n", NameSize,
ValueSize));
-
- DbgPrint((DPRINT_INIFILE, "IniReadSettingByNumber() SectionId = 0x%x\n",
SectionId));
// Loop through each section item and find the one they want
- DbgPrint((DPRINT_INIFILE, ".01 NameSize = %d ValueSize = %d\n", NameSize,
ValueSize));
- SectionItem =
(PINI_SECTION_ITEM)RtlListGetHead((PLIST_ITEM)Section->SectionItemList);
- while (SectionItem != NULL)
- {
- DbgPrint((DPRINT_INIFILE, ".1 NameSize = %d ValueSize = %d\n", NameSize,
ValueSize));
+ SectionItem = CONTAINING_RECORD(Section->SectionItemList.Flink, INI_SECTION_ITEM,
ListEntry);
+ while (&SectionItem->ListEntry != &Section->SectionItemList)
+ {
// Check to see if this is the setting they want
if (SettingNumber == 0)
{
- DbgPrint((DPRINT_INIFILE, "IniReadSettingByNumber() Setting number %d
found.\n", RealSettingNumber));
- DbgPrint((DPRINT_INIFILE, "IniReadSettingByNumber() Setting name = %s\n",
SectionItem->ItemName));
- DbgPrint((DPRINT_INIFILE, "IniReadSettingByNumber() Setting value = %s\n",
SectionItem->ItemValue));
-
- DbgPrint((DPRINT_INIFILE, "1 NameSize = %d ValueSize = %d\n", NameSize,
ValueSize));
- DbgPrint((DPRINT_INIFILE, "2 NameSize = %d ValueSize = %d\n", NameSize,
ValueSize));
- strncpy(SettingName, SectionItem->ItemName, NameSize - 1);
- SettingName[NameSize - 1] = '\0';
- DbgPrint((DPRINT_INIFILE, "3 NameSize = %d ValueSize = %d\n", NameSize,
ValueSize));
- strncpy(SettingValue, SectionItem->ItemValue, ValueSize - 1);
- SettingValue[ValueSize - 1] = '\0';
- DbgPrint((DPRINT_INIFILE, "4 NameSize = %d ValueSize = %d\n", NameSize,
ValueSize));
- DbgDumpBuffer(DPRINT_INIFILE, SettingName, NameSize);
- DbgDumpBuffer(DPRINT_INIFILE, SettingValue, ValueSize);
-
- return TRUE;
+ return SectionItem;
}
// Nope, keep going
SettingNumber--;
// Get the next section item in the list
- SectionItem = (PINI_SECTION_ITEM)RtlListGetNext((PLIST_ITEM)SectionItem);
- }
-
- DbgPrint((DPRINT_INIFILE, "IniReadSettingByNumber() Setting number %d not
found.\n", RealSettingNumber));
-
- return FALSE;
+ SectionItem = CONTAINING_RECORD(SectionItem->ListEntry.Flink, INI_SECTION_ITEM,
ListEntry);
+ }
+ return NULL;
+}
+
+ULONG IniGetSectionSettingNameSize(ULONG SectionId, ULONG SettingIndex)
+{
+ PINI_SECTION_ITEM SectionItem;
+
+ // Retrieve requested setting
+ SectionItem = IniGetSettingByNumber(SectionId, SettingIndex);
+ if (!SectionItem)
+ return 0;
+
+ // Return the size of the string plus 1 for the null-terminator
+ return (strlen(SectionItem->ItemName) + 1);
+}
+
+ULONG IniGetSectionSettingValueSize(ULONG SectionId, ULONG SettingIndex)
+{
+ PINI_SECTION_ITEM SectionItem;
+
+ // Retrieve requested setting
+ SectionItem = IniGetSettingByNumber(SectionId, SettingIndex);
+ if (!SectionItem)
+ return 0;
+
+ // Return the size of the string plus 1 for the null-terminator
+ return (strlen(SectionItem->ItemValue) + 1);
+}
+
+BOOLEAN IniReadSettingByNumber(ULONG SectionId, ULONG SettingNumber, PCHAR SettingName,
ULONG NameSize, PCHAR SettingValue, ULONG ValueSize)
+{
+ PINI_SECTION_ITEM SectionItem;
+ DbgPrint((DPRINT_INIFILE, ".001 NameSize = %d ValueSize = %d\n", NameSize,
ValueSize));
+
+ DbgPrint((DPRINT_INIFILE, "IniReadSettingByNumber() SectionId = 0x%x\n",
SectionId));
+
+ // Retrieve requested setting
+ SectionItem = IniGetSettingByNumber(SectionId, SettingNumber);
+ if (!SectionItem)
+ {
+ DbgPrint((DPRINT_INIFILE, "IniReadSettingByNumber() Setting number %d not
found.\n", SettingNumber));
+ return FALSE;
+ }
+
+ DbgPrint((DPRINT_INIFILE, "IniReadSettingByNumber() Setting number %d
found.\n", SettingNumber));
+ DbgPrint((DPRINT_INIFILE, "IniReadSettingByNumber() Setting name = %s\n",
SectionItem->ItemName));
+ DbgPrint((DPRINT_INIFILE, "IniReadSettingByNumber() Setting value = %s\n",
SectionItem->ItemValue));
+
+ DbgPrint((DPRINT_INIFILE, "1 NameSize = %d ValueSize = %d\n", NameSize,
ValueSize));
+ DbgPrint((DPRINT_INIFILE, "2 NameSize = %d ValueSize = %d\n", NameSize,
ValueSize));
+ strncpy(SettingName, SectionItem->ItemName, NameSize - 1);
+ SettingName[NameSize - 1] = '\0';
+ DbgPrint((DPRINT_INIFILE, "3 NameSize = %d ValueSize = %d\n", NameSize,
ValueSize));
+ strncpy(SettingValue, SectionItem->ItemValue, ValueSize - 1);
+ SettingValue[ValueSize - 1] = '\0';
+ DbgPrint((DPRINT_INIFILE, "4 NameSize = %d ValueSize = %d\n", NameSize,
ValueSize));
+ DbgDumpBuffer(DPRINT_INIFILE, SettingName, NameSize);
+ DbgDumpBuffer(DPRINT_INIFILE, SettingValue, ValueSize);
+
+ return TRUE;
}
BOOLEAN IniReadSettingByName(ULONG SectionId, PCSTR SettingName, PCHAR Buffer, ULONG
BufferSize)
@@ -133,8 +152,8 @@
DbgPrint((DPRINT_INIFILE, "IniReadSettingByName() SectionId = 0x%x\n",
SectionId));
// Loop through each section item and find the one they want
- SectionItem =
(PINI_SECTION_ITEM)RtlListGetHead((PLIST_ITEM)Section->SectionItemList);
- while (SectionItem != NULL)
+ SectionItem = CONTAINING_RECORD(Section->SectionItemList.Flink, INI_SECTION_ITEM,
ListEntry);
+ while (&SectionItem->ListEntry != &Section->SectionItemList)
{
// Check to see if this is the setting they want
if (_stricmp(SettingName, SectionItem->ItemName) == 0)
@@ -149,7 +168,7 @@
}
// Get the next section item in the list
- SectionItem = (PINI_SECTION_ITEM)RtlListGetNext((PLIST_ITEM)SectionItem);
+ SectionItem = CONTAINING_RECORD(SectionItem->ListEntry.Flink, INI_SECTION_ITEM,
ListEntry);
}
DbgPrint((DPRINT_INIFILE, "IniReadSettingByName() Setting \'%s\' not
found.\n", SettingName));
@@ -183,14 +202,7 @@
// Add it to the section list head
IniFileSectionCount++;
- if (IniFileSectionListHead == NULL)
- {
- IniFileSectionListHead = Section;
- }
- else
- {
- RtlListInsertTail((PLIST_ITEM)IniFileSectionListHead, (PLIST_ITEM)Section);
- }
+ InsertHeadList(&IniFileSectionListHead, &Section->ListEntry);
*SectionId = (ULONG)Section;
@@ -233,14 +245,7 @@
// Add it to the current section
Section->SectionItemCount++;
- if (Section->SectionItemList == NULL)
- {
- Section->SectionItemList = SectionItem;
- }
- else
- {
- RtlListInsertTail((PLIST_ITEM)Section->SectionItemList, (PLIST_ITEM)SectionItem);
- }
+ InsertTailList(&Section->SectionItemList, &SectionItem->ListEntry);
return TRUE;
}
Modified: trunk/reactos/boot/freeldr/freeldr/inifile/parse.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/inifi…
==============================================================================
--- trunk/reactos/boot/freeldr/freeldr/inifile/parse.c (original)
+++ trunk/reactos/boot/freeldr/freeldr/inifile/parse.c Wed Oct 31 18:31:46 2007
@@ -20,7 +20,8 @@
#include <freeldr.h>
#include <debug.h>
-PINI_SECTION IniFileSectionListHead = NULL;
+LIST_ENTRY IniFileSectionListHead;
+BOOLEAN IniFileSectionInitialized = FALSE;
ULONG IniFileSectionCount = 0;
ULONG IniFileSettingCount = 0;
@@ -37,6 +38,12 @@
DbgPrint((DPRINT_INIFILE, "IniParseFile() IniFileSize: %d\n", IniFileSize));
+ if (!IniFileSectionInitialized)
+ {
+ InitializeListHead(&IniFileSectionListHead);
+ IniFileSectionInitialized = TRUE;
+ }
+
// Start with an 80-byte buffer
IniFileLineSize = 80;
IniFileLine = MmAllocateMemory(IniFileLineSize);
@@ -97,17 +104,11 @@
// Get the section name
IniExtractSectionName(CurrentSection->SectionName, IniFileLine, LineLength);
+ InitializeListHead(&CurrentSection->SectionItemList);
// Add it to the section list head
IniFileSectionCount++;
- if (IniFileSectionListHead == NULL)
- {
- IniFileSectionListHead = CurrentSection;
- }
- else
- {
- RtlListInsertTail((PLIST_ITEM)IniFileSectionListHead, (PLIST_ITEM)CurrentSection);
- }
+ InsertTailList(&IniFileSectionListHead, &CurrentSection->ListEntry);
CurrentLineNumber++;
continue;
@@ -162,14 +163,7 @@
// Add it to the current section
IniFileSettingCount++;
CurrentSection->SectionItemCount++;
- if (CurrentSection->SectionItemList == NULL)
- {
- CurrentSection->SectionItemList = CurrentItem;
- }
- else
- {
- RtlListInsertTail((PLIST_ITEM)CurrentSection->SectionItemList,
(PLIST_ITEM)CurrentItem);
- }
+ InsertTailList(&CurrentSection->SectionItemList,
&CurrentItem->ListEntry);
CurrentLineNumber++;
continue;
Removed: trunk/reactos/boot/freeldr/freeldr/rtl/list.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/rtl/l…
==============================================================================
--- trunk/reactos/boot/freeldr/freeldr/rtl/list.c (original)
+++ trunk/reactos/boot/freeldr/freeldr/rtl/list.c (removed)
@@ -1,176 +1,0 @@
-/*
- * FreeLoader
- * Copyright (C) 1998-2003 Brian Palmer <brianp(a)sginet.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <freeldr.h>
-
-VOID RtlListInitializeHead(PLIST_ITEM ListHead)
-{
- ListHead->ListPrev = NULL;
- ListHead->ListNext = NULL;
-}
-
-VOID RtlListInsertHead(PLIST_ITEM ListHead, PLIST_ITEM Entry)
-{
- ListHead = RtlListGetHead(ListHead);
- ListHead->ListPrev = Entry;
- Entry->ListNext = ListHead;
- Entry->ListPrev = NULL;
-}
-
-VOID RtlListInsertTail(PLIST_ITEM ListHead, PLIST_ITEM Entry)
-{
- ListHead = RtlListGetTail(ListHead);
- ListHead->ListNext = Entry;
- Entry->ListNext = NULL;
- Entry->ListPrev = ListHead;
-}
-
-PLIST_ITEM RtlListRemoveHead(PLIST_ITEM ListHead)
-{
- PLIST_ITEM OldListHead = RtlListGetHead(ListHead);
-
- ListHead = ListHead->ListNext;
- ListHead->ListPrev = NULL;
-
- return OldListHead;
-}
-
-PLIST_ITEM RtlListRemoveTail(PLIST_ITEM ListHead)
-{
- PLIST_ITEM ListTail;
-
- ListTail = RtlListGetTail(ListHead);
- ListHead = ListTail->ListPrev;
- ListHead->ListNext = NULL;
-
- return ListTail;
-}
-
-PLIST_ITEM RtlListGetHead(PLIST_ITEM ListHead)
-{
- while (ListHead->ListPrev != NULL)
- {
- ListHead = ListHead->ListPrev;
- }
-
- return ListHead;
-}
-
-PLIST_ITEM RtlListGetTail(PLIST_ITEM ListHead)
-{
- while (ListHead->ListNext != NULL)
- {
- ListHead = ListHead->ListNext;
- }
-
- return ListHead;
-}
-
-BOOLEAN RtlListIsEmpty(PLIST_ITEM ListHead)
-{
- if (ListHead == NULL)
- {
- return TRUE;
- }
-
- return (ListHead->ListNext == NULL);
-}
-
-ULONG RtlListCountEntries(PLIST_ITEM ListHead)
-{
- ULONG Count = 0;
-
- while (ListHead != NULL)
- {
- Count++;
- ListHead = ListHead->ListNext;
- }
-
- return Count;
-}
-
-PLIST_ITEM RtlListGetPrevious(PLIST_ITEM ListEntry)
-{
- return ListEntry->ListPrev;
-}
-
-PLIST_ITEM RtlListGetNext(PLIST_ITEM ListEntry)
-{
- return ListEntry->ListNext;
-}
-
-PLIST_ITEM RtlListRemoveEntry(PLIST_ITEM ListEntry)
-{
- PLIST_ITEM ListNext = RtlListGetNext(ListEntry);
- PLIST_ITEM ListPrev = RtlListGetPrevious(ListEntry);
-
- if (ListPrev != NULL)
- {
- ListPrev->ListNext = ListNext;
- }
-
- if (ListNext != NULL)
- {
- ListNext->ListPrev = ListPrev;
- }
-
- return ListNext;
-}
-
-VOID RtlListInsertEntry(PLIST_ITEM InsertAfter, PLIST_ITEM ListEntry)
-{
- PLIST_ITEM ListNext = RtlListGetNext(InsertAfter);
-
- InsertAfter->ListNext = ListEntry;
- ListEntry->ListPrev = InsertAfter;
- ListEntry->ListNext = ListNext;
-}
-
-VOID RtlListMoveEntryPrevious(PLIST_ITEM ListEntry)
-{
- PLIST_ITEM ListPrev = RtlListGetPrevious(ListEntry);
-
- if (ListPrev == NULL)
- {
- return;
- }
-
- //
- // Move the previous entry after this one
- //
- RtlListRemoveEntry(ListPrev);
- RtlListInsertEntry(ListEntry, ListPrev);
-}
-
-VOID RtlListMoveEntryNext(PLIST_ITEM ListEntry)
-{
- PLIST_ITEM ListNext = RtlListGetNext(ListEntry);
-
- if (ListNext == NULL)
- {
- return;
- }
-
- //
- // Move this entry after the next entry
- //
- RtlListRemoveEntry(ListEntry);
- RtlListInsertEntry(ListNext, ListEntry);
-}
-