рд▓рд┐рдмреНрд░рд▓ - рдХрдореНрдкреНрд░реЗрд╢рди рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдРрдмреНрд╕рдЯреНрд░реИрдХреНрд╢рди рд▓реЗрдпрд░

рд╣рд╛рдп рд╣рдорд░! рдореИрдВ рдЕрдкрдиреА C / C ++ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд▓рд┐рдмреНрд░рд▓ рд╢реБрд░реВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЬреЛ рд╣рд╛рд▓ рд╣реА рдореЗрдВ GPL3 рд▓рд╛рдЗрд╕реЗрдВрд╕ рдХреЗ рддрд╣рдд рдЦреБрд▓рд╛ рд╕реНрд░реЛрдд рдмрди рдЧрдпрд╛ рд╣реИред рд╢рд╛рдпрдж рдпрд╣ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╡рд┐рднрд┐рдиреНрди рджреЛрд╖рд░рд╣рд┐рдд рдбреЗрдЯрд╛ рд╕рдВрдкреАрдбрд╝рди рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдХрд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕рдорд░реНрдерд┐рдд рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИрдВ:


рдпрд╣ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЖрдкрдХреЛ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрдкреАрдбрд╝рди рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рдмреАрдЪ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ рдиреНрдпреВрдирддрдо рдХреЛрдб рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдЗрд╖реНрдЯрддрдо рдЪреБрдирдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧреАред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдмреЗрдВрдЪрдорд╛рд░реНрдХ, рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдХреЛрдб рдХреЛ рд▓рд┐рдЦрдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред
рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рд╡рд┐рдХрд╛рд╕ рдЪрд▓ рд░рд╣рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕реНрдерд┐рд░рддрд╛ рдХреА рдЧрд┐рдирддреА рдХреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВ рд╣реИред
рдПрдкреАрдЖрдИ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрдкреАрдбрд╝рди рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рд╡рд░реНрдгрди рдЙрд╕рдХреЗ рдбреНрд░рд╛рдЗрд╡рд░ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдПрдХрд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реЛрддрд╛ рд╣реИред рдлрд╝рд╛рдЗрд▓ I / O рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдлрд┐рд▓рд╣рд╛рд▓ (v0.1) рдПрдХреНрд╕реЗрд╕ рд╕рднреА рдбреНрд░рд╛рдЗрд╡рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдХрдВрдкреНрд░реЗрд╕ () / рдЕрдирдХрдВрдкреНрд░реЗрд╕ () рдХреЛ рдЖрддреНрдорд╡рд┐рд╢реНрд╡рд╛рд╕ рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

struct file_driver_t{ fd_t *(* open)(const char *fname, int mode, void *params); int (* close)(fd_t *fd); off_t (* seek)(fd_t *fd, size_t offset, int whence); off_t (* tell)(fd_t *fd); size_t(* read)(fd_t *fd, char *buf, size_t size); size_t(* write)(fd_t *fd, char *buf, size_t size); int (* feof)(fd_t *fd); int (* ferror)(fd_t *fd); enum ral_status (* compress)(char *dest, size_t *destLen, const char *source, size_t sourceLen, void *param); enum ral_status (* uncompress)(char *dest, size_t *destLen, const char *source, size_t sourceLen, void *param); }; 

рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдбреНрд░рд╛рдЗрд╡рд░ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, get_driver рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
 enum drivers_t {RAL_STDC, RAL_GZ, RAL_LZO, RAL_SNAPPY, RAL_BZIP, RAL_END}; struct file_driver_t *get_driver(enum drivers_t d); 

рдЙрдкрдпреЛрдЧ рдЙрджрд╛рд╣рд░рдг:
 #include <ral.h> #include <stdio.h> #include <stdlib.h> #include <string.h> void fill_rand(char *buf, size_t size){ // we want to fill half, to show compression for(size_t i = 0; i < size / 2; i++){ buf[i] = (char)rand(); } } int main(){ static const size_t size_small = 1000000; // some drivers need more space to outbufer while compressing static const size_t size_big = 2*size_small; static char in[size_small]; static char tmp[size_big]; static char out[size_big]; // you can simply change drivers here struct file_driver_t *dr = get_driver(RAL_BZIP); if( dr == NULL || dr->compress == NULL || dr->uncompress == NULL ){ fprintf(stderr, "cant get driver\n"); return -1; } fill_rand(in, size_small); size_t tmp_len = size_big; if( dr->compress(tmp, &tmp_len, in, size_small, NULL) != RAL_OK ){ fprintf(stderr, "compress failed\n"); return -1; } printf("Compressed: in size: %ld out size: %ld\n", size_small, tmp_len); size_t out_len = size_big; if( dr->uncompress(out, &out_len, tmp, tmp_len, NULL) != RAL_OK ){ fprintf(stderr, "uncompress failed\n"); return -1; } if( out_len != size_small || memcmp(in, out, size_small) != 0 ) { fprintf(stderr, "Input and output differs\n"); return -1; } else { printf("Decompression ok\n"); } return 0; } 

рдореИрдВ рдХрд┐рд╕реА рднреА рдЯрд┐рдкреНрдкрдгреА рдФрд░ рд╕реБрдЭрд╛рд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рдЯреНрд░реЛрд▓ рдХреЛ рдзреНрдпрд╛рди рд╕реЗ рд╕реБрдиреВрдВрдЧрд╛ рдФрд░ рд▓реЗ рдЬрд╛рдКрдВрдЧрд╛ , рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдлрд╛рдЗрд▓ рдЖрдИрдУ рдПрдкреАрдЖрдИ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд░рд╛рдп рд╡рд┐рд╢реЗрд╖ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВред
рдкреЗрдЬ: github.com/artemg/ral
GIt: git: //github.com/artemg/ral.git
targz: github.com/downloads/artemg/ral/libral-0.1.tar.gz


Source: https://habr.com/ru/post/In123080/


All Articles