1fba4ad4cSHermès Bélusca-Maïto /*
2fba4ad4cSHermès Bélusca-Maïto * PROJECT: FreeLoader
3fba4ad4cSHermès Bélusca-Maïto * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4fba4ad4cSHermès Bélusca-Maïto * PURPOSE: INF file parser that caches contents of INF file in memory.
5fba4ad4cSHermès Bélusca-Maïto * COPYRIGHT: Copyright 2002-2006 Royce Mitchell III
6fba4ad4cSHermès Bélusca-Maïto * Copyright 2003-2019 Eric Kohl
7fba4ad4cSHermès Bélusca-Maïto */
8fba4ad4cSHermès Bélusca-Maïto
9fba4ad4cSHermès Bélusca-Maïto /* INCLUDES *****************************************************************/
10fba4ad4cSHermès Bélusca-Maïto
11fba4ad4cSHermès Bélusca-Maïto #include <freeldr.h>
12fba4ad4cSHermès Bélusca-Maïto #include "inffile.h"
13fba4ad4cSHermès Bélusca-Maïto
14fba4ad4cSHermès Bélusca-Maïto #define CONTROL_Z '\x1a'
15fba4ad4cSHermès Bélusca-Maïto #define MAX_SECTION_NAME_LEN 255
16fba4ad4cSHermès Bélusca-Maïto #define MAX_FIELD_LEN 511 /* larger fields get silently truncated */
17fba4ad4cSHermès Bélusca-Maïto /* actual string limit is MAX_INF_STRING_LENGTH+1 (plus terminating null) under Windows */
18fba4ad4cSHermès Bélusca-Maïto #define MAX_STRING_LEN (MAX_INF_STRING_LENGTH+1)
19fba4ad4cSHermès Bélusca-Maïto
20fba4ad4cSHermès Bélusca-Maïto #define TAG_INF_KEY 'KfnI'
21fba4ad4cSHermès Bélusca-Maïto #define TAG_INF_FIELD 'ffnI'
22fba4ad4cSHermès Bélusca-Maïto #define TAG_INF_LINE 'LfnI'
23fba4ad4cSHermès Bélusca-Maïto #define TAG_INF_SECTION 'SfnI'
24fba4ad4cSHermès Bélusca-Maïto #define TAG_INF_CACHE 'CfnI'
25fba4ad4cSHermès Bélusca-Maïto #define TAG_INF_FILE 'FfnI'
26fba4ad4cSHermès Bélusca-Maïto
27fba4ad4cSHermès Bélusca-Maïto typedef struct _INFCACHEFIELD
28fba4ad4cSHermès Bélusca-Maïto {
29fba4ad4cSHermès Bélusca-Maïto struct _INFCACHEFIELD *Next;
30fba4ad4cSHermès Bélusca-Maïto struct _INFCACHEFIELD *Prev;
31fba4ad4cSHermès Bélusca-Maïto
32fba4ad4cSHermès Bélusca-Maïto CHAR Data[1];
33fba4ad4cSHermès Bélusca-Maïto } INFCACHEFIELD, *PINFCACHEFIELD;
34fba4ad4cSHermès Bélusca-Maïto
35fba4ad4cSHermès Bélusca-Maïto typedef struct _INFCACHELINE
36fba4ad4cSHermès Bélusca-Maïto {
37fba4ad4cSHermès Bélusca-Maïto struct _INFCACHELINE *Next;
38fba4ad4cSHermès Bélusca-Maïto struct _INFCACHELINE *Prev;
39fba4ad4cSHermès Bélusca-Maïto
40fba4ad4cSHermès Bélusca-Maïto ULONG FieldCount;
41fba4ad4cSHermès Bélusca-Maïto
42fba4ad4cSHermès Bélusca-Maïto PCHAR Key;
43fba4ad4cSHermès Bélusca-Maïto
44fba4ad4cSHermès Bélusca-Maïto PINFCACHEFIELD FirstField;
45fba4ad4cSHermès Bélusca-Maïto PINFCACHEFIELD LastField;
46fba4ad4cSHermès Bélusca-Maïto
47fba4ad4cSHermès Bélusca-Maïto } INFCACHELINE, *PINFCACHELINE;
48fba4ad4cSHermès Bélusca-Maïto
49fba4ad4cSHermès Bélusca-Maïto typedef struct _INFCACHESECTION
50fba4ad4cSHermès Bélusca-Maïto {
51fba4ad4cSHermès Bélusca-Maïto struct _INFCACHESECTION *Next;
52fba4ad4cSHermès Bélusca-Maïto struct _INFCACHESECTION *Prev;
53fba4ad4cSHermès Bélusca-Maïto
54fba4ad4cSHermès Bélusca-Maïto PINFCACHELINE FirstLine;
55fba4ad4cSHermès Bélusca-Maïto PINFCACHELINE LastLine;
56fba4ad4cSHermès Bélusca-Maïto
57fba4ad4cSHermès Bélusca-Maïto LONG LineCount;
58fba4ad4cSHermès Bélusca-Maïto
59fba4ad4cSHermès Bélusca-Maïto CHAR Name[1];
60fba4ad4cSHermès Bélusca-Maïto } INFCACHESECTION, *PINFCACHESECTION;
61fba4ad4cSHermès Bélusca-Maïto
62fba4ad4cSHermès Bélusca-Maïto typedef struct _INFCACHE
63fba4ad4cSHermès Bélusca-Maïto {
64fba4ad4cSHermès Bélusca-Maïto PINFCACHESECTION FirstSection;
65fba4ad4cSHermès Bélusca-Maïto PINFCACHESECTION LastSection;
66fba4ad4cSHermès Bélusca-Maïto
67fba4ad4cSHermès Bélusca-Maïto PINFCACHESECTION StringsSection;
68fba4ad4cSHermès Bélusca-Maïto } INFCACHE, *PINFCACHE;
69fba4ad4cSHermès Bélusca-Maïto
70fba4ad4cSHermès Bélusca-Maïto /* parser definitions */
71fba4ad4cSHermès Bélusca-Maïto enum parser_state
72fba4ad4cSHermès Bélusca-Maïto {
73fba4ad4cSHermès Bélusca-Maïto LINE_START, /* at beginning of a line */
74fba4ad4cSHermès Bélusca-Maïto SECTION_NAME, /* parsing a section name */
75fba4ad4cSHermès Bélusca-Maïto KEY_NAME, /* parsing a key name */
76fba4ad4cSHermès Bélusca-Maïto VALUE_NAME, /* parsing a value name */
77fba4ad4cSHermès Bélusca-Maïto EOL_BACKSLASH, /* backslash at end of line */
78fba4ad4cSHermès Bélusca-Maïto QUOTES, /* inside quotes */
79fba4ad4cSHermès Bélusca-Maïto LEADING_SPACES, /* leading spaces */
80fba4ad4cSHermès Bélusca-Maïto TRAILING_SPACES, /* trailing spaces */
81fba4ad4cSHermès Bélusca-Maïto COMMENT, /* inside a comment */
82fba4ad4cSHermès Bélusca-Maïto NB_PARSER_STATES
83fba4ad4cSHermès Bélusca-Maïto };
84fba4ad4cSHermès Bélusca-Maïto
85fba4ad4cSHermès Bélusca-Maïto struct parser
86fba4ad4cSHermès Bélusca-Maïto {
87fba4ad4cSHermès Bélusca-Maïto const CHAR *start; /* start position of item being parsed */
88fba4ad4cSHermès Bélusca-Maïto const CHAR *end; /* end of buffer */
89fba4ad4cSHermès Bélusca-Maïto PINFCACHE file; /* file being built */
90fba4ad4cSHermès Bélusca-Maïto enum parser_state state; /* current parser state */
91fba4ad4cSHermès Bélusca-Maïto enum parser_state stack[4]; /* state stack */
92fba4ad4cSHermès Bélusca-Maïto int stack_pos; /* current pos in stack */
93fba4ad4cSHermès Bélusca-Maïto
94fba4ad4cSHermès Bélusca-Maïto PINFCACHESECTION cur_section; /* pointer to the section being parsed*/
95fba4ad4cSHermès Bélusca-Maïto PINFCACHELINE line; /* current line */
96fba4ad4cSHermès Bélusca-Maïto unsigned int line_pos; /* current line position in file */
97fba4ad4cSHermès Bélusca-Maïto unsigned int error; /* error code */
98fba4ad4cSHermès Bélusca-Maïto unsigned int token_len; /* current token len */
99fba4ad4cSHermès Bélusca-Maïto CHAR token[MAX_FIELD_LEN + 1]; /* current token */
100fba4ad4cSHermès Bélusca-Maïto };
101fba4ad4cSHermès Bélusca-Maïto
102fba4ad4cSHermès Bélusca-Maïto typedef const CHAR * (*parser_state_func)(struct parser *parser, const CHAR *pos);
103fba4ad4cSHermès Bélusca-Maïto
104fba4ad4cSHermès Bélusca-Maïto /* parser state machine functions */
105fba4ad4cSHermès Bélusca-Maïto static const CHAR *line_start_state(struct parser *parser, const CHAR *pos);
106fba4ad4cSHermès Bélusca-Maïto static const CHAR *section_name_state(struct parser *parser, const CHAR *pos);
107fba4ad4cSHermès Bélusca-Maïto static const CHAR *key_name_state(struct parser *parser, const CHAR *pos);
108fba4ad4cSHermès Bélusca-Maïto static const CHAR *value_name_state(struct parser *parser, const CHAR *pos);
109fba4ad4cSHermès Bélusca-Maïto static const CHAR *eol_backslash_state(struct parser *parser, const CHAR *pos);
110fba4ad4cSHermès Bélusca-Maïto static const CHAR *quotes_state(struct parser *parser, const CHAR *pos);
111fba4ad4cSHermès Bélusca-Maïto static const CHAR *leading_spaces_state(struct parser *parser, const CHAR *pos);
112fba4ad4cSHermès Bélusca-Maïto static const CHAR *trailing_spaces_state(struct parser *parser, const CHAR *pos);
113fba4ad4cSHermès Bélusca-Maïto static const CHAR *comment_state(struct parser *parser, const CHAR *pos);
114fba4ad4cSHermès Bélusca-Maïto
115fba4ad4cSHermès Bélusca-Maïto static
116fba4ad4cSHermès Bélusca-Maïto const parser_state_func
117fba4ad4cSHermès Bélusca-Maïto parser_funcs[NB_PARSER_STATES] =
118fba4ad4cSHermès Bélusca-Maïto {
119fba4ad4cSHermès Bélusca-Maïto line_start_state, /* LINE_START */
120fba4ad4cSHermès Bélusca-Maïto section_name_state, /* SECTION_NAME */
121fba4ad4cSHermès Bélusca-Maïto key_name_state, /* KEY_NAME */
122fba4ad4cSHermès Bélusca-Maïto value_name_state, /* VALUE_NAME */
123fba4ad4cSHermès Bélusca-Maïto eol_backslash_state, /* EOL_BACKSLASH */
124fba4ad4cSHermès Bélusca-Maïto quotes_state, /* QUOTES */
125fba4ad4cSHermès Bélusca-Maïto leading_spaces_state, /* LEADING_SPACES */
126fba4ad4cSHermès Bélusca-Maïto trailing_spaces_state, /* TRAILING_SPACES */
127fba4ad4cSHermès Bélusca-Maïto comment_state /* COMMENT */
128fba4ad4cSHermès Bélusca-Maïto };
129fba4ad4cSHermès Bélusca-Maïto
130fba4ad4cSHermès Bélusca-Maïto
131fba4ad4cSHermès Bélusca-Maïto /* PRIVATE FUNCTIONS ********************************************************/
132fba4ad4cSHermès Bélusca-Maïto
133fba4ad4cSHermès Bélusca-Maïto static
134fba4ad4cSHermès Bélusca-Maïto PINFCACHELINE
InfpCacheFreeLine(PINFCACHELINE Line)135fba4ad4cSHermès Bélusca-Maïto InfpCacheFreeLine(
136fba4ad4cSHermès Bélusca-Maïto PINFCACHELINE Line)
137fba4ad4cSHermès Bélusca-Maïto {
138fba4ad4cSHermès Bélusca-Maïto PINFCACHELINE Next;
139fba4ad4cSHermès Bélusca-Maïto PINFCACHEFIELD Field;
140fba4ad4cSHermès Bélusca-Maïto
141fba4ad4cSHermès Bélusca-Maïto if (Line == NULL)
142fba4ad4cSHermès Bélusca-Maïto {
143fba4ad4cSHermès Bélusca-Maïto return NULL;
144fba4ad4cSHermès Bélusca-Maïto }
145fba4ad4cSHermès Bélusca-Maïto
146fba4ad4cSHermès Bélusca-Maïto Next = Line->Next;
147fba4ad4cSHermès Bélusca-Maïto if (Line->Key != NULL)
148fba4ad4cSHermès Bélusca-Maïto {
149fba4ad4cSHermès Bélusca-Maïto FrLdrTempFree(Line->Key, TAG_INF_KEY);
150fba4ad4cSHermès Bélusca-Maïto Line->Key = NULL;
151fba4ad4cSHermès Bélusca-Maïto }
152fba4ad4cSHermès Bélusca-Maïto
153fba4ad4cSHermès Bélusca-Maïto /* Remove data fields */
154fba4ad4cSHermès Bélusca-Maïto while (Line->FirstField != NULL)
155fba4ad4cSHermès Bélusca-Maïto {
156fba4ad4cSHermès Bélusca-Maïto Field = Line->FirstField->Next;
157fba4ad4cSHermès Bélusca-Maïto FrLdrTempFree(Line->FirstField, TAG_INF_FIELD);
158fba4ad4cSHermès Bélusca-Maïto Line->FirstField = Field;
159fba4ad4cSHermès Bélusca-Maïto }
160fba4ad4cSHermès Bélusca-Maïto Line->LastField = NULL;
161fba4ad4cSHermès Bélusca-Maïto
162fba4ad4cSHermès Bélusca-Maïto FrLdrTempFree(Line, TAG_INF_LINE);
163fba4ad4cSHermès Bélusca-Maïto
164fba4ad4cSHermès Bélusca-Maïto return Next;
165fba4ad4cSHermès Bélusca-Maïto }
166fba4ad4cSHermès Bélusca-Maïto
167fba4ad4cSHermès Bélusca-Maïto
168fba4ad4cSHermès Bélusca-Maïto static
169fba4ad4cSHermès Bélusca-Maïto PINFCACHESECTION
InfpCacheFreeSection(PINFCACHESECTION Section)170fba4ad4cSHermès Bélusca-Maïto InfpCacheFreeSection(
171fba4ad4cSHermès Bélusca-Maïto PINFCACHESECTION Section)
172fba4ad4cSHermès Bélusca-Maïto {
173fba4ad4cSHermès Bélusca-Maïto PINFCACHESECTION Next;
174fba4ad4cSHermès Bélusca-Maïto
175fba4ad4cSHermès Bélusca-Maïto if (Section == NULL)
176fba4ad4cSHermès Bélusca-Maïto {
177fba4ad4cSHermès Bélusca-Maïto return NULL;
178fba4ad4cSHermès Bélusca-Maïto }
179fba4ad4cSHermès Bélusca-Maïto
180fba4ad4cSHermès Bélusca-Maïto /* Release all keys */
181fba4ad4cSHermès Bélusca-Maïto Next = Section->Next;
182fba4ad4cSHermès Bélusca-Maïto while (Section->FirstLine != NULL)
183fba4ad4cSHermès Bélusca-Maïto {
184fba4ad4cSHermès Bélusca-Maïto Section->FirstLine = InfpCacheFreeLine(Section->FirstLine);
185fba4ad4cSHermès Bélusca-Maïto }
186fba4ad4cSHermès Bélusca-Maïto Section->LastLine = NULL;
187fba4ad4cSHermès Bélusca-Maïto
188fba4ad4cSHermès Bélusca-Maïto FrLdrTempFree(Section, TAG_INF_SECTION);
189fba4ad4cSHermès Bélusca-Maïto
190fba4ad4cSHermès Bélusca-Maïto return Next;
191fba4ad4cSHermès Bélusca-Maïto }
192fba4ad4cSHermès Bélusca-Maïto
193fba4ad4cSHermès Bélusca-Maïto
194fba4ad4cSHermès Bélusca-Maïto static
195fba4ad4cSHermès Bélusca-Maïto PINFCACHESECTION
InfpCacheFindSection(PINFCACHE Cache,PCSTR Name)196fba4ad4cSHermès Bélusca-Maïto InfpCacheFindSection(
197fba4ad4cSHermès Bélusca-Maïto PINFCACHE Cache,
198fba4ad4cSHermès Bélusca-Maïto PCSTR Name)
199fba4ad4cSHermès Bélusca-Maïto {
200fba4ad4cSHermès Bélusca-Maïto PINFCACHESECTION Section = NULL;
201fba4ad4cSHermès Bélusca-Maïto
202fba4ad4cSHermès Bélusca-Maïto if (Cache == NULL || Name == NULL)
203fba4ad4cSHermès Bélusca-Maïto {
204fba4ad4cSHermès Bélusca-Maïto return NULL;
205fba4ad4cSHermès Bélusca-Maïto }
206fba4ad4cSHermès Bélusca-Maïto
207fba4ad4cSHermès Bélusca-Maïto /* iterate through list of sections */
208fba4ad4cSHermès Bélusca-Maïto Section = Cache->FirstSection;
209fba4ad4cSHermès Bélusca-Maïto while (Section != NULL)
210fba4ad4cSHermès Bélusca-Maïto {
211fba4ad4cSHermès Bélusca-Maïto if (_stricmp(Section->Name, Name) == 0)
212fba4ad4cSHermès Bélusca-Maïto {
213fba4ad4cSHermès Bélusca-Maïto return Section;
214fba4ad4cSHermès Bélusca-Maïto }
215fba4ad4cSHermès Bélusca-Maïto
216fba4ad4cSHermès Bélusca-Maïto /* get the next section*/
217fba4ad4cSHermès Bélusca-Maïto Section = Section->Next;
218fba4ad4cSHermès Bélusca-Maïto }
219fba4ad4cSHermès Bélusca-Maïto
220fba4ad4cSHermès Bélusca-Maïto return NULL;
221fba4ad4cSHermès Bélusca-Maïto }
222fba4ad4cSHermès Bélusca-Maïto
223fba4ad4cSHermès Bélusca-Maïto
224fba4ad4cSHermès Bélusca-Maïto static
225fba4ad4cSHermès Bélusca-Maïto PINFCACHESECTION
InfpCacheAddSection(PINFCACHE Cache,PCSTR Name)226fba4ad4cSHermès Bélusca-Maïto InfpCacheAddSection(
227fba4ad4cSHermès Bélusca-Maïto PINFCACHE Cache,
228*eeb4cbcbSHermès Bélusca-Maïto PCSTR Name)
229fba4ad4cSHermès Bélusca-Maïto {
230fba4ad4cSHermès Bélusca-Maïto PINFCACHESECTION Section = NULL;
231fba4ad4cSHermès Bélusca-Maïto SIZE_T Size;
232fba4ad4cSHermès Bélusca-Maïto
233fba4ad4cSHermès Bélusca-Maïto if ((Cache == NULL) || (Name == NULL))
234fba4ad4cSHermès Bélusca-Maïto {
235fba4ad4cSHermès Bélusca-Maïto // DPRINT("Invalid parameter\n");
236fba4ad4cSHermès Bélusca-Maïto return NULL;
237fba4ad4cSHermès Bélusca-Maïto }
238fba4ad4cSHermès Bélusca-Maïto
239fba4ad4cSHermès Bélusca-Maïto /* Allocate and initialize the new section */
240fba4ad4cSHermès Bélusca-Maïto Size = sizeof(INFCACHESECTION) + strlen(Name);
241fba4ad4cSHermès Bélusca-Maïto Section = (PINFCACHESECTION)FrLdrTempAlloc(Size, TAG_INF_SECTION);
242fba4ad4cSHermès Bélusca-Maïto if (Section == NULL)
243fba4ad4cSHermès Bélusca-Maïto {
244fba4ad4cSHermès Bélusca-Maïto // DPRINT("RtlAllocateHeap() failed\n");
245fba4ad4cSHermès Bélusca-Maïto return NULL;
246fba4ad4cSHermès Bélusca-Maïto }
247fba4ad4cSHermès Bélusca-Maïto memset(Section, 0, Size);
248fba4ad4cSHermès Bélusca-Maïto
249fba4ad4cSHermès Bélusca-Maïto /* Copy section name */
250fba4ad4cSHermès Bélusca-Maïto strcpy(Section->Name, Name);
251fba4ad4cSHermès Bélusca-Maïto
252fba4ad4cSHermès Bélusca-Maïto /* Append section */
253fba4ad4cSHermès Bélusca-Maïto if (Cache->FirstSection == NULL)
254fba4ad4cSHermès Bélusca-Maïto {
255fba4ad4cSHermès Bélusca-Maïto Cache->FirstSection = Section;
256fba4ad4cSHermès Bélusca-Maïto Cache->LastSection = Section;
257fba4ad4cSHermès Bélusca-Maïto }
258fba4ad4cSHermès Bélusca-Maïto else
259fba4ad4cSHermès Bélusca-Maïto {
260fba4ad4cSHermès Bélusca-Maïto Cache->LastSection->Next = Section;
261fba4ad4cSHermès Bélusca-Maïto Section->Prev = Cache->LastSection;
262fba4ad4cSHermès Bélusca-Maïto Cache->LastSection = Section;
263fba4ad4cSHermès Bélusca-Maïto }
264fba4ad4cSHermès Bélusca-Maïto
265fba4ad4cSHermès Bélusca-Maïto return Section;
266fba4ad4cSHermès Bélusca-Maïto }
267fba4ad4cSHermès Bélusca-Maïto
268fba4ad4cSHermès Bélusca-Maïto
269fba4ad4cSHermès Bélusca-Maïto static
270fba4ad4cSHermès Bélusca-Maïto PINFCACHELINE
InfpCacheAddLine(PINFCACHESECTION Section)271fba4ad4cSHermès Bélusca-Maïto InfpCacheAddLine(PINFCACHESECTION Section)
272fba4ad4cSHermès Bélusca-Maïto {
273fba4ad4cSHermès Bélusca-Maïto PINFCACHELINE Line;
274fba4ad4cSHermès Bélusca-Maïto
275fba4ad4cSHermès Bélusca-Maïto if (Section == NULL)
276fba4ad4cSHermès Bélusca-Maïto {
277fba4ad4cSHermès Bélusca-Maïto // DPRINT("Invalid parameter\n");
278fba4ad4cSHermès Bélusca-Maïto return NULL;
279fba4ad4cSHermès Bélusca-Maïto }
280fba4ad4cSHermès Bélusca-Maïto
281fba4ad4cSHermès Bélusca-Maïto Line = (PINFCACHELINE)FrLdrTempAlloc(sizeof(INFCACHELINE), TAG_INF_LINE);
282fba4ad4cSHermès Bélusca-Maïto if (Line == NULL)
283fba4ad4cSHermès Bélusca-Maïto {
284fba4ad4cSHermès Bélusca-Maïto // DPRINT("RtlAllocateHeap() failed\n");
285fba4ad4cSHermès Bélusca-Maïto return NULL;
286fba4ad4cSHermès Bélusca-Maïto }
287fba4ad4cSHermès Bélusca-Maïto memset(Line, 0, sizeof(INFCACHELINE));
288fba4ad4cSHermès Bélusca-Maïto
289fba4ad4cSHermès Bélusca-Maïto /* Append line */
290fba4ad4cSHermès Bélusca-Maïto if (Section->FirstLine == NULL)
291fba4ad4cSHermès Bélusca-Maïto {
292fba4ad4cSHermès Bélusca-Maïto Section->FirstLine = Line;
293fba4ad4cSHermès Bélusca-Maïto Section->LastLine = Line;
294fba4ad4cSHermès Bélusca-Maïto }
295fba4ad4cSHermès Bélusca-Maïto else
296fba4ad4cSHermès Bélusca-Maïto {
297fba4ad4cSHermès Bélusca-Maïto Section->LastLine->Next = Line;
298fba4ad4cSHermès Bélusca-Maïto Line->Prev = Section->LastLine;
299fba4ad4cSHermès Bélusca-Maïto Section->LastLine = Line;
300fba4ad4cSHermès Bélusca-Maïto }
301fba4ad4cSHermès Bélusca-Maïto Section->LineCount++;
302fba4ad4cSHermès Bélusca-Maïto
303fba4ad4cSHermès Bélusca-Maïto return Line;
304fba4ad4cSHermès Bélusca-Maïto }
305fba4ad4cSHermès Bélusca-Maïto
306fba4ad4cSHermès Bélusca-Maïto
307fba4ad4cSHermès Bélusca-Maïto static
308fba4ad4cSHermès Bélusca-Maïto PVOID
InfpAddKeyToLine(PINFCACHELINE Line,PCSTR Key)309fba4ad4cSHermès Bélusca-Maïto InfpAddKeyToLine(
310fba4ad4cSHermès Bélusca-Maïto PINFCACHELINE Line,
311*eeb4cbcbSHermès Bélusca-Maïto PCSTR Key)
312fba4ad4cSHermès Bélusca-Maïto {
313fba4ad4cSHermès Bélusca-Maïto if (Line == NULL)
314fba4ad4cSHermès Bélusca-Maïto return NULL;
315fba4ad4cSHermès Bélusca-Maïto
316fba4ad4cSHermès Bélusca-Maïto if (Line->Key != NULL)
317fba4ad4cSHermès Bélusca-Maïto return NULL;
318fba4ad4cSHermès Bélusca-Maïto
319fba4ad4cSHermès Bélusca-Maïto Line->Key = FrLdrTempAlloc(strlen(Key) + 1, TAG_INF_KEY);
320fba4ad4cSHermès Bélusca-Maïto if (Line->Key == NULL)
321fba4ad4cSHermès Bélusca-Maïto return NULL;
322fba4ad4cSHermès Bélusca-Maïto
323fba4ad4cSHermès Bélusca-Maïto strcpy(Line->Key, Key);
324fba4ad4cSHermès Bélusca-Maïto
325fba4ad4cSHermès Bélusca-Maïto return (PVOID)Line->Key;
326fba4ad4cSHermès Bélusca-Maïto }
327fba4ad4cSHermès Bélusca-Maïto
328fba4ad4cSHermès Bélusca-Maïto
329fba4ad4cSHermès Bélusca-Maïto static
330fba4ad4cSHermès Bélusca-Maïto PVOID
InfpAddFieldToLine(PINFCACHELINE Line,PCSTR Data)331fba4ad4cSHermès Bélusca-Maïto InfpAddFieldToLine(
332fba4ad4cSHermès Bélusca-Maïto PINFCACHELINE Line,
333*eeb4cbcbSHermès Bélusca-Maïto PCSTR Data)
334fba4ad4cSHermès Bélusca-Maïto {
335fba4ad4cSHermès Bélusca-Maïto PINFCACHEFIELD Field;
336fba4ad4cSHermès Bélusca-Maïto SIZE_T Size;
337fba4ad4cSHermès Bélusca-Maïto
338fba4ad4cSHermès Bélusca-Maïto Size = sizeof(INFCACHEFIELD) + strlen(Data);
339fba4ad4cSHermès Bélusca-Maïto Field = (PINFCACHEFIELD)FrLdrTempAlloc(Size, TAG_INF_FIELD);
340fba4ad4cSHermès Bélusca-Maïto if (Field == NULL)
341fba4ad4cSHermès Bélusca-Maïto {
342fba4ad4cSHermès Bélusca-Maïto return NULL;
343fba4ad4cSHermès Bélusca-Maïto }
344fba4ad4cSHermès Bélusca-Maïto memset(Field, 0, Size);
345fba4ad4cSHermès Bélusca-Maïto
346fba4ad4cSHermès Bélusca-Maïto strcpy(Field->Data, Data);
347fba4ad4cSHermès Bélusca-Maïto
348fba4ad4cSHermès Bélusca-Maïto /* Append key */
349fba4ad4cSHermès Bélusca-Maïto if (Line->FirstField == NULL)
350fba4ad4cSHermès Bélusca-Maïto {
351fba4ad4cSHermès Bélusca-Maïto Line->FirstField = Field;
352fba4ad4cSHermès Bélusca-Maïto Line->LastField = Field;
353fba4ad4cSHermès Bélusca-Maïto }
354fba4ad4cSHermès Bélusca-Maïto else
355fba4ad4cSHermès Bélusca-Maïto {
356fba4ad4cSHermès Bélusca-Maïto Line->LastField->Next = Field;
357fba4ad4cSHermès Bélusca-Maïto Field->Prev = Line->LastField;
358fba4ad4cSHermès Bélusca-Maïto Line->LastField = Field;
359fba4ad4cSHermès Bélusca-Maïto }
360fba4ad4cSHermès Bélusca-Maïto Line->FieldCount++;
361fba4ad4cSHermès Bélusca-Maïto
362fba4ad4cSHermès Bélusca-Maïto return (PVOID)Field;
363fba4ad4cSHermès Bélusca-Maïto }
364fba4ad4cSHermès Bélusca-Maïto
365fba4ad4cSHermès Bélusca-Maïto
366fba4ad4cSHermès Bélusca-Maïto static
367fba4ad4cSHermès Bélusca-Maïto PINFCACHELINE
InfpCacheFindKeyLine(PINFCACHESECTION Section,PCSTR Key)368fba4ad4cSHermès Bélusca-Maïto InfpCacheFindKeyLine(
369fba4ad4cSHermès Bélusca-Maïto PINFCACHESECTION Section,
370fba4ad4cSHermès Bélusca-Maïto PCSTR Key)
371fba4ad4cSHermès Bélusca-Maïto {
372fba4ad4cSHermès Bélusca-Maïto PINFCACHELINE Line;
373fba4ad4cSHermès Bélusca-Maïto
374fba4ad4cSHermès Bélusca-Maïto Line = Section->FirstLine;
375fba4ad4cSHermès Bélusca-Maïto while (Line != NULL)
376fba4ad4cSHermès Bélusca-Maïto {
377fba4ad4cSHermès Bélusca-Maïto if ((Line->Key != NULL) && (_stricmp(Line->Key, Key) == 0))
378fba4ad4cSHermès Bélusca-Maïto {
379fba4ad4cSHermès Bélusca-Maïto return Line;
380fba4ad4cSHermès Bélusca-Maïto }
381fba4ad4cSHermès Bélusca-Maïto
382fba4ad4cSHermès Bélusca-Maïto Line = Line->Next;
383fba4ad4cSHermès Bélusca-Maïto }
384fba4ad4cSHermès Bélusca-Maïto
385fba4ad4cSHermès Bélusca-Maïto return NULL;
386fba4ad4cSHermès Bélusca-Maïto }
387fba4ad4cSHermès Bélusca-Maïto
388fba4ad4cSHermès Bélusca-Maïto
389fba4ad4cSHermès Bélusca-Maïto /* push the current state on the parser stack */
push_state(struct parser * parser,enum parser_state state)390fba4ad4cSHermès Bélusca-Maïto __inline static void push_state(struct parser *parser, enum parser_state state)
391fba4ad4cSHermès Bélusca-Maïto {
392fba4ad4cSHermès Bélusca-Maïto // assert(parser->stack_pos < sizeof(parser->stack)/sizeof(parser->stack[0]));
393fba4ad4cSHermès Bélusca-Maïto parser->stack[parser->stack_pos++] = state;
394fba4ad4cSHermès Bélusca-Maïto }
395fba4ad4cSHermès Bélusca-Maïto
396fba4ad4cSHermès Bélusca-Maïto
397fba4ad4cSHermès Bélusca-Maïto /* pop the current state */
pop_state(struct parser * parser)398fba4ad4cSHermès Bélusca-Maïto __inline static void pop_state(struct parser *parser)
399fba4ad4cSHermès Bélusca-Maïto {
400fba4ad4cSHermès Bélusca-Maïto // assert( parser->stack_pos );
401fba4ad4cSHermès Bélusca-Maïto parser->state = parser->stack[--parser->stack_pos];
402fba4ad4cSHermès Bélusca-Maïto }
403fba4ad4cSHermès Bélusca-Maïto
404fba4ad4cSHermès Bélusca-Maïto
405fba4ad4cSHermès Bélusca-Maïto /* set the parser state and return the previous one */
set_state(struct parser * parser,enum parser_state state)406fba4ad4cSHermès Bélusca-Maïto __inline static enum parser_state set_state(struct parser *parser, enum parser_state state)
407fba4ad4cSHermès Bélusca-Maïto {
408fba4ad4cSHermès Bélusca-Maïto enum parser_state ret = parser->state;
409fba4ad4cSHermès Bélusca-Maïto parser->state = state;
410fba4ad4cSHermès Bélusca-Maïto return ret;
411fba4ad4cSHermès Bélusca-Maïto }
412fba4ad4cSHermès Bélusca-Maïto
413fba4ad4cSHermès Bélusca-Maïto
414fba4ad4cSHermès Bélusca-Maïto /* check if the pointer points to an end of file */
is_eof(struct parser * parser,const CHAR * ptr)415fba4ad4cSHermès Bélusca-Maïto __inline static int is_eof(struct parser *parser, const CHAR *ptr)
416fba4ad4cSHermès Bélusca-Maïto {
417fba4ad4cSHermès Bélusca-Maïto return (ptr >= parser->end || *ptr == CONTROL_Z);
418fba4ad4cSHermès Bélusca-Maïto }
419fba4ad4cSHermès Bélusca-Maïto
420fba4ad4cSHermès Bélusca-Maïto
421fba4ad4cSHermès Bélusca-Maïto /* check if the pointer points to an end of line */
is_eol(struct parser * parser,const CHAR * ptr)422fba4ad4cSHermès Bélusca-Maïto __inline static int is_eol(struct parser *parser, const CHAR *ptr)
423fba4ad4cSHermès Bélusca-Maïto {
424fba4ad4cSHermès Bélusca-Maïto return ((ptr >= parser->end) ||
425fba4ad4cSHermès Bélusca-Maïto (*ptr == CONTROL_Z) ||
426fba4ad4cSHermès Bélusca-Maïto (*ptr == '\n') ||
427fba4ad4cSHermès Bélusca-Maïto ((*ptr == '\r') && (*(ptr + 1) == '\n')));
428fba4ad4cSHermès Bélusca-Maïto }
429fba4ad4cSHermès Bélusca-Maïto
430fba4ad4cSHermès Bélusca-Maïto
431fba4ad4cSHermès Bélusca-Maïto /* push data from current token start up to pos into the current token */
432fba4ad4cSHermès Bélusca-Maïto static
433fba4ad4cSHermès Bélusca-Maïto int
push_token(struct parser * parser,const CHAR * pos)434fba4ad4cSHermès Bélusca-Maïto push_token(
435fba4ad4cSHermès Bélusca-Maïto struct parser *parser,
436fba4ad4cSHermès Bélusca-Maïto const CHAR *pos)
437fba4ad4cSHermès Bélusca-Maïto {
438fba4ad4cSHermès Bélusca-Maïto SIZE_T len = pos - parser->start;
439fba4ad4cSHermès Bélusca-Maïto const CHAR *src = parser->start;
440fba4ad4cSHermès Bélusca-Maïto CHAR *dst = parser->token + parser->token_len;
441fba4ad4cSHermès Bélusca-Maïto
442fba4ad4cSHermès Bélusca-Maïto if (len > MAX_FIELD_LEN - parser->token_len)
443fba4ad4cSHermès Bélusca-Maïto len = MAX_FIELD_LEN - parser->token_len;
444fba4ad4cSHermès Bélusca-Maïto
445fba4ad4cSHermès Bélusca-Maïto parser->token_len += (ULONG)len;
446fba4ad4cSHermès Bélusca-Maïto for ( ; len > 0; len--, dst++, src++)
447fba4ad4cSHermès Bélusca-Maïto *dst = *src ? (CHAR)*src : L' ';
448fba4ad4cSHermès Bélusca-Maïto *dst = 0;
449fba4ad4cSHermès Bélusca-Maïto parser->start = pos;
450fba4ad4cSHermès Bélusca-Maïto
451fba4ad4cSHermès Bélusca-Maïto return 0;
452fba4ad4cSHermès Bélusca-Maïto }
453fba4ad4cSHermès Bélusca-Maïto
454fba4ad4cSHermès Bélusca-Maïto
455fba4ad4cSHermès Bélusca-Maïto /* add a section with the current token as name */
456fba4ad4cSHermès Bélusca-Maïto static
457fba4ad4cSHermès Bélusca-Maïto PVOID
add_section_from_token(struct parser * parser)458fba4ad4cSHermès Bélusca-Maïto add_section_from_token(struct parser *parser)
459fba4ad4cSHermès Bélusca-Maïto {
460fba4ad4cSHermès Bélusca-Maïto PINFCACHESECTION Section;
461fba4ad4cSHermès Bélusca-Maïto
462fba4ad4cSHermès Bélusca-Maïto if (parser->token_len > MAX_SECTION_NAME_LEN)
463fba4ad4cSHermès Bélusca-Maïto {
464fba4ad4cSHermès Bélusca-Maïto parser->error = FALSE;
465fba4ad4cSHermès Bélusca-Maïto return NULL;
466fba4ad4cSHermès Bélusca-Maïto }
467fba4ad4cSHermès Bélusca-Maïto
468fba4ad4cSHermès Bélusca-Maïto Section = InfpCacheFindSection(parser->file, parser->token);
469fba4ad4cSHermès Bélusca-Maïto if (Section == NULL)
470fba4ad4cSHermès Bélusca-Maïto {
471fba4ad4cSHermès Bélusca-Maïto /* need to create a new one */
472fba4ad4cSHermès Bélusca-Maïto Section = InfpCacheAddSection(parser->file, parser->token);
473fba4ad4cSHermès Bélusca-Maïto if (Section == NULL)
474fba4ad4cSHermès Bélusca-Maïto {
475fba4ad4cSHermès Bélusca-Maïto parser->error = FALSE;
476fba4ad4cSHermès Bélusca-Maïto return NULL;
477fba4ad4cSHermès Bélusca-Maïto }
478fba4ad4cSHermès Bélusca-Maïto }
479fba4ad4cSHermès Bélusca-Maïto
480fba4ad4cSHermès Bélusca-Maïto parser->token_len = 0;
481fba4ad4cSHermès Bélusca-Maïto parser->cur_section = Section;
482fba4ad4cSHermès Bélusca-Maïto
483fba4ad4cSHermès Bélusca-Maïto return (PVOID)Section;
484fba4ad4cSHermès Bélusca-Maïto }
485fba4ad4cSHermès Bélusca-Maïto
486fba4ad4cSHermès Bélusca-Maïto
487fba4ad4cSHermès Bélusca-Maïto /* add a field containing the current token to the current line */
488fba4ad4cSHermès Bélusca-Maïto static
489fba4ad4cSHermès Bélusca-Maïto struct field*
add_field_from_token(struct parser * parser,int is_key)490fba4ad4cSHermès Bélusca-Maïto add_field_from_token(
491fba4ad4cSHermès Bélusca-Maïto struct parser *parser,
492fba4ad4cSHermès Bélusca-Maïto int is_key)
493fba4ad4cSHermès Bélusca-Maïto {
494fba4ad4cSHermès Bélusca-Maïto PVOID field;
495fba4ad4cSHermès Bélusca-Maïto
496fba4ad4cSHermès Bélusca-Maïto if (!parser->line) /* need to start a new line */
497fba4ad4cSHermès Bélusca-Maïto {
498fba4ad4cSHermès Bélusca-Maïto if (parser->cur_section == NULL) /* got a line before the first section */
499fba4ad4cSHermès Bélusca-Maïto {
500fba4ad4cSHermès Bélusca-Maïto parser->error = STATUS_WRONG_INF_STYLE;
501fba4ad4cSHermès Bélusca-Maïto return NULL;
502fba4ad4cSHermès Bélusca-Maïto }
503fba4ad4cSHermès Bélusca-Maïto
504fba4ad4cSHermès Bélusca-Maïto parser->line = InfpCacheAddLine(parser->cur_section);
505fba4ad4cSHermès Bélusca-Maïto if (parser->line == NULL)
506fba4ad4cSHermès Bélusca-Maïto goto error;
507fba4ad4cSHermès Bélusca-Maïto }
508fba4ad4cSHermès Bélusca-Maïto else
509fba4ad4cSHermès Bélusca-Maïto {
510fba4ad4cSHermès Bélusca-Maïto // assert(!is_key);
511fba4ad4cSHermès Bélusca-Maïto }
512fba4ad4cSHermès Bélusca-Maïto
513fba4ad4cSHermès Bélusca-Maïto if (is_key)
514fba4ad4cSHermès Bélusca-Maïto {
515fba4ad4cSHermès Bélusca-Maïto field = InfpAddKeyToLine(parser->line, parser->token);
516fba4ad4cSHermès Bélusca-Maïto }
517fba4ad4cSHermès Bélusca-Maïto else
518fba4ad4cSHermès Bélusca-Maïto {
519fba4ad4cSHermès Bélusca-Maïto field = InfpAddFieldToLine(parser->line, parser->token);
520fba4ad4cSHermès Bélusca-Maïto }
521fba4ad4cSHermès Bélusca-Maïto
522fba4ad4cSHermès Bélusca-Maïto if (field != NULL)
523fba4ad4cSHermès Bélusca-Maïto {
524fba4ad4cSHermès Bélusca-Maïto parser->token_len = 0;
525fba4ad4cSHermès Bélusca-Maïto return field;
526fba4ad4cSHermès Bélusca-Maïto }
527fba4ad4cSHermès Bélusca-Maïto
528fba4ad4cSHermès Bélusca-Maïto error:
529fba4ad4cSHermès Bélusca-Maïto parser->error = FALSE;
530fba4ad4cSHermès Bélusca-Maïto return NULL;
531fba4ad4cSHermès Bélusca-Maïto }
532fba4ad4cSHermès Bélusca-Maïto
533fba4ad4cSHermès Bélusca-Maïto
534fba4ad4cSHermès Bélusca-Maïto /* close the current line and prepare for parsing a new one */
535fba4ad4cSHermès Bélusca-Maïto static
536fba4ad4cSHermès Bélusca-Maïto VOID
close_current_line(struct parser * parser)537fba4ad4cSHermès Bélusca-Maïto close_current_line(struct parser *parser)
538fba4ad4cSHermès Bélusca-Maïto {
539fba4ad4cSHermès Bélusca-Maïto parser->line = NULL;
540fba4ad4cSHermès Bélusca-Maïto }
541fba4ad4cSHermès Bélusca-Maïto
542fba4ad4cSHermès Bélusca-Maïto
543fba4ad4cSHermès Bélusca-Maïto /* handler for parser LINE_START state */
544fba4ad4cSHermès Bélusca-Maïto static
545fba4ad4cSHermès Bélusca-Maïto const CHAR*
line_start_state(struct parser * parser,const CHAR * pos)546fba4ad4cSHermès Bélusca-Maïto line_start_state(
547fba4ad4cSHermès Bélusca-Maïto struct parser *parser,
548fba4ad4cSHermès Bélusca-Maïto const CHAR *pos)
549fba4ad4cSHermès Bélusca-Maïto {
550fba4ad4cSHermès Bélusca-Maïto const CHAR *p;
551fba4ad4cSHermès Bélusca-Maïto
552fba4ad4cSHermès Bélusca-Maïto for (p = pos; !is_eof(parser, p); p++)
553fba4ad4cSHermès Bélusca-Maïto {
554fba4ad4cSHermès Bélusca-Maïto switch(*p)
555fba4ad4cSHermès Bélusca-Maïto {
556fba4ad4cSHermès Bélusca-Maïto case '\r':
557fba4ad4cSHermès Bélusca-Maïto continue;
558fba4ad4cSHermès Bélusca-Maïto
559fba4ad4cSHermès Bélusca-Maïto case '\n':
560fba4ad4cSHermès Bélusca-Maïto parser->line_pos++;
561fba4ad4cSHermès Bélusca-Maïto close_current_line(parser);
562fba4ad4cSHermès Bélusca-Maïto break;
563fba4ad4cSHermès Bélusca-Maïto
564fba4ad4cSHermès Bélusca-Maïto case ';':
565fba4ad4cSHermès Bélusca-Maïto push_state(parser, LINE_START);
566fba4ad4cSHermès Bélusca-Maïto set_state(parser, COMMENT);
567fba4ad4cSHermès Bélusca-Maïto return p + 1;
568fba4ad4cSHermès Bélusca-Maïto
569fba4ad4cSHermès Bélusca-Maïto case '[':
570fba4ad4cSHermès Bélusca-Maïto parser->start = p + 1;
571fba4ad4cSHermès Bélusca-Maïto set_state(parser, SECTION_NAME);
572fba4ad4cSHermès Bélusca-Maïto return p + 1;
573fba4ad4cSHermès Bélusca-Maïto
574fba4ad4cSHermès Bélusca-Maïto default:
575fba4ad4cSHermès Bélusca-Maïto if (!isspace((unsigned char)*p))
576fba4ad4cSHermès Bélusca-Maïto {
577fba4ad4cSHermès Bélusca-Maïto parser->start = p;
578fba4ad4cSHermès Bélusca-Maïto set_state(parser, KEY_NAME);
579fba4ad4cSHermès Bélusca-Maïto return p;
580fba4ad4cSHermès Bélusca-Maïto }
581fba4ad4cSHermès Bélusca-Maïto break;
582fba4ad4cSHermès Bélusca-Maïto }
583fba4ad4cSHermès Bélusca-Maïto }
584fba4ad4cSHermès Bélusca-Maïto close_current_line(parser);
585fba4ad4cSHermès Bélusca-Maïto return NULL;
586fba4ad4cSHermès Bélusca-Maïto }
587fba4ad4cSHermès Bélusca-Maïto
588fba4ad4cSHermès Bélusca-Maïto
589fba4ad4cSHermès Bélusca-Maïto /* handler for parser SECTION_NAME state */
590fba4ad4cSHermès Bélusca-Maïto static
591fba4ad4cSHermès Bélusca-Maïto const CHAR*
section_name_state(struct parser * parser,const CHAR * pos)592fba4ad4cSHermès Bélusca-Maïto section_name_state(
593fba4ad4cSHermès Bélusca-Maïto struct parser *parser,
594fba4ad4cSHermès Bélusca-Maïto const CHAR *pos)
595fba4ad4cSHermès Bélusca-Maïto {
596fba4ad4cSHermès Bélusca-Maïto const CHAR *p;
597fba4ad4cSHermès Bélusca-Maïto
598fba4ad4cSHermès Bélusca-Maïto for (p = pos; !is_eol(parser, p); p++)
599fba4ad4cSHermès Bélusca-Maïto {
600fba4ad4cSHermès Bélusca-Maïto if (*p == ']')
601fba4ad4cSHermès Bélusca-Maïto {
602fba4ad4cSHermès Bélusca-Maïto push_token(parser, p);
603fba4ad4cSHermès Bélusca-Maïto if (add_section_from_token(parser) == NULL)
604fba4ad4cSHermès Bélusca-Maïto return NULL;
605fba4ad4cSHermès Bélusca-Maïto push_state(parser, LINE_START);
606fba4ad4cSHermès Bélusca-Maïto set_state(parser, COMMENT); /* ignore everything else on the line */
607fba4ad4cSHermès Bélusca-Maïto return p + 1;
608fba4ad4cSHermès Bélusca-Maïto }
609fba4ad4cSHermès Bélusca-Maïto }
610fba4ad4cSHermès Bélusca-Maïto parser->error = STATUS_BAD_SECTION_NAME_LINE; /* unfinished section name */
611fba4ad4cSHermès Bélusca-Maïto return NULL;
612fba4ad4cSHermès Bélusca-Maïto }
613fba4ad4cSHermès Bélusca-Maïto
614fba4ad4cSHermès Bélusca-Maïto
615fba4ad4cSHermès Bélusca-Maïto /* handler for parser KEY_NAME state */
616fba4ad4cSHermès Bélusca-Maïto static
617fba4ad4cSHermès Bélusca-Maïto const CHAR*
key_name_state(struct parser * parser,const CHAR * pos)618fba4ad4cSHermès Bélusca-Maïto key_name_state(
619fba4ad4cSHermès Bélusca-Maïto struct parser *parser,
620fba4ad4cSHermès Bélusca-Maïto const CHAR *pos)
621fba4ad4cSHermès Bélusca-Maïto {
622fba4ad4cSHermès Bélusca-Maïto const CHAR *p, *token_end = parser->start;
623fba4ad4cSHermès Bélusca-Maïto
624fba4ad4cSHermès Bélusca-Maïto for (p = pos; !is_eol(parser, p); p++)
625fba4ad4cSHermès Bélusca-Maïto {
626fba4ad4cSHermès Bélusca-Maïto if (*p == ',') break;
627fba4ad4cSHermès Bélusca-Maïto switch(*p)
628fba4ad4cSHermès Bélusca-Maïto {
629fba4ad4cSHermès Bélusca-Maïto
630fba4ad4cSHermès Bélusca-Maïto case '=':
631fba4ad4cSHermès Bélusca-Maïto push_token(parser, token_end);
632fba4ad4cSHermès Bélusca-Maïto if (!add_field_from_token(parser, 1)) return NULL;
633fba4ad4cSHermès Bélusca-Maïto parser->start = p + 1;
634fba4ad4cSHermès Bélusca-Maïto push_state(parser, VALUE_NAME);
635fba4ad4cSHermès Bélusca-Maïto set_state(parser, LEADING_SPACES);
636fba4ad4cSHermès Bélusca-Maïto return p + 1;
637fba4ad4cSHermès Bélusca-Maïto case ';':
638fba4ad4cSHermès Bélusca-Maïto push_token(parser, token_end);
639fba4ad4cSHermès Bélusca-Maïto if (!add_field_from_token(parser, 0)) return NULL;
640fba4ad4cSHermès Bélusca-Maïto push_state(parser, LINE_START);
641fba4ad4cSHermès Bélusca-Maïto set_state(parser, COMMENT);
642fba4ad4cSHermès Bélusca-Maïto return p + 1;
643fba4ad4cSHermès Bélusca-Maïto case '"':
644fba4ad4cSHermès Bélusca-Maïto push_token(parser, token_end);
645fba4ad4cSHermès Bélusca-Maïto parser->start = p + 1;
646fba4ad4cSHermès Bélusca-Maïto push_state(parser, KEY_NAME);
647fba4ad4cSHermès Bélusca-Maïto set_state(parser, QUOTES);
648fba4ad4cSHermès Bélusca-Maïto return p + 1;
649fba4ad4cSHermès Bélusca-Maïto case '\\':
650fba4ad4cSHermès Bélusca-Maïto push_token(parser, token_end);
651fba4ad4cSHermès Bélusca-Maïto parser->start = p;
652fba4ad4cSHermès Bélusca-Maïto push_state(parser, KEY_NAME);
653fba4ad4cSHermès Bélusca-Maïto set_state(parser, EOL_BACKSLASH);
654fba4ad4cSHermès Bélusca-Maïto return p;
655fba4ad4cSHermès Bélusca-Maïto default:
656fba4ad4cSHermès Bélusca-Maïto if (!isspace((unsigned char)*p)) token_end = p + 1;
657fba4ad4cSHermès Bélusca-Maïto else
658fba4ad4cSHermès Bélusca-Maïto {
659fba4ad4cSHermès Bélusca-Maïto push_token(parser, p);
660fba4ad4cSHermès Bélusca-Maïto push_state(parser, KEY_NAME);
661fba4ad4cSHermès Bélusca-Maïto set_state(parser, TRAILING_SPACES);
662fba4ad4cSHermès Bélusca-Maïto return p;
663fba4ad4cSHermès Bélusca-Maïto }
664fba4ad4cSHermès Bélusca-Maïto break;
665fba4ad4cSHermès Bélusca-Maïto }
666fba4ad4cSHermès Bélusca-Maïto }
667fba4ad4cSHermès Bélusca-Maïto push_token(parser, token_end);
668fba4ad4cSHermès Bélusca-Maïto set_state(parser, VALUE_NAME);
669fba4ad4cSHermès Bélusca-Maïto return p;
670fba4ad4cSHermès Bélusca-Maïto }
671fba4ad4cSHermès Bélusca-Maïto
672fba4ad4cSHermès Bélusca-Maïto
673fba4ad4cSHermès Bélusca-Maïto /* handler for parser VALUE_NAME state */
674fba4ad4cSHermès Bélusca-Maïto static
675fba4ad4cSHermès Bélusca-Maïto const CHAR*
value_name_state(struct parser * parser,const CHAR * pos)676fba4ad4cSHermès Bélusca-Maïto value_name_state(
677fba4ad4cSHermès Bélusca-Maïto struct parser *parser,
678fba4ad4cSHermès Bélusca-Maïto const CHAR *pos)
679fba4ad4cSHermès Bélusca-Maïto {
680fba4ad4cSHermès Bélusca-Maïto const CHAR *p, *token_end = parser->start;
681fba4ad4cSHermès Bélusca-Maïto
682fba4ad4cSHermès Bélusca-Maïto for (p = pos; !is_eol(parser, p); p++)
683fba4ad4cSHermès Bélusca-Maïto {
684fba4ad4cSHermès Bélusca-Maïto switch(*p)
685fba4ad4cSHermès Bélusca-Maïto {
686fba4ad4cSHermès Bélusca-Maïto case ';':
687fba4ad4cSHermès Bélusca-Maïto push_token(parser, token_end);
688fba4ad4cSHermès Bélusca-Maïto if (!add_field_from_token(parser, 0)) return NULL;
689fba4ad4cSHermès Bélusca-Maïto push_state(parser, LINE_START);
690fba4ad4cSHermès Bélusca-Maïto set_state(parser, COMMENT);
691fba4ad4cSHermès Bélusca-Maïto return p + 1;
692fba4ad4cSHermès Bélusca-Maïto case ',':
693fba4ad4cSHermès Bélusca-Maïto push_token(parser, token_end);
694fba4ad4cSHermès Bélusca-Maïto if (!add_field_from_token(parser, 0)) return NULL;
695fba4ad4cSHermès Bélusca-Maïto parser->start = p + 1;
696fba4ad4cSHermès Bélusca-Maïto push_state(parser, VALUE_NAME);
697fba4ad4cSHermès Bélusca-Maïto set_state(parser, LEADING_SPACES);
698fba4ad4cSHermès Bélusca-Maïto return p + 1;
699fba4ad4cSHermès Bélusca-Maïto case '"':
700fba4ad4cSHermès Bélusca-Maïto push_token(parser, token_end);
701fba4ad4cSHermès Bélusca-Maïto parser->start = p + 1;
702fba4ad4cSHermès Bélusca-Maïto push_state(parser, VALUE_NAME);
703fba4ad4cSHermès Bélusca-Maïto set_state(parser, QUOTES);
704fba4ad4cSHermès Bélusca-Maïto return p + 1;
705fba4ad4cSHermès Bélusca-Maïto case '\\':
706fba4ad4cSHermès Bélusca-Maïto push_token(parser, token_end);
707fba4ad4cSHermès Bélusca-Maïto parser->start = p;
708fba4ad4cSHermès Bélusca-Maïto push_state(parser, VALUE_NAME);
709fba4ad4cSHermès Bélusca-Maïto set_state(parser, EOL_BACKSLASH);
710fba4ad4cSHermès Bélusca-Maïto return p;
711fba4ad4cSHermès Bélusca-Maïto default:
712fba4ad4cSHermès Bélusca-Maïto if (!isspace((unsigned char)*p)) token_end = p + 1;
713fba4ad4cSHermès Bélusca-Maïto else
714fba4ad4cSHermès Bélusca-Maïto {
715fba4ad4cSHermès Bélusca-Maïto push_token(parser, p);
716fba4ad4cSHermès Bélusca-Maïto push_state(parser, VALUE_NAME);
717fba4ad4cSHermès Bélusca-Maïto set_state(parser, TRAILING_SPACES);
718fba4ad4cSHermès Bélusca-Maïto return p;
719fba4ad4cSHermès Bélusca-Maïto }
720fba4ad4cSHermès Bélusca-Maïto break;
721fba4ad4cSHermès Bélusca-Maïto }
722fba4ad4cSHermès Bélusca-Maïto }
723fba4ad4cSHermès Bélusca-Maïto push_token(parser, token_end);
724fba4ad4cSHermès Bélusca-Maïto if (!add_field_from_token(parser, 0)) return NULL;
725fba4ad4cSHermès Bélusca-Maïto set_state(parser, LINE_START);
726fba4ad4cSHermès Bélusca-Maïto return p;
727fba4ad4cSHermès Bélusca-Maïto }
728fba4ad4cSHermès Bélusca-Maïto
729fba4ad4cSHermès Bélusca-Maïto
730fba4ad4cSHermès Bélusca-Maïto /* handler for parser EOL_BACKSLASH state */
731fba4ad4cSHermès Bélusca-Maïto static
732fba4ad4cSHermès Bélusca-Maïto const CHAR*
eol_backslash_state(struct parser * parser,const CHAR * pos)733fba4ad4cSHermès Bélusca-Maïto eol_backslash_state(
734fba4ad4cSHermès Bélusca-Maïto struct parser *parser,
735fba4ad4cSHermès Bélusca-Maïto const CHAR *pos )
736fba4ad4cSHermès Bélusca-Maïto {
737fba4ad4cSHermès Bélusca-Maïto const CHAR *p;
738fba4ad4cSHermès Bélusca-Maïto
739fba4ad4cSHermès Bélusca-Maïto for (p = pos; !is_eof(parser, p); p++)
740fba4ad4cSHermès Bélusca-Maïto {
741fba4ad4cSHermès Bélusca-Maïto switch(*p)
742fba4ad4cSHermès Bélusca-Maïto {
743fba4ad4cSHermès Bélusca-Maïto case '\r':
744fba4ad4cSHermès Bélusca-Maïto continue;
745fba4ad4cSHermès Bélusca-Maïto
746fba4ad4cSHermès Bélusca-Maïto case '\n':
747fba4ad4cSHermès Bélusca-Maïto parser->line_pos++;
748fba4ad4cSHermès Bélusca-Maïto parser->start = p + 1;
749fba4ad4cSHermès Bélusca-Maïto set_state(parser, LEADING_SPACES);
750fba4ad4cSHermès Bélusca-Maïto return p + 1;
751fba4ad4cSHermès Bélusca-Maïto
752fba4ad4cSHermès Bélusca-Maïto case '\\':
753fba4ad4cSHermès Bélusca-Maïto continue;
754fba4ad4cSHermès Bélusca-Maïto
755fba4ad4cSHermès Bélusca-Maïto case ';':
756fba4ad4cSHermès Bélusca-Maïto push_state(parser, EOL_BACKSLASH);
757fba4ad4cSHermès Bélusca-Maïto set_state(parser, COMMENT);
758fba4ad4cSHermès Bélusca-Maïto return p + 1;
759fba4ad4cSHermès Bélusca-Maïto
760fba4ad4cSHermès Bélusca-Maïto default:
761fba4ad4cSHermès Bélusca-Maïto if (isspace((unsigned char)*p))
762fba4ad4cSHermès Bélusca-Maïto continue;
763fba4ad4cSHermès Bélusca-Maïto push_token(parser, p);
764fba4ad4cSHermès Bélusca-Maïto pop_state(parser);
765fba4ad4cSHermès Bélusca-Maïto return p;
766fba4ad4cSHermès Bélusca-Maïto }
767fba4ad4cSHermès Bélusca-Maïto }
768fba4ad4cSHermès Bélusca-Maïto parser->start = p;
769fba4ad4cSHermès Bélusca-Maïto pop_state(parser);
770fba4ad4cSHermès Bélusca-Maïto
771fba4ad4cSHermès Bélusca-Maïto return p;
772fba4ad4cSHermès Bélusca-Maïto }
773fba4ad4cSHermès Bélusca-Maïto
774fba4ad4cSHermès Bélusca-Maïto
775fba4ad4cSHermès Bélusca-Maïto /* handler for parser QUOTES state */
776fba4ad4cSHermès Bélusca-Maïto static
777fba4ad4cSHermès Bélusca-Maïto const CHAR*
quotes_state(struct parser * parser,const CHAR * pos)778fba4ad4cSHermès Bélusca-Maïto quotes_state(
779fba4ad4cSHermès Bélusca-Maïto struct parser *parser,
780fba4ad4cSHermès Bélusca-Maïto const CHAR *pos )
781fba4ad4cSHermès Bélusca-Maïto {
782fba4ad4cSHermès Bélusca-Maïto const CHAR *p, *token_end = parser->start;
783fba4ad4cSHermès Bélusca-Maïto
784fba4ad4cSHermès Bélusca-Maïto for (p = pos; !is_eol(parser, p); p++)
785fba4ad4cSHermès Bélusca-Maïto {
786fba4ad4cSHermès Bélusca-Maïto if (*p == '"')
787fba4ad4cSHermès Bélusca-Maïto {
788fba4ad4cSHermès Bélusca-Maïto if (p + 1 < parser->end && p[1] == '"') /* double quotes */
789fba4ad4cSHermès Bélusca-Maïto {
790fba4ad4cSHermès Bélusca-Maïto push_token(parser, p + 1);
791fba4ad4cSHermès Bélusca-Maïto parser->start = token_end = p + 2;
792fba4ad4cSHermès Bélusca-Maïto p++;
793fba4ad4cSHermès Bélusca-Maïto }
794fba4ad4cSHermès Bélusca-Maïto else /* end of quotes */
795fba4ad4cSHermès Bélusca-Maïto {
796fba4ad4cSHermès Bélusca-Maïto push_token(parser, p);
797fba4ad4cSHermès Bélusca-Maïto parser->start = p + 1;
798fba4ad4cSHermès Bélusca-Maïto pop_state(parser);
799fba4ad4cSHermès Bélusca-Maïto return p + 1;
800fba4ad4cSHermès Bélusca-Maïto }
801fba4ad4cSHermès Bélusca-Maïto }
802fba4ad4cSHermès Bélusca-Maïto }
803fba4ad4cSHermès Bélusca-Maïto push_token(parser, p);
804fba4ad4cSHermès Bélusca-Maïto pop_state(parser);
805fba4ad4cSHermès Bélusca-Maïto return p;
806fba4ad4cSHermès Bélusca-Maïto }
807fba4ad4cSHermès Bélusca-Maïto
808fba4ad4cSHermès Bélusca-Maïto
809fba4ad4cSHermès Bélusca-Maïto /* handler for parser LEADING_SPACES state */
810fba4ad4cSHermès Bélusca-Maïto static
811fba4ad4cSHermès Bélusca-Maïto const CHAR*
leading_spaces_state(struct parser * parser,const CHAR * pos)812fba4ad4cSHermès Bélusca-Maïto leading_spaces_state(
813fba4ad4cSHermès Bélusca-Maïto struct parser *parser,
814fba4ad4cSHermès Bélusca-Maïto const CHAR *pos )
815fba4ad4cSHermès Bélusca-Maïto {
816fba4ad4cSHermès Bélusca-Maïto const CHAR *p;
817fba4ad4cSHermès Bélusca-Maïto
818fba4ad4cSHermès Bélusca-Maïto for (p = pos; !is_eol(parser, p); p++)
819fba4ad4cSHermès Bélusca-Maïto {
820fba4ad4cSHermès Bélusca-Maïto if (*p == '\\')
821fba4ad4cSHermès Bélusca-Maïto {
822fba4ad4cSHermès Bélusca-Maïto parser->start = p;
823fba4ad4cSHermès Bélusca-Maïto set_state(parser, EOL_BACKSLASH);
824fba4ad4cSHermès Bélusca-Maïto return p;
825fba4ad4cSHermès Bélusca-Maïto }
826fba4ad4cSHermès Bélusca-Maïto if (!isspace((unsigned char)*p))
827fba4ad4cSHermès Bélusca-Maïto break;
828fba4ad4cSHermès Bélusca-Maïto }
829fba4ad4cSHermès Bélusca-Maïto parser->start = p;
830fba4ad4cSHermès Bélusca-Maïto pop_state(parser);
831fba4ad4cSHermès Bélusca-Maïto return p;
832fba4ad4cSHermès Bélusca-Maïto }
833fba4ad4cSHermès Bélusca-Maïto
834fba4ad4cSHermès Bélusca-Maïto
835fba4ad4cSHermès Bélusca-Maïto /* handler for parser TRAILING_SPACES state */
836fba4ad4cSHermès Bélusca-Maïto static
837fba4ad4cSHermès Bélusca-Maïto const CHAR*
trailing_spaces_state(struct parser * parser,const CHAR * pos)838fba4ad4cSHermès Bélusca-Maïto trailing_spaces_state(
839fba4ad4cSHermès Bélusca-Maïto struct parser *parser,
840fba4ad4cSHermès Bélusca-Maïto const CHAR *pos )
841fba4ad4cSHermès Bélusca-Maïto {
842fba4ad4cSHermès Bélusca-Maïto const CHAR *p;
843fba4ad4cSHermès Bélusca-Maïto
844fba4ad4cSHermès Bélusca-Maïto for (p = pos; !is_eol(parser, p); p++)
845fba4ad4cSHermès Bélusca-Maïto {
846fba4ad4cSHermès Bélusca-Maïto if (*p == '\\')
847fba4ad4cSHermès Bélusca-Maïto {
848fba4ad4cSHermès Bélusca-Maïto set_state(parser, EOL_BACKSLASH);
849fba4ad4cSHermès Bélusca-Maïto return p;
850fba4ad4cSHermès Bélusca-Maïto }
851fba4ad4cSHermès Bélusca-Maïto if (!isspace((unsigned char)*p))
852fba4ad4cSHermès Bélusca-Maïto break;
853fba4ad4cSHermès Bélusca-Maïto }
854fba4ad4cSHermès Bélusca-Maïto pop_state(parser);
855fba4ad4cSHermès Bélusca-Maïto return p;
856fba4ad4cSHermès Bélusca-Maïto }
857fba4ad4cSHermès Bélusca-Maïto
858fba4ad4cSHermès Bélusca-Maïto
859fba4ad4cSHermès Bélusca-Maïto /* handler for parser COMMENT state */
860fba4ad4cSHermès Bélusca-Maïto static
861fba4ad4cSHermès Bélusca-Maïto const CHAR*
comment_state(struct parser * parser,const CHAR * pos)862fba4ad4cSHermès Bélusca-Maïto comment_state(
863fba4ad4cSHermès Bélusca-Maïto struct parser *parser,
864fba4ad4cSHermès Bélusca-Maïto const CHAR *pos )
865fba4ad4cSHermès Bélusca-Maïto {
866fba4ad4cSHermès Bélusca-Maïto const CHAR *p = pos;
867fba4ad4cSHermès Bélusca-Maïto
868fba4ad4cSHermès Bélusca-Maïto while (!is_eol(parser, p))
869fba4ad4cSHermès Bélusca-Maïto p++;
870fba4ad4cSHermès Bélusca-Maïto pop_state(parser);
871fba4ad4cSHermès Bélusca-Maïto return p;
872fba4ad4cSHermès Bélusca-Maïto }
873fba4ad4cSHermès Bélusca-Maïto
874fba4ad4cSHermès Bélusca-Maïto
875fba4ad4cSHermès Bélusca-Maïto /* parse a complete buffer */
876fba4ad4cSHermès Bélusca-Maïto static
877fba4ad4cSHermès Bélusca-Maïto BOOLEAN
InfpParseBuffer(PINFCACHE file,PCCHAR buffer,PCCHAR end,PULONG error_line)878fba4ad4cSHermès Bélusca-Maïto InfpParseBuffer (
879fba4ad4cSHermès Bélusca-Maïto PINFCACHE file,
880fba4ad4cSHermès Bélusca-Maïto PCCHAR buffer,
881fba4ad4cSHermès Bélusca-Maïto PCCHAR end,
882fba4ad4cSHermès Bélusca-Maïto PULONG error_line)
883fba4ad4cSHermès Bélusca-Maïto {
884fba4ad4cSHermès Bélusca-Maïto struct parser parser;
885fba4ad4cSHermès Bélusca-Maïto const CHAR* pos = buffer;
886fba4ad4cSHermès Bélusca-Maïto
887fba4ad4cSHermès Bélusca-Maïto parser.start = buffer;
888fba4ad4cSHermès Bélusca-Maïto parser.end = end;
889fba4ad4cSHermès Bélusca-Maïto parser.file = file;
890fba4ad4cSHermès Bélusca-Maïto parser.line = NULL;
891fba4ad4cSHermès Bélusca-Maïto parser.state = LINE_START;
892fba4ad4cSHermès Bélusca-Maïto parser.stack_pos = 0;
893fba4ad4cSHermès Bélusca-Maïto parser.cur_section = NULL;
894fba4ad4cSHermès Bélusca-Maïto parser.line_pos = 1;
895fba4ad4cSHermès Bélusca-Maïto parser.error = TRUE;
896fba4ad4cSHermès Bélusca-Maïto parser.token_len = 0;
897fba4ad4cSHermès Bélusca-Maïto
898fba4ad4cSHermès Bélusca-Maïto /* parser main loop */
899fba4ad4cSHermès Bélusca-Maïto while (pos)
900fba4ad4cSHermès Bélusca-Maïto pos = (parser_funcs[parser.state])(&parser, pos);
901fba4ad4cSHermès Bélusca-Maïto
902fba4ad4cSHermès Bélusca-Maïto if (parser.error)
903fba4ad4cSHermès Bélusca-Maïto {
904fba4ad4cSHermès Bélusca-Maïto if (error_line)
905fba4ad4cSHermès Bélusca-Maïto *error_line = parser.line_pos;
906fba4ad4cSHermès Bélusca-Maïto return parser.error;
907fba4ad4cSHermès Bélusca-Maïto }
908fba4ad4cSHermès Bélusca-Maïto
909fba4ad4cSHermès Bélusca-Maïto /* find the [strings] section */
910fba4ad4cSHermès Bélusca-Maïto file->StringsSection = InfpCacheFindSection(file, "Strings");
911fba4ad4cSHermès Bélusca-Maïto
912fba4ad4cSHermès Bélusca-Maïto return TRUE;
913fba4ad4cSHermès Bélusca-Maïto }
914fba4ad4cSHermès Bélusca-Maïto
915fba4ad4cSHermès Bélusca-Maïto /* PUBLIC FUNCTIONS *********************************************************/
916fba4ad4cSHermès Bélusca-Maïto
917fba4ad4cSHermès Bélusca-Maïto BOOLEAN
InfOpenFile(PHINF InfHandle,PCSTR FileName,PULONG ErrorLine)918fba4ad4cSHermès Bélusca-Maïto InfOpenFile(
919fba4ad4cSHermès Bélusca-Maïto PHINF InfHandle,
920fba4ad4cSHermès Bélusca-Maïto PCSTR FileName,
921fba4ad4cSHermès Bélusca-Maïto PULONG ErrorLine)
922fba4ad4cSHermès Bélusca-Maïto {
923fba4ad4cSHermès Bélusca-Maïto FILEINFORMATION Information;
924fba4ad4cSHermès Bélusca-Maïto ULONG FileId;
925fba4ad4cSHermès Bélusca-Maïto PCHAR FileBuffer;
926fba4ad4cSHermès Bélusca-Maïto ULONG FileSize, Count;
927fba4ad4cSHermès Bélusca-Maïto PINFCACHE Cache;
928fba4ad4cSHermès Bélusca-Maïto BOOLEAN Success;
929fba4ad4cSHermès Bélusca-Maïto ARC_STATUS Status;
930fba4ad4cSHermès Bélusca-Maïto
931fba4ad4cSHermès Bélusca-Maïto *InfHandle = NULL;
932fba4ad4cSHermès Bélusca-Maïto *ErrorLine = (ULONG) - 1;
933fba4ad4cSHermès Bélusca-Maïto
934fba4ad4cSHermès Bélusca-Maïto //
935fba4ad4cSHermès Bélusca-Maïto // Open the .inf file
936fba4ad4cSHermès Bélusca-Maïto //
937bd451f24SHermès Bélusca-Maïto Status = ArcOpen((PSTR)FileName, OpenReadOnly, &FileId);
938fba4ad4cSHermès Bélusca-Maïto if (Status != ESUCCESS)
939fba4ad4cSHermès Bélusca-Maïto {
940fba4ad4cSHermès Bélusca-Maïto return FALSE;
941fba4ad4cSHermès Bélusca-Maïto }
942fba4ad4cSHermès Bélusca-Maïto
943fba4ad4cSHermès Bélusca-Maïto //
944fba4ad4cSHermès Bélusca-Maïto // Query file size
945fba4ad4cSHermès Bélusca-Maïto //
946fba4ad4cSHermès Bélusca-Maïto Status = ArcGetFileInformation(FileId, &Information);
947fba4ad4cSHermès Bélusca-Maïto if ((Status != ESUCCESS) || (Information.EndingAddress.HighPart != 0))
948fba4ad4cSHermès Bélusca-Maïto {
949fba4ad4cSHermès Bélusca-Maïto ArcClose(FileId);
950fba4ad4cSHermès Bélusca-Maïto return FALSE;
951fba4ad4cSHermès Bélusca-Maïto }
952fba4ad4cSHermès Bélusca-Maïto FileSize = Information.EndingAddress.LowPart;
953fba4ad4cSHermès Bélusca-Maïto
954fba4ad4cSHermès Bélusca-Maïto //
955fba4ad4cSHermès Bélusca-Maïto // Allocate buffer to cache the file
956fba4ad4cSHermès Bélusca-Maïto //
957fba4ad4cSHermès Bélusca-Maïto FileBuffer = FrLdrTempAlloc(FileSize + 1, TAG_INF_FILE);
958fba4ad4cSHermès Bélusca-Maïto if (!FileBuffer)
959fba4ad4cSHermès Bélusca-Maïto {
960fba4ad4cSHermès Bélusca-Maïto ArcClose(FileId);
961fba4ad4cSHermès Bélusca-Maïto return FALSE;
962fba4ad4cSHermès Bélusca-Maïto }
963fba4ad4cSHermès Bélusca-Maïto
964fba4ad4cSHermès Bélusca-Maïto //
965fba4ad4cSHermès Bélusca-Maïto // Read file into memory
966fba4ad4cSHermès Bélusca-Maïto //
967fba4ad4cSHermès Bélusca-Maïto Status = ArcRead(FileId, FileBuffer, FileSize, &Count);
968fba4ad4cSHermès Bélusca-Maïto if ((Status != ESUCCESS) || (Count != FileSize))
969fba4ad4cSHermès Bélusca-Maïto {
970fba4ad4cSHermès Bélusca-Maïto ArcClose(FileId);
971fba4ad4cSHermès Bélusca-Maïto FrLdrTempFree(FileBuffer, TAG_INF_FILE);
972fba4ad4cSHermès Bélusca-Maïto return FALSE;
973fba4ad4cSHermès Bélusca-Maïto }
974fba4ad4cSHermès Bélusca-Maïto
975fba4ad4cSHermès Bélusca-Maïto //
976fba4ad4cSHermès Bélusca-Maïto // We don't need the file anymore. Close it
977fba4ad4cSHermès Bélusca-Maïto //
978fba4ad4cSHermès Bélusca-Maïto ArcClose(FileId);
979fba4ad4cSHermès Bélusca-Maïto
980fba4ad4cSHermès Bélusca-Maïto //
981fba4ad4cSHermès Bélusca-Maïto // Append string terminator
982fba4ad4cSHermès Bélusca-Maïto //
983fba4ad4cSHermès Bélusca-Maïto FileBuffer[FileSize] = 0;
984fba4ad4cSHermès Bélusca-Maïto
985fba4ad4cSHermès Bélusca-Maïto //
986fba4ad4cSHermès Bélusca-Maïto // Allocate infcache header
987fba4ad4cSHermès Bélusca-Maïto //
988fba4ad4cSHermès Bélusca-Maïto Cache = (PINFCACHE)FrLdrTempAlloc(sizeof(INFCACHE), TAG_INF_CACHE);
989fba4ad4cSHermès Bélusca-Maïto if (!Cache)
990fba4ad4cSHermès Bélusca-Maïto {
991fba4ad4cSHermès Bélusca-Maïto FrLdrTempFree(FileBuffer, TAG_INF_FILE);
992fba4ad4cSHermès Bélusca-Maïto return FALSE;
993fba4ad4cSHermès Bélusca-Maïto }
994fba4ad4cSHermès Bélusca-Maïto
995fba4ad4cSHermès Bélusca-Maïto //
996fba4ad4cSHermès Bélusca-Maïto // Initialize inicache header
997fba4ad4cSHermès Bélusca-Maïto //
998fba4ad4cSHermès Bélusca-Maïto RtlZeroMemory(Cache, sizeof(INFCACHE));
999fba4ad4cSHermès Bélusca-Maïto
1000fba4ad4cSHermès Bélusca-Maïto //
1001fba4ad4cSHermès Bélusca-Maïto // Parse the inf buffer
1002fba4ad4cSHermès Bélusca-Maïto //
1003fba4ad4cSHermès Bélusca-Maïto Success = InfpParseBuffer(Cache,
1004fba4ad4cSHermès Bélusca-Maïto FileBuffer,
1005fba4ad4cSHermès Bélusca-Maïto FileBuffer + FileSize,
1006fba4ad4cSHermès Bélusca-Maïto ErrorLine);
1007fba4ad4cSHermès Bélusca-Maïto if (!Success)
1008fba4ad4cSHermès Bélusca-Maïto {
1009fba4ad4cSHermès Bélusca-Maïto FrLdrTempFree(Cache, TAG_INF_CACHE);
1010fba4ad4cSHermès Bélusca-Maïto Cache = NULL;
1011fba4ad4cSHermès Bélusca-Maïto }
1012fba4ad4cSHermès Bélusca-Maïto
1013fba4ad4cSHermès Bélusca-Maïto //
1014fba4ad4cSHermès Bélusca-Maïto // Free file buffer, as it has been parsed
1015fba4ad4cSHermès Bélusca-Maïto //
1016fba4ad4cSHermès Bélusca-Maïto FrLdrTempFree(FileBuffer, TAG_INF_FILE);
1017fba4ad4cSHermès Bélusca-Maïto
1018fba4ad4cSHermès Bélusca-Maïto //
1019fba4ad4cSHermès Bélusca-Maïto // Return .inf parsed contents
1020fba4ad4cSHermès Bélusca-Maïto //
1021fba4ad4cSHermès Bélusca-Maïto *InfHandle = (HINF)Cache;
1022fba4ad4cSHermès Bélusca-Maïto
1023fba4ad4cSHermès Bélusca-Maïto return Success;
1024fba4ad4cSHermès Bélusca-Maïto }
1025fba4ad4cSHermès Bélusca-Maïto
1026fba4ad4cSHermès Bélusca-Maïto
1027fba4ad4cSHermès Bélusca-Maïto VOID
InfCloseFile(HINF InfHandle)1028fba4ad4cSHermès Bélusca-Maïto InfCloseFile(HINF InfHandle)
1029fba4ad4cSHermès Bélusca-Maïto {
1030fba4ad4cSHermès Bélusca-Maïto PINFCACHE Cache;
1031fba4ad4cSHermès Bélusca-Maïto
1032fba4ad4cSHermès Bélusca-Maïto Cache = (PINFCACHE)InfHandle;
1033fba4ad4cSHermès Bélusca-Maïto
1034fba4ad4cSHermès Bélusca-Maïto if (Cache == NULL)
1035fba4ad4cSHermès Bélusca-Maïto {
1036fba4ad4cSHermès Bélusca-Maïto return;
1037fba4ad4cSHermès Bélusca-Maïto }
1038fba4ad4cSHermès Bélusca-Maïto
1039fba4ad4cSHermès Bélusca-Maïto while (Cache->FirstSection != NULL)
1040fba4ad4cSHermès Bélusca-Maïto {
1041fba4ad4cSHermès Bélusca-Maïto Cache->FirstSection = InfpCacheFreeSection(Cache->FirstSection);
1042fba4ad4cSHermès Bélusca-Maïto }
1043fba4ad4cSHermès Bélusca-Maïto Cache->LastSection = NULL;
1044fba4ad4cSHermès Bélusca-Maïto
1045fba4ad4cSHermès Bélusca-Maïto FrLdrTempFree(Cache, TAG_INF_CACHE);
1046fba4ad4cSHermès Bélusca-Maïto }
1047fba4ad4cSHermès Bélusca-Maïto
1048fba4ad4cSHermès Bélusca-Maïto
1049fba4ad4cSHermès Bélusca-Maïto BOOLEAN
InfFindFirstLine(HINF InfHandle,PCSTR Section,PCSTR Key,PINFCONTEXT Context)1050fba4ad4cSHermès Bélusca-Maïto InfFindFirstLine (
1051fba4ad4cSHermès Bélusca-Maïto HINF InfHandle,
1052fba4ad4cSHermès Bélusca-Maïto PCSTR Section,
1053fba4ad4cSHermès Bélusca-Maïto PCSTR Key,
1054fba4ad4cSHermès Bélusca-Maïto PINFCONTEXT Context)
1055fba4ad4cSHermès Bélusca-Maïto {
1056fba4ad4cSHermès Bélusca-Maïto PINFCACHE Cache;
1057fba4ad4cSHermès Bélusca-Maïto PINFCACHESECTION CacheSection;
1058fba4ad4cSHermès Bélusca-Maïto PINFCACHELINE CacheLine;
1059fba4ad4cSHermès Bélusca-Maïto
1060fba4ad4cSHermès Bélusca-Maïto if ((InfHandle == NULL) || (Section == NULL) || (Context == NULL))
1061fba4ad4cSHermès Bélusca-Maïto {
1062fba4ad4cSHermès Bélusca-Maïto // DPRINT("Invalid parameter\n");
1063fba4ad4cSHermès Bélusca-Maïto return FALSE;
1064fba4ad4cSHermès Bélusca-Maïto }
1065fba4ad4cSHermès Bélusca-Maïto
1066fba4ad4cSHermès Bélusca-Maïto Cache = (PINFCACHE)InfHandle;
1067fba4ad4cSHermès Bélusca-Maïto
1068fba4ad4cSHermès Bélusca-Maïto /* Iterate through list of sections */
1069fba4ad4cSHermès Bélusca-Maïto CacheSection = Cache->FirstSection;
1070eeeca29cSHermès Bélusca-Maïto while (CacheSection != NULL)
1071fba4ad4cSHermès Bélusca-Maïto {
1072eeeca29cSHermès Bélusca-Maïto // DPRINT("Comparing '%s' and '%s'\n", CacheSection->Name, Section);
1073fba4ad4cSHermès Bélusca-Maïto
1074fba4ad4cSHermès Bélusca-Maïto /* Are the section names the same? */
1075fba4ad4cSHermès Bélusca-Maïto if (_stricmp(CacheSection->Name, Section) == 0)
1076fba4ad4cSHermès Bélusca-Maïto {
1077fba4ad4cSHermès Bélusca-Maïto if (Key != NULL)
1078fba4ad4cSHermès Bélusca-Maïto {
1079fba4ad4cSHermès Bélusca-Maïto CacheLine = InfpCacheFindKeyLine(CacheSection, Key);
1080fba4ad4cSHermès Bélusca-Maïto }
1081fba4ad4cSHermès Bélusca-Maïto else
1082fba4ad4cSHermès Bélusca-Maïto {
1083fba4ad4cSHermès Bélusca-Maïto CacheLine = CacheSection->FirstLine;
1084fba4ad4cSHermès Bélusca-Maïto }
1085fba4ad4cSHermès Bélusca-Maïto
1086fba4ad4cSHermès Bélusca-Maïto if (CacheLine == NULL)
1087fba4ad4cSHermès Bélusca-Maïto return FALSE;
1088fba4ad4cSHermès Bélusca-Maïto
1089fba4ad4cSHermès Bélusca-Maïto Context->Inf = (PVOID)Cache;
1090fba4ad4cSHermès Bélusca-Maïto Context->Section = (PVOID)CacheSection;
1091fba4ad4cSHermès Bélusca-Maïto Context->Line = (PVOID)CacheLine;
1092fba4ad4cSHermès Bélusca-Maïto
1093fba4ad4cSHermès Bélusca-Maïto return TRUE;
1094fba4ad4cSHermès Bélusca-Maïto }
1095fba4ad4cSHermès Bélusca-Maïto
1096fba4ad4cSHermès Bélusca-Maïto /* Get the next section */
1097fba4ad4cSHermès Bélusca-Maïto CacheSection = CacheSection->Next;
1098fba4ad4cSHermès Bélusca-Maïto }
1099fba4ad4cSHermès Bélusca-Maïto
1100fba4ad4cSHermès Bélusca-Maïto // DPRINT("Section not found\n");
1101fba4ad4cSHermès Bélusca-Maïto
1102fba4ad4cSHermès Bélusca-Maïto return FALSE;
1103fba4ad4cSHermès Bélusca-Maïto }
1104fba4ad4cSHermès Bélusca-Maïto
1105fba4ad4cSHermès Bélusca-Maïto
1106fba4ad4cSHermès Bélusca-Maïto BOOLEAN
InfFindNextLine(PINFCONTEXT ContextIn,PINFCONTEXT ContextOut)1107fba4ad4cSHermès Bélusca-Maïto InfFindNextLine (
1108fba4ad4cSHermès Bélusca-Maïto PINFCONTEXT ContextIn,
1109fba4ad4cSHermès Bélusca-Maïto PINFCONTEXT ContextOut)
1110fba4ad4cSHermès Bélusca-Maïto {
1111fba4ad4cSHermès Bélusca-Maïto PINFCACHELINE CacheLine;
1112fba4ad4cSHermès Bélusca-Maïto
1113fba4ad4cSHermès Bélusca-Maïto if ((ContextIn == NULL) || (ContextOut == NULL))
1114fba4ad4cSHermès Bélusca-Maïto return FALSE;
1115fba4ad4cSHermès Bélusca-Maïto
1116fba4ad4cSHermès Bélusca-Maïto if (ContextIn->Line == NULL)
1117fba4ad4cSHermès Bélusca-Maïto return FALSE;
1118fba4ad4cSHermès Bélusca-Maïto
1119fba4ad4cSHermès Bélusca-Maïto CacheLine = (PINFCACHELINE)ContextIn->Line;
1120fba4ad4cSHermès Bélusca-Maïto if (CacheLine->Next == NULL)
1121fba4ad4cSHermès Bélusca-Maïto return FALSE;
1122fba4ad4cSHermès Bélusca-Maïto
1123fba4ad4cSHermès Bélusca-Maïto if (ContextIn != ContextOut)
1124fba4ad4cSHermès Bélusca-Maïto {
1125fba4ad4cSHermès Bélusca-Maïto ContextOut->Inf = ContextIn->Inf;
1126fba4ad4cSHermès Bélusca-Maïto ContextOut->Section = ContextIn->Section;
1127fba4ad4cSHermès Bélusca-Maïto }
1128fba4ad4cSHermès Bélusca-Maïto ContextOut->Line = (PVOID)(CacheLine->Next);
1129fba4ad4cSHermès Bélusca-Maïto
1130fba4ad4cSHermès Bélusca-Maïto return TRUE;
1131fba4ad4cSHermès Bélusca-Maïto }
1132fba4ad4cSHermès Bélusca-Maïto
1133fba4ad4cSHermès Bélusca-Maïto
1134fba4ad4cSHermès Bélusca-Maïto BOOLEAN
InfFindFirstMatchLine(PINFCONTEXT ContextIn,PCSTR Key,PINFCONTEXT ContextOut)1135fba4ad4cSHermès Bélusca-Maïto InfFindFirstMatchLine (
1136fba4ad4cSHermès Bélusca-Maïto PINFCONTEXT ContextIn,
1137*eeb4cbcbSHermès Bélusca-Maïto PCSTR Key,
1138fba4ad4cSHermès Bélusca-Maïto PINFCONTEXT ContextOut)
1139fba4ad4cSHermès Bélusca-Maïto {
1140fba4ad4cSHermès Bélusca-Maïto PINFCACHELINE CacheLine;
1141fba4ad4cSHermès Bélusca-Maïto
1142fba4ad4cSHermès Bélusca-Maïto if ((ContextIn == NULL) || (ContextOut == NULL) || (Key == NULL) || (*Key == 0))
1143fba4ad4cSHermès Bélusca-Maïto return FALSE;
1144fba4ad4cSHermès Bélusca-Maïto
1145fba4ad4cSHermès Bélusca-Maïto if (ContextIn->Inf == NULL || ContextIn->Section == NULL)
1146fba4ad4cSHermès Bélusca-Maïto return FALSE;
1147fba4ad4cSHermès Bélusca-Maïto
1148fba4ad4cSHermès Bélusca-Maïto CacheLine = ((PINFCACHESECTION)(ContextIn->Section))->FirstLine;
1149fba4ad4cSHermès Bélusca-Maïto while (CacheLine != NULL)
1150fba4ad4cSHermès Bélusca-Maïto {
1151fba4ad4cSHermès Bélusca-Maïto if ((CacheLine->Key != NULL) && (_stricmp(CacheLine->Key, Key) == 0))
1152fba4ad4cSHermès Bélusca-Maïto {
1153fba4ad4cSHermès Bélusca-Maïto
1154fba4ad4cSHermès Bélusca-Maïto if (ContextIn != ContextOut)
1155fba4ad4cSHermès Bélusca-Maïto {
1156fba4ad4cSHermès Bélusca-Maïto ContextOut->Inf = ContextIn->Inf;
1157fba4ad4cSHermès Bélusca-Maïto ContextOut->Section = ContextIn->Section;
1158fba4ad4cSHermès Bélusca-Maïto }
1159fba4ad4cSHermès Bélusca-Maïto ContextOut->Line = (PVOID)CacheLine;
1160fba4ad4cSHermès Bélusca-Maïto
1161fba4ad4cSHermès Bélusca-Maïto return TRUE;
1162fba4ad4cSHermès Bélusca-Maïto }
1163fba4ad4cSHermès Bélusca-Maïto
1164fba4ad4cSHermès Bélusca-Maïto CacheLine = CacheLine->Next;
1165fba4ad4cSHermès Bélusca-Maïto }
1166fba4ad4cSHermès Bélusca-Maïto
1167fba4ad4cSHermès Bélusca-Maïto return FALSE;
1168fba4ad4cSHermès Bélusca-Maïto }
1169fba4ad4cSHermès Bélusca-Maïto
1170fba4ad4cSHermès Bélusca-Maïto
1171fba4ad4cSHermès Bélusca-Maïto BOOLEAN
InfFindNextMatchLine(PINFCONTEXT ContextIn,PCSTR Key,PINFCONTEXT ContextOut)1172fba4ad4cSHermès Bélusca-Maïto InfFindNextMatchLine (
1173fba4ad4cSHermès Bélusca-Maïto PINFCONTEXT ContextIn,
1174*eeb4cbcbSHermès Bélusca-Maïto PCSTR Key,
1175fba4ad4cSHermès Bélusca-Maïto PINFCONTEXT ContextOut)
1176fba4ad4cSHermès Bélusca-Maïto {
1177fba4ad4cSHermès Bélusca-Maïto PINFCACHELINE CacheLine;
1178fba4ad4cSHermès Bélusca-Maïto
1179fba4ad4cSHermès Bélusca-Maïto if ((ContextIn == NULL) || (ContextOut == NULL) || (Key == NULL) || (*Key == 0))
1180fba4ad4cSHermès Bélusca-Maïto return FALSE;
1181fba4ad4cSHermès Bélusca-Maïto
1182fba4ad4cSHermès Bélusca-Maïto if ((ContextIn->Inf == NULL) || (ContextIn->Section == NULL) || (ContextIn->Line == NULL))
1183fba4ad4cSHermès Bélusca-Maïto return FALSE;
1184fba4ad4cSHermès Bélusca-Maïto
1185fba4ad4cSHermès Bélusca-Maïto CacheLine = (PINFCACHELINE)ContextIn->Line;
1186fba4ad4cSHermès Bélusca-Maïto while (CacheLine != NULL)
1187fba4ad4cSHermès Bélusca-Maïto {
1188fba4ad4cSHermès Bélusca-Maïto if ((CacheLine->Key != NULL) && (_stricmp(CacheLine->Key, Key) == 0))
1189fba4ad4cSHermès Bélusca-Maïto {
1190fba4ad4cSHermès Bélusca-Maïto
1191fba4ad4cSHermès Bélusca-Maïto if (ContextIn != ContextOut)
1192fba4ad4cSHermès Bélusca-Maïto {
1193fba4ad4cSHermès Bélusca-Maïto ContextOut->Inf = ContextIn->Inf;
1194fba4ad4cSHermès Bélusca-Maïto ContextOut->Section = ContextIn->Section;
1195fba4ad4cSHermès Bélusca-Maïto }
1196fba4ad4cSHermès Bélusca-Maïto ContextOut->Line = (PVOID)CacheLine;
1197fba4ad4cSHermès Bélusca-Maïto
1198fba4ad4cSHermès Bélusca-Maïto return TRUE;
1199fba4ad4cSHermès Bélusca-Maïto }
1200fba4ad4cSHermès Bélusca-Maïto
1201fba4ad4cSHermès Bélusca-Maïto CacheLine = CacheLine->Next;
1202fba4ad4cSHermès Bélusca-Maïto }
1203fba4ad4cSHermès Bélusca-Maïto
1204fba4ad4cSHermès Bélusca-Maïto return FALSE;
1205fba4ad4cSHermès Bélusca-Maïto }
1206fba4ad4cSHermès Bélusca-Maïto
1207fba4ad4cSHermès Bélusca-Maïto
1208fba4ad4cSHermès Bélusca-Maïto LONG
InfGetLineCount(HINF InfHandle,PCSTR Section)1209fba4ad4cSHermès Bélusca-Maïto InfGetLineCount(
1210fba4ad4cSHermès Bélusca-Maïto HINF InfHandle,
1211*eeb4cbcbSHermès Bélusca-Maïto PCSTR Section)
1212fba4ad4cSHermès Bélusca-Maïto {
1213fba4ad4cSHermès Bélusca-Maïto PINFCACHE Cache;
1214fba4ad4cSHermès Bélusca-Maïto PINFCACHESECTION CacheSection;
1215fba4ad4cSHermès Bélusca-Maïto
1216fba4ad4cSHermès Bélusca-Maïto if ((InfHandle == NULL) || (Section == NULL))
1217fba4ad4cSHermès Bélusca-Maïto {
1218fba4ad4cSHermès Bélusca-Maïto // DPRINT("Invalid parameter\n");
1219fba4ad4cSHermès Bélusca-Maïto return -1;
1220fba4ad4cSHermès Bélusca-Maïto }
1221fba4ad4cSHermès Bélusca-Maïto
1222fba4ad4cSHermès Bélusca-Maïto Cache = (PINFCACHE)InfHandle;
1223fba4ad4cSHermès Bélusca-Maïto
1224fba4ad4cSHermès Bélusca-Maïto /* Iterate through list of sections */
1225fba4ad4cSHermès Bélusca-Maïto CacheSection = Cache->FirstSection;
1226eeeca29cSHermès Bélusca-Maïto while (CacheSection != NULL)
1227fba4ad4cSHermès Bélusca-Maïto {
1228eeeca29cSHermès Bélusca-Maïto // DPRINT("Comparing '%s' and '%s'\n", CacheSection->Name, Section);
1229fba4ad4cSHermès Bélusca-Maïto
1230fba4ad4cSHermès Bélusca-Maïto /* Are the section names the same? */
1231fba4ad4cSHermès Bélusca-Maïto if (_stricmp(CacheSection->Name, Section) == 0)
1232fba4ad4cSHermès Bélusca-Maïto {
1233fba4ad4cSHermès Bélusca-Maïto return CacheSection->LineCount;
1234fba4ad4cSHermès Bélusca-Maïto }
1235fba4ad4cSHermès Bélusca-Maïto
1236fba4ad4cSHermès Bélusca-Maïto /* Get the next section */
1237fba4ad4cSHermès Bélusca-Maïto CacheSection = CacheSection->Next;
1238fba4ad4cSHermès Bélusca-Maïto }
1239fba4ad4cSHermès Bélusca-Maïto
1240fba4ad4cSHermès Bélusca-Maïto // DPRINT("Section not found\n");
1241fba4ad4cSHermès Bélusca-Maïto
1242fba4ad4cSHermès Bélusca-Maïto return -1;
1243fba4ad4cSHermès Bélusca-Maïto }
1244fba4ad4cSHermès Bélusca-Maïto
1245fba4ad4cSHermès Bélusca-Maïto
1246fba4ad4cSHermès Bélusca-Maïto /* InfGetLineText */
1247fba4ad4cSHermès Bélusca-Maïto
1248fba4ad4cSHermès Bélusca-Maïto
1249fba4ad4cSHermès Bélusca-Maïto LONG
InfGetFieldCount(PINFCONTEXT Context)1250fba4ad4cSHermès Bélusca-Maïto InfGetFieldCount(PINFCONTEXT Context)
1251fba4ad4cSHermès Bélusca-Maïto {
1252fba4ad4cSHermès Bélusca-Maïto if ((Context == NULL) || (Context->Line == NULL))
1253fba4ad4cSHermès Bélusca-Maïto return 0;
1254fba4ad4cSHermès Bélusca-Maïto
1255fba4ad4cSHermès Bélusca-Maïto return ((PINFCACHELINE)Context->Line)->FieldCount;
1256fba4ad4cSHermès Bélusca-Maïto }
1257fba4ad4cSHermès Bélusca-Maïto
1258fba4ad4cSHermès Bélusca-Maïto
1259fba4ad4cSHermès Bélusca-Maïto BOOLEAN
InfGetBinaryField(PINFCONTEXT Context,ULONG FieldIndex,PUCHAR ReturnBuffer,ULONG ReturnBufferSize,PULONG RequiredSize)1260fba4ad4cSHermès Bélusca-Maïto InfGetBinaryField (
1261fba4ad4cSHermès Bélusca-Maïto PINFCONTEXT Context,
1262fba4ad4cSHermès Bélusca-Maïto ULONG FieldIndex,
1263fba4ad4cSHermès Bélusca-Maïto PUCHAR ReturnBuffer,
1264fba4ad4cSHermès Bélusca-Maïto ULONG ReturnBufferSize,
1265fba4ad4cSHermès Bélusca-Maïto PULONG RequiredSize)
1266fba4ad4cSHermès Bélusca-Maïto {
1267fba4ad4cSHermès Bélusca-Maïto PINFCACHELINE CacheLine;
1268fba4ad4cSHermès Bélusca-Maïto PINFCACHEFIELD CacheField;
1269fba4ad4cSHermès Bélusca-Maïto ULONG Index;
1270fba4ad4cSHermès Bélusca-Maïto ULONG Size;
1271fba4ad4cSHermès Bélusca-Maïto PUCHAR Ptr;
1272fba4ad4cSHermès Bélusca-Maïto
1273fba4ad4cSHermès Bélusca-Maïto if ((Context == NULL) || (Context->Line == NULL) || (FieldIndex == 0))
1274fba4ad4cSHermès Bélusca-Maïto {
1275fba4ad4cSHermès Bélusca-Maïto // DPRINT("Invalid parameter\n");
1276fba4ad4cSHermès Bélusca-Maïto return FALSE;
1277fba4ad4cSHermès Bélusca-Maïto }
1278fba4ad4cSHermès Bélusca-Maïto
1279fba4ad4cSHermès Bélusca-Maïto if (RequiredSize != NULL)
1280fba4ad4cSHermès Bélusca-Maïto *RequiredSize = 0;
1281fba4ad4cSHermès Bélusca-Maïto
1282fba4ad4cSHermès Bélusca-Maïto CacheLine = (PINFCACHELINE)Context->Line;
1283fba4ad4cSHermès Bélusca-Maïto
1284fba4ad4cSHermès Bélusca-Maïto if (FieldIndex > CacheLine->FieldCount)
1285fba4ad4cSHermès Bélusca-Maïto return FALSE;
1286fba4ad4cSHermès Bélusca-Maïto
1287fba4ad4cSHermès Bélusca-Maïto CacheField = CacheLine->FirstField;
1288fba4ad4cSHermès Bélusca-Maïto for (Index = 1; Index < FieldIndex; Index++)
1289fba4ad4cSHermès Bélusca-Maïto CacheField = CacheField->Next;
1290fba4ad4cSHermès Bélusca-Maïto
1291fba4ad4cSHermès Bélusca-Maïto Size = CacheLine->FieldCount - FieldIndex + 1;
1292fba4ad4cSHermès Bélusca-Maïto
1293fba4ad4cSHermès Bélusca-Maïto if (RequiredSize != NULL)
1294fba4ad4cSHermès Bélusca-Maïto *RequiredSize = Size;
1295fba4ad4cSHermès Bélusca-Maïto
1296fba4ad4cSHermès Bélusca-Maïto if (ReturnBuffer != NULL)
1297fba4ad4cSHermès Bélusca-Maïto {
1298fba4ad4cSHermès Bélusca-Maïto if (ReturnBufferSize < Size)
1299fba4ad4cSHermès Bélusca-Maïto return FALSE;
1300fba4ad4cSHermès Bélusca-Maïto
1301fba4ad4cSHermès Bélusca-Maïto /* Copy binary data */
1302fba4ad4cSHermès Bélusca-Maïto Ptr = ReturnBuffer;
1303fba4ad4cSHermès Bélusca-Maïto while (CacheField != NULL)
1304fba4ad4cSHermès Bélusca-Maïto {
1305fba4ad4cSHermès Bélusca-Maïto *Ptr = (UCHAR)atoi(CacheField->Data); //strtoul(CacheField->Data, NULL, 16);
1306fba4ad4cSHermès Bélusca-Maïto
1307fba4ad4cSHermès Bélusca-Maïto Ptr++;
1308fba4ad4cSHermès Bélusca-Maïto CacheField = CacheField->Next;
1309fba4ad4cSHermès Bélusca-Maïto }
1310fba4ad4cSHermès Bélusca-Maïto }
1311fba4ad4cSHermès Bélusca-Maïto
1312fba4ad4cSHermès Bélusca-Maïto return TRUE;
1313fba4ad4cSHermès Bélusca-Maïto }
1314fba4ad4cSHermès Bélusca-Maïto
1315fba4ad4cSHermès Bélusca-Maïto
1316fba4ad4cSHermès Bélusca-Maïto BOOLEAN
InfGetIntField(PINFCONTEXT Context,ULONG FieldIndex,PLONG IntegerValue)1317fba4ad4cSHermès Bélusca-Maïto InfGetIntField (
1318fba4ad4cSHermès Bélusca-Maïto PINFCONTEXT Context,
1319fba4ad4cSHermès Bélusca-Maïto ULONG FieldIndex,
1320fba4ad4cSHermès Bélusca-Maïto PLONG IntegerValue)
1321fba4ad4cSHermès Bélusca-Maïto {
1322fba4ad4cSHermès Bélusca-Maïto PINFCACHELINE CacheLine;
1323fba4ad4cSHermès Bélusca-Maïto PINFCACHEFIELD CacheField;
1324fba4ad4cSHermès Bélusca-Maïto ULONG Index;
1325fba4ad4cSHermès Bélusca-Maïto PCHAR Ptr;
1326fba4ad4cSHermès Bélusca-Maïto
1327fba4ad4cSHermès Bélusca-Maïto if ((Context == NULL) || (Context->Line == NULL) || (IntegerValue == NULL))
1328fba4ad4cSHermès Bélusca-Maïto {
1329fba4ad4cSHermès Bélusca-Maïto // DPRINT("Invalid parameter\n");
1330fba4ad4cSHermès Bélusca-Maïto return FALSE;
1331fba4ad4cSHermès Bélusca-Maïto }
1332fba4ad4cSHermès Bélusca-Maïto
1333fba4ad4cSHermès Bélusca-Maïto CacheLine = (PINFCACHELINE)Context->Line;
1334fba4ad4cSHermès Bélusca-Maïto
1335fba4ad4cSHermès Bélusca-Maïto if (FieldIndex > CacheLine->FieldCount)
1336fba4ad4cSHermès Bélusca-Maïto {
1337fba4ad4cSHermès Bélusca-Maïto // DPRINT("Invalid parameter\n");
1338fba4ad4cSHermès Bélusca-Maïto return FALSE;
1339fba4ad4cSHermès Bélusca-Maïto }
1340fba4ad4cSHermès Bélusca-Maïto
1341fba4ad4cSHermès Bélusca-Maïto if (FieldIndex == 0)
1342fba4ad4cSHermès Bélusca-Maïto {
1343fba4ad4cSHermès Bélusca-Maïto Ptr = CacheLine->Key;
1344fba4ad4cSHermès Bélusca-Maïto }
1345fba4ad4cSHermès Bélusca-Maïto else
1346fba4ad4cSHermès Bélusca-Maïto {
1347fba4ad4cSHermès Bélusca-Maïto CacheField = CacheLine->FirstField;
1348fba4ad4cSHermès Bélusca-Maïto for (Index = 1; Index < FieldIndex; Index++)
1349fba4ad4cSHermès Bélusca-Maïto CacheField = CacheField->Next;
1350fba4ad4cSHermès Bélusca-Maïto
1351fba4ad4cSHermès Bélusca-Maïto Ptr = CacheField->Data;
1352fba4ad4cSHermès Bélusca-Maïto }
1353fba4ad4cSHermès Bélusca-Maïto
1354fba4ad4cSHermès Bélusca-Maïto *IntegerValue = atoi(Ptr); //strtol(Ptr, NULL, 0);
1355fba4ad4cSHermès Bélusca-Maïto
1356fba4ad4cSHermès Bélusca-Maïto return TRUE;
1357fba4ad4cSHermès Bélusca-Maïto }
1358fba4ad4cSHermès Bélusca-Maïto
1359fba4ad4cSHermès Bélusca-Maïto
1360fba4ad4cSHermès Bélusca-Maïto BOOLEAN
InfGetMultiSzField(PINFCONTEXT Context,ULONG FieldIndex,PCHAR ReturnBuffer,ULONG ReturnBufferSize,PULONG RequiredSize)1361fba4ad4cSHermès Bélusca-Maïto InfGetMultiSzField (
1362fba4ad4cSHermès Bélusca-Maïto PINFCONTEXT Context,
1363fba4ad4cSHermès Bélusca-Maïto ULONG FieldIndex,
1364fba4ad4cSHermès Bélusca-Maïto PCHAR ReturnBuffer,
1365fba4ad4cSHermès Bélusca-Maïto ULONG ReturnBufferSize,
1366fba4ad4cSHermès Bélusca-Maïto PULONG RequiredSize)
1367fba4ad4cSHermès Bélusca-Maïto {
1368fba4ad4cSHermès Bélusca-Maïto PINFCACHELINE CacheLine;
1369fba4ad4cSHermès Bélusca-Maïto PINFCACHEFIELD CacheField;
1370fba4ad4cSHermès Bélusca-Maïto PINFCACHEFIELD FieldPtr;
1371fba4ad4cSHermès Bélusca-Maïto ULONG Index;
1372fba4ad4cSHermès Bélusca-Maïto SIZE_T Size;
1373fba4ad4cSHermès Bélusca-Maïto PCHAR Ptr;
1374fba4ad4cSHermès Bélusca-Maïto
1375fba4ad4cSHermès Bélusca-Maïto if ((Context == NULL) || (Context->Line == NULL) || (FieldIndex == 0))
1376fba4ad4cSHermès Bélusca-Maïto {
1377fba4ad4cSHermès Bélusca-Maïto // DPRINT("Invalid parameter\n");
1378fba4ad4cSHermès Bélusca-Maïto return FALSE;
1379fba4ad4cSHermès Bélusca-Maïto }
1380fba4ad4cSHermès Bélusca-Maïto
1381fba4ad4cSHermès Bélusca-Maïto if (RequiredSize != NULL)
1382fba4ad4cSHermès Bélusca-Maïto *RequiredSize = 0;
1383fba4ad4cSHermès Bélusca-Maïto
1384fba4ad4cSHermès Bélusca-Maïto CacheLine = (PINFCACHELINE)Context->Line;
1385fba4ad4cSHermès Bélusca-Maïto
1386fba4ad4cSHermès Bélusca-Maïto if (FieldIndex > CacheLine->FieldCount)
1387fba4ad4cSHermès Bélusca-Maïto return FALSE;
1388fba4ad4cSHermès Bélusca-Maïto
1389fba4ad4cSHermès Bélusca-Maïto CacheField = CacheLine->FirstField;
1390fba4ad4cSHermès Bélusca-Maïto for (Index = 1; Index < FieldIndex; Index++)
1391fba4ad4cSHermès Bélusca-Maïto CacheField = CacheField->Next;
1392fba4ad4cSHermès Bélusca-Maïto
1393fba4ad4cSHermès Bélusca-Maïto /* Calculate the required buffer size */
1394fba4ad4cSHermès Bélusca-Maïto FieldPtr = CacheField;
1395fba4ad4cSHermès Bélusca-Maïto Size = 0;
1396fba4ad4cSHermès Bélusca-Maïto while (FieldPtr != NULL)
1397fba4ad4cSHermès Bélusca-Maïto {
1398fba4ad4cSHermès Bélusca-Maïto Size += (strlen(FieldPtr->Data) + 1);
1399fba4ad4cSHermès Bélusca-Maïto FieldPtr = FieldPtr->Next;
1400fba4ad4cSHermès Bélusca-Maïto }
1401fba4ad4cSHermès Bélusca-Maïto Size++;
1402fba4ad4cSHermès Bélusca-Maïto
1403fba4ad4cSHermès Bélusca-Maïto if (RequiredSize != NULL)
1404fba4ad4cSHermès Bélusca-Maïto *RequiredSize = (ULONG)Size;
1405fba4ad4cSHermès Bélusca-Maïto
1406fba4ad4cSHermès Bélusca-Maïto if (ReturnBuffer != NULL)
1407fba4ad4cSHermès Bélusca-Maïto {
1408fba4ad4cSHermès Bélusca-Maïto if (ReturnBufferSize < Size)
1409fba4ad4cSHermès Bélusca-Maïto return FALSE;
1410fba4ad4cSHermès Bélusca-Maïto
1411fba4ad4cSHermès Bélusca-Maïto /* Copy multi-sz string */
1412fba4ad4cSHermès Bélusca-Maïto Ptr = ReturnBuffer;
1413fba4ad4cSHermès Bélusca-Maïto FieldPtr = CacheField;
1414fba4ad4cSHermès Bélusca-Maïto while (FieldPtr != NULL)
1415fba4ad4cSHermès Bélusca-Maïto {
1416fba4ad4cSHermès Bélusca-Maïto Size = strlen(FieldPtr->Data) + 1;
1417fba4ad4cSHermès Bélusca-Maïto
1418fba4ad4cSHermès Bélusca-Maïto strcpy(Ptr, FieldPtr->Data);
1419fba4ad4cSHermès Bélusca-Maïto
1420fba4ad4cSHermès Bélusca-Maïto Ptr = Ptr + Size;
1421fba4ad4cSHermès Bélusca-Maïto FieldPtr = FieldPtr->Next;
1422fba4ad4cSHermès Bélusca-Maïto }
1423fba4ad4cSHermès Bélusca-Maïto *Ptr = 0;
1424fba4ad4cSHermès Bélusca-Maïto }
1425fba4ad4cSHermès Bélusca-Maïto
1426fba4ad4cSHermès Bélusca-Maïto return TRUE;
1427fba4ad4cSHermès Bélusca-Maïto }
1428fba4ad4cSHermès Bélusca-Maïto
1429fba4ad4cSHermès Bélusca-Maïto
1430fba4ad4cSHermès Bélusca-Maïto BOOLEAN
InfGetStringField(PINFCONTEXT Context,ULONG FieldIndex,PCHAR ReturnBuffer,ULONG ReturnBufferSize,PULONG RequiredSize)1431fba4ad4cSHermès Bélusca-Maïto InfGetStringField (
1432fba4ad4cSHermès Bélusca-Maïto PINFCONTEXT Context,
1433fba4ad4cSHermès Bélusca-Maïto ULONG FieldIndex,
1434fba4ad4cSHermès Bélusca-Maïto PCHAR ReturnBuffer,
1435fba4ad4cSHermès Bélusca-Maïto ULONG ReturnBufferSize,
1436fba4ad4cSHermès Bélusca-Maïto PULONG RequiredSize)
1437fba4ad4cSHermès Bélusca-Maïto {
1438fba4ad4cSHermès Bélusca-Maïto PINFCACHELINE CacheLine;
1439fba4ad4cSHermès Bélusca-Maïto PINFCACHEFIELD CacheField;
1440fba4ad4cSHermès Bélusca-Maïto ULONG Index;
1441fba4ad4cSHermès Bélusca-Maïto PCHAR Ptr;
1442fba4ad4cSHermès Bélusca-Maïto SIZE_T Size;
1443fba4ad4cSHermès Bélusca-Maïto
1444fba4ad4cSHermès Bélusca-Maïto if ((Context == NULL) || (Context->Line == NULL))
1445fba4ad4cSHermès Bélusca-Maïto {
1446fba4ad4cSHermès Bélusca-Maïto // DPRINT("Invalid parameter\n");
1447fba4ad4cSHermès Bélusca-Maïto return FALSE;
1448fba4ad4cSHermès Bélusca-Maïto }
1449fba4ad4cSHermès Bélusca-Maïto
1450fba4ad4cSHermès Bélusca-Maïto if (RequiredSize != NULL)
1451fba4ad4cSHermès Bélusca-Maïto *RequiredSize = 0;
1452fba4ad4cSHermès Bélusca-Maïto
1453fba4ad4cSHermès Bélusca-Maïto CacheLine = (PINFCACHELINE)Context->Line;
1454fba4ad4cSHermès Bélusca-Maïto
1455fba4ad4cSHermès Bélusca-Maïto if (FieldIndex > CacheLine->FieldCount)
1456fba4ad4cSHermès Bélusca-Maïto return FALSE;
1457fba4ad4cSHermès Bélusca-Maïto
1458fba4ad4cSHermès Bélusca-Maïto if (FieldIndex == 0)
1459fba4ad4cSHermès Bélusca-Maïto {
1460fba4ad4cSHermès Bélusca-Maïto Ptr = CacheLine->Key;
1461fba4ad4cSHermès Bélusca-Maïto }
1462fba4ad4cSHermès Bélusca-Maïto else
1463fba4ad4cSHermès Bélusca-Maïto {
1464fba4ad4cSHermès Bélusca-Maïto CacheField = CacheLine->FirstField;
1465fba4ad4cSHermès Bélusca-Maïto for (Index = 1; Index < FieldIndex; Index++)
1466fba4ad4cSHermès Bélusca-Maïto CacheField = CacheField->Next;
1467fba4ad4cSHermès Bélusca-Maïto
1468fba4ad4cSHermès Bélusca-Maïto Ptr = CacheField->Data;
1469fba4ad4cSHermès Bélusca-Maïto }
1470fba4ad4cSHermès Bélusca-Maïto
1471fba4ad4cSHermès Bélusca-Maïto Size = strlen(Ptr) + 1;
1472fba4ad4cSHermès Bélusca-Maïto
1473fba4ad4cSHermès Bélusca-Maïto if (RequiredSize != NULL)
1474fba4ad4cSHermès Bélusca-Maïto *RequiredSize = (ULONG)Size;
1475fba4ad4cSHermès Bélusca-Maïto
1476fba4ad4cSHermès Bélusca-Maïto if (ReturnBuffer != NULL)
1477fba4ad4cSHermès Bélusca-Maïto {
1478fba4ad4cSHermès Bélusca-Maïto if (ReturnBufferSize < Size)
1479fba4ad4cSHermès Bélusca-Maïto return FALSE;
1480fba4ad4cSHermès Bélusca-Maïto
1481fba4ad4cSHermès Bélusca-Maïto strcpy(ReturnBuffer, Ptr);
1482fba4ad4cSHermès Bélusca-Maïto }
1483fba4ad4cSHermès Bélusca-Maïto
1484fba4ad4cSHermès Bélusca-Maïto return TRUE;
1485fba4ad4cSHermès Bélusca-Maïto }
1486fba4ad4cSHermès Bélusca-Maïto
1487fba4ad4cSHermès Bélusca-Maïto
1488fba4ad4cSHermès Bélusca-Maïto
1489fba4ad4cSHermès Bélusca-Maïto
1490fba4ad4cSHermès Bélusca-Maïto BOOLEAN
InfGetData(PINFCONTEXT Context,PCSTR * Key,PCSTR * Data)1491fba4ad4cSHermès Bélusca-Maïto InfGetData (
1492fba4ad4cSHermès Bélusca-Maïto PINFCONTEXT Context,
1493*eeb4cbcbSHermès Bélusca-Maïto PCSTR *Key,
1494*eeb4cbcbSHermès Bélusca-Maïto PCSTR *Data)
1495fba4ad4cSHermès Bélusca-Maïto {
1496fba4ad4cSHermès Bélusca-Maïto PINFCACHELINE CacheKey;
1497fba4ad4cSHermès Bélusca-Maïto
1498fba4ad4cSHermès Bélusca-Maïto if ((Context == NULL) || (Context->Line == NULL) || (Data == NULL))
1499fba4ad4cSHermès Bélusca-Maïto {
1500fba4ad4cSHermès Bélusca-Maïto // DPRINT("Invalid parameter\n");
1501fba4ad4cSHermès Bélusca-Maïto return FALSE;
1502fba4ad4cSHermès Bélusca-Maïto }
1503fba4ad4cSHermès Bélusca-Maïto
1504fba4ad4cSHermès Bélusca-Maïto CacheKey = (PINFCACHELINE)Context->Line;
1505fba4ad4cSHermès Bélusca-Maïto if (Key != NULL)
1506fba4ad4cSHermès Bélusca-Maïto *Key = CacheKey->Key;
1507fba4ad4cSHermès Bélusca-Maïto
150825e1235fSSerge Gautherie *Data = (CacheKey->FirstField == NULL) ? NULL : CacheKey->FirstField->Data;
1509fba4ad4cSHermès Bélusca-Maïto
1510fba4ad4cSHermès Bélusca-Maïto return TRUE;
1511fba4ad4cSHermès Bélusca-Maïto }
1512fba4ad4cSHermès Bélusca-Maïto
1513fba4ad4cSHermès Bélusca-Maïto
1514fba4ad4cSHermès Bélusca-Maïto BOOLEAN
InfGetDataField(PINFCONTEXT Context,ULONG FieldIndex,PCSTR * Data)1515fba4ad4cSHermès Bélusca-Maïto InfGetDataField (
1516fba4ad4cSHermès Bélusca-Maïto PINFCONTEXT Context,
1517fba4ad4cSHermès Bélusca-Maïto ULONG FieldIndex,
1518fba4ad4cSHermès Bélusca-Maïto PCSTR *Data)
1519fba4ad4cSHermès Bélusca-Maïto {
1520fba4ad4cSHermès Bélusca-Maïto PINFCACHELINE CacheLine;
1521fba4ad4cSHermès Bélusca-Maïto PINFCACHEFIELD CacheField;
1522fba4ad4cSHermès Bélusca-Maïto ULONG Index;
1523fba4ad4cSHermès Bélusca-Maïto
1524fba4ad4cSHermès Bélusca-Maïto if ((Context == NULL) || (Context->Line == NULL) || (Data == NULL))
1525fba4ad4cSHermès Bélusca-Maïto {
1526fba4ad4cSHermès Bélusca-Maïto // DPRINT("Invalid parameter\n");
1527fba4ad4cSHermès Bélusca-Maïto return FALSE;
1528fba4ad4cSHermès Bélusca-Maïto }
1529fba4ad4cSHermès Bélusca-Maïto
1530fba4ad4cSHermès Bélusca-Maïto CacheLine = (PINFCACHELINE)Context->Line;
1531fba4ad4cSHermès Bélusca-Maïto
1532fba4ad4cSHermès Bélusca-Maïto if (FieldIndex > CacheLine->FieldCount)
1533fba4ad4cSHermès Bélusca-Maïto return FALSE;
1534fba4ad4cSHermès Bélusca-Maïto
1535fba4ad4cSHermès Bélusca-Maïto if (FieldIndex == 0)
1536fba4ad4cSHermès Bélusca-Maïto {
1537fba4ad4cSHermès Bélusca-Maïto *Data = CacheLine->Key;
1538fba4ad4cSHermès Bélusca-Maïto }
1539fba4ad4cSHermès Bélusca-Maïto else
1540fba4ad4cSHermès Bélusca-Maïto {
1541fba4ad4cSHermès Bélusca-Maïto CacheField = CacheLine->FirstField;
1542fba4ad4cSHermès Bélusca-Maïto for (Index = 1; Index < FieldIndex; Index++)
1543fba4ad4cSHermès Bélusca-Maïto CacheField = CacheField->Next;
1544fba4ad4cSHermès Bélusca-Maïto
1545fba4ad4cSHermès Bélusca-Maïto *Data = CacheField->Data;
1546fba4ad4cSHermès Bélusca-Maïto }
1547fba4ad4cSHermès Bélusca-Maïto
1548fba4ad4cSHermès Bélusca-Maïto return TRUE;
1549fba4ad4cSHermès Bélusca-Maïto }
1550fba4ad4cSHermès Bélusca-Maïto
1551fba4ad4cSHermès Bélusca-Maïto
1552fba4ad4cSHermès Bélusca-Maïto /* EOF */
1553