Skip to content

Commit 5da0b75

Browse files
committed
feat: accept extended ascii
1 parent 60108e3 commit 5da0b75

File tree

7 files changed

+30
-23
lines changed

7 files changed

+30
-23
lines changed

include/comand.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ struct data {
2121

2222
bool can_display_statistics;
2323
int serialized_tree[MAX_NODES];
24-
char data[MAX_NODES];
24+
unsigned char data[MAX_NODES];
2525
};
2626

2727
#endif

lib/huffman/huffman_ds.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,10 @@ static list_t *trim_freq_table(unsigned int *freq_table) {
3838
return list;
3939
}
4040

41-
list_t *new_freq_table(const char *str) {
41+
list_t *new_freq_table(const unsigned char *str) {
4242
unsigned int freq[FREQ_TABLE_SIZE] = {0};
4343

44-
for (size_t i = 0; i < strlen(str); i++) {
44+
for (size_t i = 0; i < strlen((char *)str); i++) {
4545
freq[(unsigned char)str[i]]++;
4646
}
4747
return trim_freq_table(freq);

lib/huffman/huffman_ds.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ struct list {
2727
* @param str string - should not be empty
2828
* @return linked list storing all 'frequency nodes' created from 'str'
2929
*/
30-
list_t *new_freq_table(const char *str);
30+
list_t *new_freq_table(const unsigned char *str);
3131

3232
/**
3333
* @brief Create a binary-tree based on 'Huffman coding'

src/decoder/decompress.c

+10-6
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,23 @@ static node_t *traverse_tree(node_t *current, char byte, int bit_index) {
99
return (byte & (1 << bit_index)) ? current->right : current->left;
1010
}
1111

12-
static char *huffman_coding_decompress(node_t *huff_tree, data_t *block) {
13-
int i = 0, j, k = 0;
12+
static unsigned char *huffman_coding_decompress(node_t *huff_tree,
13+
data_t *block) {
14+
int i, j, k = 0;
1415
node_t *current = huff_tree;
15-
char *decompressed = calloc(block->data_length + 1, sizeof(char));
16+
size_t data_length = block->data_length;
17+
unsigned char *decompressed =
18+
calloc(block->data_length + 1, sizeof(unsigned char));
1619

1720
for (i = 0; i < (int)block->compressed_data_length; i++) {
18-
for (j = 7; j >= 0; j--) {
21+
for (j = 7; j >= 0 && data_length; j--) {
1922
if (current) {
2023
current = traverse_tree(current, block->data[i], j);
2124
}
2225
if (is_leaf(current)) {
2326
decompressed[k++] = current->c;
2427
current = huff_tree;
28+
data_length--;
2529
}
2630
}
2731
}
@@ -31,11 +35,11 @@ static char *huffman_coding_decompress(node_t *huff_tree, data_t *block) {
3135

3236
void decompress(node_t *huff_tree, data_t *block) {
3337
clock_t invocation_start = clock(), invocation_end;
34-
char *decompressed = huffman_coding_decompress(huff_tree, block);
38+
unsigned char *decompressed = huffman_coding_decompress(huff_tree, block);
3539

3640
invocation_end = clock();
3741
block->time_to_decompress =
3842
(double)(invocation_end - invocation_start) / CLOCKS_PER_SEC * 1000;
39-
strcpy(block->data, decompressed);
43+
strcpy((char *)block->data, (char *)decompressed);
4044
free(decompressed);
4145
}

src/encoder/compress.c

+11-8
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ static void free_up_dictionary(char **dictionary) {
1818
dictionary = NULL;
1919
}
2020

21-
static int data_length(char **dic, const char *data) {
21+
static int data_length(char **dic, const unsigned char *data) {
2222
int i = -1, len = 0;
2323

2424
while (data[++i]) {
@@ -28,16 +28,18 @@ static int data_length(char **dic, const char *data) {
2828
return len;
2929
}
3030

31-
static char *encode(char **dic, const char *data) {
32-
char *encoded_data = calloc(data_length(dic, data), sizeof(char));
31+
static unsigned char *encode(char **dic, const unsigned char *data) {
32+
unsigned char *encoded_data =
33+
calloc(data_length(dic, data), sizeof(unsigned char));
3334

3435
for (int i = 0; data[i] != '\0'; i++) {
3536
strcat((char *)encoded_data, dic[(int)data[i]]);
3637
}
3738
return encoded_data;
3839
}
3940

40-
static void compress_byte(unsigned char *byte, char *encoded, int *j, int i) {
41+
static void compress_byte(unsigned char *byte, unsigned char *encoded, int *j,
42+
int i) {
4143
unsigned char mask = 1;
4244

4345
if (encoded[i] == '1') {
@@ -52,7 +54,7 @@ static void add_compressed_byte(char *compressed, int *k, unsigned char byte) {
5254
(*k)++;
5355
}
5456

55-
static unsigned int compress(char *encoded, char *compressed) {
57+
static unsigned int compress(unsigned char *encoded, char *compressed) {
5658
int i, j = 7, k = 0;
5759
unsigned char byte = 0;
5860

@@ -71,14 +73,15 @@ static unsigned int compress(char *encoded, char *compressed) {
7173
}
7274

7375
void compress_data(aux_t *aux) {
74-
char *data_to_be_compressed;
76+
unsigned char *data_to_be_compressed;
77+
7578
if (!strcmp("--file", aux->argv[1]) && aux->argv[2]) {
7679
data_to_be_compressed = file_to_str(aux->argv[2]);
7780
} else {
78-
data_to_be_compressed = merge_input(aux->argc, aux->argv);
81+
data_to_be_compressed = (unsigned char *)merge_input(aux->argc, aux->argv);
7982
}
8083
list_t *freq_table = new_freq_table(data_to_be_compressed);
81-
aux->data_length = strlen(data_to_be_compressed);
84+
aux->data_length = strlen((char *)data_to_be_compressed);
8285

8386
aux->huff_tree = new_huff_tree(freq_table);
8487
int tree_height = huff_tree_height(aux->huff_tree);

src/encoder/encoder.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ struct aux {
1313
unsigned int compressed_data_length;
1414

1515
char **dictionary;
16-
char *encoded_data;
16+
unsigned char *encoded_data;
1717
unsigned char compressed_data[MAX_NODES];
1818
node_t *huff_tree;
1919
};
@@ -45,7 +45,7 @@ char *merge_input(int argc, char **argv);
4545
* @param file_name existing file path
4646
* @return string containg the contents of 'file_name'
4747
*/
48-
char *file_to_str(const char *file_name);
48+
unsigned char *file_to_str(const char *file_name);
4949

5050
/**
5151
* @brief Uses bitshifting operations to compress data, writing relevant

src/encoder/input.c

+3-3
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ static bool has_valid_argc(int argc) { return argc >= 2; }
3636

3737
bool has_valid_input(int argc, char **argv) { return has_valid_argc(argc); }
3838

39-
static void read_into_buffer(FILE *file, char *contents, long size) {
39+
static void read_into_buffer(FILE *file, unsigned char *contents, long size) {
4040
int bytes_read = fread(contents, sizeof(char), size, file);
4141

4242
if (bytes_read != size) {
@@ -63,10 +63,10 @@ static FILE *open_file(const char *file_name) {
6363
return file;
6464
}
6565

66-
char *file_to_str(const char *file_name) {
66+
unsigned char *file_to_str(const char *file_name) {
6767
FILE *file = open_file(file_name);
6868
long size = get_file_size(file);
69-
char *contents = (char *)malloc(size + 1);
69+
unsigned char *contents = malloc(size + 1);
7070

7171
if (contents == NULL) {
7272
perror("malloc");

0 commit comments

Comments
 (0)