home *** CD-ROM | disk | FTP | other *** search
/ Amiga MA Magazine 1997 #3 / amigamamagazinepolishissue03-1 / polski_aminet / piotr_pawlow / convpl / convpl.c < prev    next >
C/C++ Source or Header  |  1996-12-21  |  9KB  |  325 lines

  1. #if 0
  2.  
  3.  gcc -s -c convpl.c $0
  4.  gcc -s -o convpl convpl.o
  5.  rm convpl.o
  6.  
  7.  exit
  8.  
  9. #endif
  10.  
  11. /*
  12.  ######################################################################
  13.  ##                                                                  ##
  14.  ## ConvertPL - program do konwersji pomiedzy roznymi standardami    ##
  15.  ## polskich znakow oraz roznymi standardami konca linii.            ##
  16.  ##                                                                  ##
  17.  ## Aby skompilowac ten program pod systemem UNIX napisz:            ##
  18.  ## sh convpl.c                                                      ##
  19.  ##                                                                  ##
  20.  ## Aby skompilowac go na Amidze z uzyciem kompilatora GNU C napisz: ##
  21.  ## make                                                             ##
  22.  ##                                                                  ##
  23.  ## Przy kompilowaniu na pececie pod Borland C trzeba wpisac PC w    ##
  24.  ## polu "Defines" w Options->Compiler->Code generation...           ##
  25.  ##                                                                  ##
  26.  ##---------------------------------------------------------------   ##
  27.  ##                                                                  ##
  28.  ## Moj adres:                                                       ##
  29.  ##                                                                  ##
  30.  ## Piotr Pawlow                                                     ##
  31.  ## ul. Lewartowskiego 12/46                                         ##
  32.  ## 00-185 Warszawa                                                  ##
  33.  ##                                                                  ##
  34.  ## Email: pp@cs.com.pl                                              ##
  35.  ## Homepage: http://www.cs.com.pl/amiga/index.html                  ##
  36.  ##                                                                  ##
  37.  ######################################################################
  38. */
  39.  
  40. #include <stdio.h>
  41. #include <string.h>
  42.  
  43.  
  44. #ifdef PC
  45.   #define MACHINE "pc"
  46.   #include <dir.h>
  47.   #define STRCCMP stricmp
  48. #else
  49.   #define STRCCMP strcasecmp
  50.   #include <unistd.h>
  51.   #include <machine/param.h>
  52. #endif
  53.  
  54.  
  55. char porownanie[20]="                  ";
  56. char wymiana[20]="                  ";
  57. char xxx=0;
  58. const char *zlearg="Zle argumenty (napisz -h aby uzyskac pomoc).\n";
  59.  
  60. void exit(int);
  61.  
  62. int hex(char z1,char z2)
  63. {
  64.   if ((((z1>='0')&&(z1<='9'))||((z1>='A')&&(z1<='F'))||((z1>='a')&&(z1<='f')))&&(((z2>='0')&&(z2<='9'))||((z2>='A')&&(z2<='F'))||((z2>='a')&&(z2<='f'))))
  65.   {
  66.     if (z1>='a') z1=z1-'a'+10;
  67.     else if (z1>='A') z1=z1-'A'+10;
  68.     else if (z1>='0') z1=z1-'0';
  69.     if (z2>='a') z2=z2-'a'+10;
  70.     else if (z2>='A') z2=z2-'A'+10;
  71.     else if (z2>='0') z2=z2-'0';
  72.     return(z1*16+z2);
  73.   }
  74.   else return(-1);
  75. }
  76.  
  77. int get_char(FILE *plik,char mime)
  78. {
  79.  
  80. char z1,z2,znak;
  81. int wynik;
  82.  
  83.   if (mime==0) return(fgetc(plik));
  84.   else
  85.   {
  86.     znak=fgetc(plik);
  87.     if (znak=='=')
  88.     {
  89.       z1=fgetc(plik);
  90.       if (z1==10) return(get_char(plik,mime));
  91.       z2=fgetc(plik);
  92.       if ((wynik=hex(z1,z2))==-1)
  93.       {
  94.         fseek(plik,-2,SEEK_CUR);
  95.         return(znak);
  96.       }
  97.       else return(wynik);
  98.     }
  99.     return(znak);
  100.   }
  101. }
  102.  
  103. void copy(char *zrodlo)
  104. {
  105.   if (xxx==0)
  106.   {
  107.     strcpy(porownanie,zrodlo);
  108.     xxx++;
  109.   }
  110.   else if (xxx==1)
  111.   {
  112.     strcpy(wymiana,zrodlo);
  113.     xxx++;
  114.   }
  115.   else
  116.   {
  117.     printf(zlearg);
  118.     exit(0);
  119.   }
  120. }
  121.  
  122. int main(int argc,char *argv[])
  123.  
  124. {
  125. FILE *plik;
  126. FILE *plik2;
  127.  
  128. char amigapl_zn[20]="âêëîïóôûúÂÊËÎÏÓÔÛÚ";
  129. char bezogonkow_zn[20]="acelnoszzACELNOSZZ";
  130. char isolatin_zn[20]="±æê³ñ󶿼¡ÆÊ£ÑÓ¦¯¬";
  131. char latin2_zn[20]="¥†©ˆä¢˜¾«¤¨ãà—½";
  132. char mac_zn[20]="ˆ«¸Ä—æý„Œ¢üÁîåû";
  133. char mzv_zn[20]="†‘’¤¢ž§¦•œ¥£˜¡ ";
  134. char fidomzv_zn[20]="†‡‘’¤¢ž§¦•œ¥£˜¡ ";
  135. char win_zn[20]="¹æê³ñ󜿟¥ÆÊ£Ñӌ¯";
  136. char xjp_zn[20]="æçêîñóõþûÆÇÊÎÑÓÕÞÛ";
  137.  
  138. long i,j;
  139. char znak=0,pznak=0,koniec,conv=0,mimeflag=0;
  140. char pz=0,pd=0;
  141. char *temporary=NULL;
  142. const char min=3,max=7;
  143.  
  144.   if (argc==1)
  145.   {
  146.     printf("convpl (-h)|(plik_zrodlowy [-amigapl|-bez|-fidomzv|-isolatin|-latin2|-mac|-mzv|-win|-xjp] [-MIME] [plik_wynikowy] [-amigapl|-bez|-fidomzv|-isolatin|-latin2|-mac|-mzv|-win|-xjp] [-LF|-CR|-CRLF])\n");
  147.     return(0);
  148.   }
  149.   if (argc==2) if (STRCCMP(argv[1],"-h")==0)
  150.   {
  151.     printf("\nConvertPL 1.0 - program do konwersji pomiedzy standardami polskich liter.\n\n");
  152.     printf("Wywolanie: convpl plik_zrodlowy [-standard] [-MIME] [plik_wynikowy] [-standard] [-konieclinii]\n\n");
  153.     printf("Dostepne standardy:\n");
  154.     printf("-amigapl  - format AmigaPL stosowany na Amidze\n");
  155.     printf("-bez      - bez polskich znakow\n");
  156.     printf("-fidomzv  - FIDO Mazovia\n");
  157.     printf("-isolatin - ISO Latin 2\n");
  158.     printf("-latin2   - normalny Latin 2\n");
  159.     printf("-mac      - standard Macintosha\n");
  160.     printf("-mzv      - standard Mazovii\n");
  161.     printf("-win      - standard uzywany w systemie Windows\n");
  162.     printf("-xjp      - stary format Amigowy ks. Pikuli\n\n");
  163.     printf("-MIME     - uproszczone dekodowanie MIME.\n");
  164.     printf("            Kazdy ciag =XX zostaje zamieniony na znak o kodzie XX.\n\n");
  165.     printf("Konwersja konca linii:\n");
  166.     printf("-LF       - linia bedzie sie konczyc kodem 10 - Line Feed (UNIX,Amiga)\n");
  167.     printf("-CR       - linia bedzie sie konczyc kodem 13 - Carriage Return (Macintosh)\n");
  168.     printf("-CRLF     - linia bedzie zakonczona oboma kodami (PC)\n\n");
  169.     return(0);
  170.   }
  171.   if (argc<min)
  172.   {
  173.     printf("Za malo argumentow (napisz -h aby uzyskac pomoc).\n");
  174.     return(0);
  175.   }
  176.   if (argc>max)
  177.   {
  178.     printf("Za duzo argumentow (napisz -h aby uzyskac pomoc).\n");
  179.     return(0);
  180.   }
  181.   for (i=1; i<argc; i++)
  182.   {
  183.  
  184.     if (*argv[i]!='-')
  185.     {
  186.       if (pz==0) pz=i;
  187.       else if (pd==0) pd=i;
  188.       else
  189.       {
  190.         printf(zlearg);
  191.         return(0);
  192.       }
  193.     }
  194.     else
  195.     {
  196.       if (STRCCMP(argv[i],"-MIME")==0)
  197.       {
  198.         if (mimeflag==0) mimeflag=1;
  199.         else
  200.         {
  201.           printf(zlearg);
  202.           return(0);
  203.         }
  204.       }
  205.       else if (STRCCMP(argv[i],"-LF")==0) conv=1;
  206.       else if (STRCCMP(argv[i],"-CR")==0) conv=2;
  207.       else if (STRCCMP(argv[i],"-CRLF")==0) conv=3;
  208.       else if (STRCCMP(argv[i],"-amigapl")==0) copy(amigapl_zn);
  209.       else if (STRCCMP(argv[i],"-isolatin")==0) copy(isolatin_zn);
  210.       else if (STRCCMP(argv[i],"-mzv")==0) copy(mzv_zn);
  211.       else if (STRCCMP(argv[i],"-fidomzv")==0) copy(fidomzv_zn);
  212.       else if (STRCCMP(argv[i],"-mac")==0) copy(mac_zn);
  213.       else if (STRCCMP(argv[i],"-win")==0) copy(win_zn);
  214.       else if (STRCCMP(argv[i],"-xjp")==0) copy(xjp_zn);
  215.       else if (STRCCMP(argv[i],"-latin2")==0) copy(latin2_zn);
  216.       else if (STRCCMP(argv[i],"-bez")==0) copy(bezogonkow_zn);
  217.       else
  218.       {
  219.         printf(zlearg);
  220.         return(0);
  221.       }
  222.     }
  223.   }
  224.   if (xxx==1)
  225.   {
  226.     printf(zlearg);
  227.     return(0);
  228.   }
  229.   if (pd==0) pd=pz;
  230.   plik=fopen(argv[pz],"r");
  231.   if (ferror(plik)!=0)
  232.   {
  233.     printf("Blad odczytu.\n");
  234.     return(0);
  235.   }
  236.   if (strcmp(MACHINE,"amiga")==0)
  237.     i=STRCCMP(argv[pz],argv[pd]);
  238.   else i=strcmp(argv[pz],argv[pd]);
  239.   if (i==0)
  240.   {
  241.     #ifdef PC
  242.       temporary=mktemp("convXXXXXX");
  243.     #else
  244.       temporary=mktemp("/tmp/cplXXX");
  245.     #endif
  246.     if (temporary==NULL)
  247.     {
  248.       printf("Nie moge stworzyc pliku roboczego.\n");
  249.       return(0);
  250.     }
  251.     plik2=fopen(temporary,"w");
  252.   }
  253.   else plik2=fopen(argv[pd],"w");
  254.   if (ferror(plik2)!=0)
  255.   {
  256.     printf("Blad zapisu.\n");
  257.     return(0);
  258.   }
  259.   while (feof(plik)==0)
  260.   {
  261.     pznak=znak;
  262.     znak=get_char(plik,mimeflag);
  263.     if (feof(plik)==0)
  264.     {
  265.       koniec=0;
  266.       if ((znak==10)||(znak==13))
  267.       {
  268.         if (conv==0) fputc(znak,plik2);
  269.         else
  270.         {
  271.           if (((znak==10)&&(pznak!=13))||(znak==13))
  272.           {
  273.             if (conv==1) fputc(10,plik2);
  274.             if (conv==2) fputc(13,plik2);
  275.             if (conv==3)
  276.             {
  277.               fputc(13,plik2);
  278.               fputc(10,plik2);
  279.             }
  280.           }
  281.         }
  282.       }
  283.       else
  284.       {
  285.         if (xxx==2)
  286.         for (j=0; (j<18)&&(koniec==0); j++)
  287.         {
  288.           if (znak==porownanie[j])
  289.           {
  290.             znak=wymiana[j];
  291.             koniec=1;
  292.           }
  293.         }
  294.         fputc(znak,plik2);
  295.       }
  296.     }
  297.   }
  298.   fclose(plik);
  299.   fclose(plik2);
  300.   if (temporary!=NULL)
  301.   {
  302.     plik=fopen(temporary,"r");
  303.     plik2=fopen(argv[pd],"w");
  304.     if (ferror(plik2)!=0)
  305.     {
  306.       printf("Blad zapisu.\n");
  307.       return(0);
  308.     }
  309.     while (feof(plik)==0)
  310.     {
  311.       znak=fgetc(plik);
  312.       if (feof(plik)==0) fputc(znak,plik2);
  313.     }
  314.     fclose(plik);
  315.     fclose(plik2);
  316.     if (remove(temporary)!=0)
  317.     {
  318.       printf("Nie moge usunac pliku roboczego.\n");
  319.       return(0);
  320.     }
  321.   }
  322.   return(0);
  323. }
  324.  
  325.