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