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