/* iterates over all fields of a certain key of a certain section */ static HRESULT iterate_section_fields(HINF hinf, PCWSTR section, PCWSTR key, iterate_fields_func callback, void *arg) { WCHAR static_buffer[200]; WCHAR *buffer = static_buffer; DWORD size = sizeof(static_buffer) / sizeof(WCHAR); INFCONTEXT context; HRESULT hr = E_FAIL; BOOL ok = SetupFindFirstLineW(hinf, section, key, &context); while (ok) { UINT i, count = SetupGetFieldCount(&context); for (i = 1; i <= count; i++) { if (!(buffer = get_field_string(&context, i, buffer, static_buffer, &size))) goto done; if ((hr = callback(hinf, buffer, arg)) != S_OK) goto done; } ok = SetupFindNextMatchLineW(&context, key, &context); } hr = S_OK; done: if (buffer != static_buffer) HeapFree(GetProcessHeap(), 0, buffer); return hr; }
void get_field_string_with_size(parsertype p, void *e, const char *path, char *d, size_t n) { const char *s = NULL; s = get_field_string(p, e, path); if (s) { strncpy(d, s, n); check_field_string(s, d, n); } }
// Puts "field" from "section" from .ini file "f" into "s". // If "section" does not exist or "field" does not exist in // section then s=""; void ini_fgets(FILE *f, const char *section, const char *field, char *s) { int i; long start_pos,string_start_pos; char ts[INI_STRING_SIZE*2]; if (f!=current_file) reset_buffer(f); // Default to "Not found" s[0]=0; // See if section is in buffer for (i=0;i<NUM_SECTION_BUFFERS;i++) if (strnicmp(section_buffers[i].name,section,MAX_SECTION_WIDTH)==0) break; // If section is in buffer, seek to it if necessary if (i<NUM_SECTION_BUFFERS) { if (i!=current_section) { current_section=i; fseek(f,section_buffers[i].offset,SEEK_SET); } } // else look through .ini file for it. else { // Make sure we are not at eof or this will cause trouble. if (feof(f)) rewind(f); start_pos=ftell(f); while (1) { stripped_fgets(ts,INI_STRING_SIZE*2,f); // If it is a section, add it to the section buffer if (is_section(ts,"*")) current_section=add_section(ts,ftell(f)); // If it is the section we are looking for, break. if (is_section(ts,section)) break; // If we reach the end of the file, rewind to the start. if (feof(f)) rewind(f); if (ftell(f)==start_pos) return; } } // See if field is in buffer for (i=0;i<NUM_FIELD_BUFFERS;i++) if (field_buffers[i].section==current_section) if (strnicmp(field_buffers[i].name,field,MAX_FIELD_WIDTH)==0) break; // If field is in buffer, seek to it and read it if (i<NUM_FIELD_BUFFERS) { fseek(f,field_buffers[i].offset,SEEK_SET); stripped_fgets(ts,INI_STRING_SIZE*2,f); get_field_string(s,ts); } else // else search through section for field. { // Make sure we do not start at eof or this will cause problems. if (feof(f)) fseek(f,section_buffers[current_section].offset,SEEK_SET); start_pos=ftell(f); while (1) { string_start_pos=ftell(f); stripped_fgets(ts,INI_STRING_SIZE*2,f); // If it is a field, add it to the buffer if (is_field(ts,"*")) add_field(ts,current_section,string_start_pos); // If it is the field we are looking for, save it if (is_field(ts,field)) { get_field_string(s,ts); break; } // If we reach the end of the section, start over if (feof(f) || is_section(ts,"*")) fseek(f,section_buffers[current_section].offset,SEEK_SET); if (ftell(f)==start_pos) return; } } }