summaryrefslogtreecommitdiffstats
path: root/all_pairs/source/huff_enc/huff_enc.c
diff options
context:
space:
mode:
authorJoshua Bakita <bakitajoshua@gmail.com>2019-10-07 19:13:39 -0400
committerJoshua Bakita <bakitajoshua@gmail.com>2019-10-07 19:13:39 -0400
commit386b7d3366f1359a265da207a9cafa3edf553b64 (patch)
treec76120c2c138faed822e4ae386be6ef22a738a78 /all_pairs/source/huff_enc/huff_enc.c
parent54a3f7091a2146b29c73a6fdc4b62a5c4ad7a3d8 (diff)
Reorganize and commit all the modified TACLeBench code and run scripts
Diffstat (limited to 'all_pairs/source/huff_enc/huff_enc.c')
-rw-r--r--all_pairs/source/huff_enc/huff_enc.c589
1 files changed, 589 insertions, 0 deletions
diff --git a/all_pairs/source/huff_enc/huff_enc.c b/all_pairs/source/huff_enc/huff_enc.c
new file mode 100644
index 0000000..2e739e6
--- /dev/null
+++ b/all_pairs/source/huff_enc/huff_enc.c
@@ -0,0 +1,589 @@
1/*
2
3 This program is part of the TACLeBench benchmark suite.
4 Version V 2.0
5
6 Name: huff_enc
7
8 Author: David Bourgin (David.Bourgin@ufrima.imag.fr)
9
10 Function: Example of Huffman encoding
11
12 Source: ftp://turing.imag.fr/pub/compression/ (1994-09-22)
13
14 Original name: codhuff.c
15
16 Changes: I/O to char arrays instead of file i/o.
17 Dynamic memory allocation replaced by array.
18 Explicit sorting algorithm.
19
20 License:
21
22The source code files (codrl1.c, dcodrl1.c, codrle2.c, dcodrle2.c, codrle3.c,
23dcodrle3.c, codrle4.c, dcodrle4.c, codhuff.c, dcodhuff.c) are copyrighted.
24They have been uploaded on ftp in turing.imag.fr (129.88.31.7):/pub/compression
25on 22/5/94 and have been modified on 22/9/94.
26(c) David Bourgin - 1994
27The source codes I provide have no buggs (!) but being that I make them
28available for free I have some notes to make. They can change at any time
29without notice. I assume no responsability or liability for any errors or
30inaccurracies, make no warranty of any kind (express, implied or statutory)
31with respect to this publication and expressly disclaim any and all warranties
32of merchantability, fitness for particular purposes. Of course, if you have
33some problems to use the information presented here, I will try to help you if
34I can.
35
36If you include the source codes in your application, here are the conditions:
37- You have to put my name in the header of your source file (not in the
38excutable program if you don't want) (this item is a must)
39- I would like to see your resulting application, if possible (this item is not
40a must, because some applications must remain secret)
41- Whenever you gain money with your application, I would like to receive a very
42little part in order to be encouraged to update my source codes and to develop
43new schemes (this item is not a must)
44
45*/
46
47
48/*
49 Declaration of types
50*/
51
52
53#include "../extra.h"
54typedef struct huff_enc_s_tree {
55 unsigned int byte; /* A byte has to be coded as an unsigned integer to
56 allow a node to have a value over 255 */
57 unsigned long int weight;
58 struct huff_enc_s_tree *left_ptr;
59 struct huff_enc_s_tree *right_ptr;
60} huff_enc_t_tree;
61
62typedef struct {
63 unsigned char bits[32];
64 unsigned int bits_nb;
65} huff_enc_t_bin_val;
66
67
68/*
69 Forward declaration of functions
70*/
71
72void huff_enc_init( void );
73int huff_enc_return( void );
74void huff_enc_beginning_of_data();
75int huff_enc_end_of_data();
76int huff_enc_read_byte();
77void huff_enc_write_byte( char ch );
78void huff_enc_write_bin_val( huff_enc_t_bin_val bin_val );
79void huff_enc_fill_encoding( void );
80void huff_enc_write_header( huff_enc_t_bin_val codes_table[257] );
81int huff_enc_weighhuff_enc_t_tree_comp( const void *t1, const void *t2 );
82void huff_enc_swapi( char *ii, char *ij, unsigned long es );
83char *huff_enc_pivot( char *a, unsigned long n, unsigned long es );
84void huff_enc_qsort( char *a, unsigned long n, unsigned long es );
85huff_enc_t_tree *huff_enc_build_tree_encoding( huff_enc_t_tree heap[514] );
86void huff_enc_encode_codes_table( huff_enc_t_tree *tree,
87 huff_enc_t_bin_val codes_table[257], huff_enc_t_bin_val *code_val );
88void huff_enc_create_codes_table( huff_enc_t_tree *tree,
89 huff_enc_t_bin_val codes_table[257] );
90void huff_enc_main();
91//int main( void );
92
93
94/*
95 Declaration of global variables
96*/
97
98static int huff_enc_input_pos;
99static int huff_enc_output_pos;
100static unsigned char huff_enc_output[1024];
101static unsigned char huff_enc_byte_nb_to_write = 0;
102static unsigned char huff_enc_val_to_write = 0;
103
104
105/*
106 Initialization- and return-value-related functions
107*/
108
109#define huff_enc_plaintext_len 600
110static const char *huff_enc_plaintext =
111 "You are doubtless asking \"How can I reduce the data size without losing "
112 "some informations?\". It's easy to answer to this question. I'll only take "
113 "an example. I'm sure you have heard about the morse. This system established "
114 "in the 19th century use a scheme very close to the huffman one. In the morse "
115 "you encode the letters to transmit with two kinds of signs. If you encode "
116 "these two sign possibilities in one bit, the symbol 'e' is transmitted in a "
117 "single bit and the symbols 'y' and 'z' need four bits. Look at the symbols "
118 "in the text you are reading, you'll fast understand the compression ratio...";
119
120#define huff_enc_encoded_len 419
121static unsigned char huff_enc_encoded[huff_enc_encoded_len] = {
122 128, 0, 0, 0, 80, 133, 32, 32, 128, 100, 4, 32, 63, 239, 255, 240,
123 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
124 4, 7, 167, 21, 129, 232, 69, 120, 132, 217, 20, 162, 19, 164, 39, 133,
125 252, 138, 105, 20, 194, 19, 129, 240, 172, 138, 248, 150, 11, 11, 240, 201,
126 68, 64, 114, 53, 17, 42, 37, 195, 128, 212, 116, 194, 41, 98, 52, 51,
127 12, 132, 112, 244, 3, 36, 33, 52, 39, 135, 164, 33, 62, 156, 87, 14,
128 110, 22, 87, 50, 85, 198, 99, 142, 140, 194, 81, 78, 158, 84, 129, 254,
129 129, 248, 110, 179, 159, 192, 145, 133, 184, 184, 28, 210, 96, 146, 73, 10,
130 226, 21, 83, 152, 74, 13, 111, 132, 199, 202, 219, 241, 74, 193, 167, 105,
131 222, 31, 147, 6, 55, 31, 129, 40, 232, 52, 153, 160, 148, 18, 36, 197,
132 45, 216, 202, 86, 30, 31, 177, 90, 133, 138, 248, 23, 81, 195, 160, 100,
133 215, 93, 50, 185, 225, 251, 23, 6, 230, 225, 229, 112, 71, 80, 96, 141,
134 205, 176, 230, 85, 196, 9, 24, 93, 90, 121, 225, 76, 68, 152, 63, 25,
135 107, 140, 101, 204, 214, 77, 26, 194, 96, 18, 48, 77, 210, 137, 1, 253,
136 4, 230, 248, 56, 240, 224, 111, 163, 95, 10, 12, 223, 7, 234, 167, 129,
137 40, 36, 96, 135, 125, 245, 250, 2, 198, 120, 127, 0, 145, 133, 213, 167,
138 135, 149, 195, 67, 235, 108, 9, 24, 87, 17, 102, 152, 37, 4, 222, 131,
139 188, 144, 73, 36, 128, 73, 20, 81, 152, 177, 133, 248, 28, 165, 131, 120,
140 127, 240, 242, 184, 104, 125, 109, 129, 35, 30, 4, 145, 65, 202, 88, 9,
141 138, 103, 44, 205, 100, 167, 24, 152, 11, 24, 51, 37, 66, 9, 24, 31,
142 174, 202, 212, 49, 152, 18, 96, 155, 208, 119, 146, 45, 97, 48, 56, 28,
143 194, 90, 224, 204, 144, 232, 176, 36, 96, 126, 187, 43, 83, 12, 121, 129,
144 209, 96, 197, 35, 2, 54, 176, 249, 92, 208, 204, 145, 188, 41, 170, 180,
145 71, 16, 36, 96, 126, 187, 43, 83, 19, 0, 145, 129, 100, 209, 15, 43,
146 135, 55, 6, 238, 180, 194, 90, 17, 229, 115, 21, 168, 251, 140, 131, 162,
147 217, 166, 93, 22, 4, 140, 31, 91, 166, 55, 25, 202, 192, 111, 20, 171,
148 207, 39, 192,
149};
150
151
152void huff_enc_init( void )
153{
154 huff_enc_input_pos = 0;
155 huff_enc_output_pos = 0;
156}
157
158
159int huff_enc_return( void )
160{
161 int i;
162 _Pragma( "loopbound min 1 max 419" )
163 for ( i = 0; i < huff_enc_encoded_len; i++ ) {
164 if ( huff_enc_encoded[i] != huff_enc_output[i] ) return i + 1;
165 }
166 return 0;
167}
168
169
170/*
171 Input / output functions
172*/
173
174void huff_enc_beginning_of_data()
175{
176 huff_enc_input_pos = 0;
177}
178
179
180int huff_enc_end_of_data()
181{
182 return huff_enc_input_pos >= huff_enc_plaintext_len;
183}
184
185
186int huff_enc_read_byte()
187{
188 return huff_enc_plaintext[huff_enc_input_pos++];
189}
190
191
192void huff_enc_write_byte( char ch )
193