home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1998 January / Pcwk0198.iso / Zadarmo / Convert / SRC / QPL.C < prev   
C/C++ Source or Header  |  1996-01-31  |  7KB  |  221 lines

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <fcntl.h>
  4.  
  5. #ifdef __MSDOS__
  6. #include <sys\stat.h>
  7. #include <io.h>
  8. #undef __GNUC__     /* DJGPP #definiuje obie zmienne */
  9. #endif
  10.  
  11. #ifdef __GNUC__
  12. #include <sys/stat.h>
  13. #include <sys/file.h>
  14. #define O_BINARY
  15. #endif
  16.  
  17. #include "polish.h"                    /* min. wer. 4.3.20 */
  18. #define BUF_SIZE (4*1024)              /* bufor 4K */
  19. #define CSTCNT (PSTCNT-1)              /* nie bierzemy pod uwage BezPolsk */
  20. #define T_LEN (CSTCNT*PCHCNT+CSTCNT)   /* trzeba policzyc dodatkowo zera */
  21.  
  22. typedef unsigned char ubyte;
  23.  
  24. const ubyte qver_h=1;
  25. const ubyte qver_l=0;
  26.  
  27. /* 
  28.    wagi zostaly okreslone na podstawie zliczen polskich znakow w pliku 
  29.    zlozonym z kilku polskojezycznych tekstow o lacznej dlugosci 500KB
  30. */
  31. int wagi[PCHCNT]={1,1,1,1,1,1,1,1,1,15,10,16,19,1,13,13,1,18}; /* wagi */
  32. int wyn[CSTCNT];
  33. int licznik[T_LEN];
  34. int i,j,wynik1,sum1,ind1,res;
  35. long dlug1=0;
  36. ubyte o_stat=0, o_verb=0, o_batch=0;
  37. char znaki[]="bjc675d28349h1ai9ef"; /* konwersja dla opcji -b */
  38. char ch1;
  39. char ibuf[BUF_SIZE], obuf[BUF_SIZE];
  40. int ibuf_ptr = 0, obuf_ptr = 0, ibuf_lim = 0;
  41. int f_in;
  42.  
  43. int getopts(char *opt1,int argc1, char **argv1)
  44. {   int i;
  45.  
  46.     for(i=1;i<argc1;i++) if(!strcmp(argv1[i],opt1)) return(1);
  47.  
  48. /* else */
  49.     return(0);
  50. }
  51.  
  52. ubyte getxx(void)
  53. {
  54.   if (ibuf_ptr >= ibuf_lim) {               /* odebrane wszystkie? */
  55.     ibuf_lim = read(f_in, ibuf, BUF_SIZE);  /* czytaj z pliku */
  56.     if (ibuf_lim == 0) return -1;           /* nie ma wiecej w pliku */
  57.     ibuf_ptr = 0;                           /* inicjuj wskaznik znakow */
  58.   }
  59.   return ibuf[ibuf_ptr++];                  /* daj znak, zwieksz wskaznik */
  60. }
  61.  
  62. void ListC(int num1)
  63. {   int i;
  64.     for(i=0;i<PCHCNT;i++) fprintf(stdout,"%2u ",licznik[(num1*(PCHCNT+1))+i]);
  65.     fprintf(stdout," (%u)",wyn[num1]);
  66. }
  67.  
  68. void DispQH(void)
  69. {
  70. fprintf(stderr,"\
  71. Skladnia: qpl <plik> [-v | -s | -b]\n\
  72. Opcje   :\n\
  73.         -s  rozpoznawanie statystyczne\n\
  74.         -v  wyczerpujacy raport\n\
  75.         -b  wynik w postaci parametru ConvPL\n\
  76. \nSzczegoly w dokumentacji (qpl.txt).\n");
  77.  
  78. }
  79.  
  80. int main(argc,argv)
  81. int argc;
  82. char **argv;
  83. {
  84.  
  85. fprintf(stderr,"[QueryPL] by kravietZ, v%u.%u, rozpoznawanie standardu \
  86. polskich liter. Freeware.\n\n",qver_h,qver_l);
  87.  
  88. /* inicjalizacja licznikow */
  89. for(i=0;i<T_LEN;i++) licznik[i]=0;
  90.  
  91. if(argc<2) DispQH();
  92. else
  93. if((f_in=open(argv[1],O_RDONLY|O_BINARY)) == -1) perror(argv[1]);
  94.  
  95.     else
  96.  
  97.     {
  98.         if(argc>2)
  99.         {
  100.             if(getopts("-s",argc,argv)) o_stat++;
  101.             if(getopts("-v",argc,argv)) o_verb++;
  102.             if(getopts("-b",argc,argv)) { o_batch++; o_verb=0; }
  103.         }
  104.  
  105.         if(o_verb) fprintf(stderr,"Zliczanie polskich znakow...\n");
  106.             else
  107.             fprintf(stderr,"Rozpoznawanie standardu...\n");
  108.  
  109.         while((ch1=getxx()) != EOF)
  110.         {
  111.             dlug1++;
  112.             if( (ubyte) ch1>127) /* po co sprawdzac zwykle znaki */
  113.                for(i=0;i<T_LEN;i++)
  114.                  if( ( (ubyte) ch1 == *(p_Ami+i)) ) licznik[i]++;
  115.  
  116.         } /* end zliczanie znakow */
  117.  
  118. /* zamkniecie pliku wejsciowego */
  119.     close(f_in);
  120.  
  121.     if(o_verb)
  122.     {
  123.         fprintf(stderr,"Rozpoznawanie standardu...\n");
  124.         if(o_stat) fprintf(stderr,"Statystyka...\n");
  125.     }
  126.  
  127.  
  128.     for(i=0;i<CSTCNT;i++)
  129.     {
  130.         sum1=0;
  131.         for(j=0;j<PCHCNT;j++)
  132.         {
  133.             ind1=(i*(PCHCNT+1))+j;
  134. /* opcja statystyki (-s) */
  135.            if(o_stat) licznik[ind1]=licznik[ind1]*wagi[j];
  136.             sum1=sum1+licznik[ind1];
  137.         }
  138.         wyn[i]=sum1;
  139.      } /* end zliczanie licznikow */
  140.  
  141.     wynik1=0;
  142.     for(i=0;i<CSTCNT;i++) if(wyn[i] > wynik1) { wynik1=wyn[i]; res=i; }
  143.  
  144.     if(wynik1==0) res=255; /* jesli nie ma zadnych polskich znakow */
  145.  
  146. /* raport -v */
  147.  
  148.     if(o_verb) /* opcja -b wylacza opcje -v */
  149.     {
  150.       fprintf(stdout,"\n\
  151. Tabela zgodnosci znalezionych w tekscie znakow z roznymi standardami.\n\
  152. W kazdym wierszu znajduje sie 18 zliczen dla kazdego polskiego znaku diakryty-\n\
  153. cznego. W nawiasie na koncu podana jest suma zliczen. Przy opcji -s kazde\n\
  154. zliczenie jest dodatkowo przemnozone przez odpowiadajaca mu wage. Szczegoly\n\
  155. algorytmu znajdziesz w dokumentacji.\n\n");
  156.       fprintf(stdout,"\nAmiga PL    : "); ListC(0);
  157.       fprintf(stdout,"\nCorel 2.0   : "); ListC(1);
  158.       fprintf(stdout,"\nCP/J        : "); ListC(2);
  159.       fprintf(stdout,"\nCSK         : "); ListC(3);
  160.       fprintf(stdout,"\nCyfromat    : "); ListC(4);
  161.       fprintf(stdout,"\nDHN         : "); ListC(5);
  162.       fprintf(stdout,"\nAmiga FAT   : "); ListC(6);
  163.       fprintf(stdout,"\nFidoMazovia : "); ListC(7);
  164.       fprintf(stdout,"\nIEA         : "); ListC(8);
  165.       fprintf(stdout,"\nCP852       : "); ListC(9);
  166.       fprintf(stdout,"\nISO-8859/2  : "); ListC(10);
  167.       fprintf(stdout,"\nLogic       : "); ListC(11);
  168.       fprintf(stdout,"\nMacintosh   : "); ListC(12);
  169.       fprintf(stdout,"\nMazovia     : "); ListC(13);
  170.       fprintf(stdout,"\nMicrovex    : "); ListC(14);
  171.       fprintf(stdout,"\nTeX PL      : "); ListC(15);
  172.       fprintf(stdout,"\nVentura     : "); ListC(16);
  173.       fprintf(stdout,"\nCP1250      : "); ListC(17);
  174.       fprintf(stdout,"\nAmiga XJP   : "); ListC(18);
  175.       fprintf(stdout,"\n");
  176.     } /* o_verb */
  177.  
  178.     fprintf(stderr,"\nPlik           : %s\n",argv[1]);
  179.     fprintf(stderr,"Dlugosc        : %ld\n",dlug1);
  180.     fprintf(stderr,"Metoda         : %s",(o_stat ? "statystyczna\n" : "standard\n"));
  181.     fprintf(stderr,"Polskie litery : ");
  182.  
  183.    switch(res)
  184.    {
  185.    case 0:  fprintf(stderr,"Amiga PL\n"); break;
  186.    case 1:  fprintf(stderr,"Corel 2.0\n"); break;
  187.    case 2:  fprintf(stderr,"CP/J (Elwro 800 Junior)\n"); break;
  188.    case 3:  fprintf(stderr,"CSK\n"); break;
  189.    case 4:  fprintf(stderr,"Cyfromat\n"); break;
  190.    case 5:  fprintf(stderr,"DHN (lub Logic)\n"); break;
  191.    case 6:  fprintf(stderr,"Amiga FAT\n"); break;
  192.    case 7:  fprintf(stderr,"FidoMazovia\n"); break;
  193.    case 8:  fprintf(stderr,"IEA\n"); break;
  194.    case 9:  fprintf(stderr,"CP852 (IBM-Latin/2)\n"); break;
  195.    case 10: fprintf(stderr,"ISO-8859/2 (ISO-Latin/2)\n"); break;
  196.    case 11: fprintf(stderr,"Logic (lub DHN)\n"); break;
  197.    case 12: fprintf(stderr,"Macintosh\n"); break;
  198.    case 13: fprintf(stderr,"Mazovia\n"); break;
  199.    case 14: fprintf(stderr,"Microvex\n"); break;
  200.    case 15: fprintf(stderr,"TeX PL\n"); break;
  201.    case 16: fprintf(stderr,"Ventura\n"); break;
  202.    case 17: fprintf(stderr,"CP1250 (Windows 3.0 EE)\n"); break;
  203.    case 18: fprintf(stderr,"Amiga XJP\n"); break;
  204.    default: fprintf(stderr,"brak polskich znakow w pliku\n"); break;
  205.     } /* switch */
  206.  
  207. /* wyrzuca parametr dla ConvPL, jesli brak polskich liter to 0 */
  208.    if(o_batch) {
  209.              if(res != 255)
  210.                         {
  211.                           fprintf(stderr,"ConvPL         : ");
  212.                           fprintf(stdout,"%c",znaki[res]);
  213.                           fprintf(stderr,"\n");
  214.                         }
  215.                         else fprintf(stdout,"0");
  216.                 }
  217.    } /* end open ok */
  218.  
  219.     return(0);
  220. }
  221.