home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / unixen.tar / unixen / Applications / Early_C_Compilers / last1120c.tar.gz / last1120c.tar / last1120c / ncc.c < prev    next >
C/C++ Source or Header  |  1972-07-02  |  3KB  |  194 lines

  1. /* C command */
  2.  
  3. main(argc, argv)
  4. char argv[][]; {
  5.     extern callsys, printf, unlink, link, nodup;
  6.     extern getsuf, setsuf, copy;
  7.     extern tsp;
  8.     extern tmp0, tmp1, tmp2, tmp3;
  9.     char tmp0[], tmp1[], tmp2[], tmp3[];
  10.     char glotch[100][], clist[50][], llist[50][], ts[500];
  11.     char tsp[], av[50][], t[];
  12.     auto nc, nl, cflag, i, j, c;
  13.  
  14.     tmp0 = tmp1 = tmp2 = tmp3 = "//";
  15.     tsp = ts;
  16.     i = nc = nl = cflag = 0;
  17.     while(++i < argc) {
  18.         if(*argv[i] == '-' & argv[i][1]=='c')
  19.             cflag++;
  20.         else {
  21.             t = copy(argv[i]);
  22.             if((c=getsuf(t))=='c') {
  23.                 clist[nc++] = t;
  24.                 llist[nl++] = setsuf(copy(t));
  25.             } else {
  26.             if (nodup(llist, t))
  27.                 llist[nl++] = t;
  28.             }
  29.         }
  30.     }
  31.     if(nc==0)
  32.         goto nocom;
  33.     tmp0 = copy("/tmp/ctm0a");
  34.     while((c=open(tmp0, 0))>=0) {
  35.         close(c);
  36.         tmp0[9]++;
  37.     }
  38.     while((creat(tmp0, 012))<0)
  39.         tmp0[9]++;
  40.     intr(delfil);
  41.     (tmp1 = copy(tmp0))[8] = '1';
  42.     (tmp2 = copy(tmp0))[8] = '2';
  43.     (tmp3 = copy(tmp0))[8] = '3';
  44.     i = 0;
  45.     while(i<nc) {
  46.         if (nc>1)
  47.             printf("%s:\n", clist[i]);
  48.         av[0] = "c0";
  49.         av[1] = clist[i];
  50.         av[2] = tmp1;
  51.         av[3] = tmp2;
  52.         av[4] = 0;
  53.         if (callsys("/usr/lib/c0", av)) {
  54.             cflag++;
  55.             goto loop;
  56.         }
  57.         av[0] = "c1";
  58.         av[1] = tmp1;
  59.         av[2] = tmp2;
  60.         av[3] = tmp3;
  61.         av[4] = 0;
  62.         if(callsys("/usr/lib/c1", av)) {
  63.             cflag++;
  64.             goto loop;
  65.         }
  66.         av[0] = "as";
  67.         av[1] = "-";
  68.         av[2] = tmp3;
  69.         av[3] = 0;
  70.         callsys("/bin/as", av);
  71.         t = setsuf(clist[i]);
  72.         unlink(t);
  73.         if(link("a.out", t) | unlink("a.out")) {
  74.             printf("move failed: %s\n", t);
  75.             cflag++;
  76.         }
  77. loop:;
  78.         i++;
  79.     }
  80. nocom:
  81.     if (cflag==0 & nl!=0) {
  82.         i = 0;
  83.         av[0] = "ld";
  84.         av[1] = "/usr/lib/crt0.o";
  85.         j = 2;
  86.         while(i<nl)
  87.             av[j++] = llist[i++];
  88.         av[j++] = "-lc";
  89.         av[j++] = "-l";
  90.         av[j++] = 0;
  91.         callsys("/bin/ld", av);
  92.     }
  93. delfil:
  94.     dexit();
  95. }
  96. dexit()
  97. {
  98.     extern tmp0, tmp1, tmp2, tmp3;
  99.  
  100.     unlink(tmp1);
  101.     unlink(tmp2);
  102.     unlink(tmp3);
  103.     unlink(tmp0);
  104.     exit();
  105. }
  106.  
  107. getsuf(s)
  108. char s[];
  109. {
  110.     extern exit, printf;
  111.     auto c;
  112.     char t, os[];
  113.  
  114.     c = 0;
  115.     os = s;
  116.     while(t = *s++)
  117.         if (t=='/')
  118.             c = 0;
  119.         else
  120.             c++;
  121.     s =- 3;
  122.     if (c<=8 & c>2 & *s++=='.' & *s=='c')
  123.         return('c');
  124.     return(0);
  125. }
  126.  
  127. setsuf(s)
  128. char s[];
  129. {
  130.     char os[];
  131.  
  132.     os = s;
  133.     while(*s++);
  134.     s[-2] = 'o';
  135.     return(os);
  136. }
  137.  
  138. callsys(f, v)
  139. char f[], v[][]; {
  140.  
  141.     extern fork, execv, wait, printf;
  142.     auto t, status;
  143.  
  144.     if ((t=fork())==0) {
  145.         execv(f, v);
  146.         printf("Can't find %s\n", f);
  147.         exit(1);
  148.     } else
  149.         if (t == -1) {
  150.             printf("Try again\n");
  151.             return(1);
  152.         }
  153.     while(t!=wait(&status));
  154.     if ((t=(status&0377)) != 0) {
  155.         if (t!=9)        /* interrupt */
  156.             printf("Fatal error in %s\n", f);
  157.         dexit();
  158.     }
  159.     return((status>>8) & 0377);
  160. }
  161.  
  162. copy(s)
  163. char s[]; {
  164.     extern tsp;
  165.     char tsp[], otsp[];
  166.  
  167.     otsp = tsp;
  168.     while(*tsp++ = *s++);
  169.     return(otsp);
  170. }
  171.  
  172. nodup(l, s)
  173. char l[][], s[]; {
  174.  
  175.     char t[], os[], c;
  176.  
  177.     os = s;
  178.     while(t = *l++) {
  179.         s = os;
  180.         while(c = *s++)
  181.             if (c != *t++) goto ll;
  182.         if (*t++ == '\0') return (0);
  183. ll:;
  184.     }
  185.     return(1);
  186. }
  187.  
  188. tsp;
  189. tmp0;
  190. tmp1;
  191. tmp2;
  192. tmp3;
  193.  
  194.