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 | } |