MCPcopy Create free account
hub / github.com/Moddable-OpenSource/moddable / fxMapArchive

Function fxMapArchive

xs/sources/xsAPI.c:2182–2361  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

2180}
2181
2182void* 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));

Callers 5

modInstallModsFunction · 0.85
modInstallModsFunction · 0.85
modInstallModsFunction · 0.85
modInstallModsFunction · 0.85
modInstallModsFunction · 0.85

Calls 9

fxMapperReadAtomFunction · 0.85
fxMapperSkipFunction · 0.85
fxMapperRead2Function · 0.85
fxMapperRead1Function · 0.85
fxIDFunction · 0.85
fxMapperStepFunction · 0.85
fxMapperMapIDsFunction · 0.85
readMethod · 0.65
writeMethod · 0.65

Tested by

no test coverage detected