|
|
1.1 root 1: #include "defs"
2: #include "tokdefs"
3:
4: # define BLANK ' '
5: # define MYQUOTE (2)
6: # define SEOF 0
7:
8: /* card types */
9:
10: # define STEOF 1
11: # define STINITIAL 2
12: # define STCONTINUE 3
13:
14: /* lex states */
15:
16: #define NEWSTMT 1
17: #define FIRSTTOKEN 2
18: #define OTHERTOKEN 3
19: #define RETEOS 4
20:
21:
22: LOCAL int stkey;
23: LOCAL int lastend = 1;
24: ftnint yystno;
25: flag intonly;
26: LOCAL long int stno;
27: LOCAL long int nxtstno;
28: LOCAL int parlev;
29: LOCAL int expcom;
30: LOCAL int expeql;
31: LOCAL char *nextch;
32: LOCAL char *lastch;
33: LOCAL char *nextcd = NULL;
34: LOCAL char *endcd;
35: LOCAL int prevlin;
36: LOCAL int thislin;
37: LOCAL int code;
38: LOCAL int lexstate = NEWSTMT;
39: LOCAL char s[1390];
40: LOCAL char *send = s+20*66;
41: LOCAL int nincl = 0;
42:
43: struct Inclfile
44: {
45: struct Inclfile *inclnext;
46: FILEP inclfp;
47: char *inclname;
48: int incllno;
49: char *incllinp;
50: int incllen;
51: int inclcode;
52: ftnint inclstno;
53: } ;
54:
55: LOCAL struct Inclfile *inclp = NULL;
56: LOCAL struct Keylist { char *keyname; int keyval; char notinf66; } ;
57: LOCAL struct Punctlist { char punchar; int punval; };
58: LOCAL struct Fmtlist { char fmtchar; int fmtval; };
59: LOCAL struct Dotlist { char *dotname; int dotval; };
60: LOCAL struct Keylist *keystart[26], *keyend[26];
61:
62:
63:
64:
65: inilex(name)
66: char *name;
67: {
68: nincl = 0;
69: inclp = NULL;
70: doinclude(name);
71: lexstate = NEWSTMT;
72: return(NO);
73: }
74:
75:
76:
77: /* throw away the rest of the current line */
78: flline()
79: {
80: lexstate = RETEOS;
81: }
82:
83:
84:
85: char *lexline(n)
86: int *n;
87: {
88: *n = (lastch - nextch) + 1;
89: return(nextch);
90: }
91:
92:
93:
94:
95:
96: doinclude(name)
97: char *name;
98: {
99: FILEP fp;
100: struct Inclfile *t;
101: char temp[100];
102: register char *lastslash, *s;
103:
104: if(inclp)
105: {
106: inclp->incllno = thislin;
107: inclp->inclcode = code;
108: inclp->inclstno = nxtstno;
109: if(nextcd)
110: inclp->incllinp = copyn(inclp->incllen = endcd-nextcd , nextcd);
111: else
112: inclp->incllinp = 0;
113: }
114: nextcd = NULL;
115:
116: if(++nincl >= MAXINCLUDES)
117: fatal("includes nested too deep");
118: if(name[0] == '\0')
119: fp = stdin;
120: else if(name[0]=='/' || inclp==NULL)
121: fp = fopen(name, "r");
122: else {
123: lastslash = NULL;
124: for(s = inclp->inclname ; *s ; ++s)
125: if(*s == '/')
126: lastslash = s;
127: if(lastslash)
128: {
129: *lastslash = '\0';
130: sprintf(temp, "%s/%s", inclp->inclname, name);
131: *lastslash = '/';
132: }
133: else
134: strcpy(temp, name);
135:
136: if( (fp = fopen(temp, "r")) == NULL )
137: {
138: sprintf(temp, "/usr/include/%s", name);
139: fp = fopen(temp, "r");
140: }
141: if(fp)
142: name = copys(temp);
143: }
144:
145: if( fp )
146: {
147: t = inclp;
148: inclp = ALLOC(Inclfile);
149: inclp->inclnext = t;
150: prevlin = thislin = 0;
151: infname = inclp->inclname = name;
152: infile = inclp->inclfp = fp;
153: }
154: else
155: {
156: fprintf(diagfile, "Cannot open file %s", name);
157: done(1);
158: }
159: }
160:
161:
162:
163:
164: LOCAL popinclude()
165: {
166: struct Inclfile *t;
167: register char *p;
168: register int k;
169:
170: if(infile != stdin)
171: clf(&infile);
172: free(infname);
173:
174: --nincl;
175: t = inclp->inclnext;
176: free( (charptr) inclp);
177: inclp = t;
178: if(inclp == NULL)
179: return(NO);
180:
181: infile = inclp->inclfp;
182: infname = inclp->inclname;
183: prevlin = thislin = inclp->incllno;
184: code = inclp->inclcode;
185: stno = nxtstno = inclp->inclstno;
186: if(inclp->incllinp)
187: {
188: endcd = nextcd = s;
189: k = inclp->incllen;
190: p = inclp->incllinp;
191: while(--k >= 0)
192: *endcd++ = *p++;
193: free( (charptr) (inclp->incllinp) );
194: }
195: else
196: nextcd = NULL;
197: return(YES);
198: }
199:
200:
201:
202:
203: yylex()
204: {
205: static int tokno;
206:
207: switch(lexstate)
208: {
209: case NEWSTMT : /* need a new statement */
210: if(getcds() == STEOF)
211: return(SEOF);
212: lastend = stkey == SEND;
213: crunch();
214: tokno = 0;
215: lexstate = FIRSTTOKEN;
216: yystno = stno;
217: stno = nxtstno;
218: toklen = 0;
219: return(SLABEL);
220:
221: first:
222: case FIRSTTOKEN : /* first step on a statement */
223: analyz();
224: lexstate = OTHERTOKEN;
225: tokno = 1;
226: return(stkey);
227:
228: case OTHERTOKEN : /* return next token */
229: if(nextch > lastch)
230: goto reteos;
231: ++tokno;
232: if( (stkey==SLOGIF || stkey==SELSEIF) && parlev==0 && tokno>3)
233: goto first;
234:
235: if(stkey==SASSIGN && tokno==3 && nextch<lastch &&
236: nextch[0]=='t' && nextch[1]=='o')
237: {
238: nextch+=2;
239: return(STO);
240: }
241: return(gettok());
242:
243: reteos:
244: case RETEOS:
245: lexstate = NEWSTMT;
246: return(SEOS);
247: }
248: fatali("impossible lexstate %d", lexstate);
249: /* NOTREACHED */
250: }
251:
252: LOCAL getcds()
253: {
254: register char *p, *q;
255:
256: top:
257: if(nextcd == NULL)
258: {
259: code = getcd( nextcd = s );
260: stno = nxtstno;
261: prevlin = thislin;
262: }
263: if(code == STEOF)
264: if( popinclude() )
265: goto top;
266: else
267: return(STEOF);
268:
269: if(code == STCONTINUE)
270: {
271: lineno = thislin;
272: err("illegal continuation card ignored");
273: nextcd = NULL;
274: goto top;
275: }
276:
277: if(nextcd > s)
278: {
279: q = nextcd;
280: p = s;
281: while(q < endcd)
282: *p++ = *q++;
283: endcd = p;
284: }
285: for(nextcd = endcd ;
286: nextcd+66<=send && (code = getcd(nextcd))==STCONTINUE ;
287: nextcd = endcd )
288: ;
289: nextch = s;
290: lastch = nextcd - 1;
291: if(nextcd >= send)
292: nextcd = NULL;
293: lineno = prevlin;
294: prevlin = thislin;
295: return(STINITIAL);
296: }
297:
298: LOCAL getcd(b)
299: register char *b;
300: {
301: register int c;
302: register char *p, *bend;
303: int speclin;
304: static char a[6];
305: static char *aend = a+6;
306:
307: top:
308: endcd = b;
309: bend = b+66;
310: speclin = NO;
311:
312: if( (c = getc(infile)) == '&')
313: {
314: a[0] = BLANK;
315: a[5] = 'x';
316: speclin = YES;
317: bend = send;
318: }
319: else if(c=='c' || c=='C' || c=='*')
320: {
321: while( (c = getc(infile)) != '\n')
322: if(c == EOF)
323: return(STEOF);
324: ++thislin;
325: goto top;
326: }
327:
328: else if(c != EOF)
329: {
330: /* a tab in columns 1-6 skips to column 7 */
331: ungetc(c, infile);
332: for(p=a; p<aend && (c=getc(infile)) != '\n' && c!=EOF; )
333: if(c == '\t')
334: {
335: while(p < aend)
336: *p++ = BLANK;
337: speclin = YES;
338: bend = send;
339: }
340: else
341: *p++ = c;
342: }
343: if(c == EOF)
344: return(STEOF);
345: if(c == '\n')
346: {
347: while(p < aend)
348: *p++ = BLANK;
349: if( ! speclin )
350: while(endcd < bend)
351: *endcd++ = BLANK;
352: }
353: else { /* read body of line */
354: while( endcd<bend && (c=getc(infile)) != '\n' && c!=EOF )
355: *endcd++ = c;
356: if(c == EOF)
357: return(STEOF);
358: if(c != '\n')
359: {
360: while( (c=getc(infile)) != '\n')
361: if(c == EOF)
362: return(STEOF);
363: }
364:
365: if( ! speclin )
366: while(endcd < bend)
367: *endcd++ = BLANK;
368: }
369: ++thislin;
370: if( !isspace(a[5]) && a[5]!='0')
371: return(STCONTINUE);
372: for(p=a; p<aend; ++p)
373: if( !isspace(*p) ) goto initline;
374: for(p = b ; p<endcd ; ++p)
375: if( !isspace(*p) ) goto initline;
376: goto top;
377:
378: initline:
379: nxtstno = 0;
380: for(p = a ; p<a+5 ; ++p)
381: if( !isspace(*p) )
382: if(isdigit(*p))
383: nxtstno = 10*nxtstno + (*p - '0');
384: else {
385: lineno = thislin;
386: err("nondigit in statement number field");
387: nxtstno = 0;
388: break;
389: }
390: return(STINITIAL);
391: }
392:
393: LOCAL crunch()
394: {
395: register char *i, *j, *j0, *j1, *prvstr;
396: int ten, nh, quote;
397:
398: /* i is the next input character to be looked at
399: j is the next output character */
400: parlev = 0;
401: expcom = 0; /* exposed ','s */
402: expeql = 0; /* exposed equal signs */
403: j = s;
404: prvstr = s;
405: for(i=s ; i<=lastch ; ++i)
406: {
407: if(isspace(*i) )
408: continue;
409: if(*i=='\'' || *i=='"')
410: {
411: quote = *i;
412: *j = MYQUOTE; /* special marker */
413: for(;;)
414: {
415: if(++i > lastch)
416: {
417: err("unbalanced quotes; closing quote supplied");
418: break;
419: }
420: if(*i == quote)
421: if(i<lastch && i[1]==quote) ++i;
422: else break;
423: else if(*i=='\\' && i<lastch)
424: switch(*++i)
425: {
426: case 't':
427: *i = '\t'; break;
428: case 'b':
429: *i = '\b'; break;
430: case 'n':
431: *i = '\n'; break;
432: case 'f':
433: *i = '\f'; break;
434: case 'v':
435: *i = '\v'; break;
436: case '0':
437: *i = '\0'; break;
438: default:
439: break;
440: }
441: *++j = *i;
442: }
443: j[1] = MYQUOTE;
444: j += 2;
445: prvstr = j;
446: }
447: else if( (*i=='h' || *i=='H') && j>prvstr) /* test for Hollerith strings */
448: {
449: if( ! isdigit(j[-1])) goto copychar;
450: nh = j[-1] - '0';
451: ten = 10;
452: j1 = prvstr - 1;
453: if (j1<j-5) j1=j-5;
454: for(j0=j-2 ; j0>j1; -- j0)
455: {
456: if( ! isdigit(*j0 ) ) break;
457: nh += ten * (*j0-'0');
458: ten*=10;
459: }
460: if(j0 <= j1) goto copychar;
461: /* a hollerith must be preceded by a punctuation mark.
462: '*' is possible only as repetition factor in a data statement
463: not, in particular, in character*2h
464: */
465:
466: if( !(*j0=='*'&&s[0]=='d') && *j0!='/' && *j0!='(' &&
467: *j0!=',' && *j0!='=' && *j0!='.')
468: goto copychar;
469: if(i+nh > lastch)
470: {
471: erri("%dH too big", nh);
472: nh = lastch - i;
473: }
474: j0[1] = MYQUOTE; /* special marker */
475: j = j0 + 1;
476: while(nh-- > 0)
477: {
478: if(*++i == '\\')
479: switch(*++i)
480: {
481: case 't':
482: *i = '\t'; break;
483: case 'b':
484: *i = '\b'; break;
485: case 'n':
486: *i = '\n'; break;
487: case 'f':
488: *i = '\f'; break;
489: case '0':
490: *i = '\0'; break;
491: default:
492: break;
493: }
494: *++j = *i;
495: }
496: j[1] = MYQUOTE;
497: j+=2;
498: prvstr = j;
499: }
500: else {
501: if(*i == '(') ++parlev;
502: else if(*i == ')') --parlev;
503: else if(parlev == 0)
504: if(*i == '=') expeql = 1;
505: else if(*i == ',') expcom = 1;
506: copychar: /*not a string or space -- copy, shifting case if necessary */
507: if(shiftcase && isupper(*i))
508: *j++ = tolower(*i);
509: else *j++ = *i;
510: }
511: }
512: lastch = j - 1;
513: nextch = s;
514: }
515:
516: LOCAL analyz()
517: {
518: register char *i;
519:
520: if(parlev != 0)
521: {
522: err("unbalanced parentheses, statement skipped");
523: stkey = SUNKNOWN;
524: return;
525: }
526: if(nextch+2<=lastch && nextch[0]=='i' && nextch[1]=='f' && nextch[2]=='(')
527: {
528: /* assignment or if statement -- look at character after balancing paren */
529: parlev = 1;
530: for(i=nextch+3 ; i<=lastch; ++i)
531: if(*i == (MYQUOTE))
532: {
533: while(*++i != MYQUOTE)
534: ;
535: }
536: else if(*i == '(')
537: ++parlev;
538: else if(*i == ')')
539: {
540: if(--parlev == 0)
541: break;
542: }
543: if(i >= lastch)
544: stkey = SLOGIF;
545: else if(i[1] == '=')
546: stkey = SLET;
547: else if( isdigit(i[1]) )
548: stkey = SARITHIF;
549: else stkey = SLOGIF;
550: if(stkey != SLET)
551: nextch += 2;
552: }
553: else if(expeql) /* may be an assignment */
554: {
555: if(expcom && nextch<lastch &&
556: nextch[0]=='d' && nextch[1]=='o')
557: {
558: stkey = SDO;
559: nextch += 2;
560: }
561: else stkey = SLET;
562: }
563: /* otherwise search for keyword */
564: else {
565: stkey = getkwd();
566: if(stkey==SGOTO && lastch>=nextch)
567: if(nextch[0]=='(')
568: stkey = SCOMPGOTO;
569: else if(isalpha(nextch[0]))
570: stkey = SASGOTO;
571: }
572: parlev = 0;
573: }
574:
575:
576:
577: LOCAL getkwd()
578: {
579: register char *i, *j;
580: register struct Keylist *pk, *pend;
581: int k;
582:
583: if(! isalpha(nextch[0]) )
584: return(SUNKNOWN);
585: k = nextch[0] - 'a';
586: if(pk = keystart[k])
587: for(pend = keyend[k] ; pk<=pend ; ++pk )
588: {
589: i = pk->keyname;
590: j = nextch;
591: while(*++i==*++j && *i!='\0')
592: ;
593: if(*i=='\0' && j<=lastch+1)
594: {
595: nextch = j;
596: if(no66flag && pk->notinf66)
597: errstr("Not a Fortran 66 keyword: %s",
598: pk->keyname);
599: return(pk->keyval);
600: }
601: }
602: return(SUNKNOWN);
603: }
604:
605:
606:
607: initkey()
608: {
609: extern struct Keylist keys[];
610: register struct Keylist *p;
611: register int i,j;
612:
613: for(i = 0 ; i<26 ; ++i)
614: keystart[i] = NULL;
615:
616: for(p = keys ; p->keyname ; ++p)
617: {
618: j = p->keyname[0] - 'a';
619: if(keystart[j] == NULL)
620: keystart[j] = p;
621: keyend[j] = p;
622: }
623: }
624:
625: LOCAL gettok()
626: {
627: int havdot, havexp, havdbl;
628: int radix, val;
629: extern struct Punctlist puncts[];
630: struct Punctlist *pp;
631: extern struct Fmtlist fmts[];
632: extern struct Dotlist dots[];
633: struct Dotlist *pd;
634:
635: char *i, *j, *n1, *p;
636:
637: if(*nextch == (MYQUOTE))
638: {
639: ++nextch;
640: p = token;
641: while(*nextch != MYQUOTE)
642: *p++ = *nextch++;
643: ++nextch;
644: toklen = p - token;
645: *p = '\0';
646: return (SHOLLERITH);
647: }
648: /*
649: if(stkey == SFORMAT)
650: {
651: for(pf = fmts; pf->fmtchar; ++pf)
652: {
653: if(*nextch == pf->fmtchar)
654: {
655: ++nextch;
656: if(pf->fmtval == SLPAR)
657: ++parlev;
658: else if(pf->fmtval == SRPAR)
659: --parlev;
660: return(pf->fmtval);
661: }
662: }
663: if( isdigit(*nextch) )
664: {
665: p = token;
666: *p++ = *nextch++;
667: while(nextch<=lastch && isdigit(*nextch) )
668: *p++ = *nextch++;
669: toklen = p - token;
670: *p = '\0';
671: if(nextch<=lastch && *nextch=='p')
672: {
673: ++nextch;
674: return(SSCALE);
675: }
676: else return(SICON);
677: }
678: if( isalpha(*nextch) )
679: {
680: p = token;
681: *p++ = *nextch++;
682: while(nextch<=lastch &&
683: (*nextch=='.' || isdigit(*nextch) || isalpha(*nextch) ))
684: *p++ = *nextch++;
685: toklen = p - token;
686: *p = '\0';
687: return(SFIELD);
688: }
689: goto badchar;
690: }
691: /* Not a format statement */
692:
693: if(needkwd)
694: {
695: needkwd = 0;
696: return( getkwd() );
697: }
698:
699: for(pp=puncts; pp->punchar; ++pp)
700: if(*nextch == pp->punchar)
701: {
702: if( (*nextch=='*' || *nextch=='/') &&
703: nextch<lastch && nextch[1]==nextch[0])
704: {
705: if(*nextch == '*')
706: val = SPOWER;
707: else val = SCONCAT;
708: nextch+=2;
709: }
710: else {
711: val = pp->punval;
712: if(val==SLPAR)
713: ++parlev;
714: else if(val==SRPAR)
715: --parlev;
716: ++nextch;
717: }
718: return(val);
719: }
720: if(*nextch == '.')
721: if(nextch >= lastch) goto badchar;
722: else if(isdigit(nextch[1])) goto numconst;
723: else {
724: for(pd=dots ; (j=pd->dotname) ; ++pd)
725: {
726: for(i=nextch+1 ; i<=lastch ; ++i)
727: if(*i != *j) break;
728: else if(*i != '.') ++j;
729: else {
730: nextch = i+1;
731: return(pd->dotval);
732: }
733: }
734: goto badchar;
735: }
736: if( isalpha(*nextch) )
737: {
738: p = token;
739: *p++ = *nextch++;
740: while(nextch<=lastch)
741: if( isalpha(*nextch) || isdigit(*nextch) )
742: *p++ = *nextch++;
743: else break;
744: toklen = p - token;
745: *p = '\0';
746: if(inioctl && nextch<=lastch && *nextch=='=')
747: {
748: ++nextch;
749: return(SNAMEEQ);
750: }
751: if(toklen>8 && eqn(8,token,"function") && isalpha(token[8]) &&
752: nextch<lastch && nextch[0]=='(' &&
753: (nextch[1]==')' | isalpha(nextch[1])) )
754: {
755: nextch -= (toklen - 8);
756: return(SFUNCTION);
757: }
758: if(toklen > VL)
759: {
760: char buff[30];
761: sprintf(buff, "name %s too long, truncated to %d",
762: token, VL);
763: err(buff);
764: toklen = VL;
765: token[VL] = '\0';
766: }
767: if(toklen==1 && *nextch==MYQUOTE)
768: {
769: switch(token[0])
770: {
771: case 'z': case 'Z':
772: case 'x': case 'X':
773: radix = 16; break;
774: case 'o': case 'O':
775: radix = 8; break;
776: case 'b': case 'B':
777: radix = 2; break;
778: default:
779: err("bad bit identifier");
780: return(SNAME);
781: }
782: ++nextch;
783: for(p = token ; *nextch!=MYQUOTE ; )
784: if( hextoi(*p++ = *nextch++) >= radix)
785: {
786: err("invalid binary character");
787: break;
788: }
789: ++nextch;
790: toklen = p - token;
791: return( radix==16 ? SHEXCON :
792: (radix==8 ? SOCTCON : SBITCON) );
793: }
794: return(SNAME);
795: }
796: if( ! isdigit(*nextch) ) goto badchar;
797: numconst:
798: havdot = NO;
799: havexp = NO;
800: havdbl = NO;
801: for(n1 = nextch ; nextch<=lastch ; ++nextch)
802: {
803: if(*nextch == '.')
804: if(havdot) break;
805: else if(nextch+2<=lastch && isalpha(nextch[1])
806: && isalpha(nextch[2]))
807: break;
808: else havdot = YES;
809: else if( !intonly && (*nextch=='d' || *nextch=='e') )
810: {
811: p = nextch;
812: havexp = YES;
813: if(*nextch == 'd')
814: havdbl = YES;
815: if(nextch<lastch)
816: if(nextch[1]=='+' || nextch[1]=='-')
817: ++nextch;
818: if( ! isdigit(*++nextch) )
819: {
820: nextch = p;
821: havdbl = havexp = NO;
822: break;
823: }
824: for(++nextch ;
825: nextch<=lastch && isdigit(*nextch);
826: ++nextch);
827: break;
828: }
829: else if( ! isdigit(*nextch) )
830: break;
831: }
832: p = token;
833: i = n1;
834: while(i < nextch)
835: *p++ = *i++;
836: toklen = p - token;
837: *p = '\0';
838: if(havdbl) return(SDCON);
839: if(havdot || havexp) return(SRCON);
840: return(SICON);
841: badchar:
842: s[0] = *nextch++;
843: return(SUNKNOWN);
844: }
845:
846: /* KEYWORD AND SPECIAL CHARACTER TABLES
847: */
848:
849: struct Punctlist puncts[ ] =
850: {
851: '(', SLPAR,
852: ')', SRPAR,
853: '=', SEQUALS,
854: ',', SCOMMA,
855: '+', SPLUS,
856: '-', SMINUS,
857: '*', SSTAR,
858: '/', SSLASH,
859: '$', SCURRENCY,
860: ':', SCOLON,
861: 0, 0 } ;
862:
863: /*
864: LOCAL struct Fmtlist fmts[ ] =
865: {
866: '(', SLPAR,
867: ')', SRPAR,
868: '/', SSLASH,
869: ',', SCOMMA,
870: '-', SMINUS,
871: ':', SCOLON,
872: 0, 0 } ;
873: */
874:
875: LOCAL struct Dotlist dots[ ] =
876: {
877: "and.", SAND,
878: "or.", SOR,
879: "not.", SNOT,
880: "true.", STRUE,
881: "false.", SFALSE,
882: "eq.", SEQ,
883: "ne.", SNE,
884: "lt.", SLT,
885: "le.", SLE,
886: "gt.", SGT,
887: "ge.", SGE,
888: "neqv.", SNEQV,
889: "eqv.", SEQV,
890: 0, 0 } ;
891:
892: LOCAL struct Keylist keys[ ] =
893: {
894: { "assign", SASSIGN },
895: { "automatic", SAUTOMATIC, YES },
896: { "backspace", SBACKSPACE },
897: { "blockdata", SBLOCK },
898: { "call", SCALL },
899: { "character", SCHARACTER, YES },
900: { "close", SCLOSE, YES },
901: { "common", SCOMMON },
902: { "complex", SCOMPLEX },
903: { "continue", SCONTINUE },
904: { "data", SDATA },
905: { "dimension", SDIMENSION },
906: { "doubleprecision", SDOUBLE },
907: { "doublecomplex", SDCOMPLEX, YES },
908: { "elseif", SELSEIF, YES },
909: { "else", SELSE, YES },
910: { "endfile", SENDFILE },
911: { "endif", SENDIF, YES },
912: { "end", SEND },
913: { "entry", SENTRY, YES },
914: { "equivalence", SEQUIV },
915: { "external", SEXTERNAL },
916: { "format", SFORMAT },
917: { "function", SFUNCTION },
918: { "goto", SGOTO },
919: { "implicit", SIMPLICIT, YES },
920: { "include", SINCLUDE, YES },
921: { "inquire", SINQUIRE, YES },
922: { "intrinsic", SINTRINSIC, YES },
923: { "integer", SINTEGER },
924: { "logical", SLOGICAL },
925: { "namelist", SNAMELIST, YES },
926: { "none", SUNDEFINED, YES },
927: { "open", SOPEN, YES },
928: { "parameter", SPARAM, YES },
929: { "pause", SPAUSE },
930: { "print", SPRINT },
931: { "program", SPROGRAM, YES },
932: { "punch", SPUNCH, YES },
933: { "read", SREAD },
934: { "real", SREAL },
935: { "return", SRETURN },
936: { "rewind", SREWIND },
937: { "save", SSAVE, YES },
938: { "static", SSTATIC, YES },
939: { "stop", SSTOP },
940: { "subroutine", SSUBROUTINE },
941: { "then", STHEN, YES },
942: { "undefined", SUNDEFINED, YES },
943: { "write", SWRITE },
944: { 0, 0 }
945: };
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.