SameBoy | Accurate GB/GBC emulator |
| download: https://git.y1.nz/archives/sameboy.tar.gz | |
| README | Files | Log | Refs | LICENSE |
HexFiend/HFFullMemoryByteArray.m
1 //
2 // HFFullMemoryByteArray.m
3 // HexFiend_2
4 //
5 // Copyright 2007 ridiculous_fish. All rights reserved.
6 //
7
8 #import <HexFiend/HFByteArray_Internal.h>
9 #import <HexFiend/HFFullMemoryByteArray.h>
10 #import <HexFiend/HFFullMemoryByteSlice.h>
11 #import <HexFiend/HFByteSlice.h>
12
13 @implementation HFFullMemoryByteArray
14
15 - (instancetype)init {
16 self = [super init];
17 data = [[NSMutableData alloc] init];
18 return self;
19 }
20
21 - (void)dealloc {
22 [data release];
23 [super dealloc];
24 }
25
26 - (unsigned long long)length {
27 return [data length];
28 }
29
30 - (void)copyBytes:(unsigned char *)dst range:(HFRange)range {
31 HFASSERT(range.length == 0 || dst != NULL);
32 HFASSERT(HFSumDoesNotOverflow(range.location, range.length));
33 HFASSERT(range.location + range.length <= [self length]);
34 unsigned char* bytes = [data mutableBytes];
35 memmove(dst, bytes + ll2l(range.location), ll2l(range.length));
36 }
37
38 - (HFByteArray *)subarrayWithRange:(HFRange)lrange {
39 HFRange entireRange = HFRangeMake(0, [self length]);
40 HFASSERT(HFRangeIsSubrangeOfRange(lrange, entireRange));
41 NSRange range;
42 range.location = ll2l(lrange.location);
43 range.length = ll2l(lrange.length);
44 HFFullMemoryByteArray* result = [[[self class] alloc] init];
45 [result->data setData:[data subdataWithRange:range]];
46 return [result autorelease];
47 }
48
49 - (NSArray *)byteSlices {
50 return @[[[[HFFullMemoryByteSlice alloc] initWithData:data] autorelease]];
51 }
52
53 - (void)insertByteSlice:(HFByteSlice *)slice inRange:(HFRange)lrange {
54 [self incrementGenerationOrRaiseIfLockedForSelector:_cmd];
55 HFASSERT([slice length] <= NSUIntegerMax);
56 NSUInteger length = ll2l([slice length]);
57 NSRange range;
58 HFASSERT(lrange.location <= NSUIntegerMax);
59 HFASSERT(lrange.length <= NSUIntegerMax);
60 HFASSERT(HFSumDoesNotOverflow(lrange.location, lrange.length));
61 range.location = ll2l(lrange.location);
62 range.length = ll2l(lrange.length);
63
64 void* buff = check_malloc(length);
65 [slice copyBytes:buff range:HFRangeMake(0, length)];
66 [data replaceBytesInRange:range withBytes:buff length:length];
67 free(buff);
68 }
69
70 @end
This webpage is intended to be an accessible preview of this repository. To get a fuller picture, clone it and use the git CLI.