Subversion Repositories pentevo

Rev

Blame | Last modification | View Log | Download | RSS feed | ?url?

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