3 * Copyright (C) 1998-2003 Brian Palmer <brianp@sginet.com>
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License along
16 * with this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20 /* INCLUDES *******************************************************************/
24 #define TAG_STRING ' rtS'
25 #define TAG_OS_ITEM 'tISO'
27 /* FUNCTIONS ******************************************************************/
29 static PCSTR
CopyString(PCSTR Source
)
36 Dest
= FrLdrHeapAlloc(strlen(Source
) + 1, TAG_STRING
);
43 OperatingSystemItem
* InitOperatingSystemList(ULONG
* OperatingSystemCountPointer
)
46 CHAR SettingName
[260];
47 CHAR SettingValue
[260];
49 PCHAR TitleStart
, TitleEnd
;
52 OperatingSystemItem
* Items
;
54 /* Open the [FreeLoader] section */
55 if (!IniOpenSection("Operating Systems", &SectionId
))
58 /* Count number of operating systems in the section */
59 Count
= IniGetNumSectionItems(SectionId
);
61 /* Allocate memory to hold operating system lists */
62 Items
= FrLdrHeapAlloc(Count
* sizeof(OperatingSystemItem
), TAG_OS_ITEM
);
66 /* Now loop through and read the operating system section and display names */
67 for (Idx
= 0; Idx
< Count
; Idx
++)
69 IniReadSettingByNumber(SectionId
, Idx
, SettingName
, sizeof(SettingName
), SettingValue
, sizeof(SettingValue
));
71 /* Search start and end of the title */
73 TitleStart
= SettingValue
;
74 while (*TitleStart
== ' ' || *TitleStart
== '"')
76 TitleEnd
= TitleStart
;
77 if (*TitleEnd
!= ANSI_NULL
)
79 while (*TitleEnd
!= ANSI_NULL
&& *TitleEnd
!= '"')
81 if (*TitleEnd
!= ANSI_NULL
)
83 *TitleEnd
= ANSI_NULL
;
84 OsLoadOptions
= TitleEnd
+ 1;
87 /* Copy the system partition, identifier and options */
88 Items
[Idx
].SystemPartition
= CopyString(SettingName
);
89 Items
[Idx
].LoadIdentifier
= CopyString(TitleStart
);
90 Items
[Idx
].OsLoadOptions
= CopyString(OsLoadOptions
);
94 *OperatingSystemCountPointer
= Count
;