#include <stdio.h>  // Program konvertujuci ALEPH sequential format na ISO-2709
#include <string.h> // --------------
#include <stdlib.h> // verzia 0.1

int main(int argc, char** argv)         // Brano Kovar 26.maj.2003      kovar@ulib.sk
                                        //    last update: 30.maj.2003
{
                    // zname rozdiely oproti aleph.exportu do iso - osekne medzery na konci pola
                    // (uz samotny aleph pri exporte do seq.formatu)

 char oddrec = 29;   // ODDELOVAC ZAZNAMU
 char oddtag = 30;   // ODDELOVAC POLA
 char oddsub = 31;   // ODDELOVAC PODPOLA

 char leadst1[9] = "nam--22";  // STANDARDNA HLAVICKA (ak nieje v poli LDR)
 char leadst2[9] = "---450-";

 FILE* vstsub;
 FILE* vystsub;
 char pati[80];
 char pato[80];
 char sysno[12];
 char ssysno[12];
 char tag[5];
 char nic[7];
 char obsah[3002];
 char leader[25];
 char lead1[9];
 char lead2[9];
 long z,n,poz,lenrec,lenhead;
 int x,y,za,indik,ldr, xv,yv;

 char ptag[1000][5];
 char plen[1000][5];
 char pobs[1000][1000];
 char obsahn[3002];


if ((argc == 1) || (argc > 3))
      {
        fprintf(stdout, "Program 2ISO\n------------\nProgram konvertuje aleph.sekvencny format na format ISO2709\n");
        fprintf(stdout, "\n pouzitie:  2iso vstup.dat (ako vystup bude vygenerovany standardne subor vystup.iso)\n           2iso vstup.seq vystup.iso\n");
        fprintf(stdout, "\n priklad :  2iso ../skp01/scratch/test2.dos test2.iso\n\n");
        exit(1);
      }
strcpy(pati, argv[1]);
strcpy(pato, "vystup.iso");
if (argc == 3) { strcpy(pato, argv[2]); }

 if ((vstsub=fopen(pati,"r"))==NULL)
       {
        fprintf(stderr, "Error: Can't open file: %s\n", pati);
        fprintf(stderr, " zadajte prosim spravny nazov suboru a cestu!\n");
        exit(1);
       }
 if ((vystsub=fopen(pato,"w")) == NULL )
       {
        fprintf( stderr, "Error: Can't open file: %s\n", pato);
        exit(1);
       }
printf("\nSpustam konverziu zaznamov..\n");
z=0; za=0; n=0; ldr=0;
strcpy( ssysno, "00");

do {                    //  ---- SPRACOVANIE TAGov
 indik=0;
 strcpy ( ssysno, sysno);
 fgets( sysno, 11, vstsub);
 fgets( tag, 4, vstsub);
 fgets( nic, 6, vstsub);
 fgets( obsah, 2001, vstsub);

 if ((strcmp(sysno,ssysno) != 0) || (feof(vstsub))) // skoncil zaznam -> skonvertuj
   {
    if (n > 0)       // !!! na uplnom zaciatku niet co zapisovat
     {
     lenhead = 25 + (n * 12); lenrec=lenhead+1;
     for (xv=0; xv < n; xv++)
       {
         lenrec = lenrec + strlen(pobs[xv]);
       }
     if (ldr == 0) { strcpy(lead1,leadst1); strcpy(lead2,leadst2); }
     fprintf( vystsub, "%05d%s%05d%s", lenrec,lead1,lenhead,lead2);   // Zapis hlavicky
     poz=0;
     for (xv=0; xv < n; xv++)
       {
         fprintf( vystsub, "%s%04d%05d", ptag[xv],strlen(pobs[xv]),poz);
         poz = poz + strlen(pobs[xv]);
       }
     for (xv=0; xv < n; xv++)          // Zapis dat
       {
         fprintf( vystsub, "%s", pobs[xv]);
       }
     fprintf( vystsub, "%c%c",oddtag,oddrec); // zaverecny oddelovac zaznamu
     }

     z++; za++; ldr=0; n=0;       // reinicializacia premennych
     if (za >= 25000) { za=0; fprintf(stdout,"%d\n",z); }  // pocitadlo zaznamov
   }

 if (strcmp(tag,"LDR") == 0)    // hlavicka
   {
     ldr++;
     if (ldr == 1)
        { for (xv=0; xv < 7; xv++) { lead1[xv]=obsah[xv+5];};  lead1[xv]=0;
          for (xv=0; xv < 7; xv++) { lead2[xv]=obsah[xv+17]; }
          lead2[xv]=0;
        }
       else { fprintf(stderr,"\nCHYBA pri konverzii!\nV zazname %s sa nachadzaju dve polia LDR?!\n",sysno); exit(1); }
   }

 // SEM ZARADIT KONVERZIU NAZVU TAGU, NAPR KONVERZIA Z30->999:
 // if (strcmp(tag,"Z30") == 0) { strcpy(tag,"999") }

 if (tag[0] < 65)                  // konvertuj iba ciselny tag (podla standardu ISO)
  {
    if (obsah[1]== '$') { indik=1; } // obsahuje indikatory

    strcpy(ptag[n],tag);  // aktualny tag do pola

    strcpy(obsahn,obsah);
    if (indik == 1) { y=3; obsahn[1]=nic[0]; obsahn[2]=nic[1]; } else { y=1; } // pridame indikatory

    x=0;               // konverzia oddelovacov (sem je mozne pridat konverziu diakritiky)
     do {
       if ((obsah[x] == '$') && (obsah[x+1] == '$')) { obsahn[y]=oddsub; y++; }                     
       if (obsah[x] != '$') { obsahn[y] = obsah[x]; y++; }
       x++;
     } while (obsah[x] != 0);
    y--;                             // odstranit zaverecne CR
    obsahn[y]=0;
    obsahn[0]=oddtag;

    strcpy(pobs[n],obsahn); n++;
   }


// fprintf(vystsub,"%s,",tag);
} while (!feof(vstsub));

fclose(vstsub);
fclose(vystsub);
z--;
fprintf(stdout,"\nuspesne vygenerovany vystup pre %d zaznamov\n\n",z);

}


