BSD 4_2 release
[unix-history] / usr / src / usr.bin / f77 / src / f77 / f77.c
CommitLineData
0f4556f1 1char *xxxvers[] = "\n@(#) XF77 DRIVER, VERSION 0.04.1, 1983 MAY 12\n";
47621762
BJ
2#include <stdio.h>
3#include <ctype.h>
0f4556f1
C
4#include "defines.h"
5#include "machdefs.h"
6#include "drivedefs.h"
7#include "version.h"
47621762
BJ
8#include <signal.h>
9
10static FILEP diagfile = {stderr} ;
11static int pid;
12static int sigivalue = 0;
13static int sigqvalue = 0;
14static int sighvalue = 0;
15static int sigtvalue = 0;
16
17static char *pass1name = PASS1NAME ;
18static char *pass2name = PASS2NAME ;
0f4556f1 19static char *pass2opt = PASS2OPT ;
47621762
BJ
20static char *asmname = ASMNAME ;
21static char *ldname = LDNAME ;
22static char *footname = FOOTNAME;
23static char *proffoot = PROFFOOT;
24static char *macroname = "m4";
25static char *shellname = "/bin/sh";
0f4556f1 26static char *cppname = "/lib/cpp";
47621762 27static char *aoutname = "a.out" ;
31cef89c 28static char *temppref = TEMPPREF;
47621762
BJ
29
30static char *infname;
4b9ccde7
C
31static char textfname[44];
32static char asmfname[44];
33static char asmpass2[44];
34static char initfname[44];
35static char sortfname[44];
36static char prepfname[44];
37static char objfdefault[44];
38static char optzfname[44];
39static char setfname[44];
47621762
BJ
40
41static char fflags[50] = "-";
31cef89c
BJ
42static char cflags[50] = "-c";
43#if TARGET == GCOS
44 static char eflags[30] = "system=gcos ";
45#else
46 static char eflags[30] = "system=unix ";
47#endif
47621762
BJ
48static char rflags[30] = "";
49static char lflag[3] = "-x";
50static char *fflagp = fflags+1;
51static char *cflagp = cflags+2;
31cef89c 52static char *eflagp = eflags+12;
47621762 53static char *rflagp = rflags;
0f4556f1
C
54static char *cppflags = "";
55static char **cppargs;
47621762
BJ
56static char **loadargs;
57static char **loadp;
58
59static flag erred = NO;
60static flag loadflag = YES;
61static flag saveasmflag = NO;
62static flag profileflag = NO;
63static flag optimflag = NO;
64static flag debugflag = NO;
65static flag verbose = NO;
66static flag nofloating = NO;
67static flag fortonly = NO;
68static flag macroflag = NO;
31cef89c
BJ
69static flag sdbflag = NO;
70
0f4556f1 71static int ncpp;
47621762
BJ
72
73\f
74main(argc, argv)
75int argc;
76char **argv;
77{
78int i, c, status;
0f4556f1 79char *setdoto(), *lastchar(), *lastfield(), *copys(), *argvtos();
47621762
BJ
80ptr ckalloc();
81register char *s;
82char fortfile[20], *t;
83char buff[100];
84int intrupt();
85
86sigivalue = (int) signal(SIGINT, SIG_IGN) & 01;
87sigqvalue = (int) signal(SIGQUIT,SIG_IGN) & 01;
88sighvalue = (int) signal(SIGHUP, SIG_IGN) & 01;
89sigtvalue = (int) signal(SIGTERM,SIG_IGN) & 01;
90enbint(intrupt);
91
92pid = getpid();
93crfnames();
94
0f4556f1 95cppargs = (char **) ckalloc( argc * sizeof(*cppargs) );
47621762
BJ
96loadargs = (char **) ckalloc( (argc+20) * sizeof(*loadargs) );
97loadargs[1] = "-X";
98loadargs[2] = "-u";
99#if HERE==PDP11 || HERE==VAX
0f4556f1 100 loadargs[3] = "_MAIN_";
47621762
BJ
101#endif
102#if HERE == INTERDATA
103 loadargs[3] = "main";
104#endif
105loadp = loadargs + 4;
106
107--argc;
108++argv;
109
110while(argc>0 && argv[0][0]=='-' && argv[0][1]!='\0')
111 {
112 for(s = argv[0]+1 ; *s ; ++s) switch(*s)
113 {
114 case 'T': /* use special passes */
115 switch(*++s)
116 {
117 case '1':
118 pass1name = s+1; goto endfor;
119 case '2':
120 pass2name = s+1; goto endfor;
0f4556f1
C
121 case 'p':
122 pass2opt = s+1; goto endfor;
47621762
BJ
123 case 'a':
124 asmname = s+1; goto endfor;
125 case 'l':
126 ldname = s+1; goto endfor;
127 case 'F':
128 footname = s+1; goto endfor;
129 case 'm':
130 macroname = s+1; goto endfor;
31cef89c
BJ
131 case 't':
132 temppref = s+1; goto endfor;
47621762
BJ
133 default:
134 fatali("bad option -T%c", *s);
135 }
136 break;
137
138 case '6':
139 if(s[1]=='6')
140 {
141 *fflagp++ = *s++;
142 goto copyfflag;
143 }
144 else {
145 fprintf(diagfile, "invalid flag 6%c\n", s[1]);
146 done(1);
147 }
148
149 case 'w':
150 if(s[1]=='6' && s[2]=='6')
151 {
152 *fflagp++ = *s++;
153 *fflagp++ = *s++;
154 }
155
156 copyfflag:
157 case 'u':
158 case 'U':
47621762
BJ
159 case '1':
160 case 'C':
47621762
BJ
161 *fflagp++ = *s;
162 break;
163
164 case 'O':
165 optimflag = YES;
166#if TARGET == INTERDATA
167 *loadp++ = "-r";
168 *loadp++ = "-d";
169#endif
170 *fflagp++ = 'O';
47621762
BJ
171 break;
172
173 case 'N':
174 *fflagp++ = 'N';
175 if( oneof(*++s, "qxscn") )
176 *fflagp++ = *s++;
177 else {
178 fprintf(diagfile, "invalid flag -N%c\n", *s);
179 done(1);
180 }
181 while( isdigit(*s) )
182 *fflagp++ = *s++;
183 *fflagp++ = 'X';
184 goto endfor;
185
186 case 'm':
187 if(s[1] == '4')
188 ++s;
189 macroflag = YES;
190 break;
191
192 case 'S':
31cef89c 193 strcat(cflags, " -S");
47621762
BJ
194 saveasmflag = YES;
195
196 case 'c':
197 loadflag = NO;
198 break;
199
200 case 'v':
201 verbose = YES;
0f4556f1
C
202 fprintf(diagfile,"\nBerkeley F77, version %s\n",
203 VERSIONNUMBER);
47621762
BJ
204 break;
205
206 case 'd':
207 debugflag = YES;
0f4556f1
C
208 *fflagp++ = 'd';
209 s++;
210 while( isdigit(*s) || *s == ',' )
211 *fflagp++ = *s++;
212 *fflagp++ = 'X';
213 goto endfor;
47621762 214
31cef89c
BJ
215 case 'M':
216 *loadp++ = "-M";
217 break;
218
219 case 'g':
220 strcat(cflags," -g");
221 sdbflag = YES;
222 goto copyfflag;
223
47621762
BJ
224 case 'p':
225 profileflag = YES;
31cef89c 226 strcat(cflags," -p");
e804469b
C
227 *fflagp++ = 'p';
228 if(s[1] == 'g')
229 {
230 proffoot = GPRFFOOT;
231 s++;
232 }
233 break;
47621762
BJ
234
235 case 'o':
236 if( ! strcmp(s, "onetrip") )
237 {
238 *fflagp++ = '1';
239 goto endfor;
240 }
241 aoutname = *++argv;
242 --argc;
243 break;
244
245#if TARGET == PDP11
246 case 'f':
247 nofloating = YES;
248 pass2name = NOFLPASS2;
249 break;
250#endif
251
252 case 'F':
253 fortonly = YES;
254 loadflag = NO;
255 break;
0f4556f1 256 case 'D':
47621762 257 case 'I':
0f4556f1
C
258 cppargs[ncpp++] = *argv;
259 goto endfor;
260
261 case 'i':
262 if(s[1]=='2' || s[1]=='4')
47621762
BJ
263 {
264 *fflagp++ = *s++;
265 goto copyfflag;
266 }
0f4556f1 267 fprintf(diagfile, "invalid flag -i%c\n", s[1]);
47621762
BJ
268 done(1);
269
270 case 'l': /* letter ell--library */
271 s[-1] = '-';
272 *loadp++ = s-1;
273 goto endfor;
274
275 case 'E': /* EFL flag argument */
276 while( *eflagp++ = *++s)
277 ;
278 *eflagp++ = ' ';
279 goto endfor;
280 case 'R':
281 while( *rflagp++ = *++s )
282 ;
283 *rflagp++ = ' ';
284 goto endfor;
285 default:
286 lflag[1] = *s;
287 *loadp++ = copys(lflag);
288 break;
289 }
290endfor:
291 --argc;
292 ++argv;
293 }
294
295*fflagp = '\0';
296
0f4556f1
C
297if (ncpp > 0)
298 cppflags = argvtos (ncpp,cppargs);
299
47621762
BJ
300loadargs[0] = ldname;
301#if TARGET == PDP11
302 if(nofloating)
303 *loadp++ = (profileflag ? NOFLPROF : NOFLFOOT);
304 else
305#endif
306*loadp++ = (profileflag ? proffoot : footname);
307
308for(i = 0 ; i<argc ; ++i)
309 switch(c = dotchar(infname = argv[i]) )
310 {
311 case 'r': /* Ratfor file */
312 case 'e': /* EFL file */
313 if( unreadable(argv[i]) )
314 {
315 erred = YES;
316 break;
317 }
318 s = fortfile;
319 t = lastfield(argv[i]);
320 while( *s++ = *t++)
321 ;
322 s[-2] = 'f';
323
324 if(macroflag)
325 {
326 sprintf(buff, "%s %s >%s", macroname, infname, prepfname);
327 if( sys(buff) )
328 {
329 rmf(prepfname);
330 erred = YES;
331 break;
332 }
333 infname = prepfname;
334 }
335
336 if(c == 'e')
337 sprintf(buff, "efl %s %s >%s", eflags, infname, fortfile);
338 else
339 sprintf(buff, "ratfor %s %s >%s", rflags, infname, fortfile);
340 status = sys(buff);
341 if(macroflag)
342 rmf(infname);
343 if(status)
344 {
345 erred = YES;
346 rmf(fortfile);
347 break;
348 }
349
350 if( ! fortonly )
351 {
352 infname = argv[i] = lastfield(argv[i]);
353 *lastchar(infname) = 'f';
354
355 if( dofort(argv[i]) )
356 erred = YES;
357 else {
358 if( nodup(t = setdoto(argv[i])) )
359 *loadp++ = t;
360 rmf(fortfile);
361 }
362 }
363 break;
364
0f4556f1
C
365 case 'F': /* C preprocessor -> Fortran file */
366 if( unreadable(argv[i]) )
367 {
368 erred = YES;
369 break;
370 }
371 s = fortfile;
372 t = lastfield(argv[i]);
373 while( *s++ = *t++)
374 ;
375 s[-2] = 'f';
376 sprintf(buff,"%s %s %s >%s", cppname, cppflags, infname, fortfile);
377 status = sys(buff);
378 if(status)
379 {
380 erred = YES;
381 rmf(fortfile);
382 break;
383 }
384
385 if( ! fortonly )
386 {
387 infname = argv[i] = lastfield(argv[i]);
388 *lastchar(infname) = 'f';
389
390 if ( dofort(argv[i]) )
391 erred = YES;
392 else {
393 if (nodup(t = setdoto(argv[i])) )
394 *loadp++ = t;
395 rmf(fortfile);
396 }
397 }
398 break;
399
47621762 400 case 'f': /* Fortran file */
47621762
BJ
401 if( unreadable(argv[i]) )
402 erred = YES;
403 else if( dofort(argv[i]) )
404 erred = YES;
405 else if( nodup(t=setdoto(argv[i])) )
406 *loadp++ = t;
407 break;
408
409 case 'c': /* C file */
410 case 's': /* Assembler file */
411 if( unreadable(argv[i]) )
412 {
413 erred = YES;
414 break;
415 }
416#if HERE==PDP11 || HERE==VAX
417 fprintf(diagfile, "%s:\n", argv[i]);
418#endif
31cef89c 419 sprintf(buff, "cc %s %s", cflags, argv[i] );
47621762
BJ
420 if( sys(buff) )
421 erred = YES;
422 else
423 if( nodup(t = setdoto(argv[i])) )
424 *loadp++ = t;
425 break;
426
427 case 'o':
428 if( nodup(argv[i]) )
429 *loadp++ = argv[i];
430 break;
431
432 default:
433 if( ! strcmp(argv[i], "-o") )
434 aoutname = argv[++i];
435 else
436 *loadp++ = argv[i];
437 break;
438 }
439
440if(loadflag && !erred)
441 doload(loadargs, loadp);
442done(erred);
443}
0f4556f1
C
444
445
446
447/*
448 * argvtos() copies a list of arguments contained in an array of character
449 * strings to a single dynamically allocated string. Each argument is
450 * separated by one blank space. Returns a pointer to the string or null
451 * if out of memory.
452 */
453#define SBUFINCR 1024
454#define SBUFMAX 10240
455
456char *
457argvtos(argc, argv)
458 char **argv;
459 int argc;
460{
461 register char *s; /* string pointer */
462 register int i; /* string buffer pointer */
463 char *malloc(); /* memory allocator */
464 char *realloc(); /* increase size of storage */
465 char *sbuf; /* string buffer */
466 int nbytes; /* bytes of memory required */
467 int nu; /* no. of SBUFINCR units required */
468 int sbufsize; /* current size of sbuf */
469 int strlen(); /* string length */
470
471 sbufsize = SBUFINCR;
472 if ((sbuf = malloc((unsigned)sbufsize)) == NULL)
473 {
474 fatal("out of memory (argvtos)");
475 /* NOTREACHED */
476 }
477
478 for (i = 0; argc-- > 0; ++argv)
479 {
480 if ((nbytes = (i+strlen(*argv)+1-sbufsize)) > 0)
481 {
482 nu = (nbytes+SBUFINCR-1)/SBUFINCR;
483 sbufsize += nu * SBUFINCR;
484 if (sbufsize > SBUFMAX)
485 {
486 fatal("argument length exceeded (argvtos)");
487 /* NOTREACHED */
488 }
489 if ((sbuf = realloc(sbuf, (unsigned)sbufsize)) == NULL)
490 {
491 fatal("out of memory (argvtos)");
492 /* NOTREACHED */
493 }
494 }
495 for (s = *argv; *s != '\0'; i++, s++)
496 sbuf[i] = *s;
497 sbuf[i++] = ' ';
498 }
499 sbuf[--i] = '\0';
500 return(sbuf);
501}
47621762
BJ
502\f
503dofort(s)
504char *s;
505{
506int retcode;
507char buff[200];
508
509infname = s;
510sprintf(buff, "%s %s %s %s %s %s",
511 pass1name, fflags, s, asmfname, initfname, textfname);
512switch( sys(buff) )
513 {
514 case 1:
515 goto error;
516 case 0:
517 break;
518 default:
519 goto comperror;
520 }
521
47621762
BJ
522if( dopass2() )
523 goto comperror;
524doasm(s);
525retcode = 0;
526
527ret:
528 rmf(asmfname);
529 rmf(initfname);
530 rmf(textfname);
531 return(retcode);
532
533error:
534 fprintf(diagfile, "\nError. No assembly.\n");
535 retcode = 1;
536 goto ret;
537
538comperror:
539 fprintf(diagfile, "\ncompiler error.\n");
540 retcode = 2;
541 goto ret;
542}
543
544
545
546
547dopass2()
548{
549char buff[100];
550
551if(verbose)
552 fprintf(diagfile, "PASS2.");
553
554#if FAMILY==DMR
555 sprintf(buff, "%s %s - %s", pass2name, textfname, asmpass2);
556 return( sys(buff) );
557#endif
558
0f4556f1 559
47621762
BJ
560#if FAMILY == PCC
561# if TARGET==INTERDATA
562 sprintf(buff, "%s -A%s <%s >%s", pass2name, setfname, textfname, asmpass2);
563# else
31cef89c 564 sprintf(buff, "%s %s >%s", pass2name, textfname, asmpass2);
47621762
BJ
565# endif
566 return( sys(buff) );
567#endif
568}
569
570
571
572
573doasm(s)
574char *s;
575{
576register char *lastc;
577char *obj;
578char buff[200];
31cef89c 579char *lastchar(), *setdoto();
47621762
BJ
580
581if(*s == '\0')
582 s = objfdefault;
583lastc = lastchar(s);
584obj = setdoto(s);
585
586#if TARGET==PDP11 || TARGET==VAX
587# ifdef PASS2OPT
588 if(optimflag)
589 {
0f4556f1 590 sprintf(buff, "%s %s %s", pass2opt, asmpass2, optzfname);
47621762
BJ
591 if( sys(buff) )
592 rmf(optzfname);
593 else
594 {
595 sprintf(buff,"mv %s %s", optzfname, asmpass2);
596 sys(buff);
597 }
598 }
599# endif
600#endif
601
602if(saveasmflag)
603 {
604 *lastc = 's';
605#if TARGET == INTERDATA
0f4556f1
C
606 sprintf(buff, "cat %s %s %s %s >%s",asmfname, initfname,
607 setfname, asmpass2, obj);
47621762 608#else
0f4556f1
C
609#if TARGET == VAX
610 sprintf(buff, "cat %s %s %s >%s", asmfname, asmpass2, initfname, obj);
47621762 611#else
0f4556f1
C
612 sprintf(buff, "cat %s %s %s >%s", asmfname, initfname, asmpass2, obj);
613#endif
47621762
BJ
614#endif
615 sys(buff);
616 *lastc = 'o';
617 }
618else
619 {
620 if(verbose)
621 fprintf(diagfile, " ASM.");
622#if TARGET == INTERDATA
0f4556f1
C
623 sprintf(buff, "%s -o %s %s %s %s %s", asmname, obj, asmfname,
624 initfname, setfname, asmpass2);
47621762
BJ
625#endif
626
627#if TARGET == VAX
628 /* vax assembler currently accepts only one input file */
0f4556f1 629 sprintf(buff, "cat %s %s >>%s", asmpass2, initfname, asmfname);
47621762 630 sys(buff);
0f4556f1
C
631#ifdef UCBVAXASM
632 sprintf(buff, "%s -J -o %s %s", asmname, obj, asmfname);
633#else
47621762
BJ
634 sprintf(buff, "%s -o %s %s", asmname, obj, asmfname);
635#endif
0f4556f1 636#endif
47621762
BJ
637
638#if TARGET == PDP11
639 sprintf(buff, "%s -u -o %s %s %s", asmname, obj, asmfname, asmpass2);
640#endif
641
642#if TARGET!=INTERDATA && TARGET!=PDP11 && TARGET!=VAX
643 sprintf(buff, "%s -o %s %s %s", asmname, obj, asmfname, asmpass2);
644#endif
645
646 if( sys(buff) )
647 fatal("assembler error");
648 if(verbose)
649 fprintf(diagfile, "\n");
650#if HERE==PDP11 && TARGET!=PDP11
651 rmf(obj);
652#endif
653 }
654
655rmf(asmpass2);
656}
657
658
659
660doload(v0, v)
661register char *v0[], *v[];
662{
663char **p;
664int waitpid;
665
31cef89c
BJ
666if(sdbflag)
667 *v++ = "-lg";
0f4556f1
C
668if (profileflag)
669 {
670 for(p = p_liblist ; *p ; *v++ = *p++)
671 ;
672 }
673else {
674 for(p = liblist ; *p ; *v++ = *p++)
675 ;
676 }
47621762
BJ
677
678*v++ = "-o";
679*v++ = aoutname;
680*v = NULL;
681
682if(verbose)
683 fprintf(diagfile, "LOAD.");
684if(debugflag)
685 {
686 for(p = v0 ; p<v ; ++p)
687 fprintf(diagfile, "%s ", *p);
688 fprintf(diagfile, "\n");
689 }
690
691#if HERE==PDP11 || HERE==INTERDATA || HERE==VAX
692 if( (waitpid = fork()) == 0)
693 {
694 enbint(SIG_DFL);
695 execv(ldname, v0);
696 fatalstr("couldn't load %s", ldname);
697 }
698 await(waitpid);
699#endif
700
701#if HERE==INTERDATA
702 if(optimflag)
703 {
704 char buff1[100], buff2[100];
705 sprintf(buff1, "nopt %s -o junk.%d", aoutname, pid);
706 sprintf(buff2, "mv junk.%d %s", pid, aoutname);
707 if( sys(buff1) || sys(buff2) )
708 err("bad optimization");
709 }
710#endif
711
712if(verbose)
713 fprintf(diagfile, "\n");
714}
715\f
716/* Process control and Shell-simulating routines */
717
718sys(str)
719char *str;
720{
721register char *s, *t;
722char *argv[100], path[100];
723char *inname, *outname;
724int append;
725int waitpid;
726int argc;
727
728
729if(debugflag)
730 fprintf(diagfile, "%s\n", str);
731inname = NULL;
732outname = NULL;
733argv[0] = shellname;
734argc = 1;
735
736t = str;
737while( isspace(*t) )
738 ++t;
739while(*t)
740 {
741 if(*t == '<')
742 inname = t+1;
743 else if(*t == '>')
744 {
745 if(t[1] == '>')
746 {
747 append = YES;
748 outname = t+2;
749 }
750 else {
751 append = NO;
752 outname = t+1;
753 }
754 }
755 else
756 argv[argc++] = t;
757 while( !isspace(*t) && *t!='\0' )
758 ++t;
759 if(*t)
760 {
761 *t++ = '\0';
762 while( isspace(*t) )
763 ++t;
764 }
765 }
766
767if(argc == 1) /* no command */
768 return(-1);
769argv[argc] = 0;
770
771s = path;
772t = "/usr/bin/";
773while(*t)
774 *s++ = *t++;
775for(t = argv[1] ; *s++ = *t++ ; )
776 ;
777if((waitpid = fork()) == 0)
778 {
779 if(inname)
780 freopen(inname, "r", stdin);
781 if(outname)
782 freopen(outname, (append ? "a" : "w"), stdout);
783 enbint(SIG_DFL);
784
785 texec(path+9, argv); /* command */
786 texec(path+4, argv); /* /bin/command */
787 texec(path , argv); /* /usr/bin/command */
788
789 fatalstr("Cannot load %s",path+9);
790 }
791
792return( await(waitpid) );
793}
794
795
796
797
798
799#include "errno.h"
800
801/* modified version from the Shell */
802texec(f, av)
803char *f;
804char **av;
805{
806extern int errno;
807
808execv(f, av+1);
809
810if (errno==ENOEXEC)
811 {
812 av[1] = f;
813 execv(shellname, av);
814 fatal("No shell!");
815 }
816if (errno==ENOMEM)
817 fatalstr("%s: too large", f);
818}
819
820
821
822
823
824
825done(k)
826int k;
827{
828static int recurs = NO;
829
830if(recurs == NO)
831 {
832 recurs = YES;
833 rmfiles();
834 }
835exit(k);
836}
837
838
839
840
841
842
843enbint(k)
844int (*k)();
845{
846if(sigivalue == 0)
847 signal(SIGINT,k);
848if(sigqvalue == 0)
849 signal(SIGQUIT,k);
850if(sighvalue == 0)
851 signal(SIGHUP,k);
852if(sigtvalue == 0)
853 signal(SIGTERM,k);
854}
855
856
857
858
859intrupt()
860{
861done(2);
862}
863
864
865
866await(waitpid)
867int waitpid;
868{
869int w, status;
870
871enbint(SIG_IGN);
872while ( (w = wait(&status)) != waitpid)
873 if(w == -1)
874 fatal("bad wait code");
875enbint(intrupt);
876if(status & 0377)
877 {
878 if(status != SIGINT)
0f4556f1 879 fprintf(diagfile, "Termination code %d\n", status);
47621762
BJ
880 done(3);
881 }
882return(status>>8);
883}
884\f
885/* File Name and File Manipulation Routines */
886
887unreadable(s)
888register char *s;
889{
890register FILE *fp;
891
892if(fp = fopen(s, "r"))
893 {
894 fclose(fp);
895 return(NO);
896 }
897
898else
899 {
900 fprintf(diagfile, "Error: Cannot read file %s\n", s);
901 return(YES);
902 }
903}
904
905
906
907clf(p)
908FILEP *p;
909{
910if(p!=NULL && *p!=NULL && *p!=stdout)
911 {
912 if(ferror(*p))
913 fatal("writing error");
914 fclose(*p);
915 }
916*p = NULL;
917}
918
919rmfiles()
920{
921rmf(textfname);
922rmf(asmfname);
923rmf(initfname);
924rmf(asmpass2);
925#if TARGET == INTERDATA
926 rmf(setfname);
927#endif
928}
929
930
931
932
933
934
935
936
937/* return -1 if file does not exist, 0 if it is of zero length
938 and 1 if of positive length
939*/
940content(filename)
941char *filename;
942{
943#ifdef VERSION6
944 struct stat
945 {
946 char cjunk[9];
947 char size0;
948 int size1;
949 int ijunk[12];
950 } buf;
951#else
952# include <sys/types.h>
953# include <sys/stat.h>
954 struct stat buf;
955#endif
956
957if(stat(filename,&buf) < 0)
958 return(-1);
959#ifdef VERSION6
960 return(buf.size0 || buf.size1);
961#else
962 return( buf.st_size > 0 );
963#endif
964}
965
966
967
968
969crfnames()
970{
971fname(textfname, "x");
972fname(asmfname, "s");
973fname(asmpass2, "a");
974fname(initfname, "d");
975fname(sortfname, "S");
976fname(objfdefault, "o");
977fname(prepfname, "p");
978fname(optzfname, "z");
979fname(setfname, "A");
980}
981
982
983
984
985rmf(fn)
986register char *fn;
987{
0f4556f1
C
988/* if(!debugflag && fn!=NULL && *fn!='\0') */
989
990if(fn!=NULL && *fn!='\0')
47621762
BJ
991 unlink(fn);
992}
993
994
995
996
997
998LOCAL fname(name, suff)
999char *name, *suff;
1000{
4b9ccde7 1001sprintf(name, "/tmp/%s%d.%s", temppref, pid, suff);
47621762
BJ
1002}
1003
1004
1005
1006
1007dotchar(s)
1008register char *s;
1009{
1010for( ; *s ; ++s)
1011 if(s[0]=='.' && s[1]!='\0' && s[2]=='\0')
1012 return( s[1] );
1013return(NO);
1014}
1015
1016
1017
1018char *lastfield(s)
1019register char *s;
1020{
1021register char *t;
1022for(t = s; *s ; ++s)
1023 if(*s == '/')
1024 t = s+1;
1025return(t);
1026}
1027
1028
1029
1030char *lastchar(s)
1031register char *s;
1032{
1033while(*s)
1034 ++s;
1035return(s-1);
1036}
1037
1038char *setdoto(s)
1039register char *s;
1040{
1041*lastchar(s) = 'o';
1042return( lastfield(s) );
1043}
1044
1045
1046
1047badfile(s)
1048char *s;
1049{
1050fatalstr("cannot open intermediate file %s", s);
1051}
1052
1053
1054
1055ptr ckalloc(n)
1056int n;
1057{
1058ptr p, calloc();
1059
1060if( p = calloc(1, (unsigned) n) )
1061 return(p);
1062
1063fatal("out of memory");
1064/* NOTREACHED */
1065}
1066
1067
1068
1069
1070
31cef89c 1071char *copyn(n, s)
47621762
BJ
1072register int n;
1073register char *s;
1074{
1075register char *p, *q;
1076
1077p = q = (char *) ckalloc(n);
1078while(n-- > 0)
1079 *q++ = *s++;
1080return(p);
1081}
1082
1083
1084
31cef89c 1085char *copys(s)
47621762
BJ
1086char *s;
1087{
1088return( copyn( strlen(s)+1 , s) );
1089}
1090
1091
1092
1093
1094
1095oneof(c,s)
1096register c;
1097register char *s;
1098{
1099while( *s )
1100 if(*s++ == c)
1101 return(YES);
1102return(NO);
1103}
1104
1105
1106
1107nodup(s)
1108char *s;
1109{
1110register char **p;
1111
1112for(p = loadargs ; p < loadp ; ++p)
1113 if( !strcmp(*p, s) )
1114 return(NO);
1115
1116return(YES);
1117}
1118
1119
1120
1121static fatal(t)
1122char *t;
1123{
1124fprintf(diagfile, "Compiler error in file %s: %s\n", infname, t);
1125if(debugflag)
1126 abort();
1127done(1);
1128exit(1);
1129}
1130
1131
1132
1133
1134static fatali(t,d)
1135char *t;
1136int d;
1137{
1138char buff[100];
1139sprintf(buff, t, d);
1140fatal(buff);
1141}
1142
1143
1144
1145
1146static fatalstr(t, s)
1147char *t, *s;
1148{
1149char buff[100];
1150sprintf(buff, t, s);
1151fatal(buff);
1152}
1153err(s)
1154char *s;
1155{
1156fprintf(diagfile, "Error in file %s: %s\n", infname, s);
1157}
47621762 1158