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
|
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
|
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
-
+
+
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
|
}
- free
{
fclose(fp);
return [super free];
}
- (BOOL)isEndOfFile
{
return feof(fp);
}
- (size_t)readIntoBuffer: (char*)buf
withSize: (size_t)size
andNItems: (size_t)nitems
{
size_t ret;
if ((ret = fread(buf, size, nitems, fp)) == 0 && ![self isEndOfFile])
[OFReadFailedException newWithObject: self
andSize: size
andNItems: nitems];
return ret;
}
- (char*)readWithSize: (size_t)size
andNItems: (size_t)nitems
{
uint64_t memsize;
char *ret;
if (size >= 0xFFFFFFFF || nitems >= 0xFFFFFFFF ||
if ((memsize = (uint64_t)nitems * size) > 0xFFFFFFFF) {
(memsize = (uint64_t)nitems * size) > 0xFFFFFFFF) {
[OFOverflowException newWithObject: self];
return NULL;
}
ret = [self getMem: (size_t)memsize];
if (fread(ret, size, nitems, fp) <= 0 && !feof(fp)) {
[self freeMem: ret];
@try {
[self readIntoBuffer: ret
[OFReadFailedException newWithObject: self
andSize: size
andNItems: nitems];
withSize: size
andNItems: nitems];
} @catch (OFReadFailedException *e) {
[self freeMem: ret];
@throw e;
return NULL;
}
return ret;
}
- (size_t)writeBuffer: (char*)buf
withSize: (size_t)size
andNItems: (size_t)nitems
{
size_t ret;
if ((ret = fwrite(buf, size, nitems, fp)) == 0 &&
size != 0 && nitems != 0)
[OFWriteFailedException newWithObject: self
andSize: size
andNItems: nitems];
return ret;
}
@end
|