300ff421ef
Former-commit-id: dda284b8de49fb65cd1a403db6a592e6c68a5e8c
94 lines
2.1 KiB
C
94 lines
2.1 KiB
C
static MonoBundledAssembly **bundled;
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <zlib.h>
|
|
|
|
static int
|
|
my_inflate (const Byte *compr, uLong compr_len, Byte *uncompr, uLong uncompr_len)
|
|
{
|
|
int err;
|
|
z_stream stream;
|
|
|
|
memset (&stream, 0, sizeof (z_stream));
|
|
stream.next_in = (Byte *) compr;
|
|
stream.avail_in = (uInt) compr_len;
|
|
|
|
// http://www.zlib.net/manual.html
|
|
err = inflateInit2 (&stream, 16+MAX_WBITS);
|
|
if (err != Z_OK)
|
|
return 1;
|
|
|
|
for (;;) {
|
|
stream.next_out = uncompr;
|
|
stream.avail_out = (uInt) uncompr_len;
|
|
err = inflate (&stream, Z_NO_FLUSH);
|
|
if (err == Z_STREAM_END) break;
|
|
if (err != Z_OK) {
|
|
printf ("%d\n", err);
|
|
return 2;
|
|
}
|
|
}
|
|
|
|
err = inflateEnd (&stream);
|
|
if (err != Z_OK)
|
|
return 3;
|
|
|
|
if (stream.total_out != uncompr_len)
|
|
return 4;
|
|
|
|
return 0;
|
|
}
|
|
|
|
void mono_mkbundle_init ()
|
|
{
|
|
CompressedAssembly **ptr;
|
|
MonoBundledAssembly **bundled_ptr;
|
|
Bytef *buffer;
|
|
int nbundles;
|
|
|
|
init_default_mono_api_struct ();
|
|
validate_api_struct ();
|
|
install_dll_config_files ();
|
|
|
|
ptr = (CompressedAssembly **) compressed;
|
|
nbundles = 0;
|
|
while (*ptr++ != NULL)
|
|
nbundles++;
|
|
|
|
bundled = (MonoBundledAssembly **) malloc (sizeof (MonoBundledAssembly *) * (nbundles + 1));
|
|
if (bundled == NULL) {
|
|
// May fail...
|
|
mkbundle_log_error ("mkbundle: out of memory");
|
|
exit (1);
|
|
}
|
|
|
|
bundled_ptr = bundled;
|
|
ptr = (CompressedAssembly **) compressed;
|
|
while (*ptr != NULL) {
|
|
uLong real_size;
|
|
uLongf zsize;
|
|
int result;
|
|
MonoBundledAssembly *current;
|
|
|
|
real_size = (*ptr)->assembly.size;
|
|
zsize = (*ptr)->compressed_size;
|
|
buffer = (Bytef *) malloc (real_size);
|
|
result = my_inflate ((*ptr)->assembly.data, zsize, buffer, real_size);
|
|
if (result != 0) {
|
|
fprintf (stderr, "mkbundle: Error %d decompressing data for %s\n", result, (*ptr)->assembly.name);
|
|
exit (1);
|
|
}
|
|
(*ptr)->assembly.data = buffer;
|
|
current = (MonoBundledAssembly *) malloc (sizeof (MonoBundledAssembly));
|
|
memcpy (current, *ptr, sizeof (MonoBundledAssembly));
|
|
current->name = (*ptr)->assembly.name;
|
|
*bundled_ptr = current;
|
|
bundled_ptr++;
|
|
ptr++;
|
|
}
|
|
*bundled_ptr = NULL;
|
|
mono_api.mono_register_bundled_assemblies((const MonoBundledAssembly **) bundled);
|
|
}
|