Research V2 development
authorKen Thompson <ken@research.uucp>
Fri, 26 May 1972 23:37:25 +0000 (18:37 -0500)
committerKen Thompson <ken@research.uucp>
Fri, 26 May 1972 23:37:25 +0000 (18:37 -0500)
Work on file cmd/fc.c

Co-Authored-By: Dennis Ritchie <dmr@research.uucp>
Synthesized-from: v2

cmd/fc.c [new file with mode: 0644]

diff --git a/cmd/fc.c b/cmd/fc.c
new file mode 100644 (file)
index 0000000..8df9bff
--- /dev/null
+++ b/cmd/fc.c
@@ -0,0 +1,140 @@
+/* fortran command */
+
+char   ts[500];
+char   *tsp ts;
+char   *av[50];
+char   *llist[50];
+
+main(argc, argv)
+char *argv[]; {
+       char *t;
+       int nl, cflag, i, j;
+
+       llist[0] = 0;
+       i = nl = cflag = 0;
+       while(++i < argc) {
+               if (getsuf(t=copy(argv[i])) == 'f') {
+                       printf("%s:\n", t);
+                       av[0] = "fc";
+                       av[1] = t;
+                       av[2] = 0;
+                       if(callsys("/usr/fort/fc1", av) == 0) {
+                               av[0] = "as";
+                               av[1] = "-";
+                               av[2] = "f.tmp1";
+                               av[3] = 0;
+                               callsys("/bin/as", av);
+                               setsuf(t);
+                               unlink(t);
+                               if(link("a.out", t) | unlink("a.out")) {
+                                       printf("move failed: %s\n", t);
+                                       return;
+                               }
+                       } else {
+                               cflag++;
+                               goto loop;
+                       }
+               } else if (*t == '-' & t[1] =='c') {
+                       cflag++;
+                       goto loop;
+               }
+               if (nodup(llist, t)) {
+                       llist[nl++] = t;
+                       llist[nl] = 0;
+               }
+loop:;
+       }
+       unlink("f.tmp1");
+       if (cflag | nl==0) return;
+       i = 0;
+       av[0] = "ld";
+       av[1] = "/lib/fr0.o";
+       j = 2;
+       while(i<nl)
+               av[j++] = llist[i++];
+       av[j++] = "-lf";
+       av[j++] = "/lib/filib.a";
+       av[j++] = "-l";
+       av[j++] = 0;
+       callsys("/bin/ld", av);
+}
+
+getsuf(s)
+char s[]; {
+       int c;
+       char t, *os;
+
+       c = 0;
+       os = s;
+       while(t = *s++)
+               if (t=='/')
+                       c = 0;
+               else
+                       c++;
+       s =- 3;
+       if (c<=8 & c>2 & *s++=='.' & *s=='f')
+               return('f');
+       return(0);
+}
+
+setsuf(s)
+char s[]; {
+       while(*s++);
+       s[-2] = 'o';
+}
+
+callsys(f, v)
+char f[], *v[]; {
+       int t, status;
+
+       if ((t=fork())==0) {
+               execv(f, v);
+               printf("Can't find %s\n", f);
+               exit(-1);
+       } else
+               if (t == -1) {
+                       printf("Try again\n");
+                       exit(-1);
+       }
+       while(t!=wait(&status));
+       if ((status&0377) != 0)
+               exit(-1);
+       return((status>>8) & 0377);
+}
+
+copy(s)
+char s[]; {
+       char *otsp;
+
+       otsp = tsp;
+       while(*tsp++ = *s++);
+       return(otsp);
+}
+
+nodup(l, s)
+char *l[], s[]; {
+       char *t, *os, c;
+
+       os = s;
+       while(t = *l++) {
+               s = os;
+               while(c = *s++)
+                       if (c != *t++) goto ll;
+               if (*t++ == '\0') return (0);
+ll:;
+       }
+       return(1);
+}
+(t=fork())==0) {
+               execv(f, v);
+               printf("Can't find %s\n", f);
+               exit(-1);
+       } else
+               if (t == -1) {
+                       printf("Try again\n");
+                       exit(-1);
+       }
+       while(t!=wait(&status));
+       if ((status&0377) != 0)
+               exit(-1);
+       retur
\ No newline at end of file