Skip to content

Commit

Permalink
CRLE C design started.
Browse files Browse the repository at this point in the history
  • Loading branch information
eerimoq committed Mar 14, 2019
1 parent 8bda97a commit da89f77
Show file tree
Hide file tree
Showing 3 changed files with 173 additions and 4 deletions.
139 changes: 138 additions & 1 deletion src/c/detools.c
Original file line number Diff line number Diff line change
Expand Up @@ -356,10 +356,147 @@ static int patch_reader_lzma_init(struct detools_apply_patch_patch_reader_t *sel

#if DETOOLS_CONFIG_COMPRESSION_CRLE == 1

static int patch_reader_crle_init(struct detools_apply_patch_patch_reader_t *self_p)
static int patch_reader_crle_decompress_idle(
struct detools_apply_patch_patch_reader_t *self_p,
size_t *size_p)
{
int res;
uint8_t kind;
struct detools_apply_patch_patch_reader_crle_t *crle_p;

crle_p = &self_p->compression.crle;

if (self_p->apply_patch_p->chunk.offset == self_p->apply_patch_p->chunk.size) {
return (1);
}

res = 0;
*size_p = 0;
kind = self_p->apply_patch_p->chunk.buf_p[self_p->apply_patch_p->chunk.offset];

switch (kind) {

case 0:
crle_p->state = DETOOLS_CRLE_STATE_SCATTERED_SIZE;
break;

case 1:
crle_p->state = DETOOLS_CRLE_STATE_REPEATED_REPETITIONS;
break;

default:
res = -DETOOLS_CORRUPT_PATCH;
break;
}

return (res);
}

static int patch_reader_crle_decompress_scattered_size(
struct detools_apply_patch_patch_reader_t *self_p,
size_t *size_p)
{
(void)self_p;

*size_p = 0;

return (-DETOOLS_NOT_IMPLEMENTED);
}

static int patch_reader_crle_decompress_scattered_data(
struct detools_apply_patch_patch_reader_t *self_p,
uint8_t *buf_p,
size_t *size_p)
{
(void)self_p;
(void)buf_p;
(void)size_p;

return (-DETOOLS_NOT_IMPLEMENTED);
}

static int patch_reader_crle_decompress_repeated_repetitions(
struct detools_apply_patch_patch_reader_t *self_p,
size_t *size_p)
{
(void)self_p;

*size_p = 0;

return (-DETOOLS_NOT_IMPLEMENTED);
}

static int patch_reader_crle_decompress_repeated_data(
struct detools_apply_patch_patch_reader_t *self_p,
uint8_t *buf_p,
size_t *size_p)
{
(void)self_p;
(void)buf_p;
(void)size_p;

return (-DETOOLS_NOT_IMPLEMENTED);
}

static int patch_reader_crle_decompress(
struct detools_apply_patch_patch_reader_t *self_p,
uint8_t *buf_p,
size_t *size_p)
{
int res;
struct detools_apply_patch_patch_reader_crle_t *crle_p;

crle_p = &self_p->compression.crle;

switch (crle_p->state) {

case DETOOLS_CRLE_STATE_IDLE:
res = patch_reader_crle_decompress_idle(self_p, size_p);
break;

case DETOOLS_CRLE_STATE_SCATTERED_SIZE:
res = patch_reader_crle_decompress_scattered_size(self_p, size_p);
break;

case DETOOLS_CRLE_STATE_SCATTERED_DATA:
res = patch_reader_crle_decompress_scattered_data(self_p, buf_p, size_p);
break;

case DETOOLS_CRLE_STATE_REPEATED_REPETITIONS:
res = patch_reader_crle_decompress_repeated_repetitions(self_p, size_p);
break;

case DETOOLS_CRLE_STATE_REPEATED_DATA:
res = patch_reader_crle_decompress_repeated_data(self_p, buf_p, size_p);
break;

default:
res = -DETOOLS_INTERNAL_ERROR;
break;
}

return (res);
}

static int patch_reader_crle_destroy(
struct detools_apply_patch_patch_reader_t *self_p)
{
(void)self_p;

return (0);
}

static int patch_reader_crle_init(struct detools_apply_patch_patch_reader_t *self_p)
{

struct detools_apply_patch_patch_reader_crle_t *crle_p;

crle_p = &self_p->compression.crle;

crle_p->state = DETOOLS_CRLE_STATE_IDLE;
self_p->destroy = patch_reader_crle_destroy;
self_p->decompress = patch_reader_crle_decompress;

return (-DETOOLS_NOT_IMPLEMENTED);
}

Expand Down
22 changes: 22 additions & 0 deletions src/c/detools.h
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,25 @@ struct detools_apply_patch_patch_reader_lzma_t {

#endif

#define DETOOLS_CRLE_STATE_IDLE 0
#define DETOOLS_CRLE_STATE_SCATTERED_SIZE 1
#define DETOOLS_CRLE_STATE_SCATTERED_DATA 2
#define DETOOLS_CRLE_STATE_REPEATED_REPETITIONS 3
#define DETOOLS_CRLE_STATE_REPEATED_DATA 4

struct detools_apply_patch_patch_reader_crle_t {
int state;
union {
struct {
size_t number_of_bytes_left;
} scattered;
struct {
uint8_t value;
size_t number_of_bytes_left;
} repeated;
} kind;
};

struct detools_apply_patch_patch_reader_t {
struct detools_apply_patch_t *apply_patch_p;
struct {
Expand All @@ -141,6 +160,9 @@ struct detools_apply_patch_patch_reader_t {
#endif
#if DETOOLS_CONFIG_COMPRESSION_LZMA == 1
struct detools_apply_patch_patch_reader_lzma_t lzma;
#endif
#if DETOOLS_CONFIG_COMPRESSION_CRLE == 1
struct detools_apply_patch_patch_reader_crle_t crle;
#endif
} compression;
int (*destroy)(struct detools_apply_patch_patch_reader_t *self_p);
Expand Down
16 changes: 13 additions & 3 deletions tests/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -136,15 +136,25 @@ static void assert_apply_patch(const char *from_p,
const char *patch_p,
const char *to_p)
{
int res;
const char *actual_to_p = "assert-apply-patch.new";
FILE *actual_fto_p;
FILE *expected_fto_p;
int actual_byte;
int expected_byte;

assert(detools_apply_patch_filenames(from_p,
patch_p,
actual_to_p) == 0);
res = detools_apply_patch_filenames(from_p,
patch_p,
actual_to_p);

if (res != 0) {
printf("FAIL: apply of '%s' to '%s' to '%s' failed with '%s'\n",
patch_p,
from_p,
to_p,
detools_error_as_string(-res));
exit(1);
}

actual_fto_p = myfopen(actual_to_p, "rb");
expected_fto_p = myfopen(to_p, "rb");
Expand Down

0 comments on commit da89f77

Please sign in to comment.