removed bad occurences algorithm huffman
This commit is contained in:
parent
8cdc34f119
commit
7acfb7b20c
|
@ -8,6 +8,8 @@
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
|
// stolen from stackoverflow
|
||||||
|
// https://stackoverflow.com/questions/8236/how-do-you-determine-the-size-of-a-file-in-c
|
||||||
off_t fsize(const char *filename) {
|
off_t fsize(const char *filename) {
|
||||||
struct stat st;
|
struct stat st;
|
||||||
|
|
||||||
|
@ -33,7 +35,7 @@ int main(int argc, char *argv[]) {
|
||||||
bool verbose = false;
|
bool verbose = false;
|
||||||
bool debug = false;
|
bool debug = false;
|
||||||
char *filestring = NULL;
|
char *filestring = NULL;
|
||||||
uint64_t filelen;
|
off_t filelen;
|
||||||
|
|
||||||
FILE *fptrR = NULL; // file pointer for reading
|
FILE *fptrR = NULL; // file pointer for reading
|
||||||
FILE *fptrW = NULL; // file pointer for writing
|
FILE *fptrW = NULL; // file pointer for writing
|
||||||
|
@ -73,17 +75,15 @@ int main(int argc, char *argv[]) {
|
||||||
if (filestring) {
|
if (filestring) {
|
||||||
if(debug)
|
if(debug)
|
||||||
printf("[DEBUG]processing given file argument.\n");
|
printf("[DEBUG]processing given file argument.\n");
|
||||||
// open the given file in binary mode, I want this to work with any files,
|
// open the given file in binary mode
|
||||||
// not just textfiles.
|
|
||||||
fptrR = fopen(filestring, "rb");
|
fptrR = fopen(filestring, "rb");
|
||||||
if (fptrR == NULL) {
|
if (fptrR == NULL) {
|
||||||
fprintf(stderr, "The given file does not exist or is unavailable.\n");
|
fprintf(stderr, "The given file does not exist or is unavailable.\n");
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
// causes bugs.
|
filelen = fsize(filestring);
|
||||||
fseek(fptrR, 0L, SEEK_END);
|
if(verbose)
|
||||||
filelen = ftell(fptrR);
|
printf("filesize: %ldB\n", filelen);
|
||||||
fseek(fptrR, 0L, SEEK_SET);
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// empty filestring or filestring is NULL
|
// empty filestring or filestring is NULL
|
||||||
|
@ -91,10 +91,6 @@ int main(int argc, char *argv[]) {
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO check file size and spit a "what the heck im not a 10x dev, do a
|
|
||||||
if(verbose)
|
|
||||||
printf("filesize: %ldB\n", filelen);
|
|
||||||
|
|
||||||
if (extract_mode) {
|
if (extract_mode) {
|
||||||
printf("extracting is not yet implemented.\n");
|
printf("extracting is not yet implemented.\n");
|
||||||
// decompress the file
|
// decompress the file
|
||||||
|
@ -126,81 +122,15 @@ int main(int argc, char *argv[]) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64_t occurences[256];
|
uint64_t occurences[256] = { 0 };
|
||||||
for(int i=0;i<256;i++){
|
|
||||||
occurences[i]=0;
|
|
||||||
}
|
|
||||||
// FIXME doesnt loop through full file! only 50% for larger files
|
|
||||||
// Backup occurence counting algorithm
|
|
||||||
/*
|
|
||||||
while(!feof(fptrR)){
|
|
||||||
fseek(fptrR, 512, SEEK_CUR);
|
|
||||||
if(fread(buf, 1, 512, fptrR)){
|
|
||||||
for(int i=0;i<512;i++){
|
|
||||||
occurences[buf[i]]++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
fprintf(stderr, "Error when processing file.\n");
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
// advance filepointer 512 bytes foreward. If not possible, set endOfFile flag.
|
// not needed
|
||||||
// FIXME
|
// for(int i=0;i<256;i++){
|
||||||
offset += 512;
|
// occurences[i]=0;
|
||||||
}
|
// }
|
||||||
*/
|
|
||||||
// backup
|
|
||||||
while(1){
|
|
||||||
fseek(fptrR, 512, SEEK_CUR); // this line seems the be making the most problems
|
|
||||||
|
|
||||||
// On success, fread() and fwri)te() return the number of items read or written.
|
// TODO calculate occurences
|
||||||
// This number equals the number of bytes transferred only when size is
|
|
||||||
// 1. If an error occurs, or the end of the file is reached, the return value is a short item count (or zero).
|
|
||||||
// fread() does not distinguish between end-of-file and error, and callers must use feof(3) and ferror(3) to determine which occurred.
|
|
||||||
|
|
||||||
// FIXME )This is a buggy mess
|
|
||||||
if(512 == fread(buf, 1, 512, fptrR)){
|
|
||||||
for(int i=0;i<512;i++){
|
|
||||||
occurences[buf[i]]++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if(0 == fread(buf, 1, 512, fptrR)){
|
|
||||||
if(debug)
|
|
||||||
printf("[DEBUG]fread returned 0! ftell for current position is %lu\n", ftell(fptrR));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
fprintf(stderr, "Error when processing file: %lu, At offset %lu\n",fread(buf, 1, 512, fptrR), ftell(fptrR));
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
if(ftell(fptrR) > filelen) {
|
|
||||||
// ??? unknown error
|
|
||||||
fprintf(stderr, "tried reading further than the file is long somehow?\n");
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// ALMOST WORKS! ~200 bytes lost for a 10M file!!!
|
|
||||||
uint8_t bufMini[1];
|
|
||||||
// while(1){
|
|
||||||
// if(fread(bufMini, 1, 1, fptrR)){
|
|
||||||
// occurences[buf[0]]++;
|
|
||||||
// }
|
|
||||||
// else{
|
|
||||||
// if(ferror(fptrR)){
|
|
||||||
// fprintf(stderr, "encountered error when reading file.\n");
|
|
||||||
// exit(EXIT_FAILURE);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// fseek(fptrR, 1, SEEK_SET);
|
|
||||||
// if(ferror(fptrR)){
|
|
||||||
// fprintf(stderr, "encountered error when reading file.\n");
|
|
||||||
// exit(EXIT_FAILURE);
|
|
||||||
// }
|
|
||||||
// else if(feof(fptrR)){
|
|
||||||
// break;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
if(debug){
|
if(debug){
|
||||||
printf("Occurences (Hex):\n");
|
printf("Occurences (Hex):\n");
|
||||||
for(int i=0;i<256;i++){
|
for(int i=0;i<256;i++){
|
||||||
|
|
Loading…
Reference in New Issue