42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
-
+
|
- (instancetype)initWithMemoryAddress: (void *)address
size: (size_t)size
writable: (bool)writable
{
self = [super init];
@try {
if (size > SSIZE_MAX || (ssize_t)size != (OFFileOffset)size)
if (size > SSIZE_MAX || (ssize_t)size != (OFStreamOffset)size)
@throw [OFOutOfRangeException exception];
_address = address;
_size = size;
_writable = writable;
} @catch (id e) {
[self release];
|
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
|
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
|
-
+
+
-
+
-
+
-
-
+
+
-
-
+
+
-
+
|
}
- (bool)lowlevelIsAtEndOfStream
{
return (_position == _size);
}
- (OFFileOffset)lowlevelSeekToOffset: (OFFileOffset)offset whence: (int)whence
- (OFStreamOffset)lowlevelSeekToOffset: (OFStreamOffset)offset
whence: (OFSeekWhence)whence
{
OFFileOffset new;
OFStreamOffset new;
switch (whence) {
case SEEK_SET:
case OFSeekSet:
new = offset;
break;
case SEEK_CUR:
new = (OFFileOffset)_position + offset;
case OFSeekCurrent:
new = (OFStreamOffset)_position + offset;
break;
case SEEK_END:
new = (OFFileOffset)_size + offset;
case OFSeekEnd:
new = (OFStreamOffset)_size + offset;
break;
default:
@throw [OFInvalidArgumentException exception];
}
if (new < 0 || new > (OFFileOffset)_size)
if (new < 0 || new > (OFStreamOffset)_size)
@throw [OFSeekFailedException exceptionWithStream: self
offset: offset
whence: whence
errNo: EINVAL];
return (_position = (size_t)new);
}
@end
|