?login_element?

Subversion Repositories NedoOS

Rev

Blame | Last modification | View Log | Download

  1. // Подготовка инструкции для НЛО-2
  2.  
  3. #include <stdio.h>
  4. #include <alloc.h>
  5. #include <io.h>
  6. #include <fcntl.h>
  7. #include <sys\stat.h>
  8. #include <stdlib.h>
  9. #include <string.h>
  10. #include <conio.h>
  11. #include <process.h>
  12. char x256[256];
  13. int lenx256=0;
  14. char cmpr[128][2];
  15. unsigned cc=0;
  16. int data[100][100];
  17. char code[]=" яазвсьедцрфжтгб"
  18.             "ыхнуймиколпЧэЭюШ"
  19.             "ёЯАЗВЕСДЬЦЖФРТГБ"
  20.             "ХЫУЙНМКИОЛПъшщчЩ"
  21.             "ZЮVNSDFGJLWQRYUI"
  22.             "2513460987,.:;-/"
  23.             ")(!$%\"+?Ё#++++++";
  24.  
  25. //-----------------------------------------------------------
  26. void convert_INSTR(char *m,unsigned *len)
  27. {
  28.  char *mget=m;
  29.  unsigned l=*len;
  30.  unsigned j;
  31.  for(;l>0;l--)
  32.   {
  33.   if (*m=='*') *m=' '; //  * заменяем на пробел
  34.   if (*m==' ' && m[1]==13){l--;m++;(*len)--;}
  35.   switch (*m)
  36.     {
  37.      case 13: *mget=126;l--;m++;(*len)--;break;
  38.      case '=': *mget=127;break;
  39.      default: for (j=0;j<111;j++)
  40.                 if(code[j]==*m) goto M1;
  41.                 printf("Неверный символ в тексте (%c,%u) \7\n",*m,*m);
  42.                 exit(1);
  43.           M1: *mget=j;
  44.     }
  45.    m++;
  46.    mget++;
  47.   }
  48. }
  49.  
  50. //-----------------------------------------------------------
  51. void search(char *m,unsigned len)
  52. {
  53.  for(unsigned i=0;i<len-1;i++)
  54.   {
  55.    if (m[0]<100 && m[1]<100)
  56.                 data[m[0]][m[1]]++;
  57.    m++;
  58.   }
  59. }
  60. //-----------------------------------------------------------
  61. void compress_ini()
  62. {
  63.  int i,j,k;
  64.  int max,maxi,maxj;
  65.  for(k=0;k<128;k++)
  66.   {
  67.    max=maxi=maxj=0;
  68.    for(i=0;i<100;i++)
  69.     for(j=0;j<100;j++)
  70.      if(data[i][j]>max)
  71.         {
  72.          max=data[i][j];
  73.          maxi=i;
  74.          maxj=j;
  75.         }
  76.    cmpr[k][0]=maxi;
  77.    cmpr[k][1]=maxj;
  78.    data[maxi][maxj]=-(k+1);
  79.    printf("%c%c(%3u),",code[cmpr[k][0]],code[cmpr[k][1]],max);
  80.   }
  81.  for(i=0;i<100;i++)
  82.    for(j=0;j<100;j++)
  83.      if(data[i][j]>0) data[i][j]=0;
  84.      else data[i][j]=-data[i][j];
  85. }
  86. //-----------------------------------------------------------
  87. void compress(char *m, unsigned *len)
  88. {
  89.  unsigned l=*len;
  90.  char *mget=m;
  91.  int k;
  92.  for(;l>0;l--)
  93.    {
  94. //    printf("%c",*m<126?code[*m]:'\n');
  95.     if(m[0]<100 && m[1]<100
  96.        && (k=data[m[0]][m[1]])>0)
  97.        {
  98.         *mget=k+127;
  99.         m++;
  100.         (*len)--;
  101.         l--;
  102.        }
  103.     else *mget=*m;
  104.     m++;
  105.     mget++;
  106.    }
  107. }
  108. //-----------------------------------------------------------
  109.  
  110. int main()
  111. {
  112.  char *b, *mw,*mm,*mP,*mN;
  113.  unsigned i,j,k;
  114.  printf("\n\t(c)1995 Mednonogov bros.\n");
  115.  printf("\tПодготовка компрессированой иструкции для НЛО-2\n");
  116.  printf("\tиз файлa xinstr.txt в файл xinstr.dat\n\n");
  117.  int hw=open("xinstr.txt",O_BINARY | O_RDONLY);
  118.  if (hw==-1){perror("Ошибка открытия файла слов \7\n");return -1;}
  119.  unsigned lenw=filelength(hw);
  120.  if(lenw==0){printf("Файл пуст!\n"); return -1;}
  121.  if((mw=(char*)malloc(lenw))==0)
  122.   {
  123.    printf("Недостаточно памяти (необходимо %u Kb)!\n",lenw);
  124.    return -1;
  125.   }
  126.  read(hw,mw,lenw);
  127.  close(hw);
  128. //---------------
  129.  
  130.  printf("Instr>%u \n",lenw);
  131.  convert_INSTR(mw,&lenw);
  132.  printf("Instr>%u \n",lenw);
  133.  search(mw,lenw);
  134.  compress_ini();
  135.  compress(mw,&lenw);
  136.  
  137.  hw=open("xinstr.dat",O_BINARY | O_RDWR | O_CREAT | O_TRUNC,S_IWRITE);
  138.  if (hw==-1){perror("Ошибка создания файла cлов \7\n");return -1;}
  139.  write(hw,mw,lenw);
  140.  printf("\nТекст иннструкции: %ukb\n",lenw);
  141.  close(hw);
  142.  hw=open("xinstrcm.dat",O_BINARY | O_RDWR | O_CREAT | O_TRUNC,S_IWRITE);
  143.  if (hw==-1){perror("Ошибка создания файла дешифрации словаря \7\n")
  144.                 ;return -1;}
  145.  write(hw,cmpr,256);
  146.  close (hw);
  147.  printf("O.K.\n");
  148.   return 0;
  149. }