This commit is contained in:
Peter Petrek 2022-01-19 16:52:37 +01:00
parent 1cd0cc8fc0
commit cfbcf91b0d
6 changed files with 150 additions and 0 deletions

11
a2/Makefile Normal file
View File

@ -0,0 +1,11 @@
# variables
CC=gcc
CFLAGS=-std=c11 -Wall -Werror
LDLIBS=-lm
OUTPUT=$@
# targets
%: %.c
$(CC) $(CFLAGS) $@.c $(LDLIBS) -o $(OUTPUT)

0
a2/program.c Normal file
View File

16
sk2a/Makefile Normal file
View File

@ -0,0 +1,16 @@
CC = gcc
CFLAGS = -g -Wall -Werror
all: program
program: compressor.o main.o
$(CC) $(CFLAGS) compressor.o main.o -o program
compressor.o: compressor.c
$(CC) $(CFLAGS) -c compressor.c -o compressor.o
main.o: main.c
$(CC) $(CFLAGS) -c main.c -o main.o
clean:
rm -rf program *.o *.exe *.exe.stackdump

81
sk2a/compressor.c Normal file
View File

@ -0,0 +1,81 @@
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "compressor.h"
#define BUFSIZE 1024
int ByteRLEEncode(char* bufferIn, int size, char* bufferOut) {
int posIn = 0, count = 1, posOut = 0;
char byteCurrent, byteRLE = bufferIn[posIn++];
while (posIn != size) {
byteCurrent = bufferIn[posIn++];
if (byteCurrent == byteRLE) {
count++;
if (count == 256) {
bufferOut[posOut++] = byteRLE;
bufferOut[posOut++] = 255;
count = 1;
}
} else {
bufferOut[posOut++] = byteRLE;
bufferOut[posOut++] = count;
byteRLE = byteCurrent;
count = 1;
}
}
bufferOut[posOut++] = byteRLE;
bufferOut[posOut++] = count;
return posOut;
}
int mycompress(char* bufferIn, int size, char* bufferOut){
return ByteRLEEncode(bufferIn, size, bufferOut);;
}
void compress(FILE *infile, FILE *outfile){
char buffer[BUFSIZE];
memset(buffer,0,BUFSIZE);
while(1){
int insize = fread(buffer,sizeof(char),BUFSIZE,infile);
if (insize == 0){
if (feof(infile)){
// end of file
break;
}
assert(!ferror(infile));
}
char outbuf[BUFSIZE*2];
// Doplnte implementaciu kompresie.
int outsize = mycompress(buffer,insize,outbuf);
if (outsize > 0){
fwrite(outbuf,sizeof(char),outsize,outfile);
}
}
}
void decompress(FILE *infile, FILE *outfile){
unsigned char RLEMetadata[2];
char RLEData[255];
while (fread(RLEMetadata, 2, 1, infile)) {
printf("%c %d\n", RLEMetadata[0], RLEMetadata[1]);
for (int i = 0; i < RLEMetadata[1]; i++) {
RLEData[i] = RLEMetadata[0];
}
fwrite(RLEData, RLEMetadata[1], 1, outfile);
}
}

18
sk2a/compressor.h Normal file
View File

@ -0,0 +1,18 @@
#ifndef _COMPRESSORH
#define _COMPRESSORH
#include <stdio.h>
/**
* Skomprimuje súbor in a zapíše do súboru out.
* @arg in smerník na otvorený vstupný súbor (na čítanie)
* @arg out smerník na otvorený výstupný súbor (na zápis)
*/
void compress(FILE* in, FILE* out);
/**
* Dekomprimuje súbor in a zapíše do súboru out.
* @arg in smerník na otvorený vstupný súbor (na čítanie)
* @arg out smerník na otvorený výstupný súbor (na zápis)
*/
void decompress(FILE* in, FILE* out);
#endif

24
sk2a/main.c Normal file
View File

@ -0,0 +1,24 @@
#include "compressor.h"
int main(int argc,char** argv){
if (argc != 4 || (argv[1][1] != 'c' && argv[1][1] != 'd')){
printf("Usage: \n");
printf(" Compress ./compress -c infile.txt outfile.compress\n");
printf(" decompress ./compress -d outfile.compress infile.txt\n");
return 0;
}
char* action = argv[1];
char* infile = argv[2];
char* outfile = argv[3];
FILE* inf = fopen(infile,"r");
FILE* outf = fopen(outfile,"w");
if (action[1] == 'c'){
compress(inf,outf);
}
else if (action[1] == 'd'){
decompress(inf,outf);
}
fclose(inf);
fclose(outf);
}