/* FOR_korektor.c */
/* Convertor for NWS FLDWAV from FORTRAN to C */
/* Does:
 - renames input file Name.FOR to Name.f
 - changes end-of-line-mark CRLF->LF
 - changes "COMMON\" to "COMMON/"
 - executes "f2c" translator
 - generates "Makefile", "gettim.c" file and "FOR_korektor_edcmd" file
*/

/* Aplikacia pre FLDWAV 2-0-0:
 1.najskor skopiluj tento program a uloz ho ako FOR_korektor
 2.dopln chybajuce inkludy do podadresara COMMON,
   a to subory LCS, LOS, MXVL, OPNFIL a UNTS
 3.suborom EXAH.FOR a FIL0.FOR dopln na konci CRLF
 4.pozor na povodne subory *.f, nezmenia sa ani sa neprevedu na C verziu,
   ide o subor "reddam.f" ktory je ale totozny s "REDDAM.FOR", takze ho zmaz
 5.aplikuj na vsetky fortranovske subory v adresari:
   find . -name "*.[Ff][Oo][Rr]" -exec ./FOR_korektor {} \;
 6.make
 8.budu chyby pri spusteni ./fldwav, takze treba
   zmenit unit cisla v Aamain.c zo 177 na 77, zo 155 na 55 a zo 165 na 65
   a prekompilovat (gcc -c Aamain.c; touch -r AVER.c Aamain.c; make)
 9.samozrejme prikladom Ex1... zmenit CRLF->LF
10.a vyrobit subor DATAFILE s obsahom trebars "1\nEx1\nEx1out\n"
11.ale binarne vystupne subory budu zapisane odlisne, budu vacsie a to preto,
   lebo kazdy neformatovany WRITE je vykonany inak, nez pod MS_Windows:
   pocet bajtov, potom tie bajty a nakoniec znova ich pocet
   (to je ohranicenie recordov vo fortrane).

   Na ORIGIN2000 pri pouziti f77 kompilatora bolo potrebne zmenit LEN_TRIM()
   na LEN() (kedze LEN_TRIM je len pre f90) ale nebezalo by to bez zmeny
   neformatovanych WRITE (su v suboroch DWAVSM Idprep OPNFIL READ3) v OPNFIL
   z 'BINARY' na 'SYSTEM'. Ale obsah je iny: big/little endian.
   S 'UNFORMATTED' to islo, ale tiez pridavalo hranicne znacky pre recordy.

12.pred porovnanim textovych vystupnych suborov teba Windowsovskemu zmenit CR
   a Linuxovskemu zmenit vypis desatinnych cisiel mensich nez 1 (napr.: .12)
   vykonanim skriptu ed Ex1out <zero.edcmd
   Dobre by bolo ubrat 2 medzery v OUTPUT.c medzi slovami "TT     QU(" a tiez
   v Readn.c pat v "KFLP       NET" a jednu v "DTHYD    DTOUT"
   v READ2.c dve v "VWIND    WINAGL", lebo f2c to tam zle skonvertoval.
   Ale aj tak zostane vela rozdielov: nepresnosti na druhom desatinnom mieste...
*/

#include <stdio.h>
#include <string.h>
#include <sys/stat.h>
#include <unistd.h>
#include <sys/types.h>
#include <utime.h>
#define FF "FOR_korektor_edcmd"
#define MM "Makefile"
#define GG "gettim.c"

FILE *f;
struct stat buf;
struct utimbuf buft;


int main(argc,argv) int argc; char **argv;
{int i,j; char *pp=NULL, *qq=NULL;
if(argc<2) { printf("usage: %s input_file ....*.FOR-to-*.f\n",argv[0]); exit(1); }
qq=strdup(argv[1]); if((pp=strrchr(qq,'.'))==NULL)exit(1);
if ((f = fopen(qq, "rb")) == NULL) {printf("File %s does not exists!\n",qq); exit(2);}
pp++; if(*pp=='f' || *pp=='F') {*pp='f'; pp++; *pp='\0';}

if ((f = fopen(qq, "rb")) != NULL) {printf("File %s exists!\n",qq); exit(2);}
stat(argv[1],&buf); buft.actime=buf.st_atime; buft.modtime=buf.st_mtime;
pp=(char *)malloc(sizeof(char)*(strlen(qq)+200)); if(pp==NULL)exit(5);
strcpy(pp,"cr "); strcat(pp,qq); strcat(pp," > /dev/null");
rename(argv[1],qq); system(pp);
//printf("premenoval %s na %s a vykonal:%s\n",argv[1],qq,pp);

if ((f = fopen(FF, "r")) == NULL) {
    if ((f = fopen(FF, "w")) == NULL) exit(2);
    fprintf(f,",s$INCLUDE 'COMMON\\\\$INCLUDE 'COMMON/$g\n,w\n.");
}
fclose(f);
if ((f = fopen(MM, "r")) == NULL) {
    if ((f = fopen(MM, "w")) != NULL) {
        fprintf(f,"fldwav: *.o\n");
        fprintf(f,"	gcc -O -o fldwav *.o -lf2c -lm\n\n");
        fprintf(f,"*.o: *.c\n");
        fprintf(f,"	gcc -O -c *.c\n\n");
        fprintf(f,"clean:\n");
	fprintf(f,"	rm *.o fldwav\n");
    }
}
fclose(f);
if ((f = fopen(GG, "r")) == NULL) {
    if ((f = fopen(GG, "w")) != NULL) {
        fprintf(f,"\
#include <sys/time.h>\n\n\
int gettim_(ih, im, is, it)\n\
int *ih, *im, *is, *it;\n\
{\n\
struct timeval t;\n\
struct timezone z;\n\n\
gettimeofday(&t, &z);\n\
*is = t.tv_sec % 60;\n\
*im = t.tv_sec / 60;\n\
*ih = *im / 60;\n\
*im = *im % 60;\n\
*ih = *ih % 24;\n\
*it = 0;\n\
}\n\n\
int len_trim__(char *F, long L)\
 {int i;for(i=L-1;i>0&&F[i]==' ';i--);return(++i);}\n");
    }
}
fclose(f);

strcpy(pp,"ed "); strcat(pp,qq); strcat(pp," < "); strcat(pp,FF);
strcat(pp," 2> /dev/null");
system(pp);
//unlink(FF);
utime(qq,&buft);
strcpy(pp,"f2c -Nn802 "); strcat(pp,qq);
system(pp);
exit(0);
}

/* gettime.f pre ORIGIN2000 :
      SUBROUTINE GETTIM(IH,IM,IS,IT)

      CHARACTER*8 T

      CALL TIME(T)
      I=INT(T(1:1))
      IH=(I-48)*10
      I=INT(T(2:2))
      IH=(I-48)+IH
      I=INT(T(4:4))
      IM=(I-48)*10
      I=INT(T(5:5))
      IM=(I-48)+IM
      I=INT(T(7:7))
      IS=(I-48)*10
      I=INT(T(8:8))
      IS=(I-48)+IS
      IT=0
      END
*/

/* zero.edcmd subor pre doplnenie prvej nuly v desatinnych cislach
   zacinajucich len desatinnou bodkou:

,s$ \.1$0\.1$g
,s$ \.2$0\.2$g
,s$ \.3$0\.3$g
,s$ \.4$0\.4$g
,s$ \.5$0\.5$g
,s$ \.6$0\.6$g
,s$ \.7$0\.7$g
,s$ \.8$0\.8$g
,s$ \.9$0\.9$g
,s$ \.0$0\.0$g
,s$ \-\.$\-0\.$g
,w

*/

