| 2180 | } |
| 2181 | |
| 2182 | void* fxMapArchive(txMachine* the, txPreparation* preparation, void* archive, size_t bufferSize, txArchiveRead read, txArchiveWrite write) |
| 2183 | { |
| 2184 | txMapper mapper; |
| 2185 | txMapper* self = &mapper; |
| 2186 | Atom atom; |
| 2187 | txU1* p; |
| 2188 | txU1* q; |
| 2189 | txU1 major = 0, minor = 0, patch = 0; |
| 2190 | txID id; |
| 2191 | txID c, i; |
| 2192 | txFlag clean; |
| 2193 | |
| 2194 | c_memset(self, 0, sizeof(txMapper)); |
| 2195 | if (c_setjmp(self->jmp_buf) == 0) { |
| 2196 | self->machine = the; |
| 2197 | self->archive = archive; |
| 2198 | self->read = read; |
| 2199 | self->write = write; |
| 2200 | |
| 2201 | self->scratchSize = 1024; |
| 2202 | self->scratch = c_malloc(self->scratchSize + bufferSize); |
| 2203 | mxElseNotEnoughMemory(self->scratch != C_NULL); |
| 2204 | self->bufferSize = bufferSize; |
| 2205 | self->buffer = self->scratch + self->scratchSize; |
| 2206 | |
| 2207 | mxElseFatalCheck(self->read(self->archive, 0, self->buffer, mxArchiveHeaderSize)); |
| 2208 | |
| 2209 | p = self->buffer; |
| 2210 | mxMapAtom(p); |
| 2211 | if (atom.atomType != XS_ATOM_ARCHIVE) { |
| 2212 | self->archive = NULL; |
| 2213 | goto bail; |
| 2214 | } |
| 2215 | self->size = atom.atomSize; |
| 2216 | mxMapAtom(p); |
| 2217 | mxElseFatalCheck(atom.atomType == XS_ATOM_VERSION); |
| 2218 | mxElseFatalCheck(atom.atomSize == sizeof(Atom) + 4); |
| 2219 | major = *p++; |
| 2220 | minor = *p++; |
| 2221 | patch = *p++; |
| 2222 | txU2 mod = (major << 8) + minor; |
| 2223 | txU2 min = (XS_MOD_COMPATIBLE_MAJOR_VERSION << 8) + XS_MOD_COMPATIBLE_MINOR_VERSION; |
| 2224 | txU2 max = (XS_MAJOR_VERSION << 8) + XS_MINOR_VERSION; |
| 2225 | mxElseIncompatibleMod((min <= mod) && (mod <= max)); |
| 2226 | p++; |
| 2227 | mxMapAtom(p); |
| 2228 | mxElseFatalCheck(atom.atomType == XS_ATOM_SIGNATURE); |
| 2229 | mxElseFatalCheck(atom.atomSize == sizeof(Atom) + XS_DIGEST_SIZE); |
| 2230 | p += XS_DIGEST_SIZE; |
| 2231 | |
| 2232 | self->bufferOffset = mxArchiveHeaderSize; |
| 2233 | if (self->bufferSize > self->size) |
| 2234 | self->bufferSize = self->size; |
| 2235 | mxElseFatalCheck(self->read(self->archive, mxArchiveHeaderSize, p, self->bufferSize - mxArchiveHeaderSize)); |
| 2236 | |
| 2237 | fxMapperReadAtom(self, &atom); |
| 2238 | mxElseFatalCheck(atom.atomType == XS_ATOM_NAME); |
| 2239 | fxMapperSkip(self, atom.atomSize - sizeof(Atom)); |
no test coverage detected