ObjFW  Check-in [2ed9cbdc0c]

Overview
Comment:More consistent API for OFINICategory & OFSettings
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA3-256: 2ed9cbdc0c6fdd53806902cdfd015752a923e8a55d18209caf93cbbd77352b71
User & Date: js on 2021-02-28 15:22:47
Other Links: manifest | tags
Context
2021-02-28
23:25
OFWindowsRegistryKey: More accurate method names check-in: 7c83502291 user: js tags: trunk
15:22
More consistent API for OFINICategory & OFSettings check-in: 2ed9cbdc0c user: js tags: trunk
2021-02-22
22:38
lookup-asm-x86*.S: Minor optimization check-in: ddc5d6ac49 user: js tags: trunk
Changes

Modified src/OFINICategory.h from [4d30d101c6] to [f40b53851b].

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
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







-
+













-
-
+
+


-
+





-
+

-
+


-
-
+
+













-
-
+
+













-
-
+
+













-
-
+
+












-
+







-
+


-
-
+
+







-
+


-
-
+
+




-
-
+
+

-
+


-
-
+
+




-
-
+
+

-
+


-
-
+
+




-
-
+
+

-
+


-
-
+
+








-
+

-
+


-
-
+
+













 *
 * If the specified key is a multi-key (see @ref arrayForKey:), 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
 */
- (nullable OFString *)stringForKey: (OFString *)key;
- (nullable OFString *)stringValueForKey: (OFString *)key;

/**
 * @brief Returns the string value for the specified key or the specified
 *	  default value if it does not exist.
 *
 * If the specified key is a multi-key (see @ref arrayForKey:), the value of
 * the first key/value pair found is returned.
 *
 * @param key The key for which the string value 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
 */
- (nullable OFString *)stringForKey: (OFString *)key
		       defaultValue: (nullable OFString *)defaultValue;
- (nullable OFString *)stringValueForKey: (OFString *)key
			    defaultValue: (nullable OFString *)defaultValue;

/**
 * @brief Returns the integer value for the specified key or the specified
 * @brief Returns the long long value for the specified key or the specified
 *	  default value if it does not exist.
 *
 * If the specified key is a multi-key (see @ref arrayForKey:), the value of
 * the first key/value pair found is returned.
 *
 * @param key The key for which the integer value should be returned
 * @param key The key for which the long long value should be returned
 * @param defaultValue The value to return if the key does not exist
 * @return The integer value for the specified key or the specified default
 * @return The long long value for the specified key or the specified default
 *	   value if it does not exist
 */
- (long long)integerForKey: (OFString *)key
	      defaultValue: (long long)defaultValue;
- (long long)longLongValueForKey: (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.
 *
 * If the specified key is a multi-key (see @ref arrayForKey:), the value of
 * the first key/value pair found is returned.
 *
 * @param key The key for which the bool value 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
 */
- (bool)boolForKey: (OFString *)key
      defaultValue: (bool)defaultValue;
- (bool)boolValueForKey: (OFString *)key
	   defaultValue: (bool)defaultValue;

/**
 * @brief Returns the float value for the specified key or the specified
 *	  default value if it does not exist.
 *
 * If the specified key is a multi-key (see @ref arrayForKey:), the value of
 * the first key/value pair found is returned.
 *
 * @param key The key for which the float value 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
 */
- (float)floatForKey: (OFString *)key
	defaultValue: (float)defaultValue;
- (float)floatValueForKey: (OFString *)key
	     defaultValue: (float)defaultValue;

/**
 * @brief Returns the double value for the specified key or the specified
 *	  default value if it does not exist.
 *
 * If the specified key is a multi-key (see @ref arrayForKey:), the value of
 * the first key/value pair found is returned.
 *
 * @param key The key for which the double value 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
 */
- (double)doubleForKey: (OFString *)key
	  defaultValue: (double)defaultValue;
- (double)doubleValueForKey: (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.
 *
 * 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 *) *)arrayForKey: (OFString *)key;
- (OFArray OF_GENERIC(OFString *) *)stringValuesForKey: (OFString *)key;

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

/**
 * @brief Sets the value of the specified key to the specified integer.
 *
 * If the specified key is a multi-key (see @ref arrayForKey:), the value of
 * the first key/value pair found is changed.
 *
 * @param integer The integer to which the value of the key should be set
 * @param longLongValue The long long value to which the key should be set
 * @param key The key for which the new value should be set
 */
- (void)setInteger: (long long)integer
	    forKey: (OFString *)key;
- (void)setLongLongValue: (long long)longLongValue
		  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 arrayForKey:), the value of
 * the first key/value pair found is changed.
 * If the specified key is a multi-key (see @ref stringValuesForKey:), the
 * value of the first key/value pair found is changed.
 *
 * @param bool_ The bool to which the value of the key should be set
 * @param boolValue The bool value to which the key should be set
 * @param key The key for which the new value should be set
 */
- (void)setBool: (bool)bool_
	 forKey: (OFString *)key;
- (void)setBoolValue: (bool)boolValue
	      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 arrayForKey:), the value of
 * the first key/value pair found is changed.
 * If the specified key is a multi-key (see @ref stringValuesForKey:), the
 * value of the first key/value pair found is changed.
 *
 * @param float_ The float to which the value of the key should be set
 * @param floatValue The float value to which the key should be set
 * @param key The key for which the new value should be set
 */
- (void)setFloat: (float)float_
	  forKey: (OFString *)key;
- (void)setFloatValue: (float)floatValue
	       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 arrayForKey:), the value of
 * the first key/value pair found is changed.
 * If the specified key is a multi-key (see @ref stringValuesForKey:), the
 * value of the first key/value pair found is changed.
 *
 * @param double_ The double to which the value of the key should be set
 * @param doubleValue The double value to which the key should be set
 * @param key The key for which the new value should be set
 */
- (void)setDouble: (double)double_
	   forKey: (OFString *)key;
- (void)setDoubleValue: (double)doubleValue
		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 arrayForKey: for more information about multi-keys.
 * See also @ref stringValuesForKey: for more information about multi-keys.
 *
 * @param array The array of strings to which the multi-key should be set
 * @param stringValues 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)setArray: (OFArray OF_GENERIC(OFString *) *)array
	  forKey: (OFString *)key;
- (void)setStringValues: (OFArray OF_GENERIC(OFString *) *)stringValues
		 forKey: (OFString *)key;

/**
 * @brief Removes the value for the specified key
 *
 * If the specified key is a multi-key (see @ref arrayForKey:), 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 [8974141c79] to [49cee2e98a].

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
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







-
+

-
-
+
+


-
-
+
+
















-
-
+
+


-
-
+
+












-
-
+
+


-
-
+
+

















-
-
+
+


-
-
+
+












-
-
+
+


-
-
+
+












-
+








		comment->_comment = [line copy];

		[_lines addObject: comment];
	}
}

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

- (OFString *)stringForKey: (OFString *)key
	      defaultValue: (OFString *)defaultValue
- (OFString *)stringValueForKey: (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)integerForKey: (OFString *)key
	      defaultValue: (long long)defaultValue
- (long long)longLongValueForKey: (OFString *)key
		    defaultValue: (long long)defaultValue
{
	void *pool = objc_autoreleasePoolPush();
	OFString *value = [self stringForKey: key
				defaultValue: nil];
	OFString *value = [self stringValueForKey: key
				     defaultValue: nil];
	long long ret;

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

	objc_autoreleasePoolPop(pool);

	return ret;
}

- (bool)boolForKey: (OFString *)key
      defaultValue: (bool)defaultValue
- (bool)boolValueForKey: (OFString *)key
	   defaultValue: (bool)defaultValue
{
	void *pool = objc_autoreleasePoolPush();
	OFString *value = [self stringForKey: key
				defaultValue: nil];
	OFString *value = [self stringValueForKey: key
				     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)floatForKey: (OFString *)key
	defaultValue: (float)defaultValue
- (float)floatValueForKey: (OFString *)key
	     defaultValue: (float)defaultValue
{
	void *pool = objc_autoreleasePoolPush();
	OFString *value = [self stringForKey: key
				defaultValue: nil];
	OFString *value = [self stringValueForKey: key
				     defaultValue: nil];
	float ret;

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

	objc_autoreleasePoolPop(pool);

	return ret;
}

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

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

	objc_autoreleasePoolPop(pool);

	return ret;
}

- (OFArray *)arrayForKey: (OFString *)key
- (OFArray OF_GENERIC(OFString *) *)stringValuesForKey: (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
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







-
-
+
+












-
+














-
+











-
-
+
+



-
-
+
+
+




-
-
+
+

-
-
+
+


-
-
+
+



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




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







-
+






-
+

-
+


-
+




-
+







	objc_autoreleasePoolPop(pool);

	[ret makeImmutable];

	return ret;
}

- (void)setString: (OFString *)string
	   forKey: (OFString *)key
- (void)setStringValue: (OFString *)stringValue
		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 = [string copy];
			pair->_value = [stringValue 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 = [string copy];
		pair->_value = [stringValue copy];
		[_lines addObject: pair];
	} @catch (id e) {
		[pair->_key release];
		[pair->_value release];

		@throw e;
	}

	objc_autoreleasePoolPop(pool);
}

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

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

	objc_autoreleasePoolPop(pool);
}

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

- (void)setFloat: (float)float_
	  forKey: (OFString *)key
- (void)setFloatValue: (float)floatValue
	       forKey: (OFString *)key
{
	void *pool = objc_autoreleasePoolPush();

	[self setString: [OFString stringWithFormat: @"%g", float_]
		 forKey: key];
	[self setStringValue: [OFString stringWithFormat: @"%g", floatValue]
		      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)setDouble: (double)double_
	   forKey: (OFString *)key
{
	void *pool = objc_autoreleasePoolPush();

- (void)setStringValues: (OFArray OF_GENERIC(OFString *) *)stringValues
	[self setString: [OFString stringWithFormat: @"%g", double_]
		 forKey: key];

	objc_autoreleasePoolPop(pool);
}

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

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

	pool = objc_autoreleasePoolPush();

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

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

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

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

		[pairs addObject: pair];
	}

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

440
441
442
443
444
445
446
433
434
435
436
437
438
439

440
441
442
443
444
445
446
447







-
+








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

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

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

			continue;

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

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
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







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








-
-
+
+




-
-
+
+








-
-
+
+




-
-
+
+








-
-
+
+




-
-
+
+








-
-
+
+




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








-
-
+
+
+






-
-
+
+










-
-
+
+






-
-
+
+









-
-
+
+
+






-
-
+
+









-
-
+
+
+






-
-
+
+









-
-
+
+
+






-
+









-
+







		return;
	}

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

- (void)setString: (OFString *)string
	  forPath: (OFString *)path
- (void)setStringValue: (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];

	objc_autoreleasePoolPop(pool);
}

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

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

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

	objc_autoreleasePoolPop(pool);
}

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

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

	[[_INIFile categoryForName: category] setString: string
						 forKey: key];
	[[_INIFile categoryForName: category] setBoolValue: boolValue
						    forKey: key];

	objc_autoreleasePoolPop(pool);
}

- (void)setInteger: (long long)integer
	   forPath: (OFString *)path
- (void)setFloatValue: (float)floatValue
	      forPath: (OFString *)path
{
	void *pool = objc_autoreleasePoolPush();
	OFString *category, *key;

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

	[[_INIFile categoryForName: category] setInteger: integer
						  forKey: key];
	[[_INIFile categoryForName: category] setFloatValue: floatValue
						     forKey: key];

	objc_autoreleasePoolPop(pool);
}

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

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

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

	objc_autoreleasePoolPop(pool);
}

- (void)setFloat: (float)float_
	 forPath: (OFString *)path
- (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] setFloat: float_
						forKey: key];
	[[_INIFile categoryForName: category] setStringValues: stringValues
						       forKey: key];

	objc_autoreleasePoolPop(pool);
}

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

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

	[[_INIFile categoryForName: category] setDouble: double_
						 forKey: key];

	objc_autoreleasePoolPop(pool);
}

- (void)setArray: (OFArray *)array
	 forPath: (OFString *)path
{
	void *pool = objc_autoreleasePoolPush();
	OFString *category, *key;

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

	[[_INIFile categoryForName: category] setArray: array
						forKey: key];

	objc_autoreleasePoolPop(pool);
}

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

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

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

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

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

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

	ret = [[_INIFile categoryForName: category]
	    integerForKey: key
	     defaultValue: defaultValue];
	    longLongValueForKey: key
		   defaultValue: defaultValue];

	objc_autoreleasePoolPop(pool);

	return ret;
}

- (bool)boolForPath: (OFString *)path
       defaultValue: (bool)defaultValue
- (bool)boolValueForPath: (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] boolForKey: key
						  defaultValue: defaultValue];
	ret = [[_INIFile categoryForName: category]
	    boolValueForKey: key
	       defaultValue: defaultValue];

	objc_autoreleasePoolPop(pool);

	return ret;
}

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

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

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

	objc_autoreleasePoolPop(pool);

	return ret;
}

- (double)doubleForPath: (OFString *)path
	   defaultValue: (double)defaultValue
- (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] doubleForKey: key
						    defaultValue: defaultValue];
	ret = [[_INIFile categoryForName: category]
	    doubleValueForKey: key
		 defaultValue: defaultValue];

	objc_autoreleasePoolPop(pool);

	return ret;
}

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

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

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

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

- (void)removeValueForPath: (OFString *)path

Modified src/OFSettings.h from [99a9f5155c] to [8b2581256c].

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

194
195
196
197
198
199
200
201







-
+

-
-
+
+

-
-
+
+


-
+

-
-
+
+

-
-
+
+


-
+

-
-
+
+

-
-
+
+


-
+

-
-
+
+

-
-
+
+


-
+

-
-
+
+

-
-
+
+


-
+

-
-
+
+

-
-
+
+


-
-
+
+




-
+


-
-
+
+





-
-
+
+


-
-
+
+

-
+

-
+

-
-
+
+


-
-
+
+





-
-
+
+


-
-
+
+





-
-
+
+


-
-
+
+





-
-
+
+


-
+


-
-
+
+

-
+







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

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

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

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

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

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

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

/**
 * @brief Returns the string for the specified path, or `nil` if the path does
 *	  not exist.
 * @brief Returns the string value 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
 */
- (nullable OFString *)stringForPath: (OFString *)path;
- (nullable OFString *)stringValueForPath: (OFString *)path;

/**
 * @brief Returns the string for the specified path, or the default value if
 *	  the path does not exist.
 * @brief Returns the string value 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 defaultValue The default value to return if the path does not exist
 * @return The string value of the specified path
 */
- (nullable OFString *)stringForPath: (OFString *)path
			defaultValue: (nullable OFString *)defaultValue;
- (nullable OFString *)stringValueForPath: (OFString *)path
			     defaultValue: (nullable OFString *)defaultValue;

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

/**
 * @brief Returns the bool for the specified path, or the default value if the
 *	  path does not exist.
 * @brief Returns the bool value 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 defaultValue The default value to return if the path does not exist
 * @return The bool value of the specified path
 */
- (bool)boolForPath: (OFString *)path
       defaultValue: (bool)defaultValue;
- (bool)boolValueForPath: (OFString *)path
	    defaultValue: (bool)defaultValue;

/**
 * @brief Returns the float for the specified path, or the default value if the
 *	  path does not exist.
 * @brief Returns the float value 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 defaultValue The default value to return if the path does not exist
 * @return The float value of the specified path
 */
- (float)floatForPath: (OFString *)path
	 defaultValue: (float)defaultValue;
- (float)floatValueForPath: (OFString *)path
	      defaultValue: (float)defaultValue;

/**
 * @brief Returns the double for the specified path, or the default value if
 *	  the path does not exist.
 * @brief Returns the double value 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 defaultValue The default value to return if the path does not exist
 * @return The double value of the specified path
 */
- (double)doubleForPath: (OFString *)path
	   defaultValue: (double)defaultValue;
- (double)doubleValueForPath: (OFString *)path
		defaultValue: (double)defaultValue;

/**
 * @brief Returns the array of strings for the specified path, or an empty
 * @brief Returns the array of string values for the specified path, or an empty
 *	  array if the path does not exist.
 *
 * @param path The path for which the array of strings should be returned
 * @return The array of strings of the specified path
 * @param path The path for which the array of string values should be returned
 * @return The array of string values of the specified path
 */
- (OFArray OF_GENERIC(OFString *) *)arrayForPath: (OFString *)path;
- (OFArray OF_GENERIC(OFString *) *)stringValuesForPath: (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 [372f573069] to [48a4a9191f].

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
136

137
138
139
140
141
142
143
144







-
-
+
+




-
-
+
+




-
-
+
+




-
-
+
+




-
-
+
+




-
-
+
+




-
+

-
-
+
+


-
-
+
+




-
-
+
+




-
-
+
+




-
-
+
+




-
-
+
+




-
+







- (void)dealloc
{
	[_applicationName release];

	[super dealloc];
}

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

- (void)setInteger: (long long)integer
	   forPath: (OFString *)path
- (void)setLongLongValue: (long long)longLongValue
		 forPath: (OFString *)path
{
	OF_UNRECOGNIZED_SELECTOR
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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
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







-
-
-
+
+
+

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

-
-
-
+
+
+

+
-
-
+
+

-
-
-
+
+
+

-
-
+
+

-
-
+
+


-
-
+
+

-
-
-
+
+
+

-
-
+
+


-
-
-
-
+
+
+
+


+
-
-
+
+







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

	module = @"OFINICategory";

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

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

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

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

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

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

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

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

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

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

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

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

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

	module = @"OFINIFile";