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