View difference between Paste ID: HYVvqCDW and CjR8J0PM
SHOW: | | - or go back to the newest paste.
1
/*
2
    padxorer by xerpi
3
    compile with:
4
        gcc -O3 padxorer.c -o padxorer
5
    usage:
6
        padxorer <input file 1> <input file 2>
7
8
    the output will be <input file 1>.out
9
*/
10
11
#include <stdio.h>
12
#include <stdlib.h>
13
#include <string.h>
14
#include <malloc.h>
15
16
#define BUF_SIZE (8*1024*1024)
17
18
void print_usage();
19
20
int main(int argc, char *argv[])
21
{
22
    int ret_val = EXIT_SUCCESS;
23
    
24
    if (argc < 3) {
25
        print_usage();
26
        ret_val = EXIT_FAILURE;
27
        goto exit_fail_1;
28
    }
29
    
30
    FILE *fd_in1, *fd_in2, *fd_out;
31
    if (!(fd_in1 = fopen(argv[1], "rb"))) {
32
        printf("Error opening input file 1\n");
33
        ret_val = EXIT_FAILURE;
34
        goto exit_fail_1;
35
    }
36
    if (!(fd_in2 = fopen(argv[2], "rb"))) {
37
        printf("Error opening input file 2\n");
38
        ret_val = EXIT_FAILURE;
39
        goto exit_fail_2;
40
    }
41
    
42
    fseek(fd_in1, 0, SEEK_END);
43
    unsigned int in_size1 = ftell(fd_in1);
44
    fseek(fd_in1, 0, SEEK_SET);
45
    
46
    fseek(fd_in2, 0, SEEK_END);
47
    unsigned int in_size2 = ftell(fd_in2);
48
    fseek(fd_in2, 0, SEEK_SET);
49
    
50
    unsigned int min_size = (in_size1 < in_size2) ? in_size1 : in_size2;
51
52
    char *out_name = malloc(strlen(argv[1]) + strlen(".out") + 1);
53
    sprintf(out_name, "%s.out", argv[1]);
54
    
55
    if (!(fd_out = fopen(out_name, "wb+"))) {
56
        printf("Cannot create output file\n");
57
        ret_val = EXIT_FAILURE;
58
        goto exit_fail_3;
59
    }
60
    
61
    unsigned char *data_buf1 = (unsigned char *)malloc(BUF_SIZE);
62
    unsigned char *data_buf2 = (unsigned char *)malloc(BUF_SIZE);
63
64
    #define BAR_LEN 50
65
    unsigned int step_bytes = min_size/100;
66
    unsigned int temp_bytes = 0;
67
    size_t bytes_read1, bytes_read2, total_read = 0, min_read;
68
    while ((total_read < min_size) && (bytes_read1 = fread(data_buf1, 1, BUF_SIZE, fd_in1)) &&
69
                                      (bytes_read2 = fread(data_buf2, 1, BUF_SIZE, fd_in2))) {
70
        min_read = (bytes_read1 < bytes_read2) ? bytes_read1 : bytes_read2;
71
        total_read += min_read;
72
        temp_bytes += min_read;
73
        size_t i;
74
        for (i = 0; i < min_read; i++) {
75
            data_buf1[i] ^= data_buf2[i];
76
        }
77
        fwrite(data_buf1, 1, min_read, fd_out);
78
        
79
        if ((temp_bytes >= step_bytes) || (total_read == min_size)) {
80
            temp_bytes = 0;
81
            unsigned int percent = (unsigned int)(total_read*(100.0/min_size));
82
            printf("%3i%% [", percent);
83
            int j;
84
            int bar_size = (BAR_LEN*percent)/100;
85
            for (j = 0; j < BAR_LEN; j++) {
86
                if (j < bar_size) printf("=");
87
                else if (j == bar_size) printf(">");
88
                else printf(" ");
89
            }
90
            printf("]\r");
91
            fflush(stdout);
92
        }
93
    }
94
    fflush(fd_out);
95
    fclose(fd_out);
96
    free(data_buf1);
97
    free(data_buf2);
98
    printf("\nFinished!\n");
99
exit_fail_3:
100
    free(out_name);
101
    fclose(fd_in2);
102
exit_fail_2:
103
    fclose(fd_in1);
104
exit_fail_1:
105
    return ret_val;
106
}
107
108
void print_usage()
109
{
110
    printf("padxorer by xerpi\n"
111
           "usage: padxorer <input file 1> <input file 2>\n"
112
           "the output will be <input file 1>.out\n");
113
}