/* Ratfor-Fortran command */ extern int fin, fout; char ts[1000]; char *tsp ts; char *av[50]; char *rlist[50]; int nr 0; char *llist[50]; int nl 0; int nxo 0; int bdcount 0; /* count block data files generated */ int rflag; int dflag 0; int vflag 1; int fflag; int cflag; char *complr "/usr/fort/fc1"; char *ratfor "/usr/lib/ratfor"; main(argc, argv) char *argv[]; { char *t; int i, j, c; int dexit(); for(i=0; ++i < argc; ) { if(*argv[i] == '-') switch (argv[i][1]) { default: goto passa; case 'd': dflag = 1; break; case 'v': vflag = 0; break; case 'r': rflag = fflag = cflag = 1; break; case 'f': fflag = 1; break; case 'c': cflag = 1; break; case '2': complr = "/usr/fort/fc2"; break; } else { passa: t = argv[i]; if( (c=getsuf(t))=='r' ) ratcomp(t); else if( c=='f') { fortcomp(t); llenter(setsuf(copy(t),'o')); } else llenter(copy(t)); } } if(rflag) dexit(); if ((signal(2, 1) & 01) == 0) signal(2, &dexit); if(dflag) printf("cflag=%d, nl=%d\n", cflag, nl); if (cflag==0 && nl!=0) { i = 0; av[0] = "ld"; av[1] = "-x"; av[2] = "/lib/fr0.o"; j = 3; while(i>8) & 0377; if( t ) return(++cflag); splitup(); nerr=0; for(i=0; i2 && *s++=='.') return(*s); return(0); } setsuf(s, ch) char s[]; { char *os; os = s; while(*s++); s[-2] = ch; return(os); } move(s,t) char *s, *t; { cunlink(t); if(link(s, t) || cunlink(s)) { printf("move failed: %s\n", t); return(1); } return(0); } callsys(f, v) char f[], *v[]; { int i, t, status; if(dflag){ for(i=0; v[i]; i++) printf("%s ", v[i]); putchar('\n'); } if ((t=fork())==0) { execv(f, v); printf("Can't find %s\n", f); exit(1); } else if (t == -1) { printf("Try again\n"); return(1); } while(t!=wait(&status)); if ((t=(status&0377)) != 0 && t!=14) { if (t!=2) /* interrupt */ printf("Fatal error in %s\n", f); dexit(); } t = (status>>8) & 0377; if(dflag && status != 0) printf("status = %d\n", t); return(t); } copy(s) char s[]; { char *otsp; otsp = tsp; while(*tsp++ = *s++); return(otsp); } nodup(l, s) char **l, s[]; { char *t, *os, c; if (getsuf(s) != 'o') return(1); os = s; while(t = *l++) { s = os; while(c = *s++) if (c != *t++) break; if (*t++ == '\0') return(0); } return(1); } llenter(t) char *t; { if (nodup(llist, t)) { llist[nl++] = t; if (getsuf(t)=='o') nxo++; } } cunlink(f) char *f; { if( dflag ) printf("unlink %s\n", f); if (f==0) return(0); return(unlink(f)); } splitup(){ char in[200], fname[20]; int buf[259]; int i,fd,c; if( (fin=open("ratjunk", 0)) < 0) error("can't open ratjunk\n"); while( gets(in) ){ getname(in, fname); savename(fname); if( (fd = fcreat(fname, buf)) < 0) error("can't open %s", fname); puts(in,buf); while( ! endcard(in) ){ gets(in); puts(in,buf); } fflush(buf); close(fd); } close(fin); } gets(s) char *s; { int c; while( (*s++=c=getchar()) != '\n' && c != '\0' ); *s = '\0'; return(c); } puts(s,b) char *s; int *b; { while( *s ) putc(*s++, b); } savename(s) char *s; { rlist[nr++] = copy(s); } getname(s,f) char *s,*f; { int i,j,c; loop: while( *s == ' ' || *s == '\t' ) s++; if( compar(s,"subroutine") ){ s =+ 10; goto bot; } else if( compar( s,"function") ){ s =+ 8; goto bot; } else if( compar(s,"real") ){ s =+ 4; goto loop; } else if( compar(s,"integer") ){ s =+ 7; goto loop; } else if( compar(s,"logical") ){ s =+ 7; goto loop; } else if( compar(s,"double") ){ s =+ 6; goto loop; } else if( compar(s,"precision") ){ s =+ 9; goto loop; } else if( compar(s,"complex") ){ s =+ 7; goto loop; } else if( compar(s,"block") ){ s = "blockdata "; s[9] = (bdcount++) + '0'; goto bot; } else { for(i=0; f[i]="MAIN.f"[i]; i++); return; } bot: while( *s == ' ' || *s == '\t' ) s++; for(i=0; alphanum(s[i]); i++) f[i] = s[i]; f[i++] = '.'; f[i++] = 'f'; f[i++] = '\0'; } compar(s,t) char *s,*t; { while( *t ) if( *s++ != *t++ ) return(0); return(1); } alphanum(c) int c; { return( (c>='a' && c<='z') || (c>='A' && c<='Z') || (c>='0' && c<='9') ); } endcard(s) char *s; { if( *s==0 ) return(1); while( *s==' ' || *s=='\t' ) s++; if( *s!='e' || *(s+1)!='n' || *(s+2)!='d' || *(s+3)!='\n' ) return(0); return(1); } error(s1, s2){ fout = 1; printf(s1,s2); putchar('\n'); flush(1); cflag++; }