diff options
Diffstat (limited to '')
-rw-r--r-- | src/dutil/iniutil.cpp | 107 |
1 files changed, 61 insertions, 46 deletions
diff --git a/src/dutil/iniutil.cpp b/src/dutil/iniutil.cpp index c9ef6c3d..70b62995 100644 --- a/src/dutil/iniutil.cpp +++ b/src/dutil/iniutil.cpp | |||
@@ -2,6 +2,21 @@ | |||
2 | 2 | ||
3 | #include "precomp.h" | 3 | #include "precomp.h" |
4 | 4 | ||
5 | |||
6 | // Exit macros | ||
7 | #define IniExitOnLastError(x, s, ...) ExitOnLastErrorSource(DUTIL_SOURCE_INIUTIL, x, s, __VA_ARGS__) | ||
8 | #define IniExitOnLastErrorDebugTrace(x, s, ...) ExitOnLastErrorDebugTraceSource(DUTIL_SOURCE_INIUTIL, x, s, __VA_ARGS__) | ||
9 | #define IniExitWithLastError(x, s, ...) ExitWithLastErrorSource(DUTIL_SOURCE_INIUTIL, x, s, __VA_ARGS__) | ||
10 | #define IniExitOnFailure(x, s, ...) ExitOnFailureSource(DUTIL_SOURCE_INIUTIL, x, s, __VA_ARGS__) | ||
11 | #define IniExitOnRootFailure(x, s, ...) ExitOnRootFailureSource(DUTIL_SOURCE_INIUTIL, x, s, __VA_ARGS__) | ||
12 | #define IniExitOnFailureDebugTrace(x, s, ...) ExitOnFailureDebugTraceSource(DUTIL_SOURCE_INIUTIL, x, s, __VA_ARGS__) | ||
13 | #define IniExitOnNull(p, x, e, s, ...) ExitOnNullSource(DUTIL_SOURCE_INIUTIL, p, x, e, s, __VA_ARGS__) | ||
14 | #define IniExitOnNullWithLastError(p, x, s, ...) ExitOnNullWithLastErrorSource(DUTIL_SOURCE_INIUTIL, p, x, s, __VA_ARGS__) | ||
15 | #define IniExitOnNullDebugTrace(p, x, e, s, ...) ExitOnNullDebugTraceSource(DUTIL_SOURCE_INIUTIL, p, x, e, s, __VA_ARGS__) | ||
16 | #define IniExitOnInvalidHandleWithLastError(p, x, s, ...) ExitOnInvalidHandleWithLastErrorSource(DUTIL_SOURCE_INIUTIL, p, x, s, __VA_ARGS__) | ||
17 | #define IniExitOnWin32Error(e, x, s, ...) ExitOnWin32ErrorSource(DUTIL_SOURCE_INIUTIL, e, x, s, __VA_ARGS__) | ||
18 | #define IniExitOnGdipFailure(g, x, s, ...) ExitOnGdipFailureSource(DUTIL_SOURCE_INIUTIL, g, x, s, __VA_ARGS__) | ||
19 | |||
5 | const LPCWSTR wzSectionSeparator = L"\\"; | 20 | const LPCWSTR wzSectionSeparator = L"\\"; |
6 | 21 | ||
7 | struct INI_STRUCT | 22 | struct INI_STRUCT |
@@ -33,7 +48,7 @@ const int INI_HANDLE_BYTES = sizeof(INI_STRUCT); | |||
33 | 48 | ||
34 | static HRESULT GetSectionPrefixFromName( | 49 | static HRESULT GetSectionPrefixFromName( |
35 | __in_z LPCWSTR wzName, | 50 | __in_z LPCWSTR wzName, |
36 | __deref_out_z LPWSTR* psczOutput | 51 | __deref_inout_z LPWSTR* psczOutput |
37 | ); | 52 | ); |
38 | static void UninitializeIniValue( | 53 | static void UninitializeIniValue( |
39 | INI_VALUE *pivValue | 54 | INI_VALUE *pivValue |
@@ -47,7 +62,7 @@ extern "C" HRESULT DAPI IniInitialize( | |||
47 | 62 | ||
48 | // Allocate the handle | 63 | // Allocate the handle |
49 | *piHandle = static_cast<INI_HANDLE>(MemAlloc(sizeof(INI_STRUCT), TRUE)); | 64 | *piHandle = static_cast<INI_HANDLE>(MemAlloc(sizeof(INI_STRUCT), TRUE)); |
50 | ExitOnNull(*piHandle, hr, E_OUTOFMEMORY, "Failed to allocate ini object"); | 65 | IniExitOnNull(*piHandle, hr, E_OUTOFMEMORY, "Failed to allocate ini object"); |
51 | 66 | ||
52 | LExit: | 67 | LExit: |
53 | return hr; | 68 | return hr; |
@@ -96,7 +111,7 @@ extern "C" HRESULT DAPI IniSetOpenTag( | |||
96 | if (wzOpenTagPrefix) | 111 | if (wzOpenTagPrefix) |
97 | { | 112 | { |
98 | hr = StrAllocString(&pi->sczOpenTagPrefix, wzOpenTagPrefix, 0); | 113 | hr = StrAllocString(&pi->sczOpenTagPrefix, wzOpenTagPrefix, 0); |
99 | ExitOnFailure(hr, "Failed to copy open tag prefix to ini struct: %ls", wzOpenTagPrefix); | 114 | IniExitOnFailure(hr, "Failed to copy open tag prefix to ini struct: %ls", wzOpenTagPrefix); |
100 | } | 115 | } |
101 | else | 116 | else |
102 | { | 117 | { |
@@ -106,7 +121,7 @@ extern "C" HRESULT DAPI IniSetOpenTag( | |||
106 | if (wzOpenTagPostfix) | 121 | if (wzOpenTagPostfix) |
107 | { | 122 | { |
108 | hr = StrAllocString(&pi->sczOpenTagPostfix, wzOpenTagPostfix, 0); | 123 | hr = StrAllocString(&pi->sczOpenTagPostfix, wzOpenTagPostfix, 0); |
109 | ExitOnFailure(hr, "Failed to copy open tag postfix to ini struct: %ls", wzOpenTagPostfix); | 124 | IniExitOnFailure(hr, "Failed to copy open tag postfix to ini struct: %ls", wzOpenTagPostfix); |
110 | } | 125 | } |
111 | else | 126 | else |
112 | { | 127 | { |
@@ -130,7 +145,7 @@ extern "C" HRESULT DAPI IniSetValueStyle( | |||
130 | if (wzValuePrefix) | 145 | if (wzValuePrefix) |
131 | { | 146 | { |
132 | hr = StrAllocString(&pi->sczValuePrefix, wzValuePrefix, 0); | 147 | hr = StrAllocString(&pi->sczValuePrefix, wzValuePrefix, 0); |
133 | ExitOnFailure(hr, "Failed to copy value prefix to ini struct: %ls", wzValuePrefix); | 148 | IniExitOnFailure(hr, "Failed to copy value prefix to ini struct: %ls", wzValuePrefix); |
134 | } | 149 | } |
135 | else | 150 | else |
136 | { | 151 | { |
@@ -140,7 +155,7 @@ extern "C" HRESULT DAPI IniSetValueStyle( | |||
140 | if (wzValueSeparator) | 155 | if (wzValueSeparator) |
141 | { | 156 | { |
142 | hr = StrAllocString(&pi->sczValueSeparator, wzValueSeparator, 0); | 157 | hr = StrAllocString(&pi->sczValueSeparator, wzValueSeparator, 0); |
143 | ExitOnFailure(hr, "Failed to copy value separator to ini struct: %ls", wzValueSeparator); | 158 | IniExitOnFailure(hr, "Failed to copy value separator to ini struct: %ls", wzValueSeparator); |
144 | } | 159 | } |
145 | else | 160 | else |
146 | { | 161 | { |
@@ -162,12 +177,12 @@ extern "C" HRESULT DAPI IniSetValueSeparatorException( | |||
162 | INI_STRUCT *pi = static_cast<INI_STRUCT *>(piHandle); | 177 | INI_STRUCT *pi = static_cast<INI_STRUCT *>(piHandle); |
163 | 178 | ||
164 | hr = MemEnsureArraySize(reinterpret_cast<void **>(&pi->rgsczValueSeparatorExceptions), pi->cValueSeparatorExceptions + 1, sizeof(LPWSTR), 5); | 179 | hr = MemEnsureArraySize(reinterpret_cast<void **>(&pi->rgsczValueSeparatorExceptions), pi->cValueSeparatorExceptions + 1, sizeof(LPWSTR), 5); |
165 | ExitOnFailure(hr, "Failed to increase array size for value separator exceptions"); | 180 | IniExitOnFailure(hr, "Failed to increase array size for value separator exceptions"); |
166 | dwInsertedIndex = pi->cValueSeparatorExceptions; | 181 | dwInsertedIndex = pi->cValueSeparatorExceptions; |
167 | ++pi->cValueSeparatorExceptions; | 182 | ++pi->cValueSeparatorExceptions; |
168 | 183 | ||
169 | hr = StrAllocString(&pi->rgsczValueSeparatorExceptions[dwInsertedIndex], wzValueNamePrefix, 0); | 184 | hr = StrAllocString(&pi->rgsczValueSeparatorExceptions[dwInsertedIndex], wzValueNamePrefix, 0); |
170 | ExitOnFailure(hr, "Failed to copy value separator exception"); | 185 | IniExitOnFailure(hr, "Failed to copy value separator exception"); |
171 | 186 | ||
172 | LExit: | 187 | LExit: |
173 | return hr; | 188 | return hr; |
@@ -185,7 +200,7 @@ extern "C" HRESULT DAPI IniSetCommentStyle( | |||
185 | if (wzLinePrefix) | 200 | if (wzLinePrefix) |
186 | { | 201 | { |
187 | hr = StrAllocString(&pi->sczCommentLinePrefix, wzLinePrefix, 0); | 202 | hr = StrAllocString(&pi->sczCommentLinePrefix, wzLinePrefix, 0); |
188 | ExitOnFailure(hr, "Failed to copy comment line prefix to ini struct: %ls", wzLinePrefix); | 203 | IniExitOnFailure(hr, "Failed to copy comment line prefix to ini struct: %ls", wzLinePrefix); |
189 | } | 204 | } |
190 | else | 205 | else |
191 | { | 206 | { |
@@ -226,10 +241,10 @@ extern "C" HRESULT DAPI IniParse( | |||
226 | BOOL fValuePrefix = (NULL != pi->sczValuePrefix); | 241 | BOOL fValuePrefix = (NULL != pi->sczValuePrefix); |
227 | 242 | ||
228 | hr = StrAllocString(&pi->sczPath, wzPath, 0); | 243 | hr = StrAllocString(&pi->sczPath, wzPath, 0); |
229 | ExitOnFailure(hr, "Failed to copy path to ini struct: %ls", wzPath); | 244 | IniExitOnFailure(hr, "Failed to copy path to ini struct: %ls", wzPath); |
230 | 245 | ||
231 | hr = FileToString(pi->sczPath, &sczContents, &pi->feEncoding); | 246 | hr = FileToString(pi->sczPath, &sczContents, &pi->feEncoding); |
232 | ExitOnFailure(hr, "Failed to convert file to string: %ls", pi->sczPath); | 247 | IniExitOnFailure(hr, "Failed to convert file to string: %ls", pi->sczPath); |
233 | 248 | ||
234 | if (pfeEncodingFound) | 249 | if (pfeEncodingFound) |
235 | { | 250 | { |
@@ -244,7 +259,7 @@ extern "C" HRESULT DAPI IniParse( | |||
244 | 259 | ||
245 | dwValuePrefixLength = lstrlenW(pi->sczValuePrefix); | 260 | dwValuePrefixLength = lstrlenW(pi->sczValuePrefix); |
246 | hr = StrSplitAllocArray(&pi->rgsczLines, reinterpret_cast<UINT *>(&pi->cLines), sczContents, L"\n"); | 261 | hr = StrSplitAllocArray(&pi->rgsczLines, reinterpret_cast<UINT *>(&pi->cLines), sczContents, L"\n"); |
247 | ExitOnFailure(hr, "Failed to split INI file into lines"); | 262 | IniExitOnFailure(hr, "Failed to split INI file into lines"); |
248 | 263 | ||
249 | for (DWORD i = 0; i < pi->cLines; ++i) | 264 | for (DWORD i = 0; i < pi->cLines; ++i) |
250 | { | 265 | { |
@@ -324,7 +339,7 @@ extern "C" HRESULT DAPI IniParse( | |||
324 | { | 339 | { |
325 | // There is an section starting here, let's keep track of it and move on | 340 | // There is an section starting here, let's keep track of it and move on |
326 | hr = StrAllocString(&sczCurrentSection, wzOpenTagPrefix + lstrlenW(pi->sczOpenTagPrefix), wzOpenTagPostfix - (wzOpenTagPrefix + lstrlenW(pi->sczOpenTagPrefix))); | 341 | hr = StrAllocString(&sczCurrentSection, wzOpenTagPrefix + lstrlenW(pi->sczOpenTagPrefix), wzOpenTagPostfix - (wzOpenTagPrefix + lstrlenW(pi->sczOpenTagPrefix))); |
327 | ExitOnFailure(hr, "Failed to record section name for line: %ls of INI file: %ls", pi->rgsczLines[i], pi->sczPath); | 342 | IniExitOnFailure(hr, "Failed to record section name for line: %ls of INI file: %ls", pi->rgsczLines[i], pi->sczPath); |
328 | 343 | ||
329 | // Sections will be calculated dynamically after any set operations, so don't include this in the list of lines to remember for output | 344 | // Sections will be calculated dynamically after any set operations, so don't include this in the list of lines to remember for output |
330 | ReleaseNullStr(pi->rgsczLines[i]); | 345 | ReleaseNullStr(pi->rgsczLines[i]); |
@@ -342,28 +357,28 @@ extern "C" HRESULT DAPI IniParse( | |||
342 | } | 357 | } |
343 | 358 | ||
344 | hr = MemEnsureArraySize(reinterpret_cast<void **>(&pi->rgivValues), pi->cValues + 1, sizeof(INI_VALUE), 100); | 359 | hr = MemEnsureArraySize(reinterpret_cast<void **>(&pi->rgivValues), pi->cValues + 1, sizeof(INI_VALUE), 100); |
345 | ExitOnFailure(hr, "Failed to increase array size for value array"); | 360 | IniExitOnFailure(hr, "Failed to increase array size for value array"); |
346 | 361 | ||
347 | if (sczCurrentSection) | 362 | if (sczCurrentSection) |
348 | { | 363 | { |
349 | hr = StrAllocString(&sczName, sczCurrentSection, 0); | 364 | hr = StrAllocString(&sczName, sczCurrentSection, 0); |
350 | ExitOnFailure(hr, "Failed to copy current section name"); | 365 | IniExitOnFailure(hr, "Failed to copy current section name"); |
351 | 366 | ||
352 | hr = StrAllocConcat(&sczName, wzSectionSeparator, 0); | 367 | hr = StrAllocConcat(&sczName, wzSectionSeparator, 0); |
353 | ExitOnFailure(hr, "Failed to copy current section name"); | 368 | IniExitOnFailure(hr, "Failed to copy current section name"); |
354 | } | 369 | } |
355 | 370 | ||
356 | hr = StrAllocConcat(&sczName, wzValueBegin, wzValueSeparator - wzValueBegin); | 371 | hr = StrAllocConcat(&sczName, wzValueBegin, wzValueSeparator - wzValueBegin); |
357 | ExitOnFailure(hr, "Failed to copy name"); | 372 | IniExitOnFailure(hr, "Failed to copy name"); |
358 | 373 | ||
359 | hr = StrAllocString(&sczValue, wzValueSeparator + lstrlenW(pi->sczValueSeparator), 0); | 374 | hr = StrAllocString(&sczValue, wzValueSeparator + lstrlenW(pi->sczValueSeparator), 0); |
360 | ExitOnFailure(hr, "Failed to copy value"); | 375 | IniExitOnFailure(hr, "Failed to copy value"); |
361 | 376 | ||
362 | hr = StrTrimWhitespace(&sczNameTrimmed, sczName); | 377 | hr = StrTrimWhitespace(&sczNameTrimmed, sczName); |
363 | ExitOnFailure(hr, "Failed to trim whitespace from name"); | 378 | IniExitOnFailure(hr, "Failed to trim whitespace from name"); |
364 | 379 | ||
365 | hr = StrTrimWhitespace(&sczValueTrimmed, sczValue); | 380 | hr = StrTrimWhitespace(&sczValueTrimmed, sczValue); |
366 | ExitOnFailure(hr, "Failed to trim whitespace from value"); | 381 | IniExitOnFailure(hr, "Failed to trim whitespace from value"); |
367 | 382 | ||
368 | pi->rgivValues[pi->cValues].wzName = const_cast<LPCWSTR>(sczNameTrimmed); | 383 | pi->rgivValues[pi->cValues].wzName = const_cast<LPCWSTR>(sczNameTrimmed); |
369 | sczNameTrimmed = NULL; | 384 | sczNameTrimmed = NULL; |
@@ -397,7 +412,7 @@ LExit: | |||
397 | 412 | ||
398 | extern "C" HRESULT DAPI IniGetValueList( | 413 | extern "C" HRESULT DAPI IniGetValueList( |
399 | __in_bcount(INI_HANDLE_BYTES) INI_HANDLE piHandle, | 414 | __in_bcount(INI_HANDLE_BYTES) INI_HANDLE piHandle, |
400 | __deref_out_ecount_opt(pcValues) INI_VALUE** prgivValues, | 415 | __deref_out_ecount_opt(*pcValues) INI_VALUE** prgivValues, |
401 | __out DWORD *pcValues | 416 | __out DWORD *pcValues |
402 | ) | 417 | ) |
403 | { | 418 | { |
@@ -434,7 +449,7 @@ extern "C" HRESULT DAPI IniGetValue( | |||
434 | if (NULL == pValue) | 449 | if (NULL == pValue) |
435 | { | 450 | { |
436 | hr = E_NOTFOUND; | 451 | hr = E_NOTFOUND; |
437 | ExitOnFailure(hr, "Failed to check for INI value: %ls", wzValueName); | 452 | IniExitOnFailure(hr, "Failed to check for INI value: %ls", wzValueName); |
438 | } | 453 | } |
439 | 454 | ||
440 | if (NULL == pValue->wzValue) | 455 | if (NULL == pValue->wzValue) |
@@ -443,7 +458,7 @@ extern "C" HRESULT DAPI IniGetValue( | |||
443 | } | 458 | } |
444 | 459 | ||
445 | hr = StrAllocString(psczValue, pValue->wzValue, 0); | 460 | hr = StrAllocString(psczValue, pValue->wzValue, 0); |
446 | ExitOnFailure(hr, "Failed to make copy of value while looking up INI value named: %ls", wzValueName); | 461 | IniExitOnFailure(hr, "Failed to make copy of value while looking up INI value named: %ls", wzValueName); |
447 | 462 | ||
448 | LExit: | 463 | LExit: |
449 | return hr; | 464 | return hr; |
@@ -494,7 +509,7 @@ extern "C" HRESULT DAPI IniSetValue( | |||
494 | { | 509 | { |
495 | pi->fModified = TRUE; | 510 | pi->fModified = TRUE; |
496 | hr = StrAllocString(const_cast<LPWSTR *>(&pValue->wzValue), wzValue, 0); | 511 | hr = StrAllocString(const_cast<LPWSTR *>(&pValue->wzValue), wzValue, 0); |
497 | ExitOnFailure(hr, "Failed to update value INI value named: %ls", wzValueName); | 512 | IniExitOnFailure(hr, "Failed to update value INI value named: %ls", wzValueName); |
498 | } | 513 | } |
499 | 514 | ||
500 | ExitFunction1(hr = S_OK); | 515 | ExitFunction1(hr = S_OK); |
@@ -504,7 +519,7 @@ extern "C" HRESULT DAPI IniSetValue( | |||
504 | if (wzValueName) | 519 | if (wzValueName) |
505 | { | 520 | { |
506 | hr = GetSectionPrefixFromName(wzValueName, &sczSectionPrefix); | 521 | hr = GetSectionPrefixFromName(wzValueName, &sczSectionPrefix); |
507 | ExitOnFailure(hr, "Failed to get section prefix from value name: %ls", wzValueName); | 522 | IniExitOnFailure(hr, "Failed to get section prefix from value name: %ls", wzValueName); |
508 | } | 523 | } |
509 | 524 | ||
510 | // If we have a section prefix, figure out the index to insert it (at the end of the section it belongs in) | 525 | // If we have a section prefix, figure out the index to insert it (at the end of the section it belongs in) |
@@ -545,13 +560,13 @@ extern "C" HRESULT DAPI IniSetValue( | |||
545 | 560 | ||
546 | pi->fModified = TRUE; | 561 | pi->fModified = TRUE; |
547 | hr = MemInsertIntoArray(reinterpret_cast<void **>(&pi->rgivValues), dwInsertIndex, 1, pi->cValues + 1, sizeof(INI_VALUE), 100); | 562 | hr = MemInsertIntoArray(reinterpret_cast<void **>(&pi->rgivValues), dwInsertIndex, 1, pi->cValues + 1, sizeof(INI_VALUE), 100); |
548 | ExitOnFailure(hr, "Failed to insert value into array"); | 563 | IniExitOnFailure(hr, "Failed to insert value into array"); |
549 | 564 | ||
550 | hr = StrAllocString(&sczName, wzValueName, 0); | 565 | hr = StrAllocString(&sczName, wzValueName, 0); |
551 | ExitOnFailure(hr, "Failed to copy name"); | 566 | IniExitOnFailure(hr, "Failed to copy name"); |
552 | 567 | ||
553 | hr = StrAllocString(&sczValue, wzValue, 0); | 568 | hr = StrAllocString(&sczValue, wzValue, 0); |
554 | ExitOnFailure(hr, "Failed to copy value"); | 569 | IniExitOnFailure(hr, "Failed to copy value"); |
555 | 570 | ||
556 | pi->rgivValues[dwInsertIndex].wzName = const_cast<LPCWSTR>(sczName); | 571 | pi->rgivValues[dwInsertIndex].wzName = const_cast<LPCWSTR>(sczName); |
557 | sczName = NULL; | 572 | sczName = NULL; |
@@ -611,7 +626,7 @@ extern "C" HRESULT DAPI IniWriteFile( | |||
611 | BOOL fSections = (pi->sczOpenTagPrefix) && (pi->sczOpenTagPostfix); | 626 | BOOL fSections = (pi->sczOpenTagPrefix) && (pi->sczOpenTagPostfix); |
612 | 627 | ||
613 | hr = StrAllocString(&sczContents, L"", 0); | 628 | hr = StrAllocString(&sczContents, L"", 0); |
614 | ExitOnFailure(hr, "Failed to begin contents string as empty string"); | 629 | IniExitOnFailure(hr, "Failed to begin contents string as empty string"); |
615 | 630 | ||
616 | // Insert any beginning lines we didn't understand like comments | 631 | // Insert any beginning lines we didn't understand like comments |
617 | if (0 < pi->cLines) | 632 | if (0 < pi->cLines) |
@@ -619,10 +634,10 @@ extern "C" HRESULT DAPI IniWriteFile( | |||
619 | while (pi->rgsczLines[dwLineArrayIndex]) | 634 | while (pi->rgsczLines[dwLineArrayIndex]) |
620 | { | 635 | { |
621 | hr = StrAllocConcat(&sczContents, pi->rgsczLines[dwLineArrayIndex], 0); | 636 | hr = StrAllocConcat(&sczContents, pi->rgsczLines[dwLineArrayIndex], 0); |
622 | ExitOnFailure(hr, "Failed to add previous line to ini output buffer in-memory"); | 637 | IniExitOnFailure(hr, "Failed to add previous line to ini output buffer in-memory"); |
623 | 638 | ||
624 | hr = StrAllocConcat(&sczContents, L"\r\n", 2); | 639 | hr = StrAllocConcat(&sczContents, L"\r\n", 2); |
625 | ExitOnFailure(hr, "Failed to add endline to ini output buffer in-memory"); | 640 | IniExitOnFailure(hr, "Failed to add endline to ini output buffer in-memory"); |
626 | 641 | ||
627 | ++dwLineArrayIndex; | 642 | ++dwLineArrayIndex; |
628 | } | 643 | } |
@@ -640,23 +655,23 @@ extern "C" HRESULT DAPI IniWriteFile( | |||
640 | 655 | ||
641 | // First see if we need to write a section line | 656 | // First see if we need to write a section line |
642 | hr = GetSectionPrefixFromName(pi->rgivValues[i].wzName, &sczNewSectionPrefix); | 657 | hr = GetSectionPrefixFromName(pi->rgivValues[i].wzName, &sczNewSectionPrefix); |
643 | ExitOnFailure(hr, "Failed to get section prefix from name: %ls", pi->rgivValues[i].wzName); | 658 | IniExitOnFailure(hr, "Failed to get section prefix from name: %ls", pi->rgivValues[i].wzName); |
644 | 659 | ||
645 | // If the new section prefix is different, write a section out for it | 660 | // If the new section prefix is different, write a section out for it |
646 | if (fSections && sczNewSectionPrefix && (NULL == sczCurrentSectionPrefix || CSTR_EQUAL != ::CompareStringW(LOCALE_INVARIANT, 0, sczNewSectionPrefix, -1, sczCurrentSectionPrefix, -1))) | 661 | if (fSections && sczNewSectionPrefix && (NULL == sczCurrentSectionPrefix || CSTR_EQUAL != ::CompareStringW(LOCALE_INVARIANT, 0, sczNewSectionPrefix, -1, sczCurrentSectionPrefix, -1))) |
647 | { | 662 | { |
648 | hr = StrAllocConcat(&sczContents, pi->sczOpenTagPrefix, 0); | 663 | hr = StrAllocConcat(&sczContents, pi->sczOpenTagPrefix, 0); |
649 | ExitOnFailure(hr, "Failed to concat open tag prefix to string"); | 664 | IniExitOnFailure(hr, "Failed to concat open tag prefix to string"); |
650 | 665 | ||
651 | // Exclude section separator (i.e. backslash) from new section prefix | 666 | // Exclude section separator (i.e. backslash) from new section prefix |
652 | hr = StrAllocConcat(&sczContents, sczNewSectionPrefix, lstrlenW(sczNewSectionPrefix)-lstrlenW(wzSectionSeparator)); | 667 | hr = StrAllocConcat(&sczContents, sczNewSectionPrefix, lstrlenW(sczNewSectionPrefix)-lstrlenW(wzSectionSeparator)); |
653 | ExitOnFailure(hr, "Failed to concat section name to string"); | 668 | IniExitOnFailure(hr, "Failed to concat section name to string"); |
654 | 669 | ||
655 | hr = StrAllocConcat(&sczContents, pi->sczOpenTagPostfix, 0); | 670 | hr = StrAllocConcat(&sczContents, pi->sczOpenTagPostfix, 0); |
656 | ExitOnFailure(hr, "Failed to concat open tag postfix to string"); | 671 | IniExitOnFailure(hr, "Failed to concat open tag postfix to string"); |
657 | 672 | ||
658 | hr = StrAllocConcat(&sczContents, L"\r\n", 2); | 673 | hr = StrAllocConcat(&sczContents, L"\r\n", 2); |
659 | ExitOnFailure(hr, "Failed to add endline to ini output buffer in-memory"); | 674 | IniExitOnFailure(hr, "Failed to add endline to ini output buffer in-memory"); |
660 | 675 | ||
661 | ReleaseNullStr(sczCurrentSectionPrefix); | 676 | ReleaseNullStr(sczCurrentSectionPrefix); |
662 | sczCurrentSectionPrefix = sczNewSectionPrefix; | 677 | sczCurrentSectionPrefix = sczNewSectionPrefix; |
@@ -674,10 +689,10 @@ extern "C" HRESULT DAPI IniWriteFile( | |||
674 | } | 689 | } |
675 | 690 | ||
676 | hr = StrAllocConcat(&sczContents, pi->rgsczLines[dwLineArrayIndex++], 0); | 691 | hr = StrAllocConcat(&sczContents, pi->rgsczLines[dwLineArrayIndex++], 0); |
677 | ExitOnFailure(hr, "Failed to add previous line to ini output buffer in-memory"); | 692 | IniExitOnFailure(hr, "Failed to add previous line to ini output buffer in-memory"); |
678 | 693 | ||
679 | hr = StrAllocConcat(&sczContents, L"\r\n", 2); | 694 | hr = StrAllocConcat(&sczContents, L"\r\n", 2); |
680 | ExitOnFailure(hr, "Failed to add endline to ini output buffer in-memory"); | 695 | IniExitOnFailure(hr, "Failed to add endline to ini output buffer in-memory"); |
681 | } | 696 | } |
682 | 697 | ||
683 | wzName = pi->rgivValues[i].wzName; | 698 | wzName = pi->rgivValues[i].wzName; |
@@ -690,20 +705,20 @@ extern "C" HRESULT DAPI IniWriteFile( | |||
690 | if (pi->sczValuePrefix) | 705 | if (pi->sczValuePrefix) |
691 | { | 706 | { |
692 | hr = StrAllocConcat(&sczContents, pi->sczValuePrefix, 0); | 707 | hr = StrAllocConcat(&sczContents, pi->sczValuePrefix, 0); |
693 | ExitOnFailure(hr, "Failed to concat value prefix to ini output buffer"); | 708 | IniExitOnFailure(hr, "Failed to concat value prefix to ini output buffer"); |
694 | } | 709 | } |
695 | 710 | ||
696 | hr = StrAllocConcat(&sczContents, wzName, 0); | 711 | hr = StrAllocConcat(&sczContents, wzName, 0); |
697 | ExitOnFailure(hr, "Failed to concat value name to ini output buffer"); | 712 | IniExitOnFailure(hr, "Failed to concat value name to ini output buffer"); |
698 | 713 | ||
699 | hr = StrAllocConcat(&sczContents, pi->sczValueSeparator, 0); | 714 | hr = StrAllocConcat(&sczContents, pi->sczValueSeparator, 0); |
700 | ExitOnFailure(hr, "Failed to concat value separator to ini output buffer"); | 715 | IniExitOnFailure(hr, "Failed to concat value separator to ini output buffer"); |
701 | 716 | ||
702 | hr = StrAllocConcat(&sczContents, pi->rgivValues[i].wzValue, 0); | 717 | hr = StrAllocConcat(&sczContents, pi->rgivValues[i].wzValue, 0); |
703 | ExitOnFailure(hr, "Failed to concat value to ini output buffer"); | 718 | IniExitOnFailure(hr, "Failed to concat value to ini output buffer"); |
704 | 719 | ||
705 | hr = StrAllocConcat(&sczContents, L"\r\n", 2); | 720 | hr = StrAllocConcat(&sczContents, L"\r\n", 2); |
706 | ExitOnFailure(hr, "Failed to add endline to ini output buffer in-memory"); | 721 | IniExitOnFailure(hr, "Failed to add endline to ini output buffer in-memory"); |
707 | } | 722 | } |
708 | 723 | ||
709 | // If no path was specified, use the path to the file we parsed | 724 | // If no path was specified, use the path to the file we parsed |
@@ -713,7 +728,7 @@ extern "C" HRESULT DAPI IniWriteFile( | |||
713 | } | 728 | } |
714 | 729 | ||
715 | hr = FileFromString(wzPath, 0, sczContents, feEncoding); | 730 | hr = FileFromString(wzPath, 0, sczContents, feEncoding); |
716 | ExitOnFailure(hr, "Failed to write INI contents out to file: %ls", wzPath); | 731 | IniExitOnFailure(hr, "Failed to write INI contents out to file: %ls", wzPath); |
717 | 732 | ||
718 | LExit: | 733 | LExit: |
719 | ReleaseStr(sczContents); | 734 | ReleaseStr(sczContents); |
@@ -733,7 +748,7 @@ static void UninitializeIniValue( | |||
733 | 748 | ||
734 | static HRESULT GetSectionPrefixFromName( | 749 | static HRESULT GetSectionPrefixFromName( |
735 | __in_z LPCWSTR wzName, | 750 | __in_z LPCWSTR wzName, |
736 | __deref_out_z LPWSTR* psczOutput | 751 | __deref_inout_z LPWSTR* psczOutput |
737 | ) | 752 | ) |
738 | { | 753 | { |
739 | HRESULT hr = S_OK; | 754 | HRESULT hr = S_OK; |
@@ -745,7 +760,7 @@ static HRESULT GetSectionPrefixFromName( | |||
745 | if (wzSectionDelimiter && wzSectionDelimiter != wzName) | 760 | if (wzSectionDelimiter && wzSectionDelimiter != wzName) |
746 | { | 761 | { |
747 | hr = StrAllocString(psczOutput, wzName, wzSectionDelimiter - wzName + 1); | 762 | hr = StrAllocString(psczOutput, wzName, wzSectionDelimiter - wzName + 1); |
748 | ExitOnFailure(hr, "Failed to copy section prefix"); | 763 | IniExitOnFailure(hr, "Failed to copy section prefix"); |
749 | } | 764 | } |
750 | 765 | ||
751 | LExit: | 766 | LExit: |