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







-
+













-
+



-
+





-
+

-
+


-
+














-
+














-
+














-
+













-
+







-
+


-
+








-
+


-
+





-
-
+
+

-
+


-
+





-
-
+
+

-
+


-
+





-
-
+
+

-
+


-
+









-
+

-
+


-
+







 *
 * 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
- (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
- (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
- (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
- (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
- (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
- (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
- (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_
- (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_
- (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_
- (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
- (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.

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
	return [self stringValueForKey: key
		     defaultValue: nil];
}

- (OFString *)stringForKey: (OFString *)key
- (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
- (long long)longLongValueForKey: (OFString *)key
	      defaultValue: (long long)defaultValue
{
	void *pool = objc_autoreleasePoolPush();
	OFString *value = [self stringForKey: key
	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
- (bool)boolValueForKey: (OFString *)key
      defaultValue: (bool)defaultValue
{
	void *pool = objc_autoreleasePoolPush();
	OFString *value = [self stringForKey: key
	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
- (float)floatValueForKey: (OFString *)key
	defaultValue: (float)defaultValue
{
	void *pool = objc_autoreleasePoolPush();
	OFString *value = [self stringForKey: key
	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
- (double)doubleValueForKey: (OFString *)key
	  defaultValue: (double)defaultValue
{
	void *pool = objc_autoreleasePoolPush();
	OFString *value = [self stringForKey: key
	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
- (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
- (void)setLongLongValue: (long long)longLongValue
	    forKey: (OFString *)key
{
	void *pool = objc_autoreleasePoolPush();

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

	objc_autoreleasePoolPop(pool);
}

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

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

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

	objc_autoreleasePoolPop(pool);
}

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

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

	objc_autoreleasePoolPop(pool);
}

- (void)setArray: (OFArray *)array
- (void)setStringValues: (OFArray OF_GENERIC(OFString *) *)stringValues
	  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
- (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
	[[_INIFile categoryForName: category] setBoolValue: boolValue
						 forKey: key];

	objc_autoreleasePoolPop(pool);
}

- (void)setInteger: (long long)integer
- (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
	[[_INIFile categoryForName: category] setFloatValue: floatValue
						  forKey: key];

	objc_autoreleasePoolPop(pool);
}

- (void)setBool: (bool)bool_
- (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_
	[[_INIFile categoryForName: category] setDoubleValue: doubleValue
					       forKey: key];

	objc_autoreleasePoolPop(pool);
}

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

- (void)setStringValues: (OFArray OF_GENERIC(OFString *) *)stringValues
	[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_
	[[_INIFile categoryForName: category] setStringValues: stringValues
						 forKey: key];

	objc_autoreleasePoolPop(pool);
}

- (void)setArray: (OFArray *)array
	 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] setArray: array
						forKey: key];

	objc_autoreleasePoolPop(pool);
}

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

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

- (long long)integerForPath: (OFString *)path
- (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
	    longLongValueForKey: key
	     defaultValue: defaultValue];

	objc_autoreleasePoolPop(pool);

	return ret;
}

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

	objc_autoreleasePoolPop(pool);

	return ret;
}

- (float)floatForPath: (OFString *)path
- (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
	ret = [[_INIFile categoryForName: category]
	    floatValueForKey: key
						   defaultValue: defaultValue];

	objc_autoreleasePoolPop(pool);

	return ret;
}

- (double)doubleForPath: (OFString *)path
- (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
	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
- (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
- (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_
- (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_
- (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_
- (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
- (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
- (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
- (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
- (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
- (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
- (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
- (void)setStringValue: (OFString *)stringValue
	  forPath: (OFString *)path
{
	OF_UNRECOGNIZED_SELECTOR
}

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

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

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

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

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

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

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

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

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


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

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

- (double)doubleForPath: (OFString *)path
- (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
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







-
-
-
+
+
+

-
-
+
+

-
+

-
+


-
-
+
+


+
-
+


-
-
+
+


-
+


-
-
+
+


-
+


-
-
+
+


-
+



-
-
-
-
+
+
+
+


+
-
+







	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"
	TEST(@"-[setStringValue:forKey:]",
	    R([tests setStringValue: @"baz"
			forKey: @"foo"]) &&
	    R([tests setString: @"new"
	    R([tests setStringValue: @"new"
			forKey: @"new"]) &&
	    R([foobar setString: @"a\fb"
	    R([foobar setStringValue: @"a\fb"
			 forKey: @"qux3"]))

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

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

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

	TEST(@"-[setBool:forKey:]", R([types setBool: false
	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
	TEST(@"-[setFloatValue:forKey:]", R([types setFloatValue: 0.25f
						forKey: @"float"]))

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

	TEST(@"-[setDouble:forKey:]", R([types setDouble: 0.75
	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
	    R([types setStringValues: array
						forKey: @"array1"]))

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

	module = @"OFINIFile";