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