Add files via upload

This commit is contained in:
Vasily Davydov 2021-10-26 13:29:57 +03:00 committed by GitHub
parent 900eb2ba45
commit 4597218a34
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 215 additions and 0 deletions

191
main.c Normal file
View File

@ -0,0 +1,191 @@
#include "rle_vas.h"
int main() {
FILE *fr = NULL, *fw = NULL;
char *fn = NULL, *c = NULL, *dfn = NULL;
char *fnn;
size_t fn_s;
uint16_t crc = 0;
int ch = 808;
bool stop = false;
do{
main_menu();
getline(&c, &fn_s, stdin);
sscanf(c, "%d", &ch);
switch (ch) {
case 1:
printf("Enter name of the file << ");
getline(&fn, &fn_s, stdin);
rm_n_r(fn);
fr = fopen(fn, "rb");
if (fr == NULL){
printf("%s\n", strerror(2));
}else {
fnn = compress(fr, fw, fn, crc);
printf("File compressed successfully! Your compressed filename is %s\nMore info in [RLE_log.txt]\n", fnn);
}
free(fn);
fn = NULL;
fclose(fr);
break;
case 2:
fflush(stdin);
printf("Enter name of the file << ");
getline(&fn, &fn_s, stdin);
rm_n_r(fn);
fr = fopen(fn, "rb");
if (fr == NULL){
printf("%s\n", strerror(2));
}else {
printf("What name do you want your file to have after decompression? << ");
getline(&dfn, &fn_s, stdin);
if (decompress(fw, fr, fn, dfn)){
printf("File decompressed successfully! Your new filename is %s\n", dfn);
} else{
printf("Something went wrong. Check logfile and pay attention to CRC...\n");
}
}
free(fn);
free(dfn);
dfn = NULL;
fclose(fr);
break;
case 0:
stop = true;
break;
default:
printf("Wrong value...\n");
break;
}
}while(!stop);
free(c);
return 0;
}
void rm_n_r(char *str){
for (int i = 0; i < strlen(str); ++i) {
if(str[i] == '\r' || str[i] == '\n'){
str[i] = '\0';
}
}
}
bool decompress(FILE *fr, FILE *fw, char* comp_f_nm, char *new_n){
fr = fopen(comp_f_nm, "rb");
fw = fopen(new_n, "wb");
uint8_t buffer, delim_buff, *data_for_crc = NULL;
uint8_t count = 0;
uint16_t crc_check, new_crc;
bool crc_valid = false;
long data_s;
fscanf(fr, "%d", &crc_check);
while (!feof(fr)) {
fread(&buffer, 1, 1, fr);
if (buffer == HEX_DELIM) {
delim_buff = buffer;
fread(&buffer, 1, 1, fr);
if (buffer == 0x00) {
fwrite(&delim_buff, 1, 1, fw);
} else {
count = buffer;
fread(&buffer, 1, 1, fr);
for (int j = 0; j < count; ++j) {
fwrite(&buffer, 1, 1, fw);
}
}
}
}
fclose(fw);
//Checking the CRC
fw = fopen(new_n, "rb");
if (fw == NULL){
printf("%s\n", strerror(2));
}else{
data_s = getfile_size(fw);
data_for_crc = calloc(data_s, 1);
fread(data_for_crc, 1, data_s, fw);
new_crc = crc16(data_for_crc, data_s);
if (crc_check == new_crc) crc_valid = true;
}
//Closing actions
free(data_for_crc);
data_for_crc = NULL;
fclose(fr);
fclose(fw);
return crc_valid;
}
char *compress(FILE *fr, FILE *fw, char *f_name, uint16_t crc){
uint8_t buffer, nextbuff;
uint8_t *init_data;
int count = 0;
int flag = 0;
char *crc_s;
time_t t;
time(&t);
long file_s;
FILE *log = fopen("RLE_log.txt", "a");
file_s = getfile_size(fr);
fprintf(log, "%s| Filename: %s | Original size: %lu bytes | ", ctime(&t), f_name, file_s);
strncat(f_name, FILE_APPEND, 4);
fw = fopen(f_name, "wb");
//CRC actions
init_data = calloc(file_s, 1);
fread(init_data, 1, file_s, fr);
rewind(fr);
crc = crc16(init_data, file_s);
crc_s = calloc(2, 1);
sprintf(crc_s, "%d", crc);
fprintf(fw, "%d", crc);
fprintf(log, "CRC: %s | Compressed filename: %s | ", crc_s, f_name);
free(crc_s);
free(init_data);
do{
flag = (fread(&buffer, 1,1, fr) == 0);
if (flag || nextbuff != buffer) {
if (count > 0) {
if (nextbuff == HEX_DELIM && count < 2){
fwrite(&nextbuff,1,1,fw);
fputc(0x00, fw);
}else{
fputc(HEX_DELIM, fw);
fwrite(&count,1,1,fw);
fwrite(&nextbuff,1,1,fw);
}
}
nextbuff = buffer;
count = 1;
} else{
count++;
}
}while(!feof(fr));
fprintf(log, "Compressed size: %lu bytes |\n", getfile_size(fw));
fclose(log);
return f_name;
}
uint16_t crc16(const uint8_t *data_p, unsigned int length) {
uint8_t x;
uint16_t crc = 0xFFFF;
while (length--) {
x = crc >> 8 ^ *data_p++;
x ^= x >> 4;
crc = (crc << 8) ^ ((uint16_t)(x << 12)) ^ ((uint16_t)(x << 5)) ^ ((uint16_t)x);
}
return crc;
}
long getfile_size(FILE *f){
long fs;
fseek(f, 0, SEEK_END);
fs = ftell(f);
rewind(f);
return fs;
}
void main_menu(){
printf("| You have choices to encode or decode your file with RLE |\nPlease choose either:\n0. EXIT\n1. ENCODING(pack)\n2. DECODING(unpack)\n Your choice <<< ");
}

24
rle_vas.h Normal file
View File

@ -0,0 +1,24 @@
#define _GNU_SOURCE
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include<time.h>
#define HEX_DELIM 128
#define FILE_APPEND ".rle"
//Removing the unnecessary characters from an input string
void rm_n_r(char *str);
//Compressing the file and returning new filename
char *compress(FILE *fr, FILE *fw, char *f_name, uint16_t crc);
//Decompresses the file
bool decompress(FILE *fr, FILE *fw, char *comp_f_nm, char *new_n);
//CRC calc
uint16_t crc16(const uint8_t *data_p, unsigned int length);
//Getting the size of the file via pointer
long getfile_size(FILE *f);
//Displaying the menu of the program
void main_menu();