 |
|
 |
|
| Files: |
1 |
|
Branches Taken: |
46.2% |
49 / 106 |
| Generated: |
2009-05-17 22:47 |
|
Branches Executed: |
79.2% |
84 / 106 |
| |
|
Line Coverage: |
59.2% |
90 / 152 |
| |
 |
|
 |
1 : #include "klee/Internal/ADT/BOut.h"
2 :
3 : #include <stdlib.h>
4 : #include <string.h>
5 : #include <stdio.h>
6 :
7 : #define BOUT_MAGIC "BOUT\n"
8 : #define BOUT_MAGIC_SIZE 5
9 : #define BOUT_VERSION 2
10 :
11 : /***/
12 :
13 23: static int read_uint32(FILE *f, unsigned *value_out) {
14 : unsigned char data[4];
0: branch 0 not taken
23: branch 1 taken
15 23: if (fread(data, 4, 1, f)!=1)
16 0: return 0;
17 23: *value_out = (((((data[0]<<8) + data[1])<<8) + data[2])<<8) + data[3];
18 23: return 1;
19 : }
20 :
21 6019: static int write_uint32(FILE *f, unsigned value) {
22 : unsigned char data[4];
23 6019: data[0] = value>>24;
24 6019: data[1] = value>>16;
25 6019: data[2] = value>> 8;
26 6019: data[3] = value>> 0;
27 6019: return fwrite(data, 1, 4, f)==4;
28 : }
29 :
30 8: static int read_string(FILE *f, char **value_out) {
31 : unsigned len;
0: branch 1 not taken
8: branch 2 taken
32 8: if (!read_uint32(f, &len))
33 0: return 0;
34 8: *value_out = (char*) malloc(len+1);
0: branch 0 not taken
8: branch 1 taken
35 8: if (!*value_out)
36 0: return 0;
0: branch 0 not taken
8: branch 1 taken
37 16: if (fread(*value_out, len, 1, f)!=1)
38 0: return 0;
39 8: (*value_out)[len] = 0;
40 8: return 1;
41 : }
42 :
43 1859: static int write_string(FILE *f, const char *value) {
44 1859: unsigned len = strlen(value);
0: branch 1 not taken
1859: branch 2 taken
45 1859: if (!write_uint32(f, len))
46 0: return 0;
0: branch 1 not taken
1859: branch 2 taken
47 1859: if (fwrite(value, len, 1, f)!=1)
48 0: return 0;
49 1859: return 1;
50 : }
51 :
52 : /***/
53 :
54 :
55 2: unsigned bOut_getCurrentVersion() {
56 2: return BOUT_VERSION;
57 : }
58 :
59 :
60 2: static int bOut_checkHeader(FILE *f) {
61 : char header[BOUT_MAGIC_SIZE];
0: branch 0 not taken
2: branch 1 taken
62 2: if (fread(header, BOUT_MAGIC_SIZE, 1, f)!=1)
63 0: return 0;
0: branch 1 not taken
2: branch 2 taken
64 2: if (memcmp(header, BOUT_MAGIC, BOUT_MAGIC_SIZE))
65 0: return 0;
66 2: return 1;
67 : }
68 :
69 0: int bOut_isBOutFile(const char *path) {
70 0: FILE *f = fopen(path, "rb");
71 : int res;
72 :
0: branch 0 not taken
0: branch 1 not taken
73 0: if (!f)
74 0: return 0;
75 0: res = bOut_checkHeader(f);
76 0: fclose(f);
77 :
78 0: return res;
79 : }
80 :
81 2: BOut *bOut_fromFile(const char *path) {
82 2: FILE *f = fopen(path, "rb");
83 2: BOut *res = 0;
84 : unsigned i, version;
85 :
2: branch 0 taken
0: branch 1 not taken
86 2: if (!f)
87 0: goto error;
0: branch 1 not taken
2: branch 2 taken
88 2: if (!bOut_checkHeader(f))
89 0: goto error;
90 :
91 2: res = (BOut*) calloc(1, sizeof(*res));
0: branch 0 not taken
2: branch 1 taken
92 2: if (!res)
93 0: goto error;
94 :
0: branch 1 not taken
2: branch 2 taken
95 2: if (!read_uint32(f, &version))
96 0: goto error;
97 :
0: branch 1 not taken
2: branch 2 taken
98 2: if (version > bOut_getCurrentVersion())
99 0: goto error;
100 :
101 2: res->version = version;
102 :
0: branch 1 not taken
2: branch 2 taken
103 2: if (!read_uint32(f, &res->numArgs))
104 0: goto error;
105 2: res->args = (char**) calloc(res->numArgs, sizeof(*res->args));
0: branch 0 not taken
2: branch 1 taken
106 2: if (!res->args)
107 0: goto error;
108 :
3: branch 0 taken
2: branch 1 taken
109 5: for (i=0; i<res->numArgs; i++)
0: branch 1 not taken
3: branch 2 taken
110 3: if (!read_string(f, &res->args[i]))
111 0: goto error;
112 :
2: branch 0 taken
0: branch 1 not taken
113 2: if (version >= 2) {
0: branch 1 not taken
2: branch 2 taken
114 2: if (!read_uint32(f, &res->symArgvs))
115 0: goto error;
0: branch 1 not taken
2: branch 2 taken
116 2: if (!read_uint32(f, &res->symArgvLen))
117 0: goto error;
118 : }
119 :
0: branch 1 not taken
2: branch 2 taken
120 2: if (!read_uint32(f, &res->numObjects))
121 0: goto error;
122 2: res->objects = (BOutObject*) calloc(res->numObjects, sizeof(*res->objects));
0: branch 0 not taken
2: branch 1 taken
123 2: if (!res->objects)
124 0: goto error;
5: branch 0 taken
2: branch 1 taken
125 7: for (i=0; i<res->numObjects; i++) {
126 5: BOutObject *o = &res->objects[i];
0: branch 1 not taken
5: branch 2 taken
127 5: if (!read_string(f, &o->name))
128 0: goto error;
0: branch 1 not taken
5: branch 2 taken
129 5: if (!read_uint32(f, &o->numBytes))
130 0: goto error;
131 5: o->bytes = (unsigned char*) malloc(o->numBytes);
0: branch 0 not taken
5: branch 1 taken
132 10: if (fread(o->bytes, o->numBytes, 1, f)!=1)
133 0: goto error;
134 : }
135 :
136 2: fclose(f);
137 :
138 2: return res;
139 0: error:
0: branch 0 not taken
0: branch 1 not taken
140 0: if (res) {
0: branch 0 not taken
0: branch 1 not taken
141 0: if (res->args) {
0: branch 0 not taken
0: branch 1 not taken
142 0: for (i=0; i<res->numArgs; i++)
0: branch 0 not taken
0: branch 1 not taken
143 0: if (res->args[i])
144 0: free(res->args[i]);
145 0: free(res->args);
146 : }
0: branch 0 not taken
0: branch 1 not taken
147 0: if (res->objects) {
0: branch 0 not taken
0: branch 1 not taken
148 0: for (i=0; i<res->numObjects; i++) {
149 0: BOutObject *bo = &res->objects[i];
0: branch 0 not taken
0: branch 1 not taken
150 0: if (bo->name)
151 0: free(bo->name);
0: branch 0 not taken
0: branch 1 not taken
152 0: if (bo->bytes)
153 0: free(bo->bytes);
154 : }
155 0: free(res->objects);
156 : }
157 0: free(res);
158 : }
159 :
0: branch 0 not taken
0: branch 1 not taken
160 0: if (f) fclose(f);
161 :
162 0: return 0;
163 : }
164 :
165 663: int bOut_toFile(BOut *bo, const char *path) {
166 663: FILE *f = fopen(path, "wb");
167 : unsigned i;
168 :
663: branch 0 taken
0: branch 1 not taken
169 663: if (!f)
170 0: goto error;
0: branch 1 not taken
663: branch 2 taken
171 663: if (fwrite(BOUT_MAGIC, strlen(BOUT_MAGIC), 1, f)!=1)
172 0: goto error;
0: branch 1 not taken
663: branch 2 taken
173 663: if (!write_uint32(f, BOUT_VERSION))
174 0: goto error;
175 :
0: branch 1 not taken
663: branch 2 taken
176 663: if (!write_uint32(f, bo->numArgs))
177 0: goto error;
1014: branch 0 taken
663: branch 1 taken
178 1677: for (i=0; i<bo->numArgs; i++) {
0: branch 1 not taken
1014: branch 2 taken
179 1014: if (!write_string(f, bo->args[i]))
180 0: goto error;
181 : }
182 :
0: branch 1 not taken
663: branch 2 taken
183 663: if (!write_uint32(f, bo->symArgvs))
184 0: goto error;
0: branch 1 not taken
663: branch 2 taken
185 663: if (!write_uint32(f, bo->symArgvLen))
186 0: goto error;
187 :
0: branch 1 not taken
663: branch 2 taken
188 663: if (!write_uint32(f, bo->numObjects))
189 0: goto error;
845: branch 0 taken
663: branch 1 taken
190 1508: for (i=0; i<bo->numObjects; i++) {
191 845: BOutObject *o = &bo->objects[i];
0: branch 1 not taken
845: branch 2 taken
192 845: if (!write_string(f, o->name))
193 0: goto error;
0: branch 1 not taken
845: branch 2 taken
194 845: if (!write_uint32(f, o->numBytes))
195 0: goto error;
0: branch 1 not taken
845: branch 2 taken
196 845: if (fwrite(o->bytes, o->numBytes, 1, f)!=1)
197 0: goto error;
198 : }
199 :
200 663: fclose(f);
201 :
202 663: return 1;
203 0: error:
0: branch 0 not taken
0: branch 1 not taken
204 0: if (f) fclose(f);
205 :
206 0: return 0;
207 : }
208 :
209 1: unsigned bOut_numBytes(BOut *bo) {
210 1: unsigned i, res = 0;
1: branch 0 taken
1: branch 1 taken
211 2: for (i=0; i<bo->numObjects; i++)
212 1: res += bo->objects[i].numBytes;
213 1: return res;
214 : }
215 :
216 2: void bOut_free(BOut *bo) {
217 : unsigned i;
3: branch 0 taken
2: branch 1 taken
218 5: for (i=0; i<bo->numArgs; i++)
219 3: free(bo->args[i]);
220 2: free(bo->args);
5: branch 0 taken
2: branch 1 taken
221 7: for (i=0; i<bo->numObjects; i++) {
222 5: free(bo->objects[i].name);
223 5: free(bo->objects[i].bytes);
224 : }
225 2: free(bo->objects);
226 2: free(bo);
227 2: }
Generated: 2009-05-17 22:47 by zcov