Skip to content

Commit 8017ef1

Browse files
committed
feat: add INIReader::FromString to parse in-memory ini content
Allow building an INIReader from a std::string, std::string_view or string literal without touching the file system, e.g. for unit tests that embed ini fragments in code. A constructor overload would make INIReader{"path.ini"} ambiguous, hence a named static factory. - add INIReader::FromString(std::string_view) with the same error handling as the file constructors - add from_string / from_string_errors tests - document it in README and regenerate doxygen docs
1 parent e1779b8 commit 8017ef1

29 files changed

Lines changed: 530 additions & 383 deletions

‎README.md‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,13 @@ int main() {
3939
}
4040
```
4141

42+
Ini content that is already in memory (a `std::string`, `std::string_view` or string literal, handy in unit tests) can be parsed without touching the file system:
43+
44+
```cpp
45+
const auto r = inih::INIReader::FromString("[section1]\nany = 5\n");
46+
const auto v = r.Get<int>("section1", "any"); // 5
47+
```
48+
4249
To learn more, please refer to [test folder](https://github.com/SSARCandy/ini-cpp/tree/master/test), it covered ALL utilities.
4350

4451
## API
@@ -51,6 +58,7 @@ All APIs live in namespace `inih`. All errors are reported by throwing `std::run
5158
| --- | --- |
5259
| `INIReader(const std::string& filename)` | Parse the given ini file; throws on missing file, syntax error (with line number) or duplicate keys |
5360
| `INIReader(FILE* file)` | Same, but reads from an already-opened `FILE*` (the caller keeps ownership) |
61+
| `INIReader::FromString(std::string_view content)` | Same, but parses ini text held in memory (a `std::string`, `std::string_view` or string literal) instead of a file |
5462
| `Sections()` | All section names, as `std::set<std::string>` |
5563
| `Keys(section)` | All key names in the given section, as `std::set<std::string>` |
5664
| `Get(section)` | The whole section, as `std::unordered_map<std::string, std::string>` |

‎docs/classinih_1_1INIReader-members.html‎

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -98,23 +98,24 @@
9898
<tr class="odd"><td class="entry"><a class="el" href="classinih_1_1INIReader.html#a47f3d952fef6d4fe26f36b56ae853b16">_values</a></td><td class="entry"><a class="el" href="classinih_1_1INIReader.html">inih::INIReader</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
9999
<tr class="even"><td class="entry"><a class="el" href="classinih_1_1INIReader.html#af29bef9f9ac108ba9ccda5a0211a21ba">BoolConverter</a>(std::string s) const</td><td class="entry"><a class="el" href="classinih_1_1INIReader.html">inih::INIReader</a></td><td class="entry"><span class="mlabel">inline</span><span class="mlabel">protected</span></td></tr>
100100
<tr class="odd"><td class="entry"><a class="el" href="classinih_1_1INIReader.html#a14ecdfa9e97600051acbee2d931aa2ff">Converter</a>(const std::string &amp;s) const</td><td class="entry"><a class="el" href="classinih_1_1INIReader.html">inih::INIReader</a></td><td class="entry"><span class="mlabel">inline</span><span class="mlabel">protected</span></td></tr>
101-
<tr class="even"><td class="entry"><a class="el" href="classinih_1_1INIReader.html#a682e4399dd5802110f8b9375f6551e4a">Get</a>(const std::string &amp;section) const</td><td class="entry"><a class="el" href="classinih_1_1INIReader.html">inih::INIReader</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
102-
<tr class="odd"><td class="entry"><a class="el" href="classinih_1_1INIReader.html#aa6e6cf2858a796f9de76f800d0434949">Get</a>(const std::string &amp;section, const std::string &amp;name) const</td><td class="entry"><a class="el" href="classinih_1_1INIReader.html">inih::INIReader</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
103-
<tr class="even"><td class="entry"><a class="el" href="classinih_1_1INIReader.html#a00082355d324016ffcdd416ca56a7d13">Get</a>(const std::string &amp;section, const std::string &amp;name, T &amp;&amp;default_v) const</td><td class="entry"><a class="el" href="classinih_1_1INIReader.html">inih::INIReader</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
104-
<tr class="odd"><td class="entry"><a class="el" href="classinih_1_1INIReader.html#aa09019b4bc6205d37f6c5a837dc21262">GetVector</a>(const std::string &amp;section, const std::string &amp;name) const</td><td class="entry"><a class="el" href="classinih_1_1INIReader.html">inih::INIReader</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
105-
<tr class="even"><td class="entry"><a class="el" href="classinih_1_1INIReader.html#afc8f853da847f1dcf7f2c137aa358683">GetVector</a>(const std::string &amp;section, const std::string &amp;name, const std::vector&lt; T &gt; &amp;default_v) const</td><td class="entry"><a class="el" href="classinih_1_1INIReader.html">inih::INIReader</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
106-
<tr bgcolor="#f0f0f0" class="odd"><td class="entry"><b>INIReader</b>()=default (defined in <a class="el" href="classinih_1_1INIReader.html">inih::INIReader</a>)</td><td class="entry"><a class="el" href="classinih_1_1INIReader.html">inih::INIReader</a></td><td class="entry"></td></tr>
107-
<tr class="even"><td class="entry"><a class="el" href="classinih_1_1INIReader.html#aa332e7fa3613bd9d57f5bd325202bdec">INIReader</a>(const std::string &amp;filename)</td><td class="entry"><a class="el" href="classinih_1_1INIReader.html">inih::INIReader</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
108-
<tr class="odd"><td class="entry"><a class="el" href="classinih_1_1INIReader.html#a87ccc8b99ad6b188bb088e5634c07cda">INIReader</a>(std::FILE *file)</td><td class="entry"><a class="el" href="classinih_1_1INIReader.html">inih::INIReader</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
109-
<tr class="even"><td class="entry"><a class="el" href="classinih_1_1INIReader.html#a75a8e5327efd5ca3ddf147d687d80c4e">InsertEntry</a>(const std::string &amp;section, const std::string &amp;name, const T &amp;v)</td><td class="entry"><a class="el" href="classinih_1_1INIReader.html">inih::INIReader</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
110-
<tr class="odd"><td class="entry"><a class="el" href="classinih_1_1INIReader.html#a5bc835325aa877a5211abe595efca5da">InsertEntry</a>(const std::string &amp;section, const std::string &amp;name, const std::vector&lt; T &gt; &amp;vs)</td><td class="entry"><a class="el" href="classinih_1_1INIReader.html">inih::INIReader</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
111-
<tr class="even"><td class="entry"><a class="el" href="classinih_1_1INIReader.html#ace516202b49bf78ddfed9553567ce9e5">Keys</a>(const std::string &amp;section) const</td><td class="entry"><a class="el" href="classinih_1_1INIReader.html">inih::INIReader</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
112-
<tr class="odd"><td class="entry"><a class="el" href="classinih_1_1INIReader.html#a5db3eee53f45dec459a091fa6e5992f2">ParseError</a>() const</td><td class="entry"><a class="el" href="classinih_1_1INIReader.html">inih::INIReader</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
113-
<tr class="even"><td class="entry"><a class="el" href="classinih_1_1INIReader.html#a90a06ba057048f2658f440c5d0c73c6a">Sections</a>() const</td><td class="entry"><a class="el" href="classinih_1_1INIReader.html">inih::INIReader</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
114-
<tr class="odd"><td class="entry"><a class="el" href="classinih_1_1INIReader.html#a765f6e48c13f43b46265d263a01e265b">UpdateEntry</a>(const std::string &amp;section, const std::string &amp;name, const T &amp;v)</td><td class="entry"><a class="el" href="classinih_1_1INIReader.html">inih::INIReader</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
115-
<tr class="even"><td class="entry"><a class="el" href="classinih_1_1INIReader.html#abfdb9985c4e1ec6f5f9c234e5ef6072e">UpdateEntry</a>(const std::string &amp;section, const std::string &amp;name, const std::vector&lt; T &gt; &amp;vs)</td><td class="entry"><a class="el" href="classinih_1_1INIReader.html">inih::INIReader</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
116-
<tr class="odd"><td class="entry"><a class="el" href="classinih_1_1INIReader.html#a5c1b73307fbabf76537892b196987cdb">V2String</a>(const T &amp;v) const</td><td class="entry"><a class="el" href="classinih_1_1INIReader.html">inih::INIReader</a></td><td class="entry"><span class="mlabel">inline</span><span class="mlabel">protected</span></td></tr>
117-
<tr class="even"><td class="entry"><a class="el" href="classinih_1_1INIReader.html#a865515da0f8847da3c67f722cafa46bf">Vec2String</a>(const std::vector&lt; T &gt; &amp;v) const</td><td class="entry"><a class="el" href="classinih_1_1INIReader.html">inih::INIReader</a></td><td class="entry"><span class="mlabel">inline</span><span class="mlabel">protected</span></td></tr>
101+
<tr class="even"><td class="entry"><a class="el" href="classinih_1_1INIReader.html#aab2fd355a2c449b7c7134e9f170bdb55">FromString</a>(std::string_view content)</td><td class="entry"><a class="el" href="classinih_1_1INIReader.html">inih::INIReader</a></td><td class="entry"><span class="mlabel">inline</span><span class="mlabel">static</span></td></tr>
102+
<tr class="odd"><td class="entry"><a class="el" href="classinih_1_1INIReader.html#a682e4399dd5802110f8b9375f6551e4a">Get</a>(const std::string &amp;section) const</td><td class="entry"><a class="el" href="classinih_1_1INIReader.html">inih::INIReader</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
103+
<tr class="even"><td class="entry"><a class="el" href="classinih_1_1INIReader.html#aa6e6cf2858a796f9de76f800d0434949">Get</a>(const std::string &amp;section, const std::string &amp;name) const</td><td class="entry"><a class="el" href="classinih_1_1INIReader.html">inih::INIReader</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
104+
<tr class="odd"><td class="entry"><a class="el" href="classinih_1_1INIReader.html#a00082355d324016ffcdd416ca56a7d13">Get</a>(const std::string &amp;section, const std::string &amp;name, T &amp;&amp;default_v) const</td><td class="entry"><a class="el" href="classinih_1_1INIReader.html">inih::INIReader</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
105+
<tr class="even"><td class="entry"><a class="el" href="classinih_1_1INIReader.html#aa09019b4bc6205d37f6c5a837dc21262">GetVector</a>(const std::string &amp;section, const std::string &amp;name) const</td><td class="entry"><a class="el" href="classinih_1_1INIReader.html">inih::INIReader</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
106+
<tr class="odd"><td class="entry"><a class="el" href="classinih_1_1INIReader.html#afc8f853da847f1dcf7f2c137aa358683">GetVector</a>(const std::string &amp;section, const std::string &amp;name, const std::vector&lt; T &gt; &amp;default_v) const</td><td class="entry"><a class="el" href="classinih_1_1INIReader.html">inih::INIReader</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
107+
<tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>INIReader</b>()=default (defined in <a class="el" href="classinih_1_1INIReader.html">inih::INIReader</a>)</td><td class="entry"><a class="el" href="classinih_1_1INIReader.html">inih::INIReader</a></td><td class="entry"></td></tr>
108+
<tr class="odd"><td class="entry"><a class="el" href="classinih_1_1INIReader.html#aa332e7fa3613bd9d57f5bd325202bdec">INIReader</a>(const std::string &amp;filename)</td><td class="entry"><a class="el" href="classinih_1_1INIReader.html">inih::INIReader</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
109+
<tr class="even"><td class="entry"><a class="el" href="classinih_1_1INIReader.html#a87ccc8b99ad6b188bb088e5634c07cda">INIReader</a>(std::FILE *file)</td><td class="entry"><a class="el" href="classinih_1_1INIReader.html">inih::INIReader</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
110+
<tr class="odd"><td class="entry"><a class="el" href="classinih_1_1INIReader.html#a75a8e5327efd5ca3ddf147d687d80c4e">InsertEntry</a>(const std::string &amp;section, const std::string &amp;name, const T &amp;v)</td><td class="entry"><a class="el" href="classinih_1_1INIReader.html">inih::INIReader</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
111+
<tr class="even"><td class="entry"><a class="el" href="classinih_1_1INIReader.html#a5bc835325aa877a5211abe595efca5da">InsertEntry</a>(const std::string &amp;section, const std::string &amp;name, const std::vector&lt; T &gt; &amp;vs)</td><td class="entry"><a class="el" href="classinih_1_1INIReader.html">inih::INIReader</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
112+
<tr class="odd"><td class="entry"><a class="el" href="classinih_1_1INIReader.html#ace516202b49bf78ddfed9553567ce9e5">Keys</a>(const std::string &amp;section) const</td><td class="entry"><a class="el" href="classinih_1_1INIReader.html">inih::INIReader</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
113+
<tr class="even"><td class="entry"><a class="el" href="classinih_1_1INIReader.html#a5db3eee53f45dec459a091fa6e5992f2">ParseError</a>() const</td><td class="entry"><a class="el" href="classinih_1_1INIReader.html">inih::INIReader</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
114+
<tr class="odd"><td class="entry"><a class="el" href="classinih_1_1INIReader.html#a90a06ba057048f2658f440c5d0c73c6a">Sections</a>() const</td><td class="entry"><a class="el" href="classinih_1_1INIReader.html">inih::INIReader</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
115+
<tr class="even"><td class="entry"><a class="el" href="classinih_1_1INIReader.html#a765f6e48c13f43b46265d263a01e265b">UpdateEntry</a>(const std::string &amp;section, const std::string &amp;name, const T &amp;v)</td><td class="entry"><a class="el" href="classinih_1_1INIReader.html">inih::INIReader</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
116+
<tr class="odd"><td class="entry"><a class="el" href="classinih_1_1INIReader.html#abfdb9985c4e1ec6f5f9c234e5ef6072e">UpdateEntry</a>(const std::string &amp;section, const std::string &amp;name, const std::vector&lt; T &gt; &amp;vs)</td><td class="entry"><a class="el" href="classinih_1_1INIReader.html">inih::INIReader</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
117+
<tr class="even"><td class="entry"><a class="el" href="classinih_1_1INIReader.html#a5c1b73307fbabf76537892b196987cdb">V2String</a>(const T &amp;v) const</td><td class="entry"><a class="el" href="classinih_1_1INIReader.html">inih::INIReader</a></td><td class="entry"><span class="mlabel">inline</span><span class="mlabel">protected</span></td></tr>
118+
<tr class="odd"><td class="entry"><a class="el" href="classinih_1_1INIReader.html#a865515da0f8847da3c67f722cafa46bf">Vec2String</a>(const std::vector&lt; T &gt; &amp;v) const</td><td class="entry"><a class="el" href="classinih_1_1INIReader.html">inih::INIReader</a></td><td class="entry"><span class="mlabel">inline</span><span class="mlabel">protected</span></td></tr>
118119
</table></div><!-- contents -->
119120
<!-- start footer part -->
120121
<hr class="footer"/><address class="footer"><small>

‎docs/classinih_1_1INIReader.html‎

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@
9090
<div class="header">
9191
<div class="summary">
9292
<a href="#pub-methods">Public Member Functions</a> &#124;
93+
<a href="#pub-static-methods">Static Public Member Functions</a> &#124;
9394
<a href="#pro-methods">Protected Member Functions</a> &#124;
9495
<a href="#pro-attribs">Protected Attributes</a> &#124;
9596
<a href="classinih_1_1INIReader-members.html">List of all members</a> </div>
@@ -155,6 +156,12 @@
155156
<tr class="memdesc:abfdb9985c4e1ec6f5f9c234e5ef6072e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Update a vector of values in the INI file. <br /></td></tr>
156157
<tr class="separator:abfdb9985c4e1ec6f5f9c234e5ef6072e"><td class="memSeparator" colspan="2">&#160;</td></tr>
157158
</table><table class="memberdecls">
159+
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pub-static-methods" name="pub-static-methods"></a>
160+
Static Public Member Functions</h2></td></tr>
161+
<tr class="memitem:aab2fd355a2c449b7c7134e9f170bdb55" id="r_aab2fd355a2c449b7c7134e9f170bdb55"><td class="memItemLeft" align="right" valign="top">static <a class="el" href="classinih_1_1INIReader.html">INIReader</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#aab2fd355a2c449b7c7134e9f170bdb55">FromString</a> (std::string_view content)</td></tr>
162+
<tr class="memdesc:aab2fd355a2c449b7c7134e9f170bdb55"><td class="mdescLeft">&#160;</td><td class="mdescRight">Construct an <a class="el" href="classinih_1_1INIReader.html" title="Read an INI file into easy-to-access name/value pairs.">INIReader</a> object from in-memory ini content. <br /></td></tr>
163+
<tr class="separator:aab2fd355a2c449b7c7134e9f170bdb55"><td class="memSeparator" colspan="2">&#160;</td></tr>
164+
</table><table class="memberdecls">
158165
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pro-methods" name="pro-methods"></a>
159166
Protected Member Functions</h2></td></tr>
160167
<tr class="memitem:a14ecdfa9e97600051acbee2d931aa2ff" id="r_a14ecdfa9e97600051acbee2d931aa2ff"><td class="memTemplParams" colspan="2"><a id="a14ecdfa9e97600051acbee2d931aa2ff" name="a14ecdfa9e97600051acbee2d931aa2ff"></a>
@@ -270,6 +277,45 @@ <h2 class="memtitle"><span class="permalink"><a href="#a87ccc8b99ad6b188bb088e56
270277
</div>
271278
</div>
272279
<h2 class="groupheader">Member Function Documentation</h2>
280+
<a id="aab2fd355a2c449b7c7134e9f170bdb55" name="aab2fd355a2c449b7c7134e9f170bdb55"></a>
281+
<h2 class="memtitle"><span class="permalink"><a href="#aab2fd355a2c449b7c7134e9f170bdb55">&#9670;&#160;</a></span>FromString()</h2>
282+
283+
<div class="memitem">
284+
<div class="memproto">
285+
<table class="mlabels">
286+
<tr>
287+
<td class="mlabels-left">
288+
<table class="memname">
289+
<tr>
290+
<td class="memname">static <a class="el" href="classinih_1_1INIReader.html">INIReader</a> inih::INIReader::FromString </td>
291+
<td>(</td>
292+
<td class="paramtype">std::string_view</td> <td class="paramname"><span class="paramname"><em>content</em></span></td><td>)</td>
293+
<td></td>
294+
</tr>
295+
</table>
296+
</td>
297+
<td class="mlabels-right">
298+
<span class="mlabels"><span class="mlabel">inline</span><span class="mlabel">static</span></span> </td>
299+
</tr>
300+
</table>
301+
</div><div class="memdoc">
302+
303+
<p>Construct an <a class="el" href="classinih_1_1INIReader.html" title="Read an INI file into easy-to-access name/value pairs.">INIReader</a> object from in-memory ini content. </p>
304+
<dl class="params"><dt>Parameters</dt><dd>
305+
<table class="params">
306+
<tr><td class="paramname">content</td><td>The ini text to parse (e.g. a string literal embedded in a unit test); it is not interpreted as a file name </td></tr>
307+
</table>
308+
</dd>
309+
</dl>
310+
<dl class="exception"><dt>Exceptions</dt><dd>
311+
<table class="exception">
312+
<tr><td class="paramname">std::runtime_error</td><td>if there is an error parsing the content </td></tr>
313+
</table>
314+
</dd>
315+
</dl>
316+
317+
</div>
318+
</div>
273319
<a id="a682e4399dd5802110f8b9375f6551e4a" name="a682e4399dd5802110f8b9375f6551e4a"></a>
274320
<h2 class="memtitle"><span class="permalink"><a href="#a682e4399dd5802110f8b9375f6551e4a">&#9670;&#160;</a></span>Get() <span class="overload">[1/3]</span></h2>
275321

‎docs/doxygen_crawl.html‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@
3232
<a href="functions.html"/>
3333
<a href="functions.html"/>
3434
<a href="functions.html"/>
35+
<a href="functions.html"/>
36+
<a href="functions_func.html"/>
3537
<a href="functions_func.html"/>
3638
<a href="functions_func.html"/>
3739
<a href="functions_func.html"/>
@@ -63,6 +65,7 @@
6365
<a href="classinih_1_1INIReader.html#aa09019b4bc6205d37f6c5a837dc21262"/>
6466
<a href="classinih_1_1INIReader.html#aa332e7fa3613bd9d57f5bd325202bdec"/>
6567
<a href="classinih_1_1INIReader.html#aa6e6cf2858a796f9de76f800d0434949"/>
68+
<a href="classinih_1_1INIReader.html#aab2fd355a2c449b7c7134e9f170bdb55"/>
6669
<a href="classinih_1_1INIReader.html#abfdb9985c4e1ec6f5f9c234e5ef6072e"/>
6770
<a href="classinih_1_1INIReader.html#ace516202b49bf78ddfed9553567ce9e5"/>
6871
<a href="classinih_1_1INIReader.html#af29bef9f9ac108ba9ccda5a0211a21ba"/>

0 commit comments

Comments
 (0)