ObjFW  Diff

Differences From Artifact [7e042e0447]:

To Artifact [d30563e398]:


34
35
36
37
38
39
40
41

42
43
44
45
46
47
48

49
50
51
52
53
54
55
34
35
36
37
38
39
40

41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56







-
+







+







#if !defined(OF_WINDOWS) && !defined(OF_MORPHOS)
# include <signal.h>
#endif

#import "OFStream.h"
#import "OFStream+Private.h"
#import "OFString.h"
#import "OFDataArray.h"
#import "OFData.h"
#import "OFSystemInfo.h"
#import "OFRunLoop.h"
#import "OFRunLoop+Private.h"

#import "OFInvalidArgumentException.h"
#import "OFInvalidFormatException.h"
#import "OFNotImplementedException.h"
#import "OFOutOfMemoryException.h"
#import "OFOutOfRangeException.h"
#import "OFSetOptionFailedException.h"
#import "OFTruncatedDataException.h"

#import "of_asprintf.h"

#define MIN_READ_SIZE 512
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
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







-
+

-
-
+
+


-
-
+
+

-
-
+
+

+
+
-
-
-
+
+
+
+


-
+


-
-
-
-
+
+
+
+
+
+
+


-
+


-
+

-
-
-
-
+
-
-
-
+
+







-
-
+
+





+
+
-
+







	for (size_t i = 0; i < count; i++)
		buffer[i] = OF_BSWAP_DOUBLE(buffer[i]);
#endif

	return size;
}

- (OFDataArray *)readDataArrayWithCount: (size_t)count
- (OFData *)readDataWithCount: (size_t)count
{
	return [self readDataArrayWithItemSize: 1
					 count: count];
	return [self readDataWithItemSize: 1
				    count: count];
}

- (OFDataArray *)readDataArrayWithItemSize: (size_t)itemSize
				     count: (size_t)count
- (OFData *)readDataWithItemSize: (size_t)itemSize
			   count: (size_t)count
{
	OFDataArray *dataArray;
	char *tmp;
	OFData *ret;
	char *buffer;

	if OF_UNLIKELY (count > SIZE_MAX / itemSize)
		@throw [OFOutOfRangeException exception];
	dataArray = [OFDataArray dataArrayWithItemSize: itemSize];
	tmp = [self allocMemoryWithSize: itemSize
				  count: count];

	if OF_UNLIKELY ((buffer = malloc(count * itemSize)) == NULL)
		@throw [OFOutOfMemoryException
		    exceptionWithRequestedSize: count * itemSize];

	@try {
		[self readIntoBuffer: tmp
		[self readIntoBuffer: buffer
			 exactLength: count * itemSize];

		[dataArray addItems: tmp
			      count: count];
	} @finally {
		[self freeMemory: tmp];
		ret = [OFData dataWithItemsNoCopy: buffer
					 itemSize: itemSize
					    count: count
				     freeWhenDone: true];
	} @catch (id e) {
		free(buffer);
		@throw e;
	}

	return dataArray;
	return ret;
}

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

	OFMutableData *data = [OFMutableData data];
	dataArray = [OFDataArray dataArray];
	pageSize = [OFSystemInfo pageSize];
	buffer = [self allocMemoryWithSize: pageSize];
	size_t pageSize = [OFSystemInfo pageSize];
	char *buffer = [self allocMemoryWithSize: pageSize];

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

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

	[data makeImmutable];

	return dataArray;
	return data;
}

- (OFString *)readStringWithLength: (size_t)length
{
	return [self readStringWithLength: length
				 encoding: OF_STRING_ENCODING_UTF_8];
}
1439
1440
1441
1442
1443
1444
1445
1446

1447
1448

1449
1450

1451
1452
1453
1454
1455
1456
1457
1444
1445
1446
1447
1448
1449
1450

1451
1452

1453
1454

1455
1456
1457
1458
1459
1460
1461
1462







-
+

-
+

-
+







		[self freeMemory: tmp];
	}
#endif

	return size;
}

- (size_t)writeDataArray: (OFDataArray *)dataArray
- (size_t)writeData: (OFData *)data
{
	size_t length = [dataArray count] * [dataArray itemSize];
	size_t length = [data count] * [data itemSize];

	[self writeBuffer: [dataArray items]
	[self writeBuffer: [data items]
		   length: length];

	return length;
}

- (size_t)writeString: (OFString *)string
{