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