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