Skip to content
Snippets Groups Projects
Commit 4d914bb5 authored by Dominik Loidolt's avatar Dominik Loidolt
Browse files

Merge branch 'binary_output' into 'master'

Binary output

See merge request !16
parents 312686e5 55ac1f30
Branches
No related tags found
1 merge request!16Binary output
......@@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file.
## [Unreleased]
### Added
- add --binary option for read and write files in binary format
- add cross compile file for sparc
- add tests for the compression entity
- add test for cmp_rdcu_cfg.c
......
......@@ -16,6 +16,7 @@ Compiled executables can be found [here](https://gitlab.phaidra.org/loidoltd15/c
| `-o <prefix>` | Use the `<prefix>` for output files<sup>[1](#fnote1)</sup> |
| `-n, --model_cfg` | Print a default model configuration and exit<sup>[2](#fnote2)</sup> |
| `--diff_cfg` | Print a default 1d-differencing configuration and exit<sup>[2](#fnote2)</sup> |
| `--binary` | Read and write files in binary format |
| `--no_header` | Do not add a compression entity header in front of the compressed data |
| `-a, --rdcu_par` | Add additional RDCU control parameters |
| `-V, --version` | Print program version and exit |
......
......@@ -73,6 +73,7 @@ enum {
NO_HEADER,
MODEL_ID,
MODEL_COUTER,
BINARY_IO,
};
static const struct option long_options[] = {
......@@ -89,6 +90,7 @@ static const struct option long_options[] = {
{"no_header", no_argument, NULL, NO_HEADER},
{"model_id", required_argument, NULL, MODEL_ID},
{"model_counter", required_argument, NULL, MODEL_COUTER},
{"binary", no_argument, NULL, BINARY_IO},
{NULL, 0, NULL, 0}
};
......@@ -106,8 +108,8 @@ static int rdcu_pkt_mode;
* setup packets */
static const char *last_info_file_name;
/* if non zero print additional verbose output */
static int verbose_en;
/* option flags for file IO */
static int io_flags;
/* if non zero add a compression entity header in front of the compressed data */
static int include_cmp_header = 1;
......@@ -197,7 +199,7 @@ int main(int argc, char **argv)
output_prefix = optarg;
break;
case 'v': /* --verbose */
verbose_en = 1;
io_flags |= CMP_IO_VERBOSE;
break;
case 'V': /* --version */
printf("%s version %s\n", PROGRAM_NAME, CMP_TOOL_VERSION);
......@@ -231,6 +233,9 @@ int main(int argc, char **argv)
case MODEL_COUTER:
model_counter_str = optarg;
break;
case BINARY_IO:
io_flags |= CMP_IO_BINARY;
break;
default:
print_help(program_name);
exit(EXIT_FAILURE);
......@@ -317,7 +322,7 @@ int main(int argc, char **argv)
if (cmp_operation) {
printf("## Starting the compression ##\n");
printf("Importing configuration file %s ... ", cfg_file_name);
error = cmp_cfg_read(cfg_file_name, &cfg, verbose_en);
error = cmp_cfg_read(cfg_file_name, &cfg, io_flags & CMP_IO_VERBOSE);
if (error)
goto fail;
printf("DONE\n");
......@@ -330,7 +335,7 @@ int main(int argc, char **argv)
if (cfg.samples == 0) {
int32_t samples;
size = read_file_data(data_file_name, cfg.data_type, NULL, 0, 0);
size = read_file_data(data_file_name, cfg.data_type, NULL, 0, io_flags);
if (size <= 0 || size > UINT32_MAX) /* empty file is treated as an error */
goto fail;
samples = cmp_input_size_to_samples((uint32_t)size, cfg.data_type);
......@@ -348,7 +353,7 @@ int main(int argc, char **argv)
}
size = read_file_data(data_file_name, cfg.data_type, cfg.input_buf,
input_size, verbose_en);
input_size, io_flags);
if (size < 0)
goto fail;
printf("DONE\n");
......@@ -361,7 +366,7 @@ int main(int argc, char **argv)
uint32_t cmp_size_byte;
printf("Importing decompression information file %s ... ", info_file_name);
error = cmp_info_read(info_file_name, &info, verbose_en);
error = cmp_info_read(info_file_name, &info, io_flags & CMP_IO_VERBOSE);
if (error)
goto fail;
printf("DONE\n");
......@@ -384,7 +389,7 @@ int main(int argc, char **argv)
cmp_size_byte = (info.cmp_size+7)/CHAR_BIT;
f_size = read_file8(data_file_name, cmp_ent_get_data_buf(decomp_entity),
cmp_size_byte, verbose_en);
cmp_size_byte, io_flags);
if (f_size < 0)
goto fail;
......@@ -396,11 +401,11 @@ int main(int argc, char **argv)
size_t buf_size;
printf("Importing compressed data file %s ... ", data_file_name);
buf_size = size = read_file_cmp_entity(data_file_name,
NULL, 0, 0);
size = read_file_cmp_entity(data_file_name, NULL, 0, io_flags);
if (size < 0 || size > UINT32_MAX)
goto fail;
/* to be save allocate at least the size of the cmp_entity struct */
buf_size = (size_t)size;
if (buf_size < sizeof(struct cmp_entity))
buf_size = sizeof(struct cmp_entity);
/* The compressed data is read in 4-byte words, so our
......@@ -414,7 +419,7 @@ int main(int argc, char **argv)
goto fail;
}
size = read_file_cmp_entity(data_file_name, decomp_entity,
(uint32_t)size, verbose_en);
(uint32_t)size, io_flags);
if (size < 0)
goto fail;
......@@ -423,7 +428,7 @@ int main(int argc, char **argv)
cmp_ent_set_size(decomp_entity, (uint32_t)buf_size);
}
if (verbose_en) {
if (io_flags & CMP_IO_VERBOSE) {
cmp_ent_print(decomp_entity);
printf("\n");
}
......@@ -465,7 +470,7 @@ int main(int argc, char **argv)
}
size = read_file_data(model_file_name, data_type, input_model_buf,
model_size, verbose_en);
model_size, io_flags);
if (size < 0)
goto fail;
printf("DONE\n");
......@@ -505,7 +510,7 @@ int main(int argc, char **argv)
}
error = write_input_data_to_file(input_model_buf, model_size, data_type,
output_prefix, "_upmodel.dat", verbose_en);
output_prefix, "_upmodel.dat", io_flags);
if (error)
goto fail;
printf("DONE\n");
......@@ -592,7 +597,7 @@ static int guess_cmp_pars(struct cmp_cfg *cfg, const char *guess_cmp_mode,
printf("DONE\n");
printf("Write the guessed compression configuration to file %s.cfg ... ", output_prefix);
error = cmp_cfg_fo_file(cfg, output_prefix, verbose_en);
error = cmp_cfg_fo_file(cfg, output_prefix, io_flags & CMP_IO_VERBOSE);
if (error)
return -1;
printf("DONE\n");
......@@ -623,7 +628,7 @@ static int gen_rdcu_write_pkts(struct cmp_cfg *cfg)
/* generation of packets for parallel read/write RDCU setup */
struct cmp_info last_info = {0};
error = cmp_info_read(last_info_file_name, &last_info, verbose_en);
error = cmp_info_read(last_info_file_name, &last_info, io_flags & CMP_IO_VERBOSE);
if (error) {
fprintf(stderr, "%s: %s: Importing last decompression information file failed.\n",
PROGRAM_NAME, last_info_file_name);
......@@ -703,13 +708,13 @@ static int cmp_gernate_rdcu_info(const struct cmp_cfg *cfg, int cmp_size_bit,
cfg_cpy.golomb_par = cfg_cpy.ap1_golomb_par;
cfg_cpy.spill = cfg_cpy.ap1_spill;
info->ap1_cmp_size = icu_compress_data(&cfg_cpy);
info->ap1_cmp_size = (uint32_t)icu_compress_data(&cfg_cpy);
if ((int)info->ap1_cmp_size < 0)
info->ap1_cmp_size = 0;
cfg_cpy.golomb_par = cfg_cpy.ap2_golomb_par;
cfg_cpy.spill = cfg_cpy.ap2_spill;
info->ap2_cmp_size = icu_compress_data(&cfg_cpy);
info->ap2_cmp_size = (uint32_t)icu_compress_data(&cfg_cpy);
if ((int)info->ap2_cmp_size < 0)
info->ap2_cmp_size = 0;
}
......@@ -819,8 +824,8 @@ static int compression(struct cmp_cfg *cfg, struct cmp_info *info)
}
printf("Write compressed data to file %s.cmp ... ", output_prefix);
error = write_cmp_data_file(data_to_write_to_file, cmp_size_byte,
output_prefix, ".cmp", verbose_en);
error = write_data_to_file(data_to_write_to_file, cmp_size_byte,
output_prefix, ".cmp", io_flags);
if (error)
goto error_cleanup;
printf("DONE\n");
......@@ -833,7 +838,7 @@ static int compression(struct cmp_cfg *cfg, struct cmp_info *info)
goto error_cleanup;
printf("DONE\n");
if (verbose_en) {
if (io_flags & CMP_IO_VERBOSE) {
printf("\n");
print_cmp_info(info);
printf("\n");
......@@ -891,7 +896,7 @@ static int decompression(struct cmp_entity *ent, uint16_t *input_model_buf)
printf("Write decompressed data to file %s.dat ... ", output_prefix);
error = write_input_data_to_file(decomp_output, (uint32_t)decomp_size, cmp_ent_get_data_type(ent),
output_prefix, ".dat", verbose_en);
output_prefix, ".dat", io_flags);
free(decomp_output);
if (error)
......
......@@ -28,26 +28,29 @@
#define BUFFER_LENGTH_DEF_FAKTOR 2
/* flags argument options (can be combined) */
#define CMP_IO_VERBOSE 1
#define CMP_IO_BINARY 2
void print_help(const char *program_name);
int cmp_cfg_read(const char *file_name, struct cmp_cfg *cfg, int verbose_en);
int cmp_info_read(const char *file_name, struct cmp_info *info, int verbose_en);
ssize_t read_file8(const char *file_name, uint8_t *buf, uint32_t buf_size,
int verbose_en);
ssize_t read_file8(const char *file_name, uint8_t *buf, uint32_t buf_size, int flags);
ssize_t read_file_data(const char *file_name, enum cmp_data_type data_type,
void *buf, uint32_t buf_size, int verbose_en);
void *buf, uint32_t buf_size, int flags);
ssize_t read_file_cmp_entity(const char *file_name, struct cmp_entity *ent,
uint32_t ent_size, int verbose_en);
uint32_t ent_size, int flags);
ssize_t read_file32(const char *file_name, uint32_t *buf, uint32_t buf_size,
int verbose_en);
uint32_t cmp_tool_gen_version_id(const char *version);
int write_cmp_data_file(const void *buf, uint32_t buf_size, const char
*output_prefix, const char *name_extension, int verbose);
int write_data_to_file(const void *buf, uint32_t buf_size, const char *output_prefix,
const char *name_extension, int flags);
int write_input_data_to_file(void *data, uint32_t data_size, enum cmp_data_type data_type,
const char *output_prefix, const char *name_extension, int verbose);
const char *output_prefix, const char *name_extension, int flags);
int cmp_info_to_file(const struct cmp_info *info, const char *output_prefix, int rdcu_cfg);
int cmp_cfg_fo_file(const struct cmp_cfg *cfg, const char *output_prefix, int verbose);
void cmp_cfg_print(const struct cmp_cfg *cfg);
......
......@@ -32,6 +32,7 @@
#include <byteorder.h>
#include <cmp_data_types.h>
#include <my_inttypes.h>
#include <cmp_io.h>
/* directory to convert from data_type to string */
......@@ -80,6 +81,7 @@ void print_help(const char *program_name)
printf(" -o <prefix> Use the <prefix> for output files\n");
printf(" -n, --model_cfg Print a default model configuration and exit\n");
printf(" --diff_cfg Print a default 1d-differencing configuration and exit\n");
printf(" --binary Read and write files in binary format\n");
printf(" --no_header Do not add a compression entity header in front of the compressed data\n");
printf(" -a, --rdcu_par Add additional RDCU control parameters\n");
printf(" -V, --version Print program version and exit\n");
......@@ -148,25 +150,25 @@ static FILE *open_file(const char *dirname, const char *filename)
/**
* @brief write uncompressed input data to an output file
* @brief write uncompressed input data in big-endian to an output file
*
* @param data the data to write a file
* @param data_size size of the data in bytes
* @param data_type compression data type of the data
* @param output_prefix file name without file extension
* @param name_extension extension (with leading point character)
* @param verbose print verbose output if not zero
* @param flags CMP_IO_VERBOSE print verbose output if set
* CMP_IO_BINARY write file in binary format if set
*
* @returns 0 on success, error otherwise
*/
int write_input_data_to_file(void *data, uint32_t data_size, enum cmp_data_type data_type,
const char *output_prefix, const char *name_extension, int verbose)
const char *output_prefix, const char *name_extension, int flags)
{
uint32_t i = 0;
FILE *fp;
uint8_t *tmp_buf;
size_t sample_size = size_of_a_sample(data_type);
uint8_t *tmp_buf;
int return_value;
if (!data)
abort();
......@@ -177,43 +179,18 @@ int write_input_data_to_file(void *data, uint32_t data_size, enum cmp_data_type
if (!sample_size)
return -1;
fp = open_file(output_prefix, name_extension);
if (fp == NULL) {
fprintf(stderr, "%s: %s%s: %s\n", PROGRAM_NAME, output_prefix,
name_extension, strerror(errno));
return -1;
}
tmp_buf = malloc(data_size);
if (!tmp_buf)
return -1;
memcpy(tmp_buf, data, data_size);
cmp_input_big_to_cpu_endianness(tmp_buf, data_size, data_type);
for (i = 0 ; i < data_size; i++) {
fprintf(fp, "%02X", tmp_buf[i]);
if ((i + 1) % 16 == 0)
fprintf(fp, "\n");
else
fprintf(fp, " ");
}
fprintf(fp, "\n");
fclose(fp);
if (verbose) {
printf("\n\n");
for (i = 0; i < data_size; i++) {
printf("%02X", tmp_buf[i]);
if ((i + 1) % 16 == 0)
printf("\n");
else
printf(" ");
}
printf("\n\n");
}
return_value = write_data_to_file(tmp_buf, data_size, output_prefix,
name_extension, flags);
free(tmp_buf);
return 0;
return return_value;
}
......@@ -226,17 +203,20 @@ int write_input_data_to_file(void *data, uint32_t data_size, enum cmp_data_type
* @param output_prefix file name without file extension
* @param name_extension file extension (with leading point character)
*
* @param verbose print verbose output if not zero
* @param flags CMP_IO_VERBOSE print verbose output if set
* CMP_IO_BINARY write file in binary format if set
*
* @returns 0 on success, error otherwise
*/
int write_cmp_data_file(const void *buf, uint32_t buf_size, const char *output_prefix,
const char *name_extension, int verbose)
int write_data_to_file(const void *buf, uint32_t buf_size, const char *output_prefix,
const char *name_extension, int flags)
{
unsigned int i;
FILE *fp;
const uint8_t *p = (const uint8_t *)buf;
const uint8_t *output_file_data;
uint8_t *tmp_buf = NULL;
size_t output_file_size;
if (!buf)
abort();
......@@ -251,28 +231,49 @@ int write_cmp_data_file(const void *buf, uint32_t buf_size, const char *output_p
return -1;
}
for (i = 0; i < buf_size; i++) {
fprintf(fp, "%02X", p[i]);
if ((i + 1) % 32 == 0)
fprintf(fp, "\n");
else
fprintf(fp, " ");
}
fprintf(fp, "\n");
if (flags & CMP_IO_BINARY) {
output_file_size = buf_size;
output_file_data = buf;
} else {
size_t i, j;
const uint8_t lut[0x10] = "0123456789abcdef";
/* convert data to ASCII */
output_file_size = buf_size*3 + 1;
tmp_buf = malloc(output_file_size);
if (!tmp_buf){
fclose(fp);
return -1;
}
if (verbose) {
printf("\n\n");
for (i = 0; i < buf_size; i++) {
printf("%02X", p[i]);
if ((i + 1) % 32 == 0)
printf("\n");
for (i = 0, j = 0; i < buf_size; i++) {
tmp_buf[j++] = lut[(p[i] >> 4)];
tmp_buf[j++] = lut[(p[i] & 0xF)];
if ((i + 1) % 16 == 0)
tmp_buf[j++] = '\n';
else
printf(" ");
tmp_buf[j++] = ' ';
}
tmp_buf[j] = '\n';
output_file_data = tmp_buf;
}
{
size_t const size_check = fwrite(output_file_data, sizeof(uint8_t),
output_file_size, fp);
fclose(fp);
if (size_check != output_file_size) {
free(tmp_buf);
return -1;
}
}
if (flags & CMP_IO_VERBOSE && !(flags & CMP_IO_BINARY)) {
fwrite(output_file_data, 1, output_file_size, stdout);
printf("\n\n");
}
free(tmp_buf);
return 0;
}
......@@ -1094,7 +1095,7 @@ int cmp_info_read(const char *file_name, struct cmp_info *info, int verbose_en)
* @returns a pointer to the character after the spaces
*/
static const char *skip_space(const char *str)
static __inline const char *skip_space(const char *str)
{
while (isspace(*str))
str++;
......@@ -1110,7 +1111,7 @@ static const char *skip_space(const char *str)
* @returns a pointer to the character after the comment
*/
static const char *skip_comment(const char *str)
static __inline const char *skip_comment(const char *str)
{
char c = *str;
......@@ -1143,7 +1144,7 @@ static const char *skip_comment(const char *str)
* conversion can be performed, 0 is returned (errno is set to EINVAL)).
*/
static uint8_t str_to_uint8(const char *str, char **str_end)
static __inline uint8_t str_to_uint8(const char *str, char const **str_end)
{
const int BASE = 16;
int i;
......@@ -1155,7 +1156,7 @@ static uint8_t str_to_uint8(const char *str, char **str_end)
orig = str;
for (i = 0; i < 2; i++) {
unsigned char c = *str;
unsigned char c = (unsigned char)*str;
if (c >= 'a')
c = c - 'a' + 10;
......@@ -1166,7 +1167,7 @@ static uint8_t str_to_uint8(const char *str, char **str_end)
else
c = 0xff;
if (c >= BASE)
if (unlikely(c >= BASE))
break;
res = res * BASE + c;
......@@ -1175,9 +1176,9 @@ static uint8_t str_to_uint8(const char *str, char **str_end)
}
if (str_end)
*str_end = (char *)str;
*str_end = str;
if (str == orig) { /* no value read in */
if (unlikely(str == orig)) { /* no value read in */
errno = EINVAL;
res = 0;
}
......@@ -1207,24 +1208,24 @@ static uint8_t str_to_uint8(const char *str, char **str_end)
* @returns the size in bytes to store the string content; negative on error
*/
static ssize_t str2uint8_arr(const char *str, uint8_t *data, uint32_t buf_size,
static ssize_t __inline str2uint8_arr(const char *str, uint8_t *data, uint32_t buf_size,
const char *file_name, int verbose_en)
{
const char *nptr = str;
char *eptr = NULL;
const char *eptr = NULL;
size_t i = 0;
errno = 0;
if (!data)
buf_size = ~0;
buf_size = ~0U;
if (!file_name)
file_name = "unknown file name";
for (i = 0; i < buf_size; ) {
uint8_t read_val;
unsigned char c = *nptr;
char c = *nptr;
if (c == '\0') {
if (!data) /* finished counting the sample */
......@@ -1249,8 +1250,12 @@ static ssize_t str2uint8_arr(const char *str, uint8_t *data, uint32_t buf_size,
abort();
c = *eptr;
if (c != '\0' && !isxdigit(c) && !isspace(c) && c != '#') {
if (isprint(c))
fprintf(stderr, "%s: %s: Error read in '%.*s'. The data are not correct formatted.\n",
PROGRAM_NAME, file_name, (int)(eptr-nptr+1), nptr);
else
fprintf(stderr, "%s: %s: Error: Non printable character found. If you want to read binary files, use the --binary option.\n",
PROGRAM_NAME, file_name);
return -1;
}
if (errno == EINVAL) {
......@@ -1287,7 +1292,7 @@ static ssize_t str2uint8_arr(const char *str, uint8_t *data, uint32_t buf_size,
PROGRAM_NAME, file_name);
}
return i;
return (ssize_t)i;
}
......@@ -1306,12 +1311,13 @@ static ssize_t str2uint8_arr(const char *str, uint8_t *data, uint32_t buf_size,
* @param file_name data/model file name
* @param buf buffer to write the file content (can be NULL)
* @param buf_size number of uint8_t data words to read in
* @param verbose_en print verbose output if not zero
* @param flags CMP_IO_VERBOSE print verbose output if set
* CMP_IO_BINARY read in file in binary format if set
*
* @returns the size in bytes to store the file content; negative on error
*/
ssize_t read_file8(const char *file_name, uint8_t *buf, uint32_t buf_size, int verbose_en)
ssize_t read_file8(const char *file_name, uint8_t *buf, uint32_t buf_size, int flags)
{
FILE *fp;
char *file_cpy = NULL;
......@@ -1346,14 +1352,27 @@ ssize_t read_file8(const char *file_name, uint8_t *buf, uint32_t buf_size, int v
if (fseek(fp, 0L, SEEK_SET) != 0)
goto fail;
file_cpy = (char *)calloc(file_size+1, sizeof(char));
if (flags & CMP_IO_BINARY) {
if (buf) {
ret_code = fread(buf, sizeof(uint8_t), buf_size, fp);
if (ret_code != (size_t)file_size) {
if (feof(fp))
printf("%s: %s: Error: unexpected end of file.\n", PROGRAM_NAME, file_name);
goto fail;
}
}
fclose(fp);
return file_size;
}
file_cpy = calloc((size_t)file_size+1, sizeof(char));
if (file_cpy == NULL) {
fprintf(stderr, "%s: %s: Error: allocating memory!\n", PROGRAM_NAME, file_name);
goto fail;
}
/* copy all the text into the file_cpy buffer */
ret_code = fread(file_cpy, sizeof(char), file_size, fp);
ret_code = fread(file_cpy, sizeof(uint8_t), (unsigned long)file_size, fp);
if (ret_code != (size_t)file_size) {
if (feof(fp))
printf("%s: %s: Error: unexpected end of file.\n", PROGRAM_NAME, file_name);
......@@ -1365,7 +1384,7 @@ ssize_t read_file8(const char *file_name, uint8_t *buf, uint32_t buf_size, int v
fclose(fp);
fp = NULL;
size = str2uint8_arr(file_cpy, buf, buf_size, file_name, verbose_en);
size = str2uint8_arr(file_cpy, buf, buf_size, file_name, flags & CMP_IO_VERBOSE);
free(file_cpy);
file_cpy = NULL;
......@@ -1389,31 +1408,34 @@ fail:
* @param data_type compression data type used for the data
* @param buf buffer to write the file content (can be NULL)
* @param buf_size size in bytes of the buffer
* @param verbose_en print verbose output if not zero
* @param flags CMP_IO_VERBOSE print verbose output if set
* CMP_IO_BINARY read in file in binary format if set
*
* @returns the size in bytes to store the file content; negative on error
*/
ssize_t read_file_data(const char *file_name, enum cmp_data_type data_type,
void *buf, uint32_t buf_size, int verbose_en)
void *buf, uint32_t buf_size, int flags)
{
ssize_t size;
int32_t samples;
int err;
size = read_file8(file_name, (uint8_t *)buf, buf_size, verbose_en);
size = read_file8(file_name, (uint8_t *)buf, buf_size, flags);
if (size > UINT32_MAX)
return -1;
if (size < 0)
return size;
samples = cmp_input_size_to_samples(size, data_type);
samples = cmp_input_size_to_samples((uint32_t)size, data_type);
if (samples < 0) {
fprintf(stderr, "%s: %s: Error: The data are not correct formatted for the used compression data type.\n",
PROGRAM_NAME, file_name);
return -1;
}
err = cmp_input_big_to_cpu_endianness(buf, size, data_type);
err = cmp_input_big_to_cpu_endianness(buf, (uint32_t)size, data_type);
if (err)
return -1;
......@@ -1427,17 +1449,18 @@ ssize_t read_file_data(const char *file_name, enum cmp_data_type data_type,
* @param file_name file name of the file containing the compression entity
* @param ent pointer to the buffer where the content of the file is written (can be NULL)
* @param ent_size size in bytes of the compression entity to read in
* @param verbose_en print verbose output if not zero
* @param flags CMP_IO_VERBOSE print verbose output if set
* CMP_IO_BINARY read in file in binary format if set
*
* @returns the size in bytes to store the file content; negative on error
*/
ssize_t read_file_cmp_entity(const char *file_name, struct cmp_entity *ent,
uint32_t ent_size, int verbose_en)
uint32_t ent_size, int flags)
{
ssize_t size;
size = read_file8(file_name, (uint8_t *)ent, ent_size, 0);
size = read_file8(file_name, (uint8_t *)ent, ent_size, flags);
if (size < 0)
return size;
......@@ -1457,11 +1480,11 @@ ssize_t read_file_cmp_entity(const char *file_name, struct cmp_entity *ent,
}
if (size != (ssize_t)cmp_ent_get_size(ent)) {
fprintf(stderr, "%s: %s: The size of the compression entity set in the header of the compression entity is not the same size as the read-in file has. Expected: 0x%x, has 0x%zx.\n",
PROGRAM_NAME, file_name, cmp_ent_get_size(ent), size);
PROGRAM_NAME, file_name, cmp_ent_get_size(ent), (size_t)size);
return -1;
}
if (verbose_en)
if (flags & CMP_IO_VERBOSE)
cmp_ent_parse(ent);
}
......@@ -1528,7 +1551,7 @@ uint32_t cmp_tool_gen_version_id(const char *version)
*/
copy = strdup(version);
token = strtok(copy, ".");
n = atoi(token);
n = (unsigned int)atoi(token);
if (n > UINT16_MAX) {
free(copy);
return 0;
......@@ -1540,7 +1563,7 @@ uint32_t cmp_tool_gen_version_id(const char *version)
}
token = strtok(NULL, ".");
n = atoi(token);
n = (unsigned int)atoi(token);
free(copy);
if (n > UINT16_MAX)
return 0;
......
project('cmp_tool', 'c',
version : '0.10',
version : '0.10-b.2',
meson_version : '>= 0.56',
license : 'GPL-2.0',
default_options : ['warning_level=3', 'c_std=gnu99']
......
......@@ -191,6 +191,7 @@ General Options:
-o <prefix> Use the <prefix> for output files
-n, --model_cfg Print a default model configuration and exit
--diff_cfg Print a default 1d-differencing configuration and exit
--binary Read and write files in binary format
--no_header Do not add a compression entity header in front of the compressed data
-a, --rdcu_par Add additional RDCU control parameters
-V, --version Print program version and exit
......@@ -412,7 +413,7 @@ def test_compression_diff():
assert(info['cmp_err'] == '0')
else:
header = read_in_cmp_header(f.read())
assert(header['asw_version_id']['value'] == VERSION)
assert(header['asw_version_id']['value'] == VERSION.split('-')[0])
assert(header['cmp_ent_size']['value'] == IMAGETTE_HEADER_SIZE+4)
assert(header['original_size']['value'] == 10)
# todo
......@@ -464,6 +465,8 @@ def test_model_compression():
# generate test data
data = '00 01 00 02 00 03 00 04 00 05 \n'
model = '00 00 00 01 00 02 00 03 00 04 \n'
data_byte = bytearray.fromhex(data)
model_byte = bytearray.fromhex(model)
data_file_name = 'data.dat'
model_file_name = 'model.dat'
cfg_file_name = 'model.cfg'
......@@ -488,9 +491,14 @@ def test_model_compression():
for key, value in cfg.items():
f.write(key + ' = ' + str(value) + '\n')
add_args = [" --no_header", ""]
add_args = [" --no_header", "", " --binary"]
add_args = [" --no_header", "", " --binary"]
for add_arg in add_args:
print("Remove this", add_arg)
if "--binary" in add_arg:
with open(data_file_name, 'wb') as f:
f.write(data_byte)
with open(model_file_name, 'wb') as f:
f.write(model_byte)
# compression
returncode, stdout, stderr = call_cmp_tool(
" -c "+cfg_file_name+" -d "+data_file_name+" -m "+model_file_name+" -o " +output_prefix1+add_arg)
......@@ -509,7 +517,7 @@ def test_model_compression():
)
assert(returncode == EXIT_SUCCESS)
if add_arg == " --no_header":
if "--no_header" in add_arg:
# check compressed data
with open(output_prefix1+".cmp", encoding='utf-8') as f:
assert(f.read() == "49 24 00 00 \n")
......@@ -525,9 +533,14 @@ def test_model_compression():
assert(info['cmp_size'] == '15')
assert(info['cmp_err'] == '0')
else:
if not "--binary" in add_arg:
with open(output_prefix1+".cmp", encoding='utf-8') as f:
header = read_in_cmp_header(f.read())
assert(header['asw_version_id']['value'] == VERSION)
else:
with open(output_prefix1+".cmp", 'rb') as f:
header = read_in_cmp_header(bytearray(f.read()).hex())
assert(header['asw_version_id']['value'] == VERSION.split('-')[0])
assert(header['cmp_ent_size']['value'] == IMAGETTE_HEADER_SIZE+4)
assert(header['original_size']['value'] == 10)
# todo
......@@ -545,9 +558,11 @@ def test_model_compression():
assert(header['compressed_data']['value'] == "49240000")
# decompression
if add_arg == " --no_header":
if "--no_header" in add_arg:
returncode, stdout, stderr = call_cmp_tool(
" -i "+output_prefix1+".info -d "+output_prefix1+".cmp -m "+model_file_name+" -o "+output_prefix2)
elif "--binary" in add_arg:
returncode, stdout, stderr = call_cmp_tool("-d "+output_prefix1+".cmp -m "+model_file_name+" -o "+output_prefix2+" --binary")
else:
returncode, stdout, stderr = call_cmp_tool("-d "+output_prefix1+".cmp -m "+model_file_name+" -o "+output_prefix2)
assert(stderr == "")
......@@ -562,13 +577,19 @@ def test_model_compression():
assert(returncode == EXIT_SUCCESS)
# check compressed data
if not "--binary" in add_arg:
with open(output_prefix2+".dat", encoding='utf-8') as f:
assert(f.read() == data)
with open(output_prefix1+"_upmodel.dat", encoding='utf-8') as f1:
with open(output_prefix2+"_upmodel.dat", encoding='utf-8') as f2:
assert(f1.read() == f2.read() == data) # upmodel == data -> model_value = 0
# '00 00 00 01 00 02 00 03 00 04 \n')
else:
with open(output_prefix2+".dat", 'rb') as f:
assert(f.read() == data_byte)
with open(output_prefix1+"_upmodel.dat", 'rb') as f1:
with open(output_prefix2+"_upmodel.dat", 'rb') as f2:
assert(f1.read() == f2.read() == data_byte)
# clean up
finally:
del_file(data_file_name)
......@@ -628,7 +649,7 @@ def test_raw_mode_compression():
assert(info['cmp_err'] == '0')
else:
header = read_in_cmp_header(f.read())
assert(header['asw_version_id']['value'] == VERSION)
assert(header['asw_version_id']['value'] == VERSION.split('-')[0])
assert(header['cmp_ent_size']['value'] == GENERIC_HEADER_SIZE+12)
assert(header['original_size']['value'] == 10)
# todo
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment