ObjFW  Diff

Differences From Artifact [1cf435b925]:

To Artifact [3cea6d45eb]:


28
29
30
31
32
33
34
35
36


37
38
39
40
41
42
43
28
29
30
31
32
33
34


35
36
37
38
39
40
41
42
43







-
-
+
+







#import "OFSerialization.h"
#import "OFJSONRepresentation.h"

@class OFConstantString;

typedef uint32_t of_unichar_t;

/**
 * \brief The encoding of a string.
/*!
 * @brief The encoding of a string.
 */
typedef enum of_string_encoding_t {
	OF_STRING_ENCODING_UTF_8,
	OF_STRING_ENCODING_ASCII,
	OF_STRING_ENCODING_ISO_8859_1,
	OF_STRING_ENCODING_ISO_8859_15,
	OF_STRING_ENCODING_WINDOWS_1252,
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
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
422
423



424
425
426
427
428
429


430
431
432
433
434



435
436
437
438
439
440


441
442
443
444
445
446
447




448
449
450
451
452
453
454


455
456
457
458
459
460


461
462
463
464
465


466
467
468
469
470
471
472



473
474
475
476
477
478


479
480
481
482


483
484
485
486
487


488
489
490
491
492



493
494
495
496
497
498


499
500
501
502


503
504
505
506
507


508
509
510
511
512



513
514
515
516
517
518


519
520
521
522
523
524
525
526
527
528


529
530
531
532
533


534
535
536
537
538



539
540
541
542
543
544


545
546
547
548
549
550

551
552
553
554
555


556
557
558
559
560
561
562


563
564
565
566
567
568


569
570

571
572
573
574
575


576
577

578
579
580
581
582


583
584
585
586


587
588
589
590
591


592
593
594
595


596
597
598
599
600


601
602
603


604
605
606
607
608


609
610
611
612


613
614
615
616
617
618


619
620
621


622
623
624
625
626
627


628
629
630


631
632

633
634
635
636
637
638
639


640
641
642


643
644
645


646
647
648
649
650
651
652
653


654
655
656


657
658
659
660
661


662
663
664


665
666
667
668
669


670
671
672


673
674
675
676
677


678
679
680


681
682
683
684
685


686
687
688


689
690
691
692
693


694
695
696
697
698



699
700
701
702
703
704


705
706
707
708
709



710
711
712


713
714
715
716
717
718
719
720


721
722

723
724
725
726
727


728
729

730
731
732
733
734


735
736

737
738
739
740

741
742
743
744
745


746
747

748
749
750
751
752


753
754

755
756
757
758
759


760
761

762
763
764
765
766
767


768
769
770


771
772
773
774
775


776
777
778


779
780
781
782
783


784
785
786


787
788
789
790
791


792
793
794


795
796

797
798
799
800
801
802


803
804

805
806
807
808
809


810
811

812
813
814
815
816


817
818

819
820
821
822
823


824
825
826
827
828
829
830
831
832
833

834
835
836
837
838


839
840
841
842
843
844
845
846
847
848

849
850
851
852
853


854
855
856
857
858

859
860
861
862
863


864
865
866
867
868

869
870
871
872
873


874
875
876
877
878
879

880
881
882
883
884


885
886
887
888
889
890

891
892
893
894
895


896
897

898
899
900
901
902

903
904
905

906
907
908
909
910
911
912
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


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
422
423
424
425
426
427


428
429
430
431



432
433
434
435
436
437
438


439
440
441
442
443




444
445
446
447
448
449
450
451
452


453
454
455
456
457
458


459
460
461
462
463


464
465
466
467
468
469



470
471
472
473
474
475
476


477
478
479
480


481
482
483
484
485


486
487
488
489



490
491
492
493
494
495
496


497
498
499
500


501
502
503
504
505


506
507
508
509



510
511
512
513
514
515
516


517
518
519
520
521
522
523
524
525
526


527
528
529
530
531


532
533
534
535



536
537
538
539
540
541
542


543
544
545
546
547
548
549

550
551
552
553


554
555
556
557
558
559
560


561
562
563
564
565
566


567
568
569

570
571
572
573


574
575
576

577
578
579
580


581
582
583
584


585
586
587
588
589


590
591
592
593


594
595
596
597
598


599
600
601


602
603
604
605
606


607
608
609
610


611
612
613
614
615
616


617
618
619


620
621
622
623
624
625


626
627
628


629
630
631

632
633
634
635
636
637


638
639
640


641
642
643


644
645
646
647
648
649
650
651


652
653
654


655
656
657
658
659


660
661
662


663
664
665
666
667


668
669
670


671
672
673
674
675


676
677
678


679
680
681
682
683


684
685
686


687
688
689
690
691


692
693
694
695



696
697
698
699
700
701
702


703
704
705
706



707
708
709
710


711
712
713
714
715
716
717
718


719
720
721

722
723
724
725


726
727
728

729
730
731
732


733
734
735

736
737
738
739

740
741
742
743


744
745
746

747
748
749
750


751
752
753

754
755
756
757


758
759
760

761
762
763
764
765


766
767
768


769
770
771
772
773


774
775
776


777
778
779
780
781


782
783
784


785
786
787
788
789


790
791
792


793
794
795

796
797
798
799
800


801
802
803

804
805
806
807


808
809
810

811
812
813
814


815
816
817

818
819
820
821


822
823
824
825
826
827
828
829
830
831
832

833
834
835
836


837
838
839
840
841
842
843
844
845
846
847

848
849
850
851


852
853
854
855
856
857

858
859
860
861


862
863
864
865
866
867

868
869
870
871


872
873
874
875
876
877
878

879
880
881
882


883
884
885
886
887
888
889

890
891
892
893


894
895
896

897
898
899
900
901

902
903
904

905
906
907
908
909
910
911
912







-
-
+
+













-
-
+
+

-
+



-
-
+
+

-
-
+
+



-
-
+
+


-
-
-
+
+
+




-
-
+
+

-
-
-
+
+
+




-
-
+
+


-
-
-
-
+
+
+
+





-
-
+
+

-
-
+
+



-
-
+
+

-
-
+
+



-
-
+
+


-
-
-
+
+
+




-
-
+
+


-
-
-
+
+
+




-
-
+
+


-
-
-
-
+
+
+
+





-
-
+
+

-
-
+
+



-
-
+
+


-
-
-
+
+
+




-
-
+
+


-
-
-
+
+
+




-
-
+
+



-
-
-
-
+
+
+
+





-
-
+
+




-
-
+
+



-
-
+
+

-
-
+
+



-
-
+
+


-
-
+
+



-
-
+
+


-
-
-
+
+
+




-
-
+
+







-
-
+
+



-
-
+
+


-
-
-
+
+
+




-
-
+
+


-
-
+
+



-
-
+
+


-
-
-
+
+
+




-
-
+
+


-
+

-
-
+
+

-
+




-
-
+
+


-
-
-
+
+
+




-
-
+
+


-
-
-
-
+
+
+
+





-
-
+
+

-
-
+
+



-
-
+
+

-
-
+
+



-
-
+
+


-
-
-
+
+
+




-
-
+
+


-
-
-
+
+
+




-
-
+
+



-
-
-
-
+
+
+
+





-
-
+
+

-
-
+
+



-
-
+
+


-
-
-
+
+
+




-
-
+
+


-
-
-
+
+
+




-
-
+
+



-
-
-
-
+
+
+
+





-
-
+
+




-
-
+
+



-
-
+
+




-
-
-
+
+
+




-
-
+
+


-
-
+
+



-
-
+
+


-
-
-
+
+
+




-
-
+
+


-
-
+
+



-
-
+
+


-
-
-
+
+
+




-
-
+
+








-
-
+
+



-
-
+
+


-
-
-
+
+
+




-
-
+
+





-
+



-
-
+
+





-
-
+
+




-
-
+
+

-
+



-
-
+
+

-
+



-
-
+
+


-
-
+
+



-
-
+
+


-
-
+
+



-
-
+
+

-
-
+
+



-
-
+
+


-
-
+
+




-
-
+
+

-
-
+
+




-
-
+
+

-
-
+
+

-
+





-
-
+
+

-
-
+
+

-
-
+
+






-
-
+
+

-
-
+
+



-
-
+
+

-
-
+
+



-
-
+
+

-
-
+
+



-
-
+
+

-
-
+
+



-
-
+
+

-
-
+
+



-
-
+
+


-
-
-
+
+
+




-
-
+
+


-
-
-
+
+
+

-
-
+
+






-
-
+
+

-
+



-
-
+
+

-
+



-
-
+
+

-
+



-
+



-
-
+
+

-
+



-
-
+
+

-
+



-
-
+
+

-
+




-
-
+
+

-
-
+
+



-
-
+
+

-
-
+
+



-
-
+
+

-
-
+
+



-
-
+
+

-
-
+
+

-
+




-
-
+
+

-
+



-
-
+
+

-
+



-
-
+
+

-
+



-
-
+
+









-
+



-
-
+
+









-
+



-
-
+
+




-
+



-
-
+
+




-
+



-
-
+
+





-
+



-
-
+
+





-
+



-
-
+
+

-
+




-
+


-
+







#ifdef __cplusplus
}
#endif

@class OFArray;
@class OFURL;

/**
 * \brief A class for handling strings.
/*!
 * @brief A class for handling strings.
 *
 * <b>Warning:</b> If you add methods to OFString using a category, you are not
 * allowed to access the ivars directly, as these might be still uninitialized
 * for a constant string and get initialized on the first message! Therefore,
 * you should use the corresponding methods to get the ivars, which ensures the
 * constant string is initialized.
 */
@interface OFString: OFObject <OFCopying, OFMutableCopying, OFComparing,
    OFSerialization, OFJSONRepresentation>
#ifdef OF_HAVE_PROPERTIES
@property (readonly) size_t length;
#endif

/**
 * \brief Creates a new OFString.
/*!
 * @brief Creates a new OFString.
 *
 * \return A new, autoreleased OFString
 * @return A new, autoreleased OFString
 */
+ (instancetype)string;

/**
 * \brief Creates a new OFString from a UTF-8 encoded C string.
/*!
 * @brief Creates a new OFString from a UTF-8 encoded C string.
 *
 * \param UTF8String A UTF-8 encoded C string to initialize the OFString with
 * \return A new autoreleased OFString
 * @param UTF8String A UTF-8 encoded C string to initialize the OFString with
 * @return A new autoreleased OFString
 */
+ (instancetype)stringWithUTF8String: (const char*)UTF8String;

/**
 * \brief Creates a new OFString from a UTF-8 encoded C string with the
/*!
 * @brief Creates a new OFString from a UTF-8 encoded C string with the
 *	  specified length.
 *
 * \param UTF8String A UTF-8 encoded C string to initialize the OFString with
 * \param UTF8StringLength The length of the UTF-8 encoded C string
 * \return A new autoreleased OFString
 * @param UTF8String A UTF-8 encoded C string to initialize the OFString with
 * @param UTF8StringLength The length of the UTF-8 encoded C string
 * @return A new autoreleased OFString
 */
+ (instancetype)stringWithUTF8String: (const char*)UTF8String
			      length: (size_t)UTF8StringLength;

/**
 * \brief Creates a new OFString from a C string with the specified encoding.
/*!
 * @brief Creates a new OFString from a C string with the specified encoding.
 *
 * \param string A C string to initialize the OFString with
 * \param encoding The encoding of the C string
 * \return A new autoreleased OFString
 * @param string A C string to initialize the OFString with
 * @param encoding The encoding of the C string
 * @return A new autoreleased OFString
 */
+ (instancetype)stringWithCString: (const char*)cString
			 encoding: (of_string_encoding_t)encoding;

/**
 * \brief Creates a new OFString from a C string with the specified encoding
/*!
 * @brief Creates a new OFString from a C string with the specified encoding
 *	  and length.
 *
 * \param cString A C string to initialize the OFString with
 * \param encoding The encoding of the C string
 * \param cStringLength The length of the C string
 * \return A new autoreleased OFString
 * @param cString A C string to initialize the OFString with
 * @param encoding The encoding of the C string
 * @param cStringLength The length of the C string
 * @return A new autoreleased OFString
 */
+ (instancetype)stringWithCString: (const char*)cString
			 encoding: (of_string_encoding_t)encoding
			   length: (size_t)cStringLength;

/**
 * \brief Creates a new OFString from another string.
/*!
 * @brief Creates a new OFString from another string.
 *
 * \param string A string to initialize the OFString with
 * \return A new autoreleased OFString
 * @param string A string to initialize the OFString with
 * @return A new autoreleased OFString
 */
+ (instancetype)stringWithString: (OFString*)string;

/**
 * \brief Creates a new OFString from a unicode string.
/*!
 * @brief Creates a new OFString from a unicode string.
 *
 * \param string The unicode string
 * \return A new autoreleased OFString
 * @param string The unicode string
 * @return A new autoreleased OFString
 */
+ (instancetype)stringWithUnicodeString: (const of_unichar_t*)string;

/**
 * \brief Creates a new OFString from a unicode string, assuming the specified
/*!
 * @brief Creates a new OFString from a unicode string, assuming the specified
 *	  byte order if no BOM is found.
 *
 * \param string The unicode string
 * \param byteOrder The byte order to assume if there is no BOM
 * \return A new autoreleased OFString
 * @param string The unicode string
 * @param byteOrder The byte order to assume if there is no BOM
 * @return A new autoreleased OFString
 */
+ (instancetype)stringWithUnicodeString: (const of_unichar_t*)string
			      byteOrder: (of_byte_order_t)byteOrder;

/**
 * \brief Creates a new OFString from a unicode string with the specified
/*!
 * @brief Creates a new OFString from a unicode string with the specified
 *	  length.
 *
 * \param string The unicode string
 * \param length The length of the unicode string
 * \return A new autoreleased OFString
 * @param string The unicode string
 * @param length The length of the unicode string
 * @return A new autoreleased OFString
 */
+ (instancetype)stringWithUnicodeString: (const of_unichar_t*)string
				 length: (size_t)length;

/**
 * \brief Creates a new OFString from a unicode string with the specified
/*!
 * @brief Creates a new OFString from a unicode string with the specified
 *	  length, assuming the specified byte order if no BOM is found.
 *
 * \param string The unicode string
 * \param byteOrder The byte order to assume if there is no BOM
 * \param length The length of the unicode string
 * \return A new autoreleased OFString
 * @param string The unicode string
 * @param byteOrder The byte order to assume if there is no BOM
 * @param length The length of the unicode string
 * @return A new autoreleased OFString
 */
+ (instancetype)stringWithUnicodeString: (const of_unichar_t*)string
			      byteOrder: (of_byte_order_t)byteOrder
				 length: (size_t)length;

/**
 * \brief Creates a new OFString from a UTF-16 encoded string.
/*!
 * @brief Creates a new OFString from a UTF-16 encoded string.
 *
 * \param string The UTF-16 string
 * \return A new autoreleased OFString
 * @param string The UTF-16 string
 * @return A new autoreleased OFString
 */
+ (instancetype)stringWithUTF16String: (const uint16_t*)string;

/**
 * \brief Creates a new OFString from a UTF-16 encoded string, assuming the
/*!
 * @brief Creates a new OFString from a UTF-16 encoded string, assuming the
 *	  specified byte order if no BOM is found.
 *
 * \param string The UTF-16 string
 * \param byteOrder The byte order to assume if there is no BOM
 * \return A new autoreleased OFString
 * @param string The UTF-16 string
 * @param byteOrder The byte order to assume if there is no BOM
 * @return A new autoreleased OFString
 */
+ (instancetype)stringWithUTF16String: (const uint16_t*)string
			    byteOrder: (of_byte_order_t)byteOrder;

/**
 * \brief Creates a new OFString from a UTF-16 encoded string with the specified
/*!
 * @brief Creates a new OFString from a UTF-16 encoded string with the specified
 *	  length.
 *
 * \param string The UTF-16 string
 * \param length The length of the unicode string
 * \return A new autoreleased OFString
 * @param string The UTF-16 string
 * @param length The length of the unicode string
 * @return A new autoreleased OFString
 */
+ (instancetype)stringWithUTF16String: (const uint16_t*)string
			       length: (size_t)length;

/**
 * \brief Creates a new OFString from a UTF-16 encoded string with the
/*!
 * @brief Creates a new OFString from a UTF-16 encoded string with the
 *	  specified length, assuming the specified byte order if no BOM is
 *	  found.
 *
 * \param string The UTF-16 string
 * \param byteOrder The byte order to assume if there is no BOM
 * \param length The length of the unicode string
 * \return A new autoreleased OFString
 * @param string The UTF-16 string
 * @param byteOrder The byte order to assume if there is no BOM
 * @param length The length of the unicode string
 * @return A new autoreleased OFString
 */
+ (instancetype)stringWithUTF16String: (const uint16_t*)string
			    byteOrder: (of_byte_order_t)byteOrder
			       length: (size_t)length;

/**
 * \brief Creates a new OFString from a format string.
/*!
 * @brief Creates a new OFString from a format string.
 *
 * See printf for the format syntax. As an addition, %@ is available as format
 * specifier for objects.
 *
 * \param format A string used as format to initialize the OFString
 * \return A new autoreleased OFString
 * @param format A string used as format to initialize the OFString
 * @return A new autoreleased OFString
 */
+ (instancetype)stringWithFormat: (OFConstantString*)format, ...;

/**
 * \brief Creates a new OFString containing the constructed specified path.
/*!
 * @brief Creates a new OFString containing the constructed specified path.
 *
 * \param firstComponent The first component of the path
 * \return A new autoreleased OFString
 * @param firstComponent The first component of the path
 * @return A new autoreleased OFString
 */
+ (instancetype)stringWithPath: (OFString*)firstComponent, ...;

/**
 * \brief Creates a new OFString with the contents of the specified UTF-8
/*!
 * @brief Creates a new OFString with the contents of the specified UTF-8
 *	  encoded file.
 *
 * \param path The path to the file
 * \return A new autoreleased OFString
 * @param path The path to the file
 * @return A new autoreleased OFString
 */
+ (instancetype)stringWithContentsOfFile: (OFString*)path;

/**
 * \brief Creates a new OFString with the contents of the specified file in the
/*!
 * @brief Creates a new OFString with the contents of the specified file in the
 *	  specified encoding.
 *
 * \param path The path to the file
 * \param encoding The encoding of the file
 * \return A new autoreleased OFString
 * @param path The path to the file
 * @param encoding The encoding of the file
 * @return A new autoreleased OFString
 */
+ (instancetype)stringWithContentsOfFile: (OFString*)path
				encoding: (of_string_encoding_t)encoding;

/**
 * \brief Creates a new OFString with the contents of the specified URL.
/*!
 * @brief Creates a new OFString with the contents of the specified URL.
 *
 * If the URL's scheme is file, it tries UTF-8 encoding.
 *
 * If the URL's scheme is http(s), it tries to detect the encoding from the HTTP
 * headers. If it could not detect the encoding using the HTTP headers, it tries
 * UTF-8.
 *
 * \param URL The URL to the contents for the string
 * \return A new autoreleased OFString
 * @param URL The URL to the contents for the string
 * @return A new autoreleased OFString
 */
+ (instancetype)stringWithContentsOfURL: (OFURL*)URL;

/**
 * \brief Creates a new OFString with the contents of the specified URL in the
/*!
 * @brief Creates a new OFString with the contents of the specified URL in the
 *	  specified encoding.
 *
 * \param URL The URL to the contents for the string
 * \param encoding The encoding to assume
 * \return A new autoreleased OFString
 * @param URL The URL to the contents for the string
 * @param encoding The encoding to assume
 * @return A new autoreleased OFString
 */
+ (instancetype)stringWithContentsOfURL: (OFURL*)URL
			       encoding: (of_string_encoding_t)encoding;

/**
 * \brief Initializes an already allocated OFString from a UTF-8 encoded C
/*!
 * @brief Initializes an already allocated OFString from a UTF-8 encoded C
 *	  string.
 *
 * \param UTF8String A UTF-8 encoded C string to initialize the OFString with
 * \return An initialized OFString
 * @param UTF8String A UTF-8 encoded C string to initialize the OFString with
 * @return An initialized OFString
 */
- initWithUTF8String: (const char*)UTF8String;

/**
 * \brief Initializes an already allocated OFString from a UTF-8 encoded C
/*!
 * @brief Initializes an already allocated OFString from a UTF-8 encoded C
 *	  string with the specified length.
 *
 * \param UTF8String A UTF-8 encoded C string to initialize the OFString with
 * \param UTF8StringLength The length of the UTF-8 encoded C string
 * \return An initialized OFString
 * @param UTF8String A UTF-8 encoded C string to initialize the OFString with
 * @param UTF8StringLength The length of the UTF-8 encoded C string
 * @return An initialized OFString
 */
- initWithUTF8String: (const char*)UTF8String
	      length: (size_t)UTF8StringLength;

/**
 * \brief Initializes an already allocated OFString from an UTF-8 encoded C
/*!
 * @brief Initializes an already allocated OFString from an UTF-8 encoded C
 *	  string without copying it, if possible.
 *
 * \note Mutable versions always create a copy!
 * @note Mutable versions always create a copy!
 *
 * \param UTF8String A UTF-8 encoded C string to initialize the OFString with
 * \param freeWhenDone Whether to free the C string when it is not needed
 * @param UTF8String A UTF-8 encoded C string to initialize the OFString with
 * @param freeWhenDone Whether to free the C string when it is not needed
 *		       anymore
 * \return An initialized OFString
 * @return An initialized OFString
 */
- initWithUTF8StringNoCopy: (const char*)UTF8String
	      freeWhenDone: (BOOL)freeWhenDone;

/**
 * \brief Initializes an already allocated OFString from a C string with the
/*!
 * @brief Initializes an already allocated OFString from a C string with the
 *	  specified encoding.
 *
 * \param cString A C string to initialize the OFString with
 * \param encoding The encoding of the C string
 * \return An initialized OFString
 * @param cString A C string to initialize the OFString with
 * @param encoding The encoding of the C string
 * @return An initialized OFString
 */
- initWithCString: (const char*)cString
	 encoding: (of_string_encoding_t)encoding;

/**
 * \brief Initializes an already allocated OFString from a C string with the
/*!
 * @brief Initializes an already allocated OFString from a C string with the
 *	  specified encoding and length.
 *
 * \param cString A C string to initialize the OFString with
 * \param encoding The encoding of the C string
 * \param cStringLength The length of the C string
 * \return An initialized OFString
 * @param cString A C string to initialize the OFString with
 * @param encoding The encoding of the C string
 * @param cStringLength The length of the C string
 * @return An initialized OFString
 */
- initWithCString: (const char*)cString
	 encoding: (of_string_encoding_t)encoding
	   length: (size_t)cStringLength;

/**
 * \brief Initializes an already allocated OFString with another string.
/*!
 * @brief Initializes an already allocated OFString with another string.
 *
 * \param string A string to initialize the OFString with
 * \return An initialized OFString
 * @param string A string to initialize the OFString with
 * @return An initialized OFString
 */
- initWithString: (OFString*)string;

/**
 * \brief Initializes an already allocated OFString with a unicode string.
/*!
 * @brief Initializes an already allocated OFString with a unicode string.
 *
 * \param string The unicode string
 * \return An initialized OFString
 * @param string The unicode string
 * @return An initialized OFString
 */
- initWithUnicodeString: (const of_unichar_t*)string;

/**
 * \brief Initializes an already allocated OFString with a unicode string,
/*!
 * @brief Initializes an already allocated OFString with a unicode string,
 *	  assuming the specified byte order if no BOM is found.
 *
 * \param string The unicode string
 * \param byteOrder The byte order to assume if there is no BOM
 * \return An initialized OFString
 * @param string The unicode string
 * @param byteOrder The byte order to assume if there is no BOM
 * @return An initialized OFString
 */
- initWithUnicodeString: (const of_unichar_t*)string
	      byteOrder: (of_byte_order_t)byteOrder;

/**
 * \brief Initializes an already allocated OFString with a unicode string with
/*!
 * @brief Initializes an already allocated OFString with a unicode string with
 *	  the specified length.
 *
 * \param string The unicode string
 * \param length The length of the unicode string
 * \return An initialized OFString
 * @param string The unicode string
 * @param length The length of the unicode string
 * @return An initialized OFString
 */
- initWithUnicodeString: (const of_unichar_t*)string
		 length: (size_t)length;

/**
 * \brief Initializes an already allocated OFString with a unicode string with
/*!
 * @brief Initializes an already allocated OFString with a unicode string with
 *	  the specified length, assuming the specified byte order if no BOM is
 *	  found.
 *
 * \param string The unicode string
 * \param byteOrder The byte order to assume if there is no BOM
 * \param length The length of the unicode string
 * \return An initialized OFString
 * @param string The unicode string
 * @param byteOrder The byte order to assume if there is no BOM
 * @param length The length of the unicode string
 * @return An initialized OFString
 */
- initWithUnicodeString: (const of_unichar_t*)string
	      byteOrder: (of_byte_order_t)byteOrder
		 length: (size_t)length;

/**
 * \brief Initializes an already allocated OFString with a UTF-16 string.
/*!
 * @brief Initializes an already allocated OFString with a UTF-16 string.
 *
 * \param string The UTF-16 string
 * \return An initialized OFString
 * @param string The UTF-16 string
 * @return An initialized OFString
 */
- initWithUTF16String: (const uint16_t*)string;

/**
 * \brief Initializes an already allocated OFString with a UTF-16 string,
/*!
 * @brief Initializes an already allocated OFString with a UTF-16 string,
 *	  assuming the specified byte order if no BOM is found.
 *
 * \param string The UTF-16 string
 * \param byteOrder The byte order to assume if there is no BOM
 * \return An initialized OFString
 * @param string The UTF-16 string
 * @param byteOrder The byte order to assume if there is no BOM
 * @return An initialized OFString
 */
- initWithUTF16String: (const uint16_t*)string
	    byteOrder: (of_byte_order_t)byteOrder;

/**
 * \brief Initializes an already allocated OFString with a UTF-16 string with
/*!
 * @brief Initializes an already allocated OFString with a UTF-16 string with
 *	  the specified length.
 *
 * \param string The UTF-16 string
 * \param length The length of the UTF-16 string
 * \return An initialized OFString
 * @param string The UTF-16 string
 * @param length The length of the UTF-16 string
 * @return An initialized OFString
 */
- initWithUTF16String: (const uint16_t*)string
	       length: (size_t)length;

/**
 * \brief Initializes an already allocated OFString with a UTF-16 string with
/*!
 * @brief Initializes an already allocated OFString with a UTF-16 string with
 *	  the specified length, assuming the specified byte order if no BOM is
 *	  found.
 *
 * \param string The UTF-16 string
 * \param byteOrder The byte order to assume if there is no BOM
 * \param length The length of the UTF-16 string
 * \return An initialized OFString
 * @param string The UTF-16 string
 * @param byteOrder The byte order to assume if there is no BOM
 * @param length The length of the UTF-16 string
 * @return An initialized OFString
 */
- initWithUTF16String: (const uint16_t*)string
	    byteOrder: (of_byte_order_t)byteOrder
	       length: (size_t)length;

/**
 * \brief Initializes an already allocated OFString with a format string.
/*!
 * @brief Initializes an already allocated OFString with a format string.
 *
 * See printf for the format syntax. As an addition, %@ is available as format
 * specifier for objects.
 *
 * \param format A string used as format to initialize the OFString
 * \return An initialized OFString
 * @param format A string used as format to initialize the OFString
 * @return An initialized OFString
 */
- initWithFormat: (OFConstantString*)format, ...;

/**
 * \brief Initializes an already allocated OFString with a format string.
/*!
 * @brief Initializes an already allocated OFString with a format string.
 *
 * See printf for the format syntax. As an addition, %@ is available as format
 * specifier for objects.
 *
 * \param format A string used as format to initialize the OFString
 * \param arguments The arguments used in the format string
 * \return An initialized OFString
 * @param format A string used as format to initialize the OFString
 * @param arguments The arguments used in the format string
 * @return An initialized OFString
 */
- initWithFormat: (OFConstantString*)format
       arguments: (va_list)arguments;

/**
 * \brief Initializes an already allocated OFString with the constructed
/*!
 * @brief Initializes an already allocated OFString with the constructed
 *	  specified path.
 *
 * \param firstComponent The first component of the path
 * \return A new autoreleased OFString
 * @param firstComponent The first component of the path
 * @return A new autoreleased OFString
 */
- initWithPath: (OFString*)firstComponent, ...;

/**
 * \brief Initializes an already allocated OFString with the constructed
/*!
 * @brief Initializes an already allocated OFString with the constructed
 *	  specified path.
 *
 * \param firstComponent The first component of the path
 * \param arguments A va_list with the other components of the path
 * \return A new autoreleased OFString
 * @param firstComponent The first component of the path
 * @param arguments A va_list with the other components of the path
 * @return A new autoreleased OFString
 */
- initWithPath: (OFString*)firstComponent
     arguments: (va_list)arguments;

/**
 * \brief Initializes an already allocated OFString with the contents of the
/*!
 * @brief Initializes an already allocated OFString with the contents of the
 *	  specified file in the specified encoding.
 *
 * \param path The path to the file
 * \return An initialized OFString
 * @param path The path to the file
 * @return An initialized OFString
 */
- initWithContentsOfFile: (OFString*)path;

/**
 * \brief Initializes an already allocated OFString with the contents of the
/*!
 * @brief Initializes an already allocated OFString with the contents of the
 *	  specified file in the specified encoding.
 *
 * \param path The path to the file
 * \param encoding The encoding of the file
 * \return An initialized OFString
 * @param path The path to the file
 * @param encoding The encoding of the file
 * @return An initialized OFString
 */
- initWithContentsOfFile: (OFString*)path
		encoding: (of_string_encoding_t)encoding;

/**
 * \brief Initializes an already allocated OFString with the contents of the
/*!
 * @brief Initializes an already allocated OFString with the contents of the
 *	  specified URL.
 *
 * If the URL's scheme is file, it tries UTF-8 encoding.
 *
 * If the URL's scheme is http(s), it tries to detect the encoding from the HTTP
 * headers. If it could not detect the encoding using the HTTP headers, it tries
 * UTF-8.
 *
 * \param URL The URL to the contents for the string
 * \return An initialized OFString
 * @param URL The URL to the contents for the string
 * @return An initialized OFString
 */
- initWithContentsOfURL: (OFURL*)URL;

/**
 * \brief Initializes an already allocated OFString with the contents of the
/*!
 * @brief Initializes an already allocated OFString with the contents of the
 *	  specified URL in the specified encoding.
 *
 * \param URL The URL to the contents for the string
 * \param encoding The encoding to assume
 * \return An initialized OFString
 * @param URL The URL to the contents for the string
 * @param encoding The encoding to assume
 * @return An initialized OFString
 */
- initWithContentsOfURL: (OFURL*)URL
	       encoding: (of_string_encoding_t)encoding;

/**
 * \brief Returns the OFString as a UTF-8 encoded C string.
/*!
 * @brief Returns the OFString as a UTF-8 encoded C string.
 *
 * The result is valid until the autorelease pool is released. If you want to
 * use the result outside the scope of the current autorelease pool, you have to
 * copy it.
 *
 * \return The OFString as a UTF-8 encoded C string
 * @return The OFString as a UTF-8 encoded C string
 */
- (const char*)UTF8String OF_RETURNS_INNER_POINTER;

/**
 * \brief Returns the OFString as a C string in the specified encoding.
/*!
 * @brief Returns the OFString as a C string in the specified encoding.
 *
 * The result is valid until the autorelease pool is released. If you want to
 * use the result outside the scope of the current autorelease pool, you have to
 * copy it.
 *
 * \param encoding The encoding for the C string
 * \return The OFString as a C string in the specified encoding
 * @param encoding The encoding for the C string
 * @return The OFString as a C string in the specified encoding
 */
- (const char*)cStringWithEncoding: (of_string_encoding_t)encoding
    OF_RETURNS_INNER_POINTER;

/**
 * \brief Returns the length of the string in Unicode characters.
/*!
 * @brief Returns the length of the string in Unicode characters.
 *
 * \return The length of the string in Unicode characters
 * @return The length of the string in Unicode characters
 */
- (size_t)length;

/**
 * \brief Returns the number of bytes the string needs in UTF-8 encoding.
/*!
 * @brief Returns the number of bytes the string needs in UTF-8 encoding.
 *
 * \return The number of bytes the string needs in UTF-8 encoding.
 * @return The number of bytes the string needs in UTF-8 encoding.
 */
- (size_t)UTF8StringLength;

/**
 * \brief Returns the number of bytes the string needs in the specified
/*!
 * @brief Returns the number of bytes the string needs in the specified
 *	  encoding.
 *
 * \param encoding The encoding for the string
 * \return The number of bytes the string needs in the specified encoding.
 * @param encoding The encoding for the string
 * @return The number of bytes the string needs in the specified encoding.
 */
- (size_t)cStringLengthWithEncoding: (of_string_encoding_t)encoding;

/**
 * \brief Compares the OFString to another OFString without caring about the
/*!
 * @brief Compares the OFString to another OFString without caring about the
 *	  case.
 *
 * \param otherString A string to compare with
 * \return An of_comparison_result_t
 * @param otherString A string to compare with
 * @return An of_comparison_result_t
 */
- (of_comparison_result_t)caseInsensitiveCompare: (OFString*)otherString;

/**
 * \brief Returns the Unicode character at the specified index.
/*!
 * @brief Returns the Unicode character at the specified index.
 *
 * \param index The index of the Unicode character to return
 * \return The Unicode character at the specified index
 * @param index The index of the Unicode character to return
 * @return The Unicode character at the specified index
 */
- (of_unichar_t)characterAtIndex: (size_t)index;

/**
 * \brief Copies the Unicode characters in the specified range to the specified
/*!
 * @brief Copies the Unicode characters in the specified range to the specified
 *	  buffer.
 *
 * \param buffer The buffer to store the Unicode characters
 * \param range The range of the Unicode characters to copy
 * @param buffer The buffer to store the Unicode characters
 * @param range The range of the Unicode characters to copy
 */
- (void)getCharacters: (of_unichar_t*)buffer
	      inRange: (of_range_t)range;

/**
 * \brief Returns the range of the first occurrence of the string.
/*!
 * @brief Returns the range of the first occurrence of the string.
 *
 * \param string The string to search
 * \return The range of the first occurrence of the string or a range with
 * @param string The string to search
 * @return The range of the first occurrence of the string or a range with
 *	   OF_NOT_FOUND as start position if it was not found
 */
- (of_range_t)rangeOfString: (OFString*)string;

/**
 * \brief Returns the range of the string.
/*!
 * @brief Returns the range of the string.
 *
 * \param string The string to search
 * \param options Options modifying search behaviour.
 * @param string The string to search
 * @param options Options modifying search behaviour.
 *		  Possible values: OF_STRING_SEARCH_BACKWARDS
 * \return The range of the first occurrence of the string or a range with
 * @return The range of the first occurrence of the string or a range with
 *	   OF_NOT_FOUND as start position if it was not found
 */
- (of_range_t)rangeOfString: (OFString*)string
		    options: (int)options;

/**
 * \brief Returns the range of the string in the specified range.
/*!
 * @brief Returns the range of the string in the specified range.
 *
 * \param string The string to search
 * \param options Options modifying search behaviour.
 * @param string The string to search
 * @param options Options modifying search behaviour.
 *		  Possible values: OF_STRING_SEARCH_BACKWARDS
 * \param range The range in which to search
 * \return The range of the first occurrence of the string or a range with
 * @param range The range in which to search
 * @return The range of the first occurrence of the string or a range with
 *	   OF_NOT_FOUND as start position if it was not found
 */
- (of_range_t)rangeOfString: (OFString*)string
		    options: (int)options
		      range: (of_range_t)range;

/**
 * \brief Returns whether the string contains the specified string.
/*!
 * @brief Returns whether the string contains the specified string.
 *
 * \param string The string to search
 * \return Whether the string contains the specified string
 * @param string The string to search
 * @return Whether the string contains the specified string
 */
- (BOOL)containsString: (OFString*)string;

/**
 * \brief Creates a substring with the specified range.
/*!
 * @brief Creates a substring with the specified range.
 *
 * \param range The range of the substring
 * \return The substring as a new autoreleased OFString
 * @param range The range of the substring
 * @return The substring as a new autoreleased OFString
 */
- (OFString*)substringWithRange: (of_range_t)range;

/**
 * \brief Creates a new string by appending another string.
/*!
 * @brief Creates a new string by appending another string.
 *
 * \param string The string to append
 * \return A new, autoreleased OFString with the specified string appended
 * @param string The string to append
 * @return A new, autoreleased OFString with the specified string appended
 */
- (OFString*)stringByAppendingString: (OFString*)string;

/**
 * \brief Creates a new string by appending a path component.
/*!
 * @brief Creates a new string by appending a path component.
 *
 * \param component The path component to append
 * \return A new, autoreleased OFString with the path component appended
 * @param component The path component to append
 * @return A new, autoreleased OFString with the path component appended
 */
- (OFString*)stringByAppendingPathComponent: (OFString*)component;

/**
 * \brief Creates a new string by prepending another string.
/*!
 * @brief Creates a new string by prepending another string.
 *
 * \param string The string to prepend
 * \return A new autoreleased OFString with the specified string prepended
 * @param string The string to prepend
 * @return A new autoreleased OFString with the specified string prepended
 */
- (OFString*)stringByPrependingString: (OFString*)string;

/**
 * \brief Creates a new string by replacing the occurrences of the specified
/*!
 * @brief Creates a new string by replacing the occurrences of the specified
 *	  string with the specified replacement.
 *
 * \param string The string to replace
 * \param replacement The string with which it should be replaced
 * \return A new string with the occurrences of the specified string replaced
 * @param string The string to replace
 * @param replacement The string with which it should be replaced
 * @return A new string with the occurrences of the specified string replaced
 */
- (OFString*)stringByReplacingOccurrencesOfString: (OFString*)string
				       withString: (OFString*)replacement;

/**
 * \brief Creates a new string by replacing the occurrences of the specified
/*!
 * @brief Creates a new string by replacing the occurrences of the specified
 *	  string in the specified range with the specified replacement.
 *
 * \param string The string to replace
 * \param replacement The string with which it should be replaced
 * \param options Options modifying search behaviour.
 * @param string The string to replace
 * @param replacement The string with which it should be replaced
 * @param options Options modifying search behaviour.
 *		  Possible values: None yet
 * \param range The range in which to replace the string
 * \return A new string with the occurrences of the specified string replaced
 * @param range The range in which to replace the string
 * @return A new string with the occurrences of the specified string replaced
 */
- (OFString*)stringByReplacingOccurrencesOfString: (OFString*)string
				       withString: (OFString*)replacement
					  options: (int)options
					    range: (of_range_t)range;

/**
 * \brief Returns the string in uppercase.
/*!
 * @brief Returns the string in uppercase.
 *
 * \return The string in uppercase
 * @return The string in uppercase
 */
- (OFString*)uppercaseString;

/**
 * \brief Returns the string in lowercase.
/*!
 * @brief Returns the string in lowercase.
 *
 * \return The string in lowercase
 * @return The string in lowercase
 */
- (OFString*)lowercaseString;

/**
 * \brief Returns the string capitalized.
/*!
 * @brief Returns the string capitalized.
 *
 * \note This only considers spaces, tab and newlines to be word delimiters!
 * @note This only considers spaces, tab and newlines to be word delimiters!
 *	 Also note that this might change in the future to all word delimiters
 *	 specified by Unicode!
 *
 * \return The capitalized string
 * @return The capitalized string
 */
- (OFString*)capitalizedString;

/**
 * \brief Creates a new string by deleting leading whitespaces.
/*!
 * @brief Creates a new string by deleting leading whitespaces.
 *
 * \return A new autoreleased OFString with leading whitespaces deleted
 * @return A new autoreleased OFString with leading whitespaces deleted
 */
- (OFString*)stringByDeletingLeadingWhitespaces;

/**
 * \brief Creates a new string by deleting trailing whitespaces.
/*!
 * @brief Creates a new string by deleting trailing whitespaces.
 *
 * \return A new autoreleased OFString with trailing whitespaces deleted
 * @return A new autoreleased OFString with trailing whitespaces deleted
 */
- (OFString*)stringByDeletingTrailingWhitespaces;

/**
 * \brief Creates a new string by deleting leading and trailing whitespaces.
/*!
 * @brief Creates a new string by deleting leading and trailing whitespaces.
 *
 * \return A new autoreleased OFString with leading and trailing whitespaces
 * @return A new autoreleased OFString with leading and trailing whitespaces
 *	   deleted
 */
- (OFString*)stringByDeletingEnclosingWhitespaces;

/**
 * \brief Checks whether the string has the specified prefix.
/*!
 * @brief Checks whether the string has the specified prefix.
 *
 * \param prefix The prefix to check for
 * \return A boolean whether the string has the specified prefix
 * @param prefix The prefix to check for
 * @return A boolean whether the string has the specified prefix
 */
- (BOOL)hasPrefix: (OFString*)prefix;

/**
 * \brief Checks whether the string has the specified suffix.
/*!
 * @brief Checks whether the string has the specified suffix.
 *
 * \param suffix The suffix to check for
 * \return A boolean whether the string has the specified suffix
 * @param suffix The suffix to check for
 * @return A boolean whether the string has the specified suffix
 */
- (BOOL)hasSuffix: (OFString*)suffix;

/**
 * \brief Separates an OFString into an OFArray of OFStrings.
/*!
 * @brief Separates an OFString into an OFArray of OFStrings.
 *
 * \param delimiter The delimiter for separating
 * \return An autoreleased OFArray with the separated string
 * @param delimiter The delimiter for separating
 * @return An autoreleased OFArray with the separated string
 */
- (OFArray*)componentsSeparatedByString: (OFString*)delimiter;

/**
 * \brief Separates an OFString into an OFArray of OFStrings.
/*!
 * @brief Separates an OFString into an OFArray of OFStrings.
 *
 * \param delimiter The delimiter for separating
 * \param options Options according to which the string should be separated
 * @param delimiter The delimiter for separating
 * @param options Options according to which the string should be separated
 * 		  Possible values: OF_STRING_SKIP_EMPTY
 * \return An autoreleased OFArray with the separated string
 * @return An autoreleased OFArray with the separated string
 */
- (OFArray*)componentsSeparatedByString: (OFString*)delimiter
				options: (int)options;

/**
 * \brief Returns the components of the path.
/*!
 * @brief Returns the components of the path.
 *
 * \return The components of the path
 * @return The components of the path
 */
- (OFArray*)pathComponents;

/**
 * \brief Returns the last component of the path.
/*!
 * @brief Returns the last component of the path.
 *
 * \return The last component of the path
 * @return The last component of the path
 */
- (OFString*)lastPathComponent;

/**
 * \brief Returns the directory name of the path.
/*!
 * @brief Returns the directory name of the path.
 *
 * \return The directory name of the path
 * @return The directory name of the path
 */
- (OFString*)stringByDeletingLastPathComponent;

/**
 * \brief Returns the decimal value of the string as an intmax_t.
/*!
 * @brief Returns the decimal value of the string as an intmax_t.
 *
 * Leading and trailing whitespaces are ignored.
 *
 * If the string contains any non-number characters, an
 * OFInvalidEncodingException is thrown.
 *
 * If the number is too big to fit into an intmax_t, an OFOutOfRangeException
 * is thrown.
 *
 * \return An intmax_t with the value of the string
 * @return An intmax_t with the value of the string
 */
- (intmax_t)decimalValue;

/**
 * \brief Returns the hexadecimal value of the string as an uintmax_t.
/*!
 * @brief Returns the hexadecimal value of the string as an uintmax_t.
 *
 * Leading and trailing whitespaces are ignored.
 *
 * If the string contains any non-number characters, an
 * OFInvalidEncodingException is thrown.
 *
 * If the number is too big to fit into an uintmax_t, an OFOutOfRangeException
 * is thrown.
 *
 * \return A uintmax_t with the value of the string
 * @return A uintmax_t with the value of the string
 */
- (uintmax_t)hexadecimalValue;

/**
 * \brief Returns the float value of the string as a float.
/*!
 * @brief Returns the float value of the string as a float.
 *
 * If the string contains any non-number characters, an
 * OFInvalidEncodingException is thrown.
 *
 * \return A float with the value of the string
 * @return A float with the value of the string
 */
- (float)floatValue;

/**
 * \brief Returns the double value of the string as a double.
/*!
 * @brief Returns the double value of the string as a double.
 *
 * If the string contains any non-number characters, an
 * OFInvalidEncodingException is thrown.
 *
 * \return A double with the value of the string
 * @return A double with the value of the string
 */
- (double)doubleValue;

/**
 * \brief Returns the string as an array of Unicode characters.
/*!
 * @brief Returns the string as an array of Unicode characters.
 *
 * The result is valid until the autorelease pool is released. If you want to
 * use the result outside the scope of the current autorelease pool, you have to
 * copy it.
 *
 * \return The string as an array of Unicode characters
 * @return The string as an array of Unicode characters
 */
- (const of_unichar_t*)unicodeString OF_RETURNS_INNER_POINTER;

/**
 * \brief Returns the string in big endian UTF-16 encoding.
/*!
 * @brief Returns the string in big endian UTF-16 encoding.
 *
 * The result is valid until the autorelease pool is released. If you want to
 * use the result outside the scope of the current autorelease pool, you have to
 * copy it.
 *
 * \return The string in big endian UTF-16 encoding
 * @return The string in big endian UTF-16 encoding
 */
- (const uint16_t*)UTF16String OF_RETURNS_INNER_POINTER;

/**
 * \brief Writes the string into the specified file using UTF-8 encoding.
/*!
 * @brief Writes the string into the specified file using UTF-8 encoding.
 *
 * \param path The path of the file to write to
 * @param path The path of the file to write to
 */
- (void)writeToFile: (OFString*)path;

#ifdef OF_HAVE_BLOCKS
/**
/*!
 * Enumerates all lines in the receiver using the specified block.
 *
 * \brief block The block to call for each line
 * @brief block The block to call for each line
 */
- (void)enumerateLinesUsingBlock: (of_string_line_enumeration_block_t)block;
#endif
@end

#import "OFConstantString.h"
#import "OFMutableString.h"