Subversion Repositories pentevo

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
975 savelij 1
 
2
/* last update: 28.10.2021 savelij */
3
 
4
#include <stdio.h>
5
#include <stdlib.h>
6
#include <ctype.h>
7
#include <string.h>
8
 
9
// открытие файла
10
FILE *OpenFile(const char *filename, const char *mode)
11
{
12
        FILE *namebuf;
13
 
14
        if(!(namebuf = fopen(filename, mode)))
15
        {
16
                printf("file %s not found\n", filename);
17
                exit(1);
18
        }
19
        return namebuf;
20
}
21
 
22
// чтение файла
23
unsigned char *ReadFile(FILE *name, char *filename, unsigned int filesize)
24
{
25
        unsigned char *buf;
26
 
27
        if(!(buf = (unsigned char *)malloc(filesize)))
28
        {
29
                printf("memory allocation error\n");
30
                exit(1);
31
        }
32
 
33
        unsigned int rdsize = fread(buf, 1, filesize, name);
34
        if(rdsize != filesize)
35
        {
36
                printf("file %s reading error\n", filename);
37
                exit(1);
38
        }
39
        return buf;
40
}
41
 
42
// запись файла
43
int WriteFile(int size, FILE *dst, unsigned char *buff)
44
{
45
        return fwrite(buff, 1, size, dst);
46
}
47
 
48
// получение размера файла
49
int FileSize(FILE *p)
50
{
51
        int pos, size;
52
 
53
        pos = ftell(p);
54
        fseek(p, 0, SEEK_END);
55
        size = ftell(p);
56
        fseek(p, pos, SEEK_SET);
57
        return size;
58
}
59
 
60
// краткая встроенная помощь
61
void usage(void)
62
{
63
        printf("Build: %s  %s\n", __DATE__, __TIME__);
64
        printf("Usage:\n");
65
        printf("csum32 input.bin >> creating output file \"csum32.bin\"\n");
66
        printf("csum32 input.bin -a >> no create \"csum32.bin\", add csum32 to input file\n");
67
        printf("csum32 inpit.bin -o output.ext >> the output file is equal to the input file appended with csum32\n");
68
 
69
        exit(0);
70
}
71
 
72
int main(int argc, char **argv)
73
{
74
        FILE *inp, *outp;                               // входной и выходной файл
75
        int insize;                                             // размер входного файла
76
        unsigned char *inputbuf;                // входной буфер
77
        unsigned int csum = 0;
78
 
79
        if ( argc < 2 ) usage();
80
 
81
        // открытие входного файла на чтение
82
        inp = OpenFile(argv[1], "rb");
83
        // проверка размера файла
84
        insize = FileSize(inp);
85
        // читаем входной файл в буфер
86
        inputbuf = ReadFile(inp, argv[1], FileSize(inp));
87
 
88
        for(int i = 0; i < insize; i++)
89
        {
90
                csum += inputbuf[i];
91
        }
92
 
93
        switch(argc)
94
        {
95
        case 4:
96
                if ( argv[2][0] == '-' && (argv[2][1] == 'o' || argv[2][1] == 'O') )
97
                {
98
                        // сключем "-o": копирование входного файла в выходной и добавление csum32
99
                        outp = OpenFile(argv[3], "wb");
100
                        WriteFile(insize, outp, inputbuf);
101
                        WriteFile(4, outp, (unsigned char *)&csum);
102
                        fclose(outp);
103
                }
104
                else printf("Unknown key\n");
105
                break;
106
 
107
        case 3:
108
                if ( argv[2][0] == '-' && (argv[2][1] == 'a' || argv[2][1] == 'A') )
109
                {
110
                        // с ключем "-a": добавление csum32 к входному файлу
111
                        outp = OpenFile(argv[1], "ab");
112
                        WriteFile(4, outp, (unsigned char *)&csum);
113
                        fclose(outp);
114
                }
115
                else printf("Unknown key\n");
116
                break;
117
 
118
        case 2:
119
        default:
120
                // без ключей
121
                outp = OpenFile("csum32.bin", "wb");
122
                WriteFile(4, outp, (unsigned char *)&csum);
123
                fclose(outp);
124
        }
125
 
126
        fclose(inp);
127
}