?login_element?

Subversion Repositories NedoOS

Rev

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

  1. // Подготовка текстов для НЛО-2
  2. #include <stdio.h>
  3. #include <alloc.h>
  4. #include <io.h>
  5. #include <fcntl.h>
  6. #include <sys\stat.h>
  7. #include <stdlib.h>
  8. #include <string.h>
  9. #include <conio.h>
  10. #include <process.h>
  11. char x256[256];
  12. int lenx256=0;
  13. char cmpr[128][2];
  14. unsigned cc=0;
  15. int data[80-15][80-15];
  16. char code[]="0123456789?-.,: "
  17.             "АБВГДЕЁЖЗИЙКЛМНО"
  18.             "ПРСТУФХЦЧШЩЬЫЭЮЯ"
  19.             "абвгдеёжзийклмно"
  20.             "прстуфхцчшщьыэюя"
  21.             "DFGIJLNQRSUVWYZ!"
  22.             "()_/%>\"$ФФФФФФФФ"
  23.             "ъ^'";
  24. //-----------------------------------------------------------
  25. void convert_word(char *m,int *len)
  26. {
  27.  char *mget=m;
  28.  int l=*len;
  29.  int j;
  30.  for(;l>0;l--)
  31.   {
  32.    switch (*m)
  33.     {
  34.      case 13: *mget=126;l--;m++;(*len)--;lenx256++;break;
  35.      case '#': *m=' ';
  36.      default: for (j=0;j<115;j++)
  37.                 if(code[j]==*m) goto M1;
  38.                 printf("Неверный символ в словаре(%u,%c) \7\n",*m,*m);
  39.                 exit(1);
  40.           M1: *mget=j;
  41.     }
  42.    m++;
  43.    mget++;
  44.   }
  45. }
  46.  
  47. //-----------------------------------------------------------
  48. void convert_menu(char *m,int *len)
  49. {
  50.  char *mget=m;
  51.  int l=*len;
  52.  int j;
  53.  for(;l>0;l--)
  54.   {
  55.    switch (*m)
  56.     {
  57.      case 13: *mget=127;l--;m++;(*len)--;break;
  58.      case '¤': *mget=126;break;
  59.      default: for (j=0;j<115;j++)
  60.                 if(code[j]==*m) goto M1;
  61.                 printf("Неверный символ в меню (%c,%u) \7\n",*m,*m);
  62.                 exit(1);
  63.           M1: *mget=j;
  64.     }
  65.    m++;
  66.    mget++;
  67.   }
  68. }
  69.  
  70. //-----------------------------------------------------------
  71. void convert_ufopedia(char *m,int *len)
  72. {
  73.  char *mget=m;
  74.  int l=*len;
  75.  int j;
  76.  m[0]=' ';
  77.  m[1]=' ';
  78.  for(;l>0;l--)
  79.   {
  80. //   printf("%c",*m);
  81.    switch (*m)
  82.     {
  83.      case 13: *mget=127;l--;m++;(*len)--;
  84.               if(m[1]>='0')
  85.                {
  86.                 m[1]=' '; //номер XX
  87.                 m[2]=' ';
  88.                }
  89.               break;
  90.      case '&':mget--;(*len)--;break;
  91.      case '#': *mget=126;break;
  92.      default: for (j=0;j<115;j++)
  93.                 if(code[j]==*m) goto M1;
  94.                 printf("Неверный символ в энциклопедии(%c,%i) \7\n",*m,*m);
  95.                 exit(1);
  96.           M1: *mget=j;
  97.  
  98.     }
  99.    m++;
  100.    mget++;
  101.   }
  102. }
  103. //-----------------------------------------------------------
  104. void formatter(char *m,int len)
  105. {
  106.  int i,max=0,k=0,maxi=0;
  107.  char *mj=m;
  108.  for(i=0;i<len;i++)
  109.   {
  110.    switch (*mj)
  111.     {
  112.      case 126:
  113.      case 127:  max=k;
  114.      case 15:if(k>27)
  115.                 {
  116.                  if(m[maxi]<126) m[maxi]=126;
  117.                  max=k=k-max;
  118.                  maxi=i;
  119.                 }
  120.              else
  121.                if (*mj<126)
  122.                 {max=k;k++;maxi=i;}
  123.                else
  124.                 {maxi=i;max=0;k=0;}
  125.              break;
  126.      default:  k++;
  127.     }
  128.    mj++;
  129.   }
  130.   mj=m;
  131. /*  for(i=0;i<len;i++,mj++)
  132.    switch(*mj)
  133.     {
  134.      case 126: printf("\n");break;
  135.      case 127: printf("\n************\n");break;
  136.      default:printf("%c",code[*mj]);
  137.     }*/
  138. }
  139. //-----------------------------------------------------------
  140. void search(char *m,int len)
  141. {
  142.  int i;
  143.  for(i=0;i<len-1;i++)
  144.   {
  145.    if(m[0]>=15 && m[0]<80 && m[1]>=15 && m[1]<80)
  146.                 data[m[0]-15][m[1]-15]++;
  147.    m++;
  148.   }
  149. }
  150. //-----------------------------------------------------------
  151. void compress_ini()
  152. {
  153.  int i,j,k;
  154.  int max,maxi,maxj;
  155.  for(k=0;k<128;k++)
  156.   {
  157.    max=maxi=maxj=0;
  158.    for(i=0;i<80-15;i++)
  159.     for(j=0;j<80-15;j++)
  160.      if(data[i][j]>max)
  161.         {
  162.          max=data[i][j];
  163.          maxi=i;
  164.          maxj=j;
  165.         }
  166.    cmpr[k][0]=maxi+15;
  167.    cmpr[k][1]=maxj+15;
  168.    data[maxi][maxj]=-(k+1);
  169.    printf("%c%c(%3u),",code[cmpr[k][0]],code[cmpr[k][1]],max);
  170.   }
  171.  for(i=0;i<80-15;i++)
  172.    for(j=0;j<80-15;j++)
  173.      if(data[i][j]>0) data[i][j]=0;
  174.      else data[i][j]=-data[i][j];
  175. }
  176. //-----------------------------------------------------------
  177. void compress(char *m, int *len)
  178. {
  179.  int l=*len;
  180.  char *mget=m;
  181.  int k;
  182.  for(;l>0;l--)
  183.    {
  184. //    printf("%c",*m<126?code[*m]:'\n');
  185.     if(m[0]>=15 && m[0]<80 && m[1]>=15 && m[1]<80
  186.        && (k=data[m[0]-15][m[1]-15])>0)
  187.        {
  188.         *mget=k+127;
  189.         m++;
  190.         (*len)--;
  191.         l--;
  192.        }
  193.     else *mget=*m;
  194.     m++;
  195.     mget++;
  196.    }
  197. }
  198. //-----------------------------------------------------------
  199.  
  200. int main()
  201. {
  202.  char *b, *mw,*mm,*mP,*mN,*mE;
  203.  unsigned i,j,k;
  204.  int hw;
  205.  int lenw;
  206.  int hN;
  207.  int lenN;
  208.  int hm;
  209.  int lenm;
  210.  int hP;
  211.  int lenP;
  212.  int hE;
  213.  int lenE;
  214.  printf("\n\t(c)1995 Mednonogov bros.\n");
  215.  printf("\tПодготовка компрессированых текстов для НЛО-2\n");
  216.  printf("\tиз файлов xword.txt, xfopedia.txt, xmenu.txt\n");
  217.  printf("\tв файлы xword.dat, xfopedia.dat, xmenu.dat, xcompres.dat\n\n");
  218.  hw=open("xword.txt",O_BINARY | O_RDONLY);
  219.  if (hw==-1){perror("Ошибка открытия файла слов \7\n");return -1;}
  220.  lenw=filelength(hw);
  221.  if(lenw==0){printf("Файл пуст!\n"); return -1;}
  222.  if((mw=(char*)malloc(lenw))==0)
  223.   {
  224.    printf("Недостаточно памяти (необходимо %u Kb)!\n",lenw);
  225.    return -1;
  226.   }
  227.  read(hw,mw,lenw);
  228.  close(hw);
  229.  hN=open("xname.txt",O_BINARY | O_RDONLY);
  230.  if (hN==-1){perror("Ошибка открытия файла имён \7\n");return -1;}
  231.  lenN=filelength(hN);
  232.  if(lenN==0){printf("Файл пуст!\n"); return -1;}
  233.  if((mN=(char*)malloc(lenN))==0)
  234.   {
  235.    printf("Недостаточно памяти (необходимо %u Kb)!\n",lenN);
  236.    return -1;
  237.   }
  238.  read(hN,mN,lenN);
  239.  close(hN);
  240.  hm=open("xmenu.txt",O_BINARY | O_RDONLY);
  241.  if (hm==-1){perror("Ошибка открытия файла меню \7\n");return -1;}
  242.  lenm=filelength(hm);
  243.  if(lenm==0){printf("Файл пуст!\n"); return -1;}
  244.  if((mm=(char*)malloc(lenm))==0)
  245.   {
  246.    printf("Недостаточно памяти (необходимо %u Kb)!\n",lenm);
  247.    return -1;
  248.   }
  249.  read(hm,mm,lenm);
  250.  close(hm);
  251.  hP=open("xfopedia.txt",O_BINARY | O_RDONLY);
  252.  if (hP==-1){perror("Ошибка открытия файла энциклопедии \7\n");return -1;}
  253.  lenP=filelength(hP);
  254.  if(lenP==0){printf("Файл пуст!\n"); return -1;}
  255.  if((mP=(char*)malloc(lenP))==0)
  256.   {
  257.    printf("Недостаточно памяти (необходимо %u Kb)!\n",lenP);
  258.    return -1;
  259.   }
  260.  read(hP,mP,lenP);
  261.  close(hP);
  262.  hE=open("xend.txt",O_BINARY | O_RDONLY);
  263.  if (hE==-1){perror("Ошибка открытия файла концовки \7\n");return -1;}
  264.  lenE=filelength(hE);
  265.  if(lenE==0){printf("Файл пуст!\n"); return -1;}
  266.  if((mE=(char*)malloc(lenE))==0)
  267.   {
  268.    printf("Недостаточно памяти (необходимо %u Kb)!\n",lenE);
  269.    return -1;
  270.   }
  271.  read(hE,mE,lenE);
  272.  close(hE);
  273. //---------------
  274.  
  275.  printf("Wr>%u  Mn>%u  Up>%u Nm>%u \n",lenw,lenm,lenP,lenN);
  276.  convert_word(mw,&lenw);
  277.  convert_word(mN,&lenN);
  278.  convert_word(mE,&lenE);
  279.  convert_menu(mm,&lenm);
  280.  convert_ufopedia(mP,&lenP);
  281.  formatter(mP,lenP);
  282.  printf("Wr>%u  Mn>%u  Up>%u\n",lenw,lenm,lenP);
  283.  search(mw,lenw);
  284.  search(mN,lenN);
  285.  search(mm,lenm);
  286.  search(mP,lenP);
  287.  compress_ini();
  288.  compress(mw,&lenw);
  289.  compress(mN,&lenN);
  290.  compress(mP,&lenP);
  291.  compress(mm,&lenm);
  292.  hm=open("xmenu.dat",O_BINARY | O_RDWR | O_CREAT | O_TRUNC,S_IWRITE);
  293.  if (hm==-1){perror("Ошибка создания файла меню \7\n");return -1;}
  294.  write(hm,mm,lenm);
  295.  printf("\nФайл меню: %ukb\n",lenm);
  296.  close(hm);
  297.  hm=open("xname.dat",O_BINARY | O_RDWR | O_CREAT | O_TRUNC,S_IWRITE);
  298.  if (hm==-1){perror("Ошибка создания файла имён \7\n");return -1;}
  299.  write(hm,mN,lenN);
  300.  printf("Файл имён: %ukb\n",lenN);
  301.  close(hm);
  302.  hm=open("xfopedia.dat",O_BINARY | O_RDWR | O_CREAT | O_TRUNC,S_IWRITE);
  303.  if (hm==-1){perror("Ошибка создания файла меню \7\n");return -1;}
  304.  write(hm,mP,lenP);
  305.  printf("Файл энциклопедии: %ukb\n",lenP);
  306.  close(hm);
  307.  hw=open("xword.dat",O_BINARY | O_RDWR | O_CREAT | O_TRUNC,S_IWRITE);
  308.  if (hw==-1){perror("Ошибка создания файла cлов \7\n");return -1;}
  309.  write(hw,mw,lenw);
  310.  printf("Словарь: %ukb\n",lenw);
  311.  close(hw);
  312.  hw=open("xend.dat",O_BINARY | O_RDWR | O_CREAT | O_TRUNC,S_IWRITE);
  313.  if (hw==-1){perror("Ошибка создания файла концовки \7\n");return -1;}
  314.  write(hw,mE,lenE);
  315.  close(hw);
  316.  hw=open("xcompres.dat",O_BINARY | O_RDWR | O_CREAT | O_TRUNC,S_IWRITE);
  317.  if (hw==-1){perror("Ошибка создания файла дешифрации словаря \7\n")
  318.                 ;return -1;}
  319.  write(hw,cmpr,256);
  320.  close (hw);
  321.  hw=open("x256.dat",O_BINARY | O_RDWR | O_CREAT | O_TRUNC,S_IWRITE);
  322.  for (i=0;i<256;i++)x256[i]=i;
  323.  if (hw==-1){perror("Ошибка создания файла дешифрации словаря \7\n")
  324.                 ;return -1;}
  325.  write(hw,x256,256);
  326.  printf("O.K.\n");
  327.  close(hw);
  328.   return 0;
  329. }