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