Jonathon Fletcher / Mbed 2 deprecated MBEDZlib

Dependencies:   mbed-rtos mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 #include "rtos.h"
00003 
00004 #include "zlib.h"
00005 
00006 
00007 static const char *newline = "\r\n";
00008 
00009 
00010 BusOut leds(LED1, LED2, LED3, LED4);
00011 LocalFileSystem fs("local");
00012 
00013 
00014 
00015 /** GUNZIP a from src buffer to dst buffer
00016  @param dst : destination buffer
00017  @param dst_length : pointer to destination buffer length
00018  @param src : source buffer
00019  @param src_length : source buffer length
00020  @return Z_OK on success, zlib error (<0) on failure
00021  */
00022 int gunzip(unsigned char *dst, unsigned long *dst_length, unsigned char *src, unsigned long src_length)
00023 {
00024     z_stream stream;
00025     memset(&stream, 0, sizeof(stream));
00026 
00027     stream.next_in = src;
00028     stream.avail_in = src_length;
00029 
00030     stream.next_out = dst;
00031     stream.avail_out = *dst_length;
00032 
00033     int rv = inflateInit2(&stream, 15 + 16);
00034     if (Z_OK == rv) {
00035         rv = inflate(&stream, Z_NO_FLUSH);
00036         if (Z_STREAM_END == rv) {
00037             inflateEnd(&stream);
00038             rv = Z_OK;
00039         }
00040     }
00041 
00042     if (Z_OK == rv) {
00043         *dst_length = stream.total_out;
00044     } else {
00045         *dst_length = 0;
00046     }
00047 
00048     return rv;
00049 }
00050 
00051 /** GUNZIP a from src buffer to dst buffer
00052  @param dst : destination buffer
00053  @param dst_length : pointer to destination buffer length
00054  @param src : source buffer
00055  @param src_length : source buffer length
00056  @return Z_OK on success, zlib error (<0) on failure
00057  */
00058 int gzip(unsigned char *dst, unsigned long *dst_length, unsigned char *src, unsigned long src_length)
00059 {
00060     z_stream        stream;
00061     memset(&stream, 0, sizeof(stream));
00062 
00063     stream.next_in = src;
00064     stream.avail_in = src_length;
00065 
00066     stream.next_out = Z_NULL;
00067     stream.avail_out = 0;
00068 
00069     /* add 16 to MAX_WBITS to specify gzip format - it gets taken off again in defaultInit2 */
00070     int rv = deflateInit2(&stream, Z_DEFAULT_COMPRESSION, Z_DEFLATED, 16 + MAX_WBITS, MAX_MEM_LEVEL, Z_DEFAULT_STRATEGY);
00071     if (Z_OK == rv) {
00072         unsigned long dst_bound = deflateBound(&stream, stream.avail_in) + 12; /* 12 bytes for the gzip header */
00073         if (dst_bound > *dst_length) {
00074             rv = Z_MEM_ERROR;
00075         } else {
00076             stream.next_out   = dst;
00077             stream.avail_out = dst_bound;
00078         }
00079     }
00080 
00081     if (Z_OK == rv) {
00082         gz_header        header;
00083         memset(&header, 0, sizeof(header));
00084         rv = deflateSetHeader(&stream, &header);
00085     }
00086 
00087     if (Z_OK == rv) {
00088         rv = deflate(&stream, Z_FINISH);
00089         if (Z_STREAM_END == rv) {
00090             rv = deflateEnd(&stream);
00091         }
00092     }
00093 
00094     if (Z_OK == rv) {
00095         *dst_length = stream.total_out;
00096     } else {
00097         *dst_length = 0;
00098     }
00099 
00100     return rv;
00101 }
00102 
00103 
00104 int main(int argc, char**argv)
00105 {
00106 
00107     unsigned char input_data[2048];
00108     unsigned long input_data_length = 0;
00109     FILE *ifp = fopen("/local/src.txt", "r");
00110     if (ifp) {
00111         int br = fread(input_data, 1, sizeof(input_data), ifp);
00112         fclose(ifp);
00113         input_data_length = br;
00114     }
00115     printf("%s:%d: input_data_length:%lu%s", __FILE__, __LINE__, input_data_length, newline);
00116 
00117 
00118     unsigned char gzip_data[2048];
00119     unsigned long gzip_data_length = 0;
00120     if (input_data_length > 0) {
00121         gzip_data_length = sizeof(gzip_data);
00122         int rv = gzip(gzip_data, &gzip_data_length, input_data, input_data_length);
00123         if (Z_OK == rv) {
00124             FILE *ofp = fopen("/local/dst.gz", "w");
00125             if (ofp) {
00126                 int bw = fwrite(gzip_data, 1, gzip_data_length, ofp);
00127                 fclose(ofp);
00128             }
00129         } else {
00130             printf("%s:%d: %d%s", __FILE__, __LINE__, rv, newline);
00131         }
00132     }
00133     printf("%s:%d: gzip_data_length:%lu%s", __FILE__, __LINE__, gzip_data_length, newline);
00134 
00135 
00136     unsigned char output_data[2048];
00137     unsigned long output_data_length = 0;
00138     if (gzip_data_length > 0) {
00139         output_data_length = sizeof(output_data);
00140         int rv = gunzip(output_data, &output_data_length, gzip_data, gzip_data_length);
00141         if (Z_OK != rv) {
00142             printf("%s:%d: %d%s", __FILE__, __LINE__, rv, newline);
00143         }
00144     }
00145     printf("%s:%d: output_data_length:%lu%s", __FILE__, __LINE__, output_data_length, newline);
00146 
00147 
00148     if (input_data_length > 0 and input_data_length > 0) {
00149         bool input_matches_output = false;
00150         if (input_data_length == output_data_length) {
00151             input_matches_output = true;
00152             for ( size_t i = 0 ; input_matches_output && i < input_data_length ; i++ ) {
00153                 if (input_data[i] != output_data[i]) {
00154                     input_matches_output = false;
00155                 }
00156             }
00157         }
00158         printf("%s:%d: input (%lu bytes) %s output (%lu bytes)%s", __FILE__, __LINE__, input_data_length, input_matches_output?"matches":"does not match", output_data_length, newline);
00159     } else {
00160         printf("%s:%d: input and/or output length is 0%s", __FILE__, __LINE__, newline);
00161     }
00162 
00163     while (true) {
00164         leds = (leds ^ 1);
00165         Thread::wait(1000);
00166     }
00167 }