xref: /reactos/boot/freeldr/freeldr/ntldr/inffile.c (revision eeb4cbcb)
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