-
Notifications
You must be signed in to change notification settings - Fork 14
/
Copy pathindex.ts
89 lines (77 loc) · 2.23 KB
/
index.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
import HuffManTree from './huffman';
import {
getHeaderSection,
readFile,
readOutputFile,
writeToFile
} from './utils';
import fs from 'fs';
if (process.argv.length < 3) {
console.error('Invalid use');
printUsage();
process.exit(1);
}
const command = process.argv[2];
if (command === '--compress') {
if (process.argv.length !== 5) {
console.error('Please provide input and output file for compression');
printUsage();
process.exit(1);
}
performCompression();
} else if (command === '--decompress') {
if (process.argv.length !== 5) {
console.error('Please provide valid input file decompression');
printUsage();
process.exit(1);
}
performDecompression();
} else {
console.error('Invalid option provided.');
printUsage();
process.exit(1);
}
/**
* Prints the information about to use this command line tool.
*/
function printUsage() {
const text = `
Usage
compress
node index.js --compress <input_file> <output_file>
decompress
node index.js --decompress <compressed_file> <output_file>
`;
console.log(text);
}
function performCompression() {
const inputFile = process.argv[3];
const outputFile = process.argv[4];
const text = readFile(inputFile);
const huffmanTree = new HuffManTree();
const [compressedText, padding] = huffmanTree.compress(text);
const freqTable = huffmanTree.getFrequencyTable()!;
const headerText = getHeaderSection(freqTable);
writeToFile(outputFile, headerText, compressedText, padding);
const inSize = fs.statSync(inputFile).size;
const outSize = fs.statSync(outputFile).size;
console.log('Input file size ' + inSize);
console.log('Output file size ' + outSize);
console.log('Compression ratio achieved %s', inSize / outSize);
process.exit(0);
}
function performDecompression() {
const filename = process.argv[3];
const outFile = process.argv[4];
const fileContents = fs.readFileSync(filename);
const [freqTable, compressedTextBuffer, padding] =
readOutputFile(fileContents);
const huffmanTree = new HuffManTree();
huffmanTree.buildHuffmanTree(freqTable);
const decompressedText = huffmanTree.decompress(
compressedTextBuffer,
padding
);
fs.writeFileSync(outFile, decompressedText);
process.exit(0);
}