Skip to content

Commit 5fa62bd

Browse files
committed
add C14-Compress Example
1 parent 931b8ca commit 5fa62bd

File tree

4 files changed

+417
-0
lines changed

4 files changed

+417
-0
lines changed

Algorithms.xcodeproj/project.pbxproj

+4
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
CB95943B1EADEFF90006D375 /* clist.h in Headers */ = {isa = PBXBuildFile; fileRef = CB9594381EADEFDE0006D375 /* clist.h */; settings = {ATTRIBUTES = (Public, ); }; };
4848
CB95944F1EADF9380006D375 /* page.c in Sources */ = {isa = PBXBuildFile; fileRef = CB95944E1EADF9380006D375 /* page.c */; };
4949
CB9594501EADF93E0006D375 /* page.h in Headers */ = {isa = PBXBuildFile; fileRef = CB95944D1EADF92B0006D375 /* page.h */; settings = {ATTRIBUTES = (Public, ); }; };
50+
CB9B76F91ECD73840000C464 /* huffman.c in Sources */ = {isa = PBXBuildFile; fileRef = CB9B76F81ECD73840000C464 /* huffman.c */; };
5051
CBA147B51EB317B200765E81 /* hashpjw.h in Headers */ = {isa = PBXBuildFile; fileRef = CBA147B41EB317B200765E81 /* hashpjw.h */; settings = {ATTRIBUTES = (Public, ); }; };
5152
CBA147B81EB3184400765E81 /* hashpjw.c in Sources */ = {isa = PBXBuildFile; fileRef = CBA147B71EB3184400765E81 /* hashpjw.c */; };
5253
CBA147BA1EB3198B00765E81 /* chtbl.h in Headers */ = {isa = PBXBuildFile; fileRef = CBA147B91EB3198B00765E81 /* chtbl.h */; settings = {ATTRIBUTES = (Public, ); }; };
@@ -117,6 +118,7 @@
117118
CB9594391EADEFED0006D375 /* clist.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = clist.c; sourceTree = "<group>"; };
118119
CB95944D1EADF92B0006D375 /* page.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = page.h; sourceTree = "<group>"; };
119120
CB95944E1EADF9380006D375 /* page.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = page.c; sourceTree = "<group>"; };
121+
CB9B76F81ECD73840000C464 /* huffman.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = huffman.c; sourceTree = "<group>"; };
120122
CBA147B41EB317B200765E81 /* hashpjw.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = hashpjw.h; sourceTree = "<group>"; };
121123
CBA147B71EB3184400765E81 /* hashpjw.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = hashpjw.c; sourceTree = "<group>"; };
122124
CBA147B91EB3198B00765E81 /* chtbl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = chtbl.h; sourceTree = "<group>"; };
@@ -383,6 +385,7 @@
383385
isa = PBXGroup;
384386
children = (
385387
CBBBC1B81ECC26C800B84835 /* bit.c */,
388+
CB9B76F81ECD73840000C464 /* huffman.c */,
386389
);
387390
name = chapter14;
388391
sourceTree = "<group>";
@@ -527,6 +530,7 @@
527530
CB26A5BC1ECAEF430025ACC4 /* lsqe.c in Sources */,
528531
CBC15B4D1EC4529000C0500E /* ctsort.c in Sources */,
529532
CBA147B81EB3184400765E81 /* hashpjw.c in Sources */,
533+
CB9B76F91ECD73840000C464 /* huffman.c in Sources */,
530534
CB4B679D1EBC5294001FCC1A /* heap.c in Sources */,
531535
CB1BD5101EBB057F00BCEE73 /* bistree.c in Sources */,
532536
CBBBC1B91ECC26C800B84835 /* bit.c in Sources */,

Example/compress/main.c

+104
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
//
2+
// main.c
3+
// MasteringAlgorithms
4+
// Illustrates data compression (see Chapter 14).
5+
//
6+
// Created by YourtionGuo on 18/05/2017.
7+
// Copyright © 2017 Yourtion. All rights reserved.
8+
//
9+
10+
#include <ctype.h>
11+
#include <stdio.h>
12+
13+
#include "compress.h"
14+
15+
/// 设置压缩数据的最大大小
16+
#define DATSIZ 500000
17+
18+
int main(int argc, char **argv)
19+
{
20+
FILE *fp;
21+
unsigned char original[DATSIZ], *compressed, *restored;
22+
int csize, osize, rsize, c, i;
23+
24+
/// 获取用于压缩的数据
25+
if ((fp = fopen("sample.txt", "r")) == NULL) return 1;
26+
27+
i = 0;
28+
29+
while ((c = getc(fp)) != EOF && i < DATSIZ) {
30+
31+
original[i] = c;
32+
i++;
33+
34+
}
35+
36+
osize = i;
37+
fclose(fp);
38+
39+
/// 使用霍夫曼编码压缩数据
40+
41+
fprintf(stdout, "Compressing with Huffman coding\n");
42+
fprintf(stdout, "Compressing...");
43+
44+
if ((csize = huffman_compress(original, &compressed, osize)) < 0) {
45+
46+
fprintf(stdout, "\n");
47+
return 1;
48+
}
49+
50+
fprintf(stdout, "Done\n");
51+
fprintf(stdout, "Uncompressing...");
52+
53+
if ((rsize = huffman_uncompress(compressed, &restored)) < 0) {
54+
55+
fprintf(stdout, "\n");
56+
free(compressed);
57+
return 1;
58+
}
59+
60+
fprintf(stdout, "Done\n");
61+
fprintf(stdout, "-> osize=%d, csize=%d, rsize=%d\n", osize, csize, rsize);
62+
63+
if (rsize != osize) {
64+
65+
fprintf(stdout, "Data was not properly restored\n");
66+
free(compressed);
67+
free(restored);
68+
return 1;
69+
70+
} else {
71+
72+
for (i = 0; i < rsize; i++) {
73+
74+
if (original[i] != restored[i]) {
75+
76+
fprintf(stdout, "Data was not properly restored\n");
77+
78+
if (isgraph(original[i])) {
79+
fprintf(stdout, "-> original[%d]=\"%c\"\n", i, original[i]);
80+
} else {
81+
fprintf(stdout, "-> original[%d]=0x%02x\n", i, original[i]);
82+
}
83+
84+
if (isgraph(restored[i])) {
85+
fprintf(stdout, "-> restored[%d]=\"%c\"\n", i, restored[i]);
86+
} else {
87+
fprintf(stdout, "-> restored[%d]=0x%02x\n", i, restored[i]);
88+
}
89+
90+
free(compressed);
91+
free(restored);
92+
return 1;
93+
}
94+
}
95+
}
96+
97+
fprintf(stdout, "Data was restored OK\n");
98+
99+
free(compressed);
100+
free(restored);
101+
102+
return 0;
103+
104+
}

Example/compress/sample.txt

+206
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,206 @@
1+
/*****************************************************************************
2+
* *
3+
* sample.txt *
4+
* ========== *
5+
* *
6+
* Description: A copy of ex-1.c to use as a sample file to compress. *
7+
* *
8+
*****************************************************************************/
9+
10+
#include <ctype.h>
11+
#include <stdio.h>
12+
13+
#include "compress.h"
14+
15+
/*****************************************************************************
16+
* *
17+
* Define the size of data to compress. *
18+
* *
19+
*****************************************************************************/
20+
21+
#define DATSIZ 500000
22+
23+
/*****************************************************************************
24+
* *
25+
* --------------------------------- main --------------------------------- *
26+
* *
27+
*****************************************************************************/
28+
29+
int main(int argc, char **argv) {
30+
31+
FILE *fp;
32+
33+
unsigned char original[DATSIZ],
34+
*compressed,
35+
*restored;
36+
37+
int csize,
38+
osize,
39+
rsize,
40+
c,
41+
i;
42+
43+
/*****************************************************************************
44+
* *
45+
* Read some data to compress. *
46+
* *
47+
*****************************************************************************/
48+
49+
if ((fp = fopen("sample.txt", "r")) == NULL)
50+
return 1;
51+
52+
i = 0;
53+
54+
while ((c = getc(fp)) != EOF && i < DATSIZ) {
55+
56+
original[i] = c;
57+
i++;
58+
59+
}
60+
61+
osize = i;
62+
fclose(fp);
63+
64+
/*****************************************************************************
65+
* *
66+
* Compress the data using Huffman coding. *
67+
* *
68+
*****************************************************************************/
69+
70+
fprintf(stdout, "Testing Huffman coding\n");
71+
fprintf(stdout, "Compressing...");
72+
73+
if ((csize = huffman_compress(original, &compressed, osize)) < 0) {
74+
75+
fprintf(stdout, "\n");
76+
return 1;
77+
78+
}
79+
80+
fprintf(stdout, "Done\n");
81+
fprintf(stdout, "Uncompressing...");
82+
83+
if ((rsize = huffman_uncompress(compressed, &restored)) < 0) {
84+
85+
fprintf(stdout, "\n");
86+
free(compressed);
87+
return 1;
88+
89+
}
90+
91+
fprintf(stdout, "Done\n");
92+
fprintf(stdout, "osize=%d, csize=%d, rsize=%d\n", osize, csize, rsize);
93+
94+
if (rsize != osize) {
95+
96+
fprintf(stdout, "Data was not properly restored\n");
97+
free(compressed);
98+
free(restored);
99+
return 1;
100+
101+
}
102+
103+
else {
104+
105+
for (i = 0; i < rsize; i++) {
106+
107+
if (original[i] != restored[i]) {
108+
109+
fprintf(stdout, "Data was not properly restored\n");
110+
111+
if (isgraph(original[i]))
112+
fprintf(stdout, "original[%d]=\"%c\"\n", i, original[i]);
113+
else
114+
fprintf(stdout, "original[%d]=0x%02x\n", i, original[i]);
115+
116+
if (isgraph(restored[i]))
117+
fprintf(stdout, "restored[%d]=\"%c\"\n", i, restored[i]);
118+
else
119+
fprintf(stdout, "restored[%d]=0x%02x\n", i, restored[i]);
120+
121+
free(compressed);
122+
free(restored);
123+
return 1;
124+
125+
}
126+
127+
}
128+
129+
}
130+
131+
fprintf(stdout, "Data was restored OK\n");
132+
133+
free(compressed);
134+
free(restored);
135+
136+
/*****************************************************************************
137+
* *
138+
* Compress some data using LZ77. *
139+
* *
140+
*****************************************************************************/
141+
142+
fprintf(stdout, "Testing LZ77\n");
143+
fprintf(stdout, "Compressing...");
144+
145+
if ((csize = lz77_compress(original, &compressed, osize)) < 0)
146+
return 1;
147+
148+
fprintf(stdout, "Done\n");
149+
fprintf(stdout, "Uncompressing...");
150+
151+
if ((rsize = lz77_uncompress(compressed, &restored)) < 0) {
152+
153+
fprintf(stdout, "\n");
154+
free(compressed);
155+
return 1;
156+
157+
}
158+
159+
fprintf(stdout, "Done\n");
160+
fprintf(stdout, "osize=%d, csize=%d, rsize=%d\n", osize, csize, rsize);
161+
162+
if (rsize != osize) {
163+
164+
fprintf(stdout, "Data was not properly restored\n");
165+
free(compressed);
166+
free(restored);
167+
return 1;
168+
169+
}
170+
171+
else {
172+
173+
for (i = 0; i < rsize; i++) {
174+
175+
if (original[i] != restored[i]) {
176+
177+
fprintf(stdout, "Data was not properly restored\n");
178+
179+
if (isgraph(original[i]))
180+
fprintf(stdout, "original[%d]=\"%c\"\n", i, original[i]);
181+
else
182+
fprintf(stdout, "original[%d]=0x%02x\n", i, original[i]);
183+
184+
if (isgraph(restored[i]))
185+
fprintf(stdout, "restored[%d]=\"%c\"\n", i, restored[i]);
186+
else
187+
fprintf(stdout, "restored[%d]=0x%02x\n", i, restored[i]);
188+
189+
free(compressed);
190+
free(restored);
191+
return 1;
192+
193+
}
194+
195+
}
196+
197+
}
198+
199+
fprintf(stdout, "Data was restored OK\n");
200+
201+
free(compressed);
202+
free(restored);
203+
204+
return 0;
205+
206+
}

0 commit comments

Comments
 (0)