Trisurf Monte Carlo simulator
Samo Penic
2019-10-17 aecb11873dde5425c1acdf8791736461f3628b14
Non debugged compression of integer fields
2 files modified
40 ■■■■ changed files
src/snapshot.c 39 ●●●● patch | view | raw | blame | history
src/snapshot.h 1 ●●●● patch | view | raw | blame | history
src/snapshot.c
@@ -9,6 +9,7 @@
#include<inttypes.h>
#include<config.h>
#include <time.h>
#include <string.h>
#include "io.h"
/* a helper function that utilizes ts_string data structure and performs same as sprintf */
ts_uint ts_sprintf(ts_string *str, char *fmt, ...){
@@ -34,14 +35,14 @@
    xml_trisurf_vtx_tristar(data,vesicle->vlist);
    xml_trisurf_nucleus(data,vesicle);
    xml_trisurf_constvolarea(data,V0,A0);
#ifdef COMPRESSION
//#ifdef COMPRESSION
    char *compressed;
    ts_uint nbytes=ts_compress_string64(data->string, data->beg-1, &compressed); //suppress null character at the end with by substracting 1
    fwrite(compressed, sizeof(unsigned char), nbytes, fh);
    free (compressed);
#else
    fprintf(fh,"%s", data->string);
#endif
//#else
//    fprintf(fh,"%s", data->string);
//#endif
    free(data->string);  /* TODO: valgrind is not ok with this! */
    free(data);
    xml_trisurf_footer(fh);
@@ -145,7 +146,7 @@
/* zlib compression base64 encoded */
/* compressed must not be pre-malloced */
/* taken from https://gist.github.com/arq5x/5315739 */
ts_uint ts_compress_string64(char *data, ts_uint data_len, char **compressed){
ts_uint ts_compress_data(char *data, ts_uint data_len, char **compressed){
    z_stream defstream;
    defstream.zalloc = Z_NULL;
    defstream.zfree = Z_NULL;
@@ -158,14 +159,36 @@
    deflateInit(&defstream, Z_BEST_COMPRESSION);
        deflate(&defstream, Z_FINISH);
        deflateEnd(&defstream);
    /*base64 encode*/
    size_t nbase;
    *compressed=base64_encode((unsigned char *)compr,(size_t)defstream.total_out,&nbase);
    *compressed=compr;
//    *compressed=base64_encode((unsigned char *)compr,(size_t)defstream.total_out,&nbase);
    //fwrite(base64, sizeof(unsigned char), nbase, fh);
//    free(compr);
    return defstream.total_out;
}
ts_uint ts_compress_string64(char *data, ts_uint data_len, char **encoded_compressed){
    size_t nbase;
    char *compr;
    size_t number_of_compressed_bytes=ts_compress_data(data, data_len, &compr);
    *encoded_compressed=base64_encode((unsigned char *)compr,number_of_compressed_bytes,&nbase);
    free(compr);
    return nbase;
}
char *ts_compress_intlist(int *data, ts_uint data_len){
    size_t nbase;
    char *compr;
    size_t number_of_compressed_bytes=ts_compress_data((char *)data, data_len*sizeof(int), &compr);
    char *encoded_compressed=base64_encode((unsigned char *)compr,number_of_compressed_bytes,&nbase);
    free(compr);
    ts_uint header[4]={1, data_len, data_len, nbase};
    char *encoded_header=(char *)base64_encode((unsigned char *)header, 4*sizeof(ts_uint), &nbase);
    encoded_header=realloc(encoded_header, 4*sizeof(ts_uint)+strlen(encoded_compressed));
    encoded_header=strcat(encoded_header,encoded_compressed);
    free(encoded_compressed);
    return encoded_header;
}
ts_uint ts_decompress_string64(char *b64, ts_uint data_len, char **decompressed){
return TS_SUCCESS;
src/snapshot.h
@@ -26,4 +26,5 @@
void build_decoding_table();
void base64_cleanup();
ts_uint ts_compress_string64(char *data, ts_uint data_len, char **compressed);
char *ts_compress_intlist(int *data, ts_uint data_len);
#endif