ObjFW  Check-in [b0b5eff396]

Overview
Comment:Remove useless *Value from selector names
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA3-256: b0b5eff39623c3b4e50c1033b52221b0e2985ccb81d2c2b3f584b28f1aef2279
User & Date: js on 2021-03-07 01:53:28
Other Links: manifest | tags
Context
2021-03-07
02:36
Style change: Allow more than 1 argument per line check-in: a0fd103a0b user: js tags: trunk
01:53
Remove useless *Value from selector names check-in: b0b5eff396 user: js tags: trunk
2021-02-28
23:42
OFINICategory: Documentation fixes check-in: b5afddbea4 user: js tags: trunk
Changes

Modified src/OFINICategory.h from [30849cd33f] to [ce099ffcaa].

37
38
39
40
41
42
43
44
45


46
47

48
49
50
51


52
53

54
55
56
57


58
59

60
61
62

63
64
65


66
67
68


69
70
71
72


73
74

75
76
77

78
79
80


81
82
83


84
85
86
87


88
89

90
91
92

93
94
95


96
97
98

99
100
101
102


103
104

105
106
107

108
109
110


111
112
113

114
115
116
117


118
119

120
121
122

123
124
125


126
127
128

129
130
131
132


133
134
135
136
137
138
139
140
141

142
143
144
145
146
147
148
149

150
151
152
153

154
155
156
157
158
159
160
161

162
163
164
165

166
167
168
169
170
171
172
173

174
175
176
177

178
179
180
181
182
183
184
185

186
187
188
189

190
191
192
193
194
195
196
197

198
199
200
201

202
203
204
205
206
207
208
209
210

211
212

213
214
215
216


217
218
219
220
221
222
223
224
225
226
227
228
229
37
38
39
40
41
42
43


44
45
46

47
48
49


50
51
52

53
54
55


56
57
58

59
60
61

62
63


64
65
66


67
68
69
70


71
72
73

74
75
76

77
78


79
80
81


82
83
84
85


86
87
88

89
90
91

92
93


94
95
96


97
98
99


100
101
102

103
104
105

106
107


108
109
110


111
112
113


114
115
116

117
118
119

120
121


122
123
124


125
126
127


128
129
130
131
132
133
134
135
136
137

138
139
140
141
142
143
144
145

146
147
148


149
150
151
152
153
154
155
156

157
158
159


160
161
162
163
164
165
166
167

168
169
170


171
172
173
174
175
176
177
178

179
180
181


182
183
184
185
186
187
188
189

190
191
192


193
194
195
196
197
198
199
200
201

202
203

204
205
206


207
208
209
210
211
212
213
214
215
216
217
218
219
220
221







-
-
+
+

-
+


-
-
+
+

-
+


-
-
+
+

-
+


-
+

-
-
+
+

-
-
+
+


-
-
+
+

-
+


-
+

-
-
+
+

-
-
+
+


-
-
+
+

-
+


-
+

-
-
+
+

-
-
+


-
-
+
+

-
+


-
+

-
-
+
+

-
-
+


-
-
+
+

-
+


-
+

-
-
+
+

-
-
+


-
-
+
+








-
+







-
+


-
-
+







-
+


-
-
+







-
+


-
-
+







-
+


-
-
+







-
+


-
-
+








-
+

-
+


-
-
+
+













 * @brief The name of the INI category
 */
@property (copy, nonatomic) OFString *name;

- (instancetype)init OF_UNAVAILABLE;

/**
 * @brief Returns the string value for the specified key, or `nil` if it does
 *	  not exist.
 * @brief Returns the string for the specified key, or `nil` if it does not
 *	  exist.
 *
 * If the specified key is a multi-key (see @ref stringValuesForKey:), the value
 * If the specified key is a multi-key (see @ref stringArrayForKey:), the value
 * of the first key/value pair found is returned.
 *
 * @param key The key for which the string value should be returned
 * @return The string value for the specified key, or `nil` if it does not exist
 * @param key The key for which the string should be returned
 * @return The string for the specified key, or `nil` if it does not exist
 */
- (nullable OFString *)stringValueForKey: (OFString *)key;
- (nullable OFString *)stringForKey: (OFString *)key;

/**
 * @brief Returns the string value for the specified key or the specified
 *	  default value if it does not exist.
 * @brief Returns the string for the specified key or the specified default
 *	  value if it does not exist.
 *
 * If the specified key is a multi-key (see @ref stringValuesForKey:), the value
 * If the specified key is a multi-key (see @ref stringArrayForKey:), the value
 * of the first key/value pair found is returned.
 *
 * @param key The key for which the string value should be returned
 * @param key The key for which the string should be returned
 * @param defaultValue The value to return if the key does not exist
 * @return The string value for the specified key or the specified default
 *	   value if it does not exist
 * @return The string for the specified key or the specified default value if
 *	   it does not exist
 */
- (nullable OFString *)stringValueForKey: (OFString *)key
			    defaultValue: (nullable OFString *)defaultValue;
- (nullable OFString *)stringForKey: (OFString *)key
		       defaultValue: (nullable OFString *)defaultValue;

/**
 * @brief Returns the long long value for the specified key or the specified
 *	  default value if it does not exist.
 * @brief Returns the long long for the specified key or the specified default
 *	  value if it does not exist.
 *
 * If the specified key is a multi-key (see @ref stringValuesForKey:), the value
 * If the specified key is a multi-key (see @ref stringArrayForKey:), the value
 * of the first key/value pair found is returned.
 *
 * @param key The key for which the long long value should be returned
 * @param key The key for which the long long should be returned
 * @param defaultValue The value to return if the key does not exist
 * @return The long long value for the specified key or the specified default
 *	   value if it does not exist
 * @return The long long for the specified key or the specified default value
 *	   if it does not exist
 */
- (long long)longLongValueForKey: (OFString *)key
		    defaultValue: (long long)defaultValue;
- (long long)longLongForKey: (OFString *)key
	       defaultValue: (long long)defaultValue;

/**
 * @brief Returns the bool value for the specified key or the specified default
 *	  value if it does not exist.
 * @brief Returns the bool for the specified key or the specified default value
 *	  if it does not exist.
 *
 * If the specified key is a multi-key (see @ref stringValuesForKey:), the value
 * If the specified key is a multi-key (see @ref stringArrayForKey:), the value
 * of the first key/value pair found is returned.
 *
 * @param key The key for which the bool value should be returned
 * @param key The key for which the bool should be returned
 * @param defaultValue The value to return if the key does not exist
 * @return The bool value for the specified key or the specified default value
 *	   if it does not exist
 * @return The bool for the specified key or the specified default value if it
 *	   does not exist
 */
- (bool)boolValueForKey: (OFString *)key
	   defaultValue: (bool)defaultValue;
- (bool)boolForKey: (OFString *)key defaultValue: (bool)defaultValue;

/**
 * @brief Returns the float value for the specified key or the specified
 *	  default value if it does not exist.
 * @brief Returns the float for the specified key or the specified default
 *	  value if it does not exist.
 *
 * If the specified key is a multi-key (see @ref stringValuesForKey:), the value
 * If the specified key is a multi-key (see @ref stringArrayForKey:), the value
 * of the first key/value pair found is returned.
 *
 * @param key The key for which the float value should be returned
 * @param key The key for which the float should be returned
 * @param defaultValue The value to return if the key does not exist
 * @return The float value for the specified key or the specified default value
 *	   if it does not exist
 * @return The float for the specified key or the specified default value if it
 *	   does not exist
 */
- (float)floatValueForKey: (OFString *)key
	     defaultValue: (float)defaultValue;
- (float)floatForKey: (OFString *)key defaultValue: (float)defaultValue;

/**
 * @brief Returns the double value for the specified key or the specified
 *	  default value if it does not exist.
 * @brief Returns the double for the specified key or the specified default
 *	  value if it does not exist.
 *
 * If the specified key is a multi-key (see @ref stringValuesForKey:), the value
 * If the specified key is a multi-key (see @ref stringArrayForKey:), the value
 * of the first key/value pair found is returned.
 *
 * @param key The key for which the double value should be returned
 * @param key The key for which the double should be returned
 * @param defaultValue The value to return if the key does not exist
 * @return The double value for the specified key or the specified default
 *	   value if it does not exist
 * @return The double for the specified key or the specified default value if
 *	   it does not exist
 */
- (double)doubleValueForKey: (OFString *)key
	       defaultValue: (double)defaultValue;
- (double)doubleForKey: (OFString *)key defaultValue: (double)defaultValue;

/**
 * @brief Returns an array of string values for the specified multi-key, or an
 *	  empty array if the key does not exist.
 * @brief Returns an array of strings for the specified multi-key, or an empty
 *	  array if the key does not exist.
 *
 * A multi-key is a key which exists several times in the same category. Each
 * occurrence of the key/value pair adds the respective value to the array.
 *
 * @param key The multi-key for which the array should be returned
 * @return The array for the specified key, or an empty array if it does not
 *	   exist
 */
- (OFArray OF_GENERIC(OFString *) *)stringValuesForKey: (OFString *)key;
- (OFArray OF_GENERIC(OFString *) *)stringArrayForKey: (OFString *)key;

/**
 * @brief Sets the value of the specified key to the specified string.
 *
 * If the specified key is a multi-key (see @ref stringValuesForKey:), the
 * value of the first key/value pair found is changed.
 *
 * @param stringValue The string value to which the key should be set
 * @param string The string to which the key should be set
 * @param key The key for which the new value should be set
 */
- (void)setStringValue: (OFString *)stringValue
		forKey: (OFString *)key;
- (void)setString: (OFString *)string forKey: (OFString *)key;

/**
 * @brief Sets the value of the specified key to the specified long long.
 *
 * If the specified key is a multi-key (see @ref stringValuesForKey:), the value
 * of the first key/value pair found is changed.
 *
 * @param longLongValue The long long value to which the key should be set
 * @param longLong The long long to which the key should be set
 * @param key The key for which the new value should be set
 */
- (void)setLongLongValue: (long long)longLongValue
		  forKey: (OFString *)key;
- (void)setLongLong: (long long)longLong forKey: (OFString *)key;

/**
 * @brief Sets the value of the specified key to the specified bool.
 *
 * If the specified key is a multi-key (see @ref stringValuesForKey:), the
 * value of the first key/value pair found is changed.
 *
 * @param boolValue The bool value to which the key should be set
 * @param bool_ The bool to which the key should be set
 * @param key The key for which the new value should be set
 */
- (void)setBoolValue: (bool)boolValue
	      forKey: (OFString *)key;
- (void)setBool: (bool)bool_ forKey: (OFString *)key;

/**
 * @brief Sets the value of the specified key to the specified float.
 *
 * If the specified key is a multi-key (see @ref stringValuesForKey:), the
 * value of the first key/value pair found is changed.
 *
 * @param floatValue The float value to which the key should be set
 * @param float_ The float to which the key should be set
 * @param key The key for which the new value should be set
 */
- (void)setFloatValue: (float)floatValue
	       forKey: (OFString *)key;
- (void)setFloat: (float)float_ forKey: (OFString *)key;

/**
 * @brief Sets the value of the specified key to the specified double.
 *
 * If the specified key is a multi-key (see @ref stringValuesForKey:), the value
 * of the first key/value pair found is changed.
 *
 * @param doubleValue The double value to which the key should be set
 * @param double_ The double to which the key should be set
 * @param key The key for which the new value should be set
 */
- (void)setDoubleValue: (double)doubleValue
		forKey: (OFString *)key;
- (void)setDouble: (double)double_ forKey: (OFString *)key;

/**
 * @brief Sets the specified multi-key to the specified array of strings.
 *
 * It replaces the first occurrence of the multi-key with several key/value
 * pairs and removes all following occurrences. If the multi-key does not exist
 * yet, it is appended to the section.
 *
 * See also @ref stringValuesForKey: for more information about multi-keys.
 * See also @ref stringArrayForKey: for more information about multi-keys.
 *
 * @param stringValues The array of strings to which the multi-key should be set
 * @param array The array of strings to which the multi-key should be set
 * @param key The multi-key for which the new values should be set
 */
- (void)setStringValues: (OFArray OF_GENERIC(OFString *) *)stringValues
		 forKey: (OFString *)key;
- (void)setStringArray: (OFArray OF_GENERIC(OFString *) *)array
		forKey: (OFString *)key;

/**
 * @brief Removes the value for the specified key
 *
 * If the specified key is a multi-key (see @ref stringValuesForKey:), all
 * key/value pairs matching the specified key are removed.
 *
 * @param key The key of the value to remove
 */
- (void)removeValueForKey: (OFString *)key;
@end

OF_ASSUME_NONNULL_END

Modified src/OFINICategory.m from [49cee2e98a] to [504a2316bf].

48
49
50
51
52
53
54
55

56
57

58
59

60
61

62
63

64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85

86
87

88
89

90
91

92
93

94
95
96
97
98
99
100
101
48
49
50
51
52
53
54

55


56


57


58


59

60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79

80


81


82


83


84

85
86
87
88
89
90
91







-
+
-
-
+
-
-
+
-
-
+
-
-
+
-




















-
+
-
-
+
-
-
+
-
-
+
-
-
+
-







	    ![string hasPrefix: @"\f"] && ![string hasSuffix: @" "] &&
	    ![string hasSuffix: @"\t"] && ![string hasSuffix: @"\f"] &&
	    ![string containsString: @"\""])
		return string;

	mutableString = [[string mutableCopy] autorelease];

	[mutableString replaceOccurrencesOfString: @"\\"
	[mutableString replaceOccurrencesOfString: @"\\" withString: @"\\\\"];
				       withString: @"\\\\"];
	[mutableString replaceOccurrencesOfString: @"\f"
	[mutableString replaceOccurrencesOfString: @"\f" withString: @"\\f"];
				       withString: @"\\f"];
	[mutableString replaceOccurrencesOfString: @"\r"
	[mutableString replaceOccurrencesOfString: @"\r" withString: @"\\r"];
				       withString: @"\\r"];
	[mutableString replaceOccurrencesOfString: @"\n"
	[mutableString replaceOccurrencesOfString: @"\n" withString: @"\\n"];
				       withString: @"\\n"];
	[mutableString replaceOccurrencesOfString: @"\""
	[mutableString replaceOccurrencesOfString: @"\"" withString: @"\\\""];
				       withString: @"\\\""];

	[mutableString prependString: @"\""];
	[mutableString appendString: @"\""];

	[mutableString makeImmutable];

	return mutableString;
}

static OFString *
unescapeString(OFString *string)
{
	OFMutableString *mutableString;

	if (![string hasPrefix: @"\""] || ![string hasSuffix: @"\""])
		return string;

	string = [string substringWithRange: of_range(1, string.length - 2)];
	mutableString = [[string mutableCopy] autorelease];

	[mutableString replaceOccurrencesOfString: @"\\f"
	[mutableString replaceOccurrencesOfString: @"\\f" withString: @"\f"];
				       withString: @"\f"];
	[mutableString replaceOccurrencesOfString: @"\\r"
	[mutableString replaceOccurrencesOfString: @"\\r" withString: @"\r"];
				       withString: @"\r"];
	[mutableString replaceOccurrencesOfString: @"\\n"
	[mutableString replaceOccurrencesOfString: @"\\n" withString: @"\n"];
				       withString: @"\n"];
	[mutableString replaceOccurrencesOfString: @"\\\""
	[mutableString replaceOccurrencesOfString: @"\\\"" withString: @"\""];
				       withString: @"\""];
	[mutableString replaceOccurrencesOfString: @"\\\\"
	[mutableString replaceOccurrencesOfString: @"\\\\" withString: @"\\"];
				       withString: @"\\"];

	[mutableString makeImmutable];

	return mutableString;
}

@implementation OFINICategoryPair
174
175
176
177
178
179
180
181

182
183

184
185
186
187
188


189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206


207
208
209

210
211
212
213
214
215
216
217
218
219
220
221
222
223
224

225
226
227

228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247

248
249
250

251
252
253
254
255
256
257
258
259
260
261
262
263
264
265

266
267
268

269
270
271
272
273
274
275
276
277
278
279
280
281
282

283
284
285
286
287
288
289
164
165
166
167
168
169
170

171
172

173

174
175


176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193


194
195
196
197

198

199
200
201
202
203
204
205
206
207
208
209
210


211
212
213

214

215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231


232
233
234

235

236
237
238
239
240
241
242
243
244
245
246
247


248
249
250

251

252
253
254
255
256
257
258
259
260
261
262
263

264
265
266
267
268
269
270
271







-
+

-
+
-


-
-
+
+
















-
-
+
+


-
+
-












-
-
+


-
+
-

















-
-
+


-
+
-












-
-
+


-
+
-












-
+








		comment->_comment = [line copy];

		[_lines addObject: comment];
	}
}

- (OFString *)stringValueForKey: (OFString *)key
- (OFString *)stringForKey: (OFString *)key
{
	return [self stringValueForKey: key
	return [self stringForKey: key defaultValue: nil];
			  defaultValue: nil];
}

- (OFString *)stringValueForKey: (OFString *)key
		   defaultValue: (OFString *)defaultValue
- (OFString *)stringForKey: (OFString *)key
	      defaultValue: (OFString *)defaultValue
{
	for (id line in _lines) {
		OFINICategoryPair *pair;

		if (![line isKindOfClass: [OFINICategoryPair class]])
			continue;

		pair = line;

		if ([pair->_key isEqual: key])
			return [[pair->_value copy] autorelease];
	}

	return defaultValue;
}

- (long long)longLongValueForKey: (OFString *)key
		    defaultValue: (long long)defaultValue
- (long long)longLongForKey: (OFString *)key
	       defaultValue: (long long)defaultValue
{
	void *pool = objc_autoreleasePoolPush();
	OFString *value = [self stringValueForKey: key
	OFString *value = [self stringForKey: key defaultValue: nil];
				     defaultValue: nil];
	long long ret;

	if (value != nil)
		ret = [value longLongValueWithBase: 0];
	else
		ret = defaultValue;

	objc_autoreleasePoolPop(pool);

	return ret;
}

- (bool)boolValueForKey: (OFString *)key
	   defaultValue: (bool)defaultValue
- (bool)boolForKey: (OFString *)key defaultValue: (bool)defaultValue
{
	void *pool = objc_autoreleasePoolPush();
	OFString *value = [self stringValueForKey: key
	OFString *value = [self stringForKey: key defaultValue: nil];
				     defaultValue: nil];
	bool ret;

	if (value != nil) {
		if ([value isEqual: @"true"])
			ret = true;
		else if ([value isEqual: @"false"])
			ret = false;
		else
			@throw [OFInvalidFormatException exception];
	} else
		ret = defaultValue;

	objc_autoreleasePoolPop(pool);

	return ret;
}

- (float)floatValueForKey: (OFString *)key
	     defaultValue: (float)defaultValue
- (float)floatForKey: (OFString *)key defaultValue: (float)defaultValue
{
	void *pool = objc_autoreleasePoolPush();
	OFString *value = [self stringValueForKey: key
	OFString *value = [self stringForKey: key defaultValue: nil];
				     defaultValue: nil];
	float ret;

	if (value != nil)
		ret = value.floatValue;
	else
		ret = defaultValue;

	objc_autoreleasePoolPop(pool);

	return ret;
}

- (double)doubleValueForKey: (OFString *)key
	       defaultValue: (double)defaultValue
- (double)doubleForKey: (OFString *)key defaultValue: (double)defaultValue
{
	void *pool = objc_autoreleasePoolPush();
	OFString *value = [self stringValueForKey: key
	OFString *value = [self stringForKey: key defaultValue: nil];
				     defaultValue: nil];
	double ret;

	if (value != nil)
		ret = value.doubleValue;
	else
		ret = defaultValue;

	objc_autoreleasePoolPop(pool);

	return ret;
}

- (OFArray OF_GENERIC(OFString *) *)stringValuesForKey: (OFString *)key
- (OFArray OF_GENERIC(OFString *) *)stringArrayForKey: (OFString *)key
{
	OFMutableArray *ret = [OFMutableArray array];
	void *pool = objc_autoreleasePoolPush();

	for (id line in _lines) {
		OFINICategoryPair *pair;

299
300
301
302
303
304
305
306
307

308
309
310
311
312
313
314
315
316
317
318
319
320

321
322
323
324
325
326
327
328
329
330
331
332
333
334
335

336
337
338
339
340
341
342
343
344
345
346
347
348

349
350
351
352

353
354

355
356
357
358
359
360






361

362
363
364
365
366
367








368
369
370
371
372


373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389


390
391
392
393
394
395
396
397

398
399
400
401
402
403
404

405
406

407
408
409

410
411
412
413
414

415
416
417
418
419
420
421
281
282
283
284
285
286
287


288
289
290
291
292
293
294
295
296
297
298
299
300

301
302
303
304
305
306
307
308
309
310
311
312
313
314
315

316
317
318
319
320
321
322
323
324
325
326
327


328
329
330
331

332


333
334
335
336
337


338
339
340
341
342
343
344
345






346
347
348
349
350
351
352
353
354
355
356


357
358
359
360
361
362













363
364
365
366
367
368
369
370
371

372
373
374
375
376
377
378

379
380

381
382
383

384
385
386
387
388

389
390
391
392
393
394
395
396







-
-
+












-
+














-
+











-
-
+



-
+
-
-
+




-
-
+
+
+
+
+
+

+
-
-
-
-
-
-
+
+
+
+
+
+
+
+



-
-
+
+




-
-
-
-
-
-
-
-
-
-
-
-
-
+
+







-
+






-
+

-
+


-
+




-
+







	objc_autoreleasePoolPop(pool);

	[ret makeImmutable];

	return ret;
}

- (void)setStringValue: (OFString *)stringValue
		forKey: (OFString *)key
- (void)setString: (OFString *)string forKey: (OFString *)key
{
	void *pool = objc_autoreleasePoolPush();
	OFINICategoryPair *pair;

	for (id line in _lines) {
		if (![line isKindOfClass: [OFINICategoryPair class]])
			continue;

		pair = line;

		if ([pair->_key isEqual: key]) {
			OFString *old = pair->_value;
			pair->_value = [stringValue copy];
			pair->_value = [string copy];
			[old release];

			objc_autoreleasePoolPop(pool);

			return;
		}
	}

	pair = [[[OFINICategoryPair alloc] init] autorelease];
	pair->_key = nil;
	pair->_value = nil;

	@try {
		pair->_key = [key copy];
		pair->_value = [stringValue copy];
		pair->_value = [string copy];
		[_lines addObject: pair];
	} @catch (id e) {
		[pair->_key release];
		[pair->_value release];

		@throw e;
	}

	objc_autoreleasePoolPop(pool);
}

- (void)setLongLongValue: (long long)longLongValue
		  forKey: (OFString *)key
- (void)setLongLong: (long long)longLong forKey: (OFString *)key
{
	void *pool = objc_autoreleasePoolPush();

	[self setStringValue: [OFString stringWithFormat: @"%lld",
	[self setString: [OFString stringWithFormat: @"%lld", longLong]
							  longLongValue]
		      forKey: key];
		 forKey: key];

	objc_autoreleasePoolPop(pool);
}

- (void)setBoolValue: (bool)boolValue
	      forKey: (OFString *)key
- (void)setBool: (bool)bool_ forKey: (OFString *)key
{
	[self setString: (bool_ ? @"true" : @"false") forKey: key];
}

- (void)setFloat: (float)float_ forKey: (OFString *)key
{
	void *pool = objc_autoreleasePoolPush();
	[self setStringValue: (boolValue ? @"true" : @"false")
		      forKey: key];
}

- (void)setFloatValue: (float)floatValue
	       forKey: (OFString *)key

	[self setString: [OFString stringWithFormat: @"%g", float_]
		 forKey: key];

	objc_autoreleasePoolPop(pool);
}

- (void)setDouble: (double)double_ forKey: (OFString *)key
{
	void *pool = objc_autoreleasePoolPush();

	[self setStringValue: [OFString stringWithFormat: @"%g", floatValue]
		      forKey: key];
	[self setString: [OFString stringWithFormat: @"%g", double_]
		 forKey: key];

	objc_autoreleasePoolPop(pool);
}

- (void)setDoubleValue: (double)doubleValue
		forKey: (OFString *)key
{
	void *pool = objc_autoreleasePoolPush();

	[self setStringValue: [OFString stringWithFormat: @"%g", doubleValue]
		      forKey: key];

	objc_autoreleasePoolPop(pool);
}

- (void)setStringValues: (OFArray OF_GENERIC(OFString *) *)stringValues
		 forKey: (OFString *)key
- (void)setStringArray: (OFArray OF_GENERIC(OFString *) *)array
		forKey: (OFString *)key
{
	void *pool;
	OFMutableArray *pairs;
	id const *lines;
	size_t count;
	bool replaced;

	if (stringValues.count == 0) {
	if (array.count == 0) {
		[self removeValueForKey: key];
		return;
	}

	pool = objc_autoreleasePoolPush();

	pairs = [OFMutableArray arrayWithCapacity: stringValues.count];
	pairs = [OFMutableArray arrayWithCapacity: array.count];

	for (OFString *stringValue in stringValues) {
	for (OFString *string in array) {
		OFINICategoryPair *pair;

		if (![stringValue isKindOfClass: [OFString class]])
		if (![string isKindOfClass: [OFString class]])
			@throw [OFInvalidArgumentException exception];

		pair = [[[OFINICategoryPair alloc] init] autorelease];
		pair->_key = [key copy];
		pair->_value = [stringValue copy];
		pair->_value = [string copy];

		[pairs addObject: pair];
	}

	lines = _lines.objects;
	count = _lines.count;
	replaced = false;
433
434
435
436
437
438
439
440

441
442
443
444
445
446
447
408
409
410
411
412
413
414

415
416
417
418
419
420
421
422







-
+








			if (!replaced) {
				[_lines insertObjectsFromArray: pairs
						       atIndex: i];

				replaced = true;
				/* Continue after inserted pairs */
				i += stringValues.count - 1;
				i += array.count - 1;
			} else
				i--;	/* Continue at same position */

			lines = _lines.objects;
			count = _lines.count;

			continue;

Modified src/OFINIFile.h from [5f1fab4818] to [4e2773d0f5].

99
100
101
102
103
104
105
106

107
108
109
110
99
100
101
102
103
104
105

106

107
108
109







-
+
-



/**
 * @brief Writes the contents of the OFINIFile to a file in the specified
 *	  encoding.
 *
 * @param path The path of the file to write to
 * @param encoding The encoding to use
 */
- (void)writeToFile: (OFString *)path
- (void)writeToFile: (OFString *)path encoding: (of_string_encoding_t)encoding;
	   encoding: (of_string_encoding_t)encoding;
@end

OF_ASSUME_NONNULL_END

Modified src/OFINIFile.m from [c32d0fe539] to [4d99c8e035].

25
26
27
28
29
30
31
32

33
34
35
36
37
38
39
40
25
26
27
28
29
30
31

32

33
34
35
36
37
38
39







-
+
-







#import "OFINICategory+Private.h"

#import "OFInvalidFormatException.h"
#import "OFOpenItemFailedException.h"

OF_DIRECT_MEMBERS
@interface OFINIFile ()
- (void)of_parseFile: (OFString *)path
- (void)of_parseFile: (OFString *)path encoding: (of_string_encoding_t)encoding;
	    encoding: (of_string_encoding_t)encoding;
@end

static bool
isWhitespaceLine(OFString *line)
{
	const char *cString = line.UTF8String;
	size_t length = line.UTF8StringLength;
62
63
64
65
66
67
68
69

70
71
72
73
74
75
76
77
78
79
80
81

82
83
84
85
86
87
88
89
61
62
63
64
65
66
67

68

69
70
71
72
73
74
75
76
77
78

79

80
81
82
83
84
85
86







-
+
-










-
+
-







- (instancetype)init
{
	OF_INVALID_INIT_METHOD
}

- (instancetype)initWithPath: (OFString *)path
{
	return [self initWithPath: path
	return [self initWithPath: path encoding: OF_STRING_ENCODING_UTF_8];
			 encoding: OF_STRING_ENCODING_UTF_8];
}

- (instancetype)initWithPath: (OFString *)path
		    encoding: (of_string_encoding_t)encoding
{
	self = [super init];

	@try {
		_categories = [[OFMutableArray alloc] init];

		[self of_parseFile: path
		[self of_parseFile: path encoding: encoding];
			  encoding: encoding];
	} @catch (id e) {
		[self release];
		@throw e;
	}

	return self;
}
108
109
110
111
112
113
114
115

116
117
118
119
120
121
122
123
124

125
126
127
128
129
130
131
132
105
106
107
108
109
110
111

112

113
114
115
116
117
118
119

120

121
122
123
124
125
126
127







-
+
-







-
+
-







	[_categories addObject: category];

	objc_autoreleasePoolPop(pool);

	return category;
}

- (void)of_parseFile: (OFString *)path
- (void)of_parseFile: (OFString *)path encoding: (of_string_encoding_t)encoding
	    encoding: (of_string_encoding_t)encoding
{
	void *pool = objc_autoreleasePoolPush();
	OFFile *file;
	OFINICategory *category = nil;
	OFString *line;

	@try {
		file = [OFFile fileWithPath: path
		file = [OFFile fileWithPath: path mode: @"r"];
				       mode: @"r"];
	} @catch (OFOpenItemFailedException *e) {
		/* Handle missing file like an empty file */
		if (e.errNo == ENOENT)
			return;

		@throw e;
	}
156
157
158
159
160
161
162
163

164
165
166
167
168
169
170
171

172
173
174
175
176
177
178
179
180
181
182
183
151
152
153
154
155
156
157

158

159
160
161
162
163
164

165

166
167
168
169
170
171
172
173
174
175
176







-
+
-






-
+
-











	}

	objc_autoreleasePoolPop(pool);
}

- (void)writeToFile: (OFString *)path
{
	[self writeToFile: path
	[self writeToFile: path encoding: OF_STRING_ENCODING_UTF_8];
		 encoding: OF_STRING_ENCODING_UTF_8];
}

- (void)writeToFile: (OFString *)path
	   encoding: (of_string_encoding_t)encoding
{
	void *pool = objc_autoreleasePoolPush();
	OFFile *file = [OFFile fileWithPath: path
	OFFile *file = [OFFile fileWithPath: path mode: @"w"];
				       mode: @"w"];
	bool first = true;

	for (OFINICategory *category in _categories)
		if ([category of_writeToStream: file
				      encoding: encoding
					 first: first])
			first = false;

	objc_autoreleasePoolPop(pool);
}
@end

Modified src/OFINIFileSettings.m from [d49cdb7650] to [a5f326cd7a].

65
66
67
68
69
70
71
72
73

74
75
76
77
78
79
80
81
82
83














84
85
86
87
88
89

90
91
92
93
94

95
96
97
98

99
100
101
102
103
104
105

106
107
108
109
110
111
112
113
114













115
116
117
118
119
120
121


122
123
124
125
126

127
128
129
130
131


132
133
134
135
136
137

138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169

170
171
172
173
174

175
176
177
178

179
180

181
182
183
184
185
186
187
188


189
190
191
192
193
194
195
196






197










198

199
200

201
202
203
204
205
206
207

208
209
210
211
212

213
214

215
216
217
218

219
220

221
222
223
224
225
226
227

228
229
230
231
232

233
234

235
236
237
238

239
240

241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267

268
269
270
271
272
273

274
275
276
277

278
279
280
281
282
283
284
285
286
287
288
289

290
291
292
293
294
295
296
297
298
299
300
301
302
65
66
67
68
69
70
71


72
73
74
75
76






77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94


95
96
97
98
99

100




101

102
103
104
105


106
107
108
109
110





111
112
113
114
115
116
117
118
119
120
121
122
123

124
125
126
127


128
129
130
131
132
133

134





135
136
137
138
139
140


141
































142
143
144
145
146

147




148


149
150
151
152
153
154
155


156
157
158
159
160
161
162



163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179

180


181
182
183
184
185
186
187

188

189
190
191

192
193

194




195


196
197
198
199
200
201
202

203

204
205
206

207
208

209




210


211
212
213
214
215
216
217





















218
219
220
221
222
223

224




225
226
227
228
229
230
231
232
233
234
235
236

237



238
239
240
241
242
243
244
245
246
247







-
-
+




-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+




-
-
+




-
+
-
-
-
-
+
-




-
-
+




-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
-




-
-
+
+




-
+
-
-
-
-
-
+
+




-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+




-
+
-
-
-
-
+
-
-
+






-
-
+
+





-
-
-
+
+
+
+
+
+

+
+
+
+
+
+
+
+
+
+
-
+
-
-
+






-
+
-



-
+

-
+
-
-
-
-
+
-
-
+






-
+
-



-
+

-
+
-
-
-
-
+
-
-
+






-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+





-
+
-
-
-
-
+











-
+
-
-
-










		return;
	}

	*category = [path substringToIndex: pos];
	*key = [path substringFromIndex: pos + 1];
}

- (void)setStringValue: (OFString *)string
	       forPath: (OFString *)path
- (void)setString: (OFString *)string forPath: (OFString *)path
{
	void *pool = objc_autoreleasePoolPush();
	OFString *category, *key;

	[self of_getCategory: &category
		      andKey: &key
		     forPath: path];

	[[_INIFile categoryForName: category] setStringValue: string
						      forKey: key];
	[self of_getCategory: &category andKey: &key forPath: path];
	[[_INIFile categoryForName: category] setString: string forKey: key];

	objc_autoreleasePoolPop(pool);
}

- (void)setLongLong: (long long)longLong forPath: (OFString *)path
{
	void *pool = objc_autoreleasePoolPush();
	OFString *category, *key;

	[self of_getCategory: &category andKey: &key forPath: path];
	[[_INIFile categoryForName: category] setLongLong: longLong
						   forKey: key];

	objc_autoreleasePoolPop(pool);
}

- (void)setLongLongValue: (long long)longLongValue
		 forPath: (OFString *)path
- (void)setBool: (bool)bool_ forPath: (OFString *)path
{
	void *pool = objc_autoreleasePoolPush();
	OFString *category, *key;

	[self of_getCategory: &category
	[self of_getCategory: &category andKey: &key forPath: path];
		      andKey: &key
		     forPath: path];

	[[_INIFile categoryForName: category] setLongLongValue: longLongValue
	[[_INIFile categoryForName: category] setBool: bool_ forKey: key];
							forKey: key];

	objc_autoreleasePoolPop(pool);
}

- (void)setBoolValue: (bool)boolValue
	     forPath: (OFString *)path
- (void)setFloat: (float)float_ forPath: (OFString *)path
{
	void *pool = objc_autoreleasePoolPush();
	OFString *category, *key;

	[self of_getCategory: &category
		      andKey: &key
		     forPath: path];

	[[_INIFile categoryForName: category] setBoolValue: boolValue
	[self of_getCategory: &category andKey: &key forPath: path];
	[[_INIFile categoryForName: category] setFloat: float_ forKey: key];

	objc_autoreleasePoolPop(pool);
}

- (void)setDouble: (double)double_ forPath: (OFString *)path
{
	void *pool = objc_autoreleasePoolPush();
	OFString *category, *key;

	[self of_getCategory: &category andKey: &key forPath: path];
	[[_INIFile categoryForName: category] setDouble: double_ forKey: key];
						    forKey: key];

	objc_autoreleasePoolPop(pool);
}

- (void)setFloatValue: (float)floatValue
	      forPath: (OFString *)path
- (void)setStringArray: (OFArray OF_GENERIC(OFString *) *)array
	       forPath: (OFString *)path
{
	void *pool = objc_autoreleasePoolPush();
	OFString *category, *key;

	[self of_getCategory: &category
	[self of_getCategory: &category andKey: &key forPath: path];
		      andKey: &key
		     forPath: path];

	[[_INIFile categoryForName: category] setFloatValue: floatValue
						     forKey: key];
	[[_INIFile categoryForName: category] setStringArray: array
						      forKey: key];

	objc_autoreleasePoolPop(pool);
}

- (void)setDoubleValue: (double)doubleValue
	       forPath: (OFString *)path
- (OFString *)stringForPath: (OFString *)path
{
	void *pool = objc_autoreleasePoolPush();
	OFString *category, *key;

	[self of_getCategory: &category
		      andKey: &key
		     forPath: path];

	[[_INIFile categoryForName: category] setDoubleValue: doubleValue
						      forKey: key];

	objc_autoreleasePoolPop(pool);
}

- (void)setStringValues: (OFArray OF_GENERIC(OFString *) *)stringValues
		forPath: (OFString *)path
{
	void *pool = objc_autoreleasePoolPush();
	OFString *category, *key;

	[self of_getCategory: &category
		      andKey: &key
		     forPath: path];

	[[_INIFile categoryForName: category] setStringValues: stringValues
						       forKey: key];

	objc_autoreleasePoolPop(pool);
}

- (OFString *)stringValueForPath: (OFString *)path
		    defaultValue: (OFString *)defaultValue
	       defaultValue: (OFString *)defaultValue
{
	void *pool = objc_autoreleasePoolPush();
	OFString *category, *key, *ret;

	[self of_getCategory: &category
	[self of_getCategory: &category andKey: &key forPath: path];
		      andKey: &key
		     forPath: path];

	ret = [[_INIFile categoryForName: category]
	ret = [[_INIFile categoryForName: category] stringForKey: key
	    stringValueForKey: key
		 defaultValue: defaultValue];
						    defaultValue: defaultValue];

	[ret retain];
	objc_autoreleasePoolPop(pool);
	return [ret autorelease];
}

- (long long)longLongValueForPath: (OFString *)path
		     defaultValue: (long long)defaultValue
- (long long)longLongForPath: (OFString *)path
		defaultValue: (long long)defaultValue
{
	void *pool = objc_autoreleasePoolPush();
	OFString *category, *key;
	long long ret;

	[self of_getCategory: &category
		      andKey: &key
		     forPath: path];
	[self of_getCategory: &category andKey: &key forPath: path];
	ret = [[_INIFile categoryForName: category]
	    longLongForKey: key
	      defaultValue: defaultValue];

	objc_autoreleasePoolPop(pool);

	return ret;
}

- (bool)boolForPath: (OFString *)path defaultValue: (bool)defaultValue
{
	void *pool = objc_autoreleasePoolPush();
	OFString *category, *key;
	bool ret;

	[self of_getCategory: &category andKey: &key forPath: path];
	ret = [[_INIFile categoryForName: category]
	ret = [[_INIFile categoryForName: category] boolForKey: key
	    longLongValueForKey: key
		   defaultValue: defaultValue];
						  defaultValue: defaultValue];

	objc_autoreleasePoolPop(pool);

	return ret;
}

- (bool)boolValueForPath: (OFString *)path
- (float)floatForPath: (OFString *)path defaultValue: (float)defaultValue
	    defaultValue: (bool)defaultValue
{
	void *pool = objc_autoreleasePoolPush();
	OFString *category, *key;
	bool ret;
	float ret;

	[self of_getCategory: &category
	[self of_getCategory: &category andKey: &key forPath: path];
		      andKey: &key
		     forPath: path];

	ret = [[_INIFile categoryForName: category]
	ret = [[_INIFile categoryForName: category] floatForKey: key
	    boolValueForKey: key
	       defaultValue: defaultValue];
						   defaultValue: defaultValue];

	objc_autoreleasePoolPop(pool);

	return ret;
}

- (float)floatValueForPath: (OFString *)path
- (double)doubleForPath: (OFString *)path defaultValue: (double)defaultValue
	      defaultValue: (float)defaultValue
{
	void *pool = objc_autoreleasePoolPush();
	OFString *category, *key;
	float ret;
	double ret;

	[self of_getCategory: &category
	[self of_getCategory: &category andKey: &key forPath: path];
		      andKey: &key
		     forPath: path];

	ret = [[_INIFile categoryForName: category]
	ret = [[_INIFile categoryForName: category] doubleForKey: key
	    floatValueForKey: key
		defaultValue: defaultValue];
						    defaultValue: defaultValue];

	objc_autoreleasePoolPop(pool);

	return ret;
}

- (double)doubleValueForPath: (OFString *)path
		defaultValue: (double)defaultValue
{
	void *pool = objc_autoreleasePoolPush();
	OFString *category, *key;
	double ret;

	[self of_getCategory: &category
		      andKey: &key
		     forPath: path];

	ret = [[_INIFile categoryForName: category]
	    doubleValueForKey: key
		 defaultValue: defaultValue];

	objc_autoreleasePoolPop(pool);

	return ret;
}

- (OFArray OF_GENERIC(OFString *) *)stringValuesForPath: (OFString *)path
- (OFArray OF_GENERIC(OFString *) *)stringArrayForPath: (OFString *)path
{
	void *pool = objc_autoreleasePoolPush();
	OFString *category, *key;
	OFArray *ret;

	[self of_getCategory: &category
	[self of_getCategory: &category andKey: &key forPath: path];
		      andKey: &key
		     forPath: path];

	ret = [[_INIFile categoryForName: category] stringValuesForKey: key];
	ret = [[_INIFile categoryForName: category] stringArrayForKey: key];

	[ret retain];
	objc_autoreleasePoolPop(pool);
	return [ret autorelease];
}

- (void)removeValueForPath: (OFString *)path
{
	void *pool = objc_autoreleasePoolPush();
	OFString *category, *key;

	[self of_getCategory: &category
	[self of_getCategory: &category andKey: &key forPath: path];
		      andKey: &key
		     forPath: path];

	[[_INIFile categoryForName: category] removeValueForKey: key];

	objc_autoreleasePoolPop(pool);
}

- (void)save
{
	[_INIFile writeToFile: _filePath];
}
@end

Modified src/OFSettings.h from [8b2581256c] to [10aa8b7158].

63
64
65
66
67
68
69
70

71
72
73


74
75
76

77
78
79

80
81
82


83
84
85

86
87
88

89
90
91


92
93
94

95
96
97

98
99
100


101
102
103

104
105
106

107
108
109


110
111
112

113
114
115

116
117
118


119
120
121


122
123
124
125


126
127
128


129
130

131
132
133
134


135
136

137
138

139
140
141


142
143
144
145


146
147

148
149

150
151
152


153
154
155
156


157
158

159
160

161
162
163

164
165
166
167


168
169

170
171

172
173
174

175
176
177
178


179
180

181
182

183
184
185

186
187
188

189
190
191

192
193
194

195
196
197
198
199
200
201
63
64
65
66
67
68
69

70
71


72
73
74


75
76
77

78
79


80
81
82


83
84
85

86
87


88
89
90


91
92
93

94
95


96
97
98


99
100
101

102
103


104
105
106


107
108
109

110
111


112
113
114


115
116
117
118


119
120
121


122
123
124

125
126
127


128
129
130

131
132

133
134


135
136
137
138


139
140
141

142
143

144
145


146
147
148
149


150
151
152

153
154

155
156


157
158
159


160
161
162

163
164

165
166


167
168
169


170
171
172

173
174

175
176


177
178
179

180
181
182

183
184
185

186
187
188
189
190
191
192
193







-
+

-
-
+
+

-
-
+


-
+

-
-
+
+

-
-
+


-
+

-
-
+
+

-
-
+


-
+

-
-
+
+

-
-
+


-
+

-
-
+
+

-
-
+


-
+

-
-
+
+

-
-
+
+


-
-
+
+

-
-
+
+

-
+


-
-
+
+

-
+

-
+

-
-
+
+


-
-
+
+

-
+

-
+

-
-
+
+


-
-
+
+

-
+

-
+

-
-
+


-
-
+
+

-
+

-
+

-
-
+


-
-
+
+

-
+

-
+

-
-
+


-
+


-
+


-
+







 *			  accessed
 * @return An initialized OFSettings instance
 */
- (instancetype)initWithApplicationName: (OFString *)applicationName
    OF_DESIGNATED_INITIALIZER;

/**
 * @brief Sets the specified path to the specified string value.
 * @brief Sets the specified path to the specified string.
 *
 * @param stringValue The string value to set
 * @param path The path to store the string value at
 * @param string The string to set
 * @param path The path to store the string at
 */
- (void)setStringValue: (OFString *)stringValue
	       forPath: (OFString *)path;
- (void)setString: (OFString *)string forPath: (OFString *)path;

/**
 * @brief Sets the specified path to the specified long long value.
 * @brief Sets the specified path to the specified long long.
 *
 * @param longLongValue The long long value to set
 * @param path The path to store the long long value at
 * @param longLong The long long to set
 * @param path The path to store the long long at
 */
- (void)setLongLongValue: (long long)longLongValue
		 forPath: (OFString *)path;
- (void)setLongLong: (long long)longLong forPath: (OFString *)path;

/**
 * @brief Sets the specified path to the specified bool value.
 * @brief Sets the specified path to the specified bool.
 *
 * @param boolValue The bool value to set
 * @param path The path to store the bool value at
 * @param bool_ The bool to set
 * @param path The path to store the bool at
 */
- (void)setBoolValue: (bool)boolValue
	     forPath: (OFString *)path;
- (void)setBool: (bool)bool_ forPath: (OFString *)path;

/**
 * @brief Sets the specified path to the specified float value.
 * @brief Sets the specified path to the specified float.
 *
 * @param floatValue The float value to set
 * @param path The path to store the float value at
 * @param float_ The float to set
 * @param path The path to store the float at
 */
- (void)setFloatValue: (float)floatValue
	      forPath: (OFString *)path;
- (void)setFloat: (float)float_ forPath: (OFString *)path;

/**
 * @brief Sets the specified path to the specified double value.
 * @brief Sets the specified path to the specified double.
 *
 * @param doubleValue The double value to set
 * @param path The path to store the double value at
 * @param double_ The double to set
 * @param path The path to store the double at
 */
- (void)setDoubleValue: (double)doubleValue
	       forPath: (OFString *)path;
- (void)setDouble: (double)double_ forPath: (OFString *)path;

/**
 * @brief Sets the specified path to the specified array of string values.
 * @brief Sets the specified path to the specified array of strings.
 *
 * @param stringValues The array of string values to set
 * @param path The path to store the array of string values at
 * @param array The array of strings to set
 * @param path The path to store the array of string at
 */
- (void)setStringValues: (OFArray OF_GENERIC(OFString *) *)stringValues
		forPath: (OFString *)path;
- (void)setStringArray: (OFArray OF_GENERIC(OFString *) *)array
	       forPath: (OFString *)path;

/**
 * @brief Returns the string value for the specified path, or `nil` if the path
 *	  does not exist.
 * @brief Returns the string for the specified path, or `nil` if the path does
 *	  not exist.
 *
 * @param path The path for which the string value should be returned
 * @return The string value of the specified path
 * @param path The path for which the string should be returned
 * @return The string of the specified path
 */
- (nullable OFString *)stringValueForPath: (OFString *)path;
- (nullable OFString *)stringForPath: (OFString *)path;

/**
 * @brief Returns the string value for the specified path, or the default value
 *	  if the path does not exist.
 * @brief Returns the string for the specified path, or the default value if
 *	  the path does not exist.
 *
 * @param path The path for which the string value should be returned
 * @param path The path for which the string should be returned
 * @param defaultValue The default value to return if the path does not exist
 * @return The string value of the specified path
 * @return The string of the specified path
 */
- (nullable OFString *)stringValueForPath: (OFString *)path
			     defaultValue: (nullable OFString *)defaultValue;
- (nullable OFString *)stringForPath: (OFString *)path
			defaultValue: (nullable OFString *)defaultValue;

/**
 * @brief Returns the long long value for the specified path, or the default
 *	  value if the path does not exist.
 * @brief Returns the long long for the specified path, or the default value if
 *	  the path does not exist.
 *
 * @param path The path for which the long long value should be returned
 * @param path The path for which the long long should be returned
 * @param defaultValue The default value to return if the path does not exist
 * @return The long long value of the specified path
 * @return The long long of the specified path
 */
- (long long)longLongValueForPath: (OFString *)path
		     defaultValue: (long long)defaultValue;
- (long long)longLongForPath: (OFString *)path
		defaultValue: (long long)defaultValue;

/**
 * @brief Returns the bool value for the specified path, or the default value if
 *	  the path does not exist.
 * @brief Returns the bool for the specified path, or the default value if the
 *	  path does not exist.
 *
 * @param path The path for which the bool value should be returned
 * @param path The path for which the bool should be returned
 * @param defaultValue The default value to return if the path does not exist
 * @return The bool value of the specified path
 * @return The bool of the specified path
 */
- (bool)boolValueForPath: (OFString *)path
	    defaultValue: (bool)defaultValue;
- (bool)boolForPath: (OFString *)path defaultValue: (bool)defaultValue;

/**
 * @brief Returns the float value for the specified path, or the default value
 *	  if the path does not exist.
 * @brief Returns the float for the specified path, or the default value if the
 *	  path does not exist.
 *
 * @param path The path for which the float value should be returned
 * @param path The path for which the float should be returned
 * @param defaultValue The default value to return if the path does not exist
 * @return The float value of the specified path
 * @return The float of the specified path
 */
- (float)floatValueForPath: (OFString *)path
	      defaultValue: (float)defaultValue;
- (float)floatForPath: (OFString *)path defaultValue: (float)defaultValue;

/**
 * @brief Returns the double value for the specified path, or the default value
 *	  if the path does not exist.
 * @brief Returns the double for the specified path, or the default value if
 *	  the path does not exist.
 *
 * @param path The path for which the double value should be returned
 * @param path The path for which the double should be returned
 * @param defaultValue The default value to return if the path does not exist
 * @return The double value of the specified path
 * @return The double of the specified path
 */
- (double)doubleValueForPath: (OFString *)path
		defaultValue: (double)defaultValue;
- (double)doubleForPath: (OFString *)path defaultValue: (double)defaultValue;

/**
 * @brief Returns the array of string values for the specified path, or an empty
 * @brief Returns the array of strings for the specified path, or an empty
 *	  array if the path does not exist.
 *
 * @param path The path for which the array of string values should be returned
 * @param path The path for which the array of strings should be returned
 * @return The array of string values of the specified path
 */
- (OFArray OF_GENERIC(OFString *) *)stringValuesForPath: (OFString *)path;
- (OFArray OF_GENERIC(OFString *) *)stringArrayForPath: (OFString *)path;

/**
 * @brief Removes the value for the specified path.
 *
 * @param path The path for which the value should be removed
 */
- (void)removeValueForPath: (OFString *)path;

Modified src/OFSettings.m from [48a4a9191f] to [8b3ec674cd].

58
59
60
61
62
63
64
65
66

67
68
69
70
71
72

73
74
75
76
77
78

79
80
81
82
83
84

85
86
87
88
89
90

91
92
93
94
95
96


97
98
99
100
101

102
103

104
105
106
107
108


109
110
111
112
113
114


115
116
117
118
119
120

121
122
123
124
125
126

127
128
129
130
131
132

133
134
135
136
137

138
139
140
141
142
143
144
58
59
60
61
62
63
64


65
66
67
68
69


70
71
72
73
74


75
76
77
78
79


80
81
82
83
84


85
86
87
88
89


90
91
92
93
94
95

96
97

98

99
100


101
102
103
104
105
106


107
108
109
110
111
112


113
114
115
116
117


118
119
120
121
122


123
124
125
126
127

128
129
130
131
132
133
134
135







-
-
+




-
-
+




-
-
+




-
-
+




-
-
+




-
-
+
+




-
+

-
+
-


-
-
+
+




-
-
+
+




-
-
+




-
-
+




-
-
+




-
+







- (void)dealloc
{
	[_applicationName release];

	[super dealloc];
}

- (void)setStringValue: (OFString *)stringValue
	       forPath: (OFString *)path
- (void)setString: (OFString *)string forPath: (OFString *)path
{
	OF_UNRECOGNIZED_SELECTOR
}

- (void)setLongLongValue: (long long)longLongValue
		 forPath: (OFString *)path
- (void)setLongLong: (long long)longLong forPath: (OFString *)path
{
	OF_UNRECOGNIZED_SELECTOR
}

- (void)setBoolValue: (bool)boolValue
	     forPath: (OFString *)path
- (void)setBool: (bool)bool_ forPath: (OFString *)path
{
	OF_UNRECOGNIZED_SELECTOR
}

- (void)setFloatValue: (float)floatValue
	      forPath: (OFString *)path
- (void)setFloat: (float)float_ forPath: (OFString *)path
{
	OF_UNRECOGNIZED_SELECTOR
}

- (void)setDoubleValue: (double)doubleValue
	       forPath: (OFString *)path
- (void)setDouble: (double)double_ forPath: (OFString *)path
{
	OF_UNRECOGNIZED_SELECTOR
}

- (void)setStringValues: (OFArray OF_GENERIC(OFString *) *)stringValues
		forPath: (OFString *)path
- (void)setStringArray: (OFArray OF_GENERIC(OFString *) *)array
	       forPath: (OFString *)path
{
	OF_UNRECOGNIZED_SELECTOR
}

- (OFString *)stringValueForPath: (OFString *)path
- (OFString *)stringForPath: (OFString *)path
{
	return [self stringValueForPath: path
	return [self stringForPath: path defaultValue: nil];
			   defaultValue: nil];
}

- (OFString *)stringValueForPath: (OFString *)path
		    defaultValue: (OFString *)defaultValue
- (OFString *)stringForPath: (OFString *)path
	       defaultValue: (OFString *)defaultValue
{
	OF_UNRECOGNIZED_SELECTOR
}

- (long long)longLongValueForPath: (OFString *)path
		     defaultValue: (long long)defaultValue
- (long long)longLongForPath: (OFString *)path
		defaultValue: (long long)defaultValue
{
	OF_UNRECOGNIZED_SELECTOR
}

- (bool)boolValueForPath: (OFString *)path
	    defaultValue: (bool)defaultValue
- (bool)boolForPath: (OFString *)path defaultValue: (bool)defaultValue
{
	OF_UNRECOGNIZED_SELECTOR
}

- (float)floatValueForPath: (OFString *)path
	      defaultValue: (float)defaultValue
- (float)floatForPath: (OFString *)path defaultValue: (float)defaultValue
{
	OF_UNRECOGNIZED_SELECTOR
}

- (double)doubleValueForPath: (OFString *)path
		defaultValue: (double)defaultValue
- (double)doubleForPath: (OFString *)path defaultValue: (double)defaultValue
{
	OF_UNRECOGNIZED_SELECTOR
}

- (OFArray OF_GENERIC(OFString *) *)stringValuesForPath: (OFString *)path
- (OFArray OF_GENERIC(OFString *) *)stringArrayForPath: (OFString *)path
{
	OF_UNRECOGNIZED_SELECTOR
}

- (void)removeValueForPath: (OFString *)path
{
	OF_UNRECOGNIZED_SELECTOR

Modified tests/OFINIFileTests.m from [fab3932383] to [ad2cd47828].

58
59
60
61
62
63
64
65
66
67



68
69
70


71
72

73
74

75
76
77

78
79

80
81
82


83
84
85

86
87

88
89

90
91
92

93
94

95
96
97


98
99

100
101

102
103
104


105
106
107
108
109
110




111
112
113
114


115
116
117
118
119
120
121
122
58
59
60
61
62
63
64



65
66
67
68


69
70


71


72

73

74


75
76


77
78

79

80


81
82

83

84

85


86
87


88
89
90

91


92
93


94
95
96
97




98
99
100
101
102
103


104
105

106
107
108
109
110
111
112







-
-
-
+
+
+

-
-
+
+
-
-
+
-
-
+
-

-
+
-
-
+

-
-
+
+
-

-
+
-
-
+

-
+
-

-
+
-
-
+

-
-
+
+

-
+
-
-
+

-
-
+
+


-
-
-
-
+
+
+
+


-
-
+
+
-







	foobar = [file categoryForName: @"foobar"];
	types = [file categoryForName: @"types"];
	TEST(@"-[categoryForName:]",
	    tests != nil && foobar != nil && types != nil)

	module = @"OFINICategory";

	TEST(@"-[stringValueForKey:]",
	    [[tests stringValueForKey: @"foo"] isEqual: @"bar"] &&
	    [[foobar stringValueForKey: @"quxquxqux"] isEqual: @"hello\"wörld"])
	TEST(@"-[stringForKey:]",
	    [[tests stringForKey: @"foo"] isEqual: @"bar"] &&
	    [[foobar stringForKey: @"quxquxqux"] isEqual: @"hello\"wörld"])

	TEST(@"-[setStringValue:forKey:]",
	    R([tests setStringValue: @"baz"
	TEST(@"-[setString:forKey:]",
	    R([tests setString: @"baz" forKey: @"foo"]) &&
			     forKey: @"foo"]) &&
	    R([tests setStringValue: @"new"
	    R([tests setString: @"new" forKey: @"new"]) &&
			     forKey: @"new"]) &&
	    R([foobar setStringValue: @"a\fb"
	    R([foobar setString: @"a\fb" forKey: @"qux3"]))
			      forKey: @"qux3"]))

	TEST(@"-[longLongValueForKey:defaultValue:]",
	TEST(@"-[longLongForKey:defaultValue:]",
	    [types longLongValueForKey: @"integer"
			  defaultValue: 2] == 0x20)
	    [types longLongForKey: @"integer" defaultValue: 2] == 0x20)

	TEST(@"-[setLongLongValue:forKey:]",
	    R([types setLongLongValue: 0x10
	TEST(@"-[setLongLong:forKey:]",
	    R([types setLongLong: 0x10 forKey: @"integer"]))
			       forKey: @"integer"]))

	TEST(@"-[boolValueForKey:defaultValue:]",
	TEST(@"-[boolForKey:defaultValue:]",
	    [types boolValueForKey: @"bool"
		      defaultValue: false] == true)
	    [types boolForKey: @"bool" defaultValue: false] == true)

	TEST(@"-[setBoolValue:forKey:]", R([types setBoolValue: false
	TEST(@"-[setBool:forKey:]", R([types setBool: false forKey: @"bool"]))
							forKey: @"bool"]))

	TEST(@"-[floatValueForKey:defaultValue:]",
	TEST(@"-[floatForKey:defaultValue:]",
	    [types floatValueForKey: @"float"
		  defaultValue: 1] == 0.5f)
	    [types floatForKey: @"float" defaultValue: 1] == 0.5f)

	TEST(@"-[setFloatValue:forKey:]", R([types setFloatValue: 0.25f
							  forKey: @"float"]))
	TEST(@"-[setFloat:forKey:]", R([types setFloat: 0.25f
						forKey: @"float"]))

	TEST(@"-[doubleValueForKey:defaultValue:]",
	TEST(@"-[doubleForKey:defaultValue:]",
	    [types doubleValueForKey: @"double"
			defaultValue: 3] == 0.25)
	    [types doubleForKey: @"double" defaultValue: 3] == 0.25)

	TEST(@"-[setDoubleValue:forKey:]", R([types setDoubleValue: 0.75
							    forKey: @"double"]))
	TEST(@"-[setDouble:forKey:]", R([types setDouble: 0.75
						  forKey: @"double"]))

	array = [OFArray arrayWithObjects: @"1", @"2", nil];
	TEST(@"-[stringValuesForKey:]",
	    [[types stringValuesForKey: @"array1"] isEqual: array] &&
	    [[types stringValuesForKey: @"array2"] isEqual: array] &&
	    [[types stringValuesForKey: @"array3"] isEqual: [OFArray array]])
	TEST(@"-[stringArrayForKey:]",
	    [[types stringArrayForKey: @"array1"] isEqual: array] &&
	    [[types stringArrayForKey: @"array2"] isEqual: array] &&
	    [[types stringArrayForKey: @"array3"] isEqual: [OFArray array]])

	array = [OFArray arrayWithObjects: @"foo", @"bar", nil];
	TEST(@"-[setStringValues:forKey:]",
	    R([types setStringValues: array
	TEST(@"-[setStringArray:forKey:]",
	    R([types setStringArray: array forKey: @"array1"]))
			      forKey: @"array1"]))

	TEST(@"-[removeValueForKey:]",
	    R([foobar removeValueForKey: @"quxqux "]) &&
	    R([types removeValueForKey: @"array2"]))

	module = @"OFINIFile";