Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #include <stdbool.h>
- int bin (int num) {
- int bin = 0, k = 1;
- while (num)
- {
- bin += (num % 2) * k;
- k *= 10;
- num /= 2;
- }
- return bin;
- }
- int num (long long a) {
- long long p = 0;
- while (a > 0) {
- a /= 10;
- p++;
- }
- return p;
- }
- void range (int uniquesymbol, int z, long long *mas) {
- while (uniquesymbol >= z) {
- long long min = 2000000000000;
- for (int i = 0; i < uniquesymbol - 1; i++) {
- if (mas[i] + mas[i + 1] < min) {
- min = mas[i] + mas[i + 1];
- }
- }
- for (int i = 0; i < uniquesymbol - 1; i++) {
- if (mas[i] + mas[i + 1] == min) {
- mas[i] = mas[i] + mas[i + 1];
- for (int k = i + 1; k < uniquesymbol - 1; k++) {
- mas[k] = mas[k + 1];
- }
- break;
- }
- }
- uniquesymbol--;
- }
- }
- struct file
- {
- int byte[37500];
- };
- struct filearc
- {
- int bit[300000];
- };
- int symbols = 0, uniquesymbol = 0, tmp = 0;
- int compare (const void * a, const void * b) {
- return(*(int*)b - *(int*)a);
- }
- int main(int argc, char* argv[]) {
- FILE *f;
- tmp = 0;
- struct file file;
- struct filearc filearc;
- char create[] = "--create";
- if (!strcmp(argv[3], create)) {
- for (int i = 4; i < argc; i++) {
- if ((f = fopen(argv[i], "rb")) == NULL)
- return -1;
- for (int j = symbols; (file.byte[j] = getc(f)) != EOF; j++) {
- symbols = j + 2;
- }
- fclose(f);
- }
- int a[256] = {};
- for (int j = 0; j < symbols; j++) {
- a[file.byte[j]]++;
- }
- if ((f = fopen(argv[2], "wb")) == NULL)
- return -1;
- for (int i = 0; i < 256; i++)
- if (a[i] != 0) {
- uniquesymbol++;
- }
- symbols = symbols - argc + 4;
- fprintf(f, "%d %d ", symbols, uniquesymbol);
- int mas[uniquesymbol];
- for (int i = 0; i < uniquesymbol; i++) {
- for (int j = tmp; j < 256; j++) {
- if (a[j] != 0) {
- mas[i] = a[j];
- tmp = j + 1;
- break;
- }
- }
- }
- qsort(mas, uniquesymbol, 4, compare);
- long long mas2[uniquesymbol], mas1[uniquesymbol];
- long long mas3[256] = {};
- long long mas4[uniquesymbol];
- for (int i = 0; i < uniquesymbol; i++)
- mas3[i] = 1;
- for (int i = 0; i < uniquesymbol; i++) {
- mas1[i] = mas[i];
- mas2[i] = mas[i];
- }
- long long s = 0, ss = 0;
- for (int z = 1; z < uniquesymbol; z++) {
- range(uniquesymbol, z + 1, mas1);
- range(uniquesymbol, z + 2, mas2);
- for (int i = 0; i < z; i++) {
- if (mas1[i] != mas2[i]) {
- s = 0;
- ss = 0;
- for (int j = 0; j < i; j++) {
- s += mas1[j];
- }
- tmp = 0;
- for (int j = 0; s != ss; j++) {
- ss += mas[j];
- tmp = j + 1;
- }
- ss = 0;
- int start, end;
- start = tmp;
- for (int j = tmp; ss != mas2[i]; j++) {
- ss += mas[j];
- tmp = j + 1;
- }
- end = tmp;
- for (int j = start; j < end; j++) {
- mas3[j] = mas3[j] * 10;
- }
- start = end;
- ss = 0;
- for (int j = tmp; ss != mas2[i + 1]; j++) {
- ss += mas[j];
- tmp = j + 1;
- }
- end = tmp;
- for (int j = start; j < end; j++) {
- mas3[j] = mas3[j] * 10 + 1;
- }
- for (int j = 0; j < uniquesymbol; j++) {
- mas1[j] = mas[j];
- mas2[j] = mas[j];
- }
- }
- }
- }
- tmp = 0;
- int l;
- for (int i = 0; i < uniquesymbol; i++) {
- for (int j = 0; j < 256; j++) {
- bool t = true;
- if (a[j] == mas[i]) {
- for (int y = 0; y < i; y++) if (j == mas4[y]) t = false;
- if (t) {
- mas4[i] = j;
- fprintf(f, "%d ", bin(j));
- l = num(mas3[i]) - 1;
- long long m = 10000000000000000;
- for (int z = 0; z < 16 - l; z++) {
- m /= 10;
- }
- for (int z = 0; z < l; z++) {
- m /= 10;
- fprintf(f, "%lld", mas3[i] / m % 10);
- }
- fprintf(f, " ");
- break;
- }
- }
- }
- }
- s = 0;
- int y = 0;
- fprintf(f, "%d ", argc - 4);
- for (int i = 4; i < argc; i++) {
- y = 0;
- fprintf(f, "%s ", argv[i]);
- for (int j = tmp; file.byte[j] != EOF; j++) {
- for (int z = 0; z < uniquesymbol; z++) {
- if (file.byte[j] == mas4[z]) {
- l = num(mas3[z]) - 1;
- long long m = 10000000000000000;
- for (int x = 0; x < 16 - l; x++) {
- m /= 10;
- }
- for (int x = 0; x < l; x++) {
- m /= 10;
- filearc.bit[s] = mas3[z] / m % 10;
- s++;
- y++;
- }
- }
- }
- tmp = j;
- }
- fprintf(f, "%d ", y);
- tmp += 2;
- }
- fprintf(f, "%d ", s);
- int output;
- for (int j = 0; j < s / 8 + 1; j++) {
- output = 128 * filearc.bit[j * 8] + 64 * filearc.bit[j * 8 + 1] + 32 * filearc.bit[j * 8 + 2] + 16 * filearc.bit[j * 8 + 3] + 8 * filearc.bit[j * 8 + 4] + 4 * filearc.bit[j * 8 + 5] + 2 * filearc.bit[j * 8 + 6] + filearc.bit[j * 8 + 7];
- fwrite(&output, 1, 1, f);
- }
- fclose(f);
- }
- char extract[] = "--extract";
- if (!strcmp(argv[3], extract)) {
- if ((f = fopen(argv[2], "rb")) == NULL)
- return -1;
- char number[16] = {32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32};
- long long number1[16] = {};
- long long number2[16] = {};
- uniquesymbol = 0;
- for (int j = 0; (number[j] = getc(f)) != 32; j++);
- for (int j = 0; (number[j] = getc(f)) != 32; j++);
- for (int j = 0; j < 16; j++)
- if (number[j] != 32) {
- uniquesymbol = uniquesymbol * 10 + number[j] - 48;
- } else break;
- int k = 1;
- long long mas3[256] = {};
- long long mas[256][16] = {};
- for (int i = 0; i < uniquesymbol; i++) {
- for (int j = 0; (number1[j] = getc(f)) != 32; j++) tmp = j;
- for (int j = tmp; j >= 0; j--) {
- mas3[i] = mas3[i] + k * (number1[j] - 48);
- k *= 2;
- }
- for (int j = 0; (number2[j] = getc(f)) != 32; j++) tmp = j;
- for (int j = tmp; j >= 0; j--) {
- mas[i][j] = number2[j];
- }
- k = 1;
- }
- int filein, empty;
- filein = getc(f);
- filein -= 48;
- empty = getc(f);
- char size[16];
- int filesize[16] = {};
- char numm[10][16];
- for (int i = 0; i < filein; i++) {
- for (int j = 0; (number[j] = getc(f)) != 32; j++) tmp = j + 1;
- for (int j = 0; j < tmp; j++)
- numm[i][j] = number[j];
- for (int j = 0; (size[j] = getc(f)) != 32; j++);
- for (int j = 0; j < 8; j++)
- if (size[j] != 32) {
- filesize[i] = filesize[i] * 10 + size[j] - 48;
- } else break;
- }
- char bytes[10];
- int sizebits = 0;
- for (int j = 0; (bytes[j] = getc(f)) != 32; j++);
- for (int j = 0; j < 16; j++)
- if (bytes[j] != 32) {
- sizebits = sizebits * 10 + bytes[j] - 48;
- } else break;
- for (int i = 0; i < sizebits / 8 + 1; i++) {
- fread(&file.byte[i], 1, 1, f);
- }
- fclose(f);
- for (int i = 0; i < sizebits / 8 + 1; i++) {
- filearc.bit[i * 8] = bin(file.byte[i]) / 10000000;
- filearc.bit[i * 8 + 1] = bin(file.byte[i]) / 1000000 % 10;
- filearc.bit[i * 8 + 2] = bin(file.byte[i]) / 100000 % 10;
- filearc.bit[i * 8 + 3] = bin(file.byte[i]) / 10000 % 10;
- filearc.bit[i * 8 + 4] = bin(file.byte[i]) / 1000 % 10;
- filearc.bit[i * 8 + 5] = bin(file.byte[i]) / 100 % 10;
- filearc.bit[i * 8 + 6] = bin(file.byte[i]) / 10 % 10;
- filearc.bit[i * 8 + 7] = bin(file.byte[i]) % 10;
- }
- tmp = 0;
- for (int i = 0; i < filein - 1; i++) {
- filesize[i + 1] += filesize[i];
- }
- bool iftrue = true;
- for (int i = 0; i < filein; i++) {
- char *str;
- str = strtok(numm[i], " ");
- if ((f = fopen(str, "wb")) == NULL)
- return -1;
- for (int z = tmp; z < filesize[i]; z++) {
- for (int j = 0; j < 256; j++) {
- for (int p = 0; p < 16 && (mas[j][p] != 0); p++) {
- if ((mas[j][p] - 48) == filearc.bit[z + p]) {
- iftrue *= 1;
- } else {
- iftrue = false;
- }
- }
- if (iftrue) {
- fprintf(f, "%c", mas3[j]);
- for (int l = 0; l < 16; l++) {
- if (mas[j][l] != 0)
- z++;
- }
- j = 256;
- }
- iftrue = true;
- }
- z--;
- tmp = filesize[i];
- }
- fclose(f);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement