|
dvander@27
|
1 |
#include "memfile.h" |
|
dvander@27
|
2 |
#include <string.h> |
|
dvander@27
|
3 |
#include "osdefs.h" |
|
dvander@27
|
4 |
|
|
dvander@27
|
5 |
memfile_t *memfile_creat(const char *name, size_t init) |
|
dvander@27
|
6 |
{ |
|
dvander@27
|
7 |
memfile_t mf; |
|
dvander@27
|
8 |
memfile_t *pmf; |
|
dvander@27
|
9 |
|
|
dvander@27
|
10 |
mf.size = init; |
|
dvander@27
|
11 |
mf.base = (char *)malloc(init); |
|
dvander@27
|
12 |
mf.usedoffs = 0; |
|
dvander@27
|
13 |
if (!mf.base) |
|
dvander@27
|
14 |
{ |
|
dvander@27
|
15 |
return NULL; |
|
dvander@27
|
16 |
} |
|
dvander@27
|
17 |
|
|
dvander@27
|
18 |
mf.offs = 0; |
|
dvander@27
|
19 |
mf._static = 0; |
|
dvander@27
|
20 |
|
|
dvander@27
|
21 |
pmf = (memfile_t *)malloc(sizeof(memfile_t)); |
|
dvander@27
|
22 |
memcpy(pmf, &mf, sizeof(memfile_t)); |
|
dvander@27
|
23 |
|
|
dvander@27
|
24 |
pmf->name = strdup(name); |
|
dvander@27
|
25 |
|
|
dvander@27
|
26 |
return pmf; |
|
dvander@27
|
27 |
} |
|
dvander@27
|
28 |
|
|
dvander@27
|
29 |
void memfile_destroy(memfile_t *mf) |
|
dvander@27
|
30 |
{ |
|
dvander@31
|
31 |
if (!mf) |
|
dvander@31
|
32 |
{ |
|
dvander@31
|
33 |
return; |
|
dvander@31
|
34 |
} |
|
dvander@31
|
35 |
|
|
dvander@27
|
36 |
if (!mf->_static) |
|
dvander@27
|
37 |
{ |
|
dvander@27
|
38 |
free(mf->name); |
|
dvander@27
|
39 |
free(mf->base); |
|
dvander@27
|
40 |
free(mf); |
|
dvander@27
|
41 |
} |
|
dvander@27
|
42 |
} |
|
dvander@27
|
43 |
|
|
dvander@27
|
44 |
void memfile_seek(memfile_t *mf, long seek) |
|
dvander@27
|
45 |
{ |
|
dvander@27
|
46 |
mf->offs = seek; |
|
dvander@27
|
47 |
} |
|
dvander@27
|
48 |
|
|
dvander@27
|
49 |
long memfile_tell(memfile_t *mf) |
|
dvander@27
|
50 |
{ |
|
dvander@27
|
51 |
return mf->offs; |
|
dvander@27
|
52 |
} |
|
dvander@27
|
53 |
|
|
dvander@27
|
54 |
size_t memfile_read(memfile_t *mf, void *buffer, size_t maxsize) |
|
dvander@27
|
55 |
{ |
|
dvander@27
|
56 |
if (!maxsize || mf->offs >= mf->usedoffs) |
|
dvander@27
|
57 |
{ |
|
dvander@27
|
58 |
return 0; |
|
dvander@27
|
59 |
} |
|
dvander@27
|
60 |
|
|
dvander@27
|
61 |
if (mf->usedoffs - mf->offs < (long)maxsize) |
|
dvander@27
|
62 |
{ |
|
dvander@27
|
63 |
maxsize = mf->usedoffs - mf->offs; |
|
dvander@27
|
64 |
if (!maxsize) |
|
dvander@27
|
65 |
{ |
|
dvander@27
|
66 |
return 0; |
|
dvander@27
|
67 |
} |
|
dvander@27
|
68 |
} |
|
dvander@27
|
69 |
|
|
dvander@27
|
70 |
memcpy(buffer, mf->base + mf->offs, maxsize); |
|
dvander@27
|
71 |
|
|
dvander@27
|
72 |
mf->offs += maxsize; |
|
dvander@27
|
73 |
|
|
dvander@27
|
74 |
return maxsize; |
|
dvander@27
|
75 |
} |
|
dvander@27
|
76 |
|
|
dvander@31
|
77 |
int memfile_write(memfile_t *mf, const void *buffer, size_t size) |
|
dvander@27
|
78 |
{ |
|
dvander@27
|
79 |
if (mf->offs + size > mf->size) |
|
dvander@27
|
80 |
{ |
|
dvander@27
|
81 |
size_t newsize = (mf->size + size) * 2; |
|
dvander@27
|
82 |
if (mf->_static) |
|
dvander@27
|
83 |
{ |
|
dvander@27
|
84 |
char *oldbase = mf->base; |
|
dvander@27
|
85 |
mf->base = (char *)malloc(newsize); |
|
dvander@27
|
86 |
if (!mf->base) |
|
dvander@27
|
87 |
{ |
|
dvander@27
|
88 |
return 0; |
|
dvander@27
|
89 |
} |
|
dvander@27
|
90 |
memcpy(mf->base, oldbase, mf->size); |
|
dvander@27
|
91 |
} else { |
|
dvander@27
|
92 |
mf->base = (char *)realloc(mf->base, newsize); |
|
dvander@27
|
93 |
if (!mf->base) |
|
dvander@27
|
94 |
{ |
|
dvander@27
|
95 |
return 0; |
|
dvander@27
|
96 |
} |
|
dvander@27
|
97 |
} |
|
dvander@27
|
98 |
mf->_static = 0; |
|
dvander@27
|
99 |
mf->size = newsize; |
|
dvander@27
|
100 |
} |
|
dvander@27
|
101 |
memcpy(mf->base + mf->offs, buffer, size); |
|
dvander@27
|
102 |
mf->offs += size; |
|
dvander@27
|
103 |
|
|
dvander@27
|
104 |
if (mf->offs > mf->usedoffs) |
|
dvander@27
|
105 |
{ |
|
dvander@27
|
106 |
mf->usedoffs = mf->offs; |
|
dvander@27
|
107 |
} |
|
dvander@27
|
108 |
|
|
dvander@27
|
109 |
return 1; |
|
dvander@27
|
110 |
} |
|
dvander@31
|
111 |
|
|
dvander@31
|
112 |
void memfile_reset(memfile_t *mf) |
|
dvander@31
|
113 |
{ |
|
dvander@31
|
114 |
mf->usedoffs = 0; |
|
dvander@31
|
115 |
mf->offs = 0; |
|
dvander@31
|
116 |
} |