File: HFFullMemoryByteArray.m

package info (click to toggle)
sameboy 1.0.2%2Bds-1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 10,528 kB
  • sloc: ansic: 29,948; objc: 22,249; asm: 1,424; pascal: 1,373; makefile: 1,065; xml: 111
file content (70 lines) | stat: -rw-r--r-- 2,128 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
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
//
//  HFFullMemoryByteArray.m
//  HexFiend_2
//
//  Copyright 2007 ridiculous_fish. All rights reserved.
//

#import <HexFiend/HFByteArray_Internal.h>
#import <HexFiend/HFFullMemoryByteArray.h>
#import <HexFiend/HFFullMemoryByteSlice.h>
#import <HexFiend/HFByteSlice.h>

@implementation HFFullMemoryByteArray

- (instancetype)init {
    self = [super init];
    data = [[NSMutableData alloc] init];
    return self;
}

- (void)dealloc {
    [data release];
    [super dealloc];
}

- (unsigned long long)length {
    return [data length];
}

- (void)copyBytes:(unsigned char *)dst range:(HFRange)range {
    HFASSERT(range.length == 0 || dst != NULL);
    HFASSERT(HFSumDoesNotOverflow(range.location, range.length));
    HFASSERT(range.location + range.length <= [self length]);
    unsigned char* bytes = [data mutableBytes];
    memmove(dst, bytes + ll2l(range.location), ll2l(range.length));
}

- (HFByteArray *)subarrayWithRange:(HFRange)lrange {
    HFRange entireRange = HFRangeMake(0, [self length]);
    HFASSERT(HFRangeIsSubrangeOfRange(lrange, entireRange));
    NSRange range;
    range.location = ll2l(lrange.location);
    range.length = ll2l(lrange.length);
    HFFullMemoryByteArray* result = [[[self class] alloc] init];
    [result->data setData:[data subdataWithRange:range]];
    return [result autorelease];
}

- (NSArray *)byteSlices {
    return @[[[[HFFullMemoryByteSlice alloc] initWithData:data] autorelease]];
}

- (void)insertByteSlice:(HFByteSlice *)slice inRange:(HFRange)lrange {
    [self incrementGenerationOrRaiseIfLockedForSelector:_cmd];
    HFASSERT([slice length] <= NSUIntegerMax);
    NSUInteger length = ll2l([slice length]);
    NSRange range;
    HFASSERT(lrange.location <= NSUIntegerMax);
    HFASSERT(lrange.length <= NSUIntegerMax);
    HFASSERT(HFSumDoesNotOverflow(lrange.location, lrange.length));
    range.location = ll2l(lrange.location);
    range.length = ll2l(lrange.length);
    
    void* buff = check_malloc(length);
    [slice copyBytes:buff range:HFRangeMake(0, length)];
    [data replaceBytesInRange:range withBytes:buff length:length];
    free(buff);    
}

@end