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