?login_element?

Subversion Repositories NedoOS

Rev

Blame | Last modification | View Log | Download

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <memory.h>
  5.  
  6.  
  7.  
  8. int main(int argc,char* argv[])
  9. {
  10.         FILE *file;
  11.         unsigned char *src,*dst;
  12.         int i,pd,sec,off,sum,size,out_size,blocks,data_size;
  13.  
  14.         if(argc<2)
  15.         {
  16.                 printf("Error: No input file\n");
  17.                 return 1;
  18.         }
  19.  
  20.         file=fopen(argv[1],"rb");
  21.  
  22.         if(!file)
  23.         {
  24.                 printf("Error: Can't open file\n");
  25.                 return 1;
  26.         }
  27.  
  28.         fseek(file,0,SEEK_END);
  29.         size=ftell(file);
  30.         fseek(file,0,SEEK_SET);
  31.  
  32.         src=(unsigned char*)malloc(size);
  33.         fread(src,size,1,file);
  34.         fclose(file);
  35.  
  36.         if(memcmp(src,"SINCLAIR",8))
  37.         {
  38.                 printf("Error: Wrong format\n");
  39.                 free(src);
  40.                 return 1;
  41.         }
  42.  
  43.         sec=0;
  44.         off=9;
  45.  
  46.         for(i=0;i<src[8];i++)
  47.         {
  48.                 sec+=src[off+13];
  49.                 off+=14;
  50.         }
  51.  
  52.         data_size=sec<<8;
  53.         blocks=sec/255;
  54.         if(sec%255) blocks++;
  55.  
  56.         dst=(unsigned char*)malloc(size);
  57.  
  58.         memcpy(dst,"SINCLAIR",8);
  59.         dst[8]=blocks;
  60.  
  61.         pd=9;
  62.  
  63.         for(i=0;i<blocks;i++)
  64.         {
  65.                 if(!i)
  66.                 {
  67.                         memcpy(&dst[pd],&src[9],14);
  68.                 }
  69.                 else
  70.                 {
  71.                         memcpy(&dst[pd],"data    ",8);
  72.                         dst[pd+8]=i-1+'0';
  73.                         dst[pd+9]=0;
  74.                         dst[pd+10]=0;
  75.                         dst[pd+11]=0;
  76.                         dst[pd+12]=0;
  77.                 }
  78.  
  79.                 dst[pd+13]=sec>255?255:sec;
  80.  
  81.                 sec-=255;
  82.                 pd+=14;
  83.         }
  84.  
  85.         memcpy(&dst[pd],&src[off],data_size);
  86.         pd+=data_size;
  87.  
  88.         free(src);
  89.  
  90.         sum=0;
  91.  
  92.         for(i=0;i<pd;i++) sum+=dst[i];
  93.  
  94.         dst[pd++]=sum&255;
  95.         dst[pd++]=(sum>>8)&255;
  96.         dst[pd++]=(sum>>16)&255;
  97.         dst[pd++]=(sum>>24)&255;
  98.  
  99.         out_size=pd;
  100.  
  101.         file=fopen(argv[1],"wb");
  102.  
  103.         if(!file)
  104.         {
  105.                 printf("Error: Can't create file\n");
  106.                 free(dst);
  107.                 return 1;
  108.         }
  109.  
  110.         fwrite(dst,out_size,1,file);
  111.         fclose(file);
  112.  
  113.         free(dst);
  114. }