ObjFW  Diff

Differences From Artifact [31e482b9ed]:

To Artifact [17a340fbd1]:


30
31
32
33
34
35
36

37
38
39
40
41
42
43
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44







+







#ifndef _WIN32
# include <signal.h>
#endif

#import "OFStream.h"
#import "OFString.h"
#import "OFDataArray.h"
#import "OFSystemInfo.h"
#import "OFRunLoop.h"

#import "OFInvalidArgumentException.h"
#import "OFInvalidFormatException.h"
#import "OFSetOptionFailedException.h"

#import "macros.h"
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
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







+



+
-
+






-
+








	return dataArray;
}

- (OFDataArray*)readDataArrayTillEndOfStream
{
	OFDataArray *dataArray;
	size_t pageSize;
	char *buffer;

	dataArray = [OFDataArray dataArray];
	pageSize = [OFSystemInfo pageSize];
	buffer = [self allocMemoryWithSize: of_pagesize];
	buffer = [self allocMemoryWithSize: pageSize];

	@try {
		while (![self isAtEndOfStream]) {
			size_t length;

			length = [self readIntoBuffer: buffer
					       length: of_pagesize];
					       length: pageSize];
			[dataArray addItems: buffer
				      count: length];
		}
	} @finally {
		[self freeMemory: buffer];
	}

559
560
561
562
563
564
565
566

567
568
569
570
571
572
573
562
563
564
565
566
567
568

569
570
571
572
573
574
575
576







-
+







	}

	return ret;
}

- (OFString*)tryReadLineWithEncoding: (of_string_encoding_t)encoding
{
	size_t i, bufferLength, retLength;
	size_t i, pageSize, bufferLength, retLength;
	char *retCString, *buffer, *newCache;
	OFString *ret;

	/* Look if there's a line or \0 in our cache */
	if (!waitingForDelimiter && cache != NULL) {
		for (i = 0; i < cacheLength; i++) {
			if OF_UNLIKELY (cache[i] == '\n' || cache[i] == '\0') {
592
593
594
595
596
597
598
599
600



601
602
603
604
605
606
607
595
596
597
598
599
600
601


602
603
604
605
606
607
608
609
610
611







-
-
+
+
+








				waitingForDelimiter = NO;
				return ret;
			}
		}
	}

	/* Read and see if we get a newline or \0 */
	buffer = [self allocMemoryWithSize: of_pagesize];
	/* Read and see if we got a newline or \0 */
	pageSize = [OFSystemInfo pageSize];
	buffer = [self allocMemoryWithSize: pageSize];

	@try {
		if ([self lowlevelIsAtEndOfStream]) {
			if (cache == NULL) {
				waitingForDelimiter = NO;
				return nil;
			}
620
621
622
623
624
625
626
627

628
629
630
631
632
633
634
624
625
626
627
628
629
630

631
632
633
634
635
636
637
638







-
+







			cacheLength = 0;

			waitingForDelimiter = NO;
			return ret;
		}

		bufferLength = [self lowlevelReadIntoBuffer: buffer
						     length: of_pagesize];
						     length: pageSize];

		/* Look if there's a newline or \0 */
		for (i = 0; i < bufferLength; i++) {
			if OF_UNLIKELY (buffer[i] == '\n' ||
			    buffer[i] == '\0') {
				retLength = cacheLength + i;
				retCString = [self
761
762
763
764
765
766
767
768

769
770
771
772
773
774
775
765
766
767
768
769
770
771

772
773
774
775
776
777
778
779







-
+







	return [self tryReadLineWithEncoding: OF_STRING_ENCODING_UTF_8];
}

- (OFString*)tryReadTillDelimiter: (OFString*)delimiter
			 encoding: (of_string_encoding_t)encoding
{
	const char *delimiterCString;
	size_t i, j, delimiterLength, bufferLength, retLength;
	size_t i, j, delimiterLength, pageSize, bufferLength, retLength;
	char *retCString, *buffer, *newCache;
	OFString *ret;

	delimiterCString = [delimiter cStringUsingEncoding: encoding];
	delimiterLength = [delimiter lengthOfBytesUsingEncoding: encoding];
	j = 0;

805
806
807
808
809
810
811
812
813



814
815
816
817
818
819
820
809
810
811
812
813
814
815


816
817
818
819
820
821
822
823
824
825







-
-
+
+
+








				waitingForDelimiter = NO;
				return ret;
			}
		}
	}

	/* Read and see if we get a delimiter or \0 */
	buffer = [self allocMemoryWithSize: of_pagesize];
	/* Read and see if we got a delimiter or \0 */
	pageSize = [OFSystemInfo pageSize];
	buffer = [self allocMemoryWithSize: pageSize];

	@try {
		if ([self lowlevelIsAtEndOfStream]) {
			if (cache == NULL) {
				waitingForDelimiter = NO;
				return nil;
			}
828
829
830
831
832
833
834
835

836
837
838
839
840
841
842
833
834
835
836
837
838
839

840
841
842
843
844
845
846
847







-
+







			cacheLength = 0;

			waitingForDelimiter = NO;
			return ret;
		}

		bufferLength = [self lowlevelReadIntoBuffer: buffer
						     length: of_pagesize];
						     length: pageSize];

		/* Look if there's a delimiter or \0 */
		for (i = 0; i < bufferLength; i++) {
			if (buffer[i] != delimiterCString[j++])
				j = 0;

			if (j == delimiterLength || buffer[i] == '\0') {