|
|
1.1 root 1:
2: #include "defs.h"
3: #include "conv.h"
4:
5: int badvalue;
6:
7:
8: /* The following constants are used to check the limits of */
9: /* conversions. Dmaxword is the largest double precision */
10: /* number which can be converted to a two-byte integer */
11: /* without overflow. Dminword is the smallest double */
12: /* precision value which can be converted to a two-byte */
13: /* integer without overflow. Dmaxint and dminint are the */
14: /* analogous values for four-byte integers. */
15:
16:
17: LOCAL long dmaxword[] = { 0xfeff47ff, 0xffffffff };
18: LOCAL long dminword[] = { 0x00ffc800, 0xffffffff };
19:
20: LOCAL long dmaxint[] = { 0xffff4fff, 0xfffffeff };
21: LOCAL long dminint[] = { 0x0000d000, 0xffff00ff };
22:
23: LOCAL long dmaxreal[] = { 0xffff7fff, 0xffff7fff };
24: LOCAL long dminreal[] = { 0x0000f800, 0xffffffff };
25:
26:
27:
28: /* The routines which follow are used to convert */
29: /* constants into constants of other types. */
30:
31: LOCAL char *
32: grabbits(len, cp)
33: int len;
34: Constp cp;
35: {
36:
37: static char *toobig = "bit value too large";
38:
39: register char *p;
40: register char *bits;
41: register int i;
42: register int k;
43: register int lenb;
44:
45: bits = cp->const.ccp;
46: lenb = cp->vleng->constblock.const.ci;
47:
48: p = (char *) ckalloc(len);
49:
50: if (len >= lenb)
51: k = lenb;
52: else
53: {
54: k = len;
55: if ( badvalue == 0 )
56: {
57: #if (TARGET == PDP11 || TARGET == VAX)
58: i = len;
59: while ( i < lenb && bits[i] == 0 )
60: i++;
61: if (i < lenb)
62: badvalue = 1;
63: #else
64: i = lenb - len - 1;
65: while ( i >= 0 && bits[i] == 0)
66: i--;
67: if (i >= 0)
68: badvalue = 1;
69: #endif
70: if (badvalue)
71: warn(toobig);
72: }
73: }
74:
75: #if (TARGET == PDP11 || TARGET == VAX)
76: i = 0;
77: while (i < k)
78: {
79: p[i] = bits[i];
80: i++;
81: }
82: #else
83: i = lenb;
84: while (k > 0)
85: p[--k] = bits[--i];
86: #endif
87:
88: return (p);
89: }
90:
91:
92:
93: LOCAL char *
94: grabbytes(len, cp)
95: int len;
96: Constp cp;
97: {
98: register char *p;
99: register char *bytes;
100: register int i;
101: register int k;
102: register int lenb;
103:
104: bytes = cp->const.ccp;
105: lenb = cp->vleng->constblock.const.ci;
106:
107: p = (char *) ckalloc(len);
108:
109: if (len >= lenb)
110: k = lenb;
111: else
112: k = len;
113:
114: i = 0;
115: while (i < k)
116: {
117: p[i] = bytes[i];
118: i++;
119: }
120:
121: while (i < len)
122: p[i++] = BLANK;
123:
124: return (p);
125: }
126:
127:
128:
129: LOCAL expptr
130: cshort(cp)
131: Constp cp;
132: {
133: static char *toobig = "data value too large";
134: static char *reserved = "reserved operand assigned to an integer";
135: static char *compat1 = "logical datum assigned to an integer variable";
136: static char *compat2 = "character datum assigned to an integer variable";
137:
138: register expptr p;
139: register short *shortp;
140: register ftnint value;
141: register long *rp;
142: register double *minp;
143: register double *maxp;
144: realvalue x;
145:
146: switch (cp->vtype)
147: {
148: case TYBITSTR:
149: shortp = (short *) grabbits(2, cp);
150: p = (expptr) mkconst(TYSHORT);
151: p->constblock.const.ci = *shortp;
152: free((char *) shortp);
153: break;
154:
155: case TYSHORT:
156: p = (expptr) cpexpr(cp);
157: break;
158:
159: case TYLONG:
160: value = cp->const.ci;
161: if (value >= MINWORD && value <= MAXWORD)
162: {
163: p = (expptr) mkconst(TYSHORT);
164: p->constblock.const.ci = value;
165: }
166: else
167: {
168: if (badvalue <= 1)
169: {
170: badvalue = 2;
171: err(toobig);
172: }
173: p = errnode();
174: }
175: break;
176:
177: case TYREAL:
178: case TYDREAL:
179: case TYCOMPLEX:
180: case TYDCOMPLEX:
181: minp = (double *) dminword;
182: maxp = (double *) dmaxword;
183: rp = (long *) &(cp->const.cd[0]);
184: x.q.word1 = rp[0];
185: x.q.word2 = rp[1];
186: if (x.f.sign == 1 && x.f.exp == 0)
187: {
188: if (badvalue <= 1)
189: {
190: badvalue = 2;
191: err(reserved);
192: }
193: p = errnode();
194: }
195: else if (x.d >= *minp && x.d <= *maxp)
196: {
197: p = (expptr) mkconst(TYSHORT);
198: p->constblock.const.ci = x.d;
199: }
200: else
201: {
202: if (badvalue <= 1)
203: {
204: badvalue = 2;
205: err(toobig);
206: }
207: p = errnode();
208: }
209: break;
210:
211: case TYLOGICAL:
212: if (badvalue <= 1)
213: {
214: badvalue = 2;
215: err(compat1);
216: }
217: p = errnode();
218: break;
219:
220: case TYCHAR:
221: if ( !ftn66flag && badvalue == 0 )
222: {
223: badvalue = 1;
224: warn(compat2);
225: }
226:
227: case TYHOLLERITH:
228: shortp = (short *) grabbytes(2, cp);
229: p = (expptr) mkconst(TYSHORT);
230: p->constblock.const.ci = *shortp;
231: free((char *) shortp);
232: break;
233:
234: case TYERROR:
235: p = errnode();
236: break;
237: }
238:
239: return (p);
240: }
241:
242:
243:
244: LOCAL expptr
245: clong(cp)
246: Constp cp;
247: {
248: static char *toobig = "data value too large";
249: static char *reserved = "reserved operand assigned to an integer";
250: static char *compat1 = "logical datum assigned to an integer variable";
251: static char *compat2 = "character datum assigned to an integer variable";
252:
253: register expptr p;
254: register ftnint *longp;
255: register long *rp;
256: register double *minp;
257: register double *maxp;
258: realvalue x;
259:
260: switch (cp->vtype)
261: {
262: case TYBITSTR:
263: longp = (ftnint *) grabbits(4, cp);
264: p = (expptr) mkconst(TYLONG);
265: p->constblock.const.ci = *longp;
266: free((char *) longp);
267: break;
268:
269: case TYSHORT:
270: p = (expptr) mkconst(TYLONG);
271: p->constblock.const.ci = cp->const.ci;
272: break;
273:
274: case TYLONG:
275: p = (expptr) cpexpr(cp);
276: break;
277:
278: case TYREAL:
279: case TYDREAL:
280: case TYCOMPLEX:
281: case TYDCOMPLEX:
282: minp = (double *) dminint;
283: maxp = (double *) dmaxint;
284: rp = (long *) &(cp->const.cd[0]);
285: x.q.word1 = rp[0];
286: x.q.word2 = rp[1];
287: if (x.f.sign == 1 && x.f.exp == 0)
288: {
289: if (badvalue <= 1)
290: {
291: badvalue = 2;
292: err(reserved);
293: }
294: p = errnode();
295: }
296: else if (x.d >= *minp && x.d <= *maxp)
297: {
298: p = (expptr) mkconst(TYLONG);
299: p->constblock.const.ci = x.d;
300: }
301: else
302: {
303: if (badvalue <= 1)
304: {
305: badvalue = 2;
306: err(toobig);
307: }
308: p = errnode();
309: }
310: break;
311:
312: case TYLOGICAL:
313: if (badvalue <= 1)
314: {
315: badvalue = 2;
316: err(compat1);
317: }
318: p = errnode();
319: break;
320:
321: case TYCHAR:
322: if ( !ftn66flag && badvalue == 0 )
323: {
324: badvalue = 1;
325: warn(compat2);
326: }
327:
328: case TYHOLLERITH:
329: longp = (ftnint *) grabbytes(4, cp);
330: p = (expptr) mkconst(TYLONG);
331: p->constblock.const.ci = *longp;
332: free((char *) longp);
333: break;
334:
335: case TYERROR:
336: p = errnode();
337: break;
338: }
339:
340: return (p);
341: }
342:
343:
344:
345: LOCAL expptr
346: creal(cp)
347: Constp cp;
348: {
349: static char *toobig = "data value too large";
350: static char *compat1 = "logical datum assigned to a real variable";
351: static char *compat2 = "character datum assigned to a real variable";
352:
353: register expptr p;
354: register long *longp;
355: register long *rp;
356: register double *minp;
357: register double *maxp;
358: realvalue x;
359: float y;
360:
361: switch (cp->vtype)
362: {
363: case TYBITSTR:
364: longp = (long *) grabbits(4, cp);
365: p = (expptr) mkconst(TYREAL);
366: rp = (long *) &(p->constblock.const.cd[0]);
367: rp[0] = *longp;
368: free((char *) longp);
369: break;
370:
371: case TYSHORT:
372: case TYLONG:
373: p = (expptr) mkconst(TYREAL);
374: p->constblock.const.cd[0] = cp->const.ci;
375: break;
376:
377: case TYREAL:
378: case TYDREAL:
379: case TYCOMPLEX:
380: case TYDCOMPLEX:
381: minp = (double *) dminreal;
382: maxp = (double *) dmaxreal;
383: rp = (long *) &(cp->const.cd[0]);
384: x.q.word1 = rp[0];
385: x.q.word2 = rp[1];
386: if (x.f.sign == 1 && x.f.exp == 0)
387: {
388: p = (expptr) mkconst(TYREAL);
389: rp = (long *) &(p->constblock.const.cd[0]);
390: rp[0] = x.q.word1;
391: }
392: else if (x.d >= *minp && x.d <= *maxp)
393: {
394: p = (expptr) mkconst(TYREAL);
395: y = x.d;
396: p->constblock.const.cd[0] = y;
397: }
398: else
399: {
400: if (badvalue <= 1)
401: {
402: badvalue = 2;
403: err(toobig);
404: }
405: p = errnode();
406: }
407: break;
408:
409: case TYLOGICAL:
410: if (badvalue <= 1)
411: {
412: badvalue = 2;
413: err(compat1);
414: }
415: p = errnode();
416: break;
417:
418: case TYCHAR:
419: if ( !ftn66flag && badvalue == 0)
420: {
421: badvalue = 1;
422: warn(compat2);
423: }
424:
425: case TYHOLLERITH:
426: longp = (long *) grabbytes(4, cp);
427: p = (expptr) mkconst(TYREAL);
428: rp = (long *) &(p->constblock.const.cd[0]);
429: rp[0] = *longp;
430: free((char *) longp);
431: break;
432:
433: case TYERROR:
434: p = errnode();
435: break;
436: }
437:
438: return (p);
439: }
440:
441:
442:
443: LOCAL expptr
444: cdreal(cp)
445: Constp cp;
446: {
447: static char *compat1 =
448: "logical datum assigned to a double precision variable";
449: static char *compat2 =
450: "character datum assigned to a double precision variable";
451:
452: register expptr p;
453: register long *longp;
454: register long *rp;
455:
456: switch (cp->vtype)
457: {
458: case TYBITSTR:
459: longp = (long *) grabbits(8, cp);
460: p = (expptr) mkconst(TYDREAL);
461: rp = (long *) &(p->constblock.const.cd[0]);
462: rp[0] = longp[0];
463: rp[1] = longp[1];
464: free((char *) longp);
465: break;
466:
467: case TYSHORT:
468: case TYLONG:
469: p = (expptr) mkconst(TYDREAL);
470: p->constblock.const.cd[0] = cp->const.ci;
471: break;
472:
473: case TYREAL:
474: case TYDREAL:
475: case TYCOMPLEX:
476: case TYDCOMPLEX:
477: p = (expptr) mkconst(TYDREAL);
478: longp = (long *) &(cp->const.cd[0]);
479: rp = (long *) &(p->constblock.const.cd[0]);
480: rp[0] = longp[0];
481: rp[1] = longp[1];
482: break;
483:
484: case TYLOGICAL:
485: if (badvalue <= 1)
486: {
487: badvalue = 2;
488: err(compat1);
489: }
490: p = errnode();
491: break;
492:
493: case TYCHAR:
494: if ( !ftn66flag && badvalue == 0 )
495: {
496: badvalue = 1;
497: warn(compat2);
498: }
499:
500: case TYHOLLERITH:
501: longp = (long *) grabbytes(8, cp);
502: p = (expptr) mkconst(TYDREAL);
503: rp = (long *) &(p->constblock.const.cd[0]);
504: rp[0] = longp[0];
505: rp[1] = longp[1];
506: free((char *) longp);
507: break;
508:
509: case TYERROR:
510: p = errnode();
511: break;
512: }
513:
514: return (p);
515: }
516:
517:
518:
519: LOCAL expptr
520: ccomplex(cp)
521: Constp cp;
522: {
523: static char *toobig = "data value too large";
524: static char *compat1 = "logical datum assigned to a complex variable";
525: static char *compat2 = "character datum assigned to a complex variable";
526:
527: register expptr p;
528: register long *longp;
529: register long *rp;
530: register double *minp;
531: register double *maxp;
532: realvalue re, im;
533: int overflow;
534: float x;
535:
536: switch (cp->vtype)
537: {
538: case TYBITSTR:
539: longp = (long *) grabbits(8, cp);
540: p = (expptr) mkconst(TYCOMPLEX);
541: rp = (long *) &(p->constblock.const.cd[0]);
542: rp[0] = longp[0];
543: rp[2] = longp[1];
544: free((char *) longp);
545: break;
546:
547: case TYSHORT:
548: case TYLONG:
549: p = (expptr) mkconst(TYCOMPLEX);
550: p->constblock.const.cd[0] = cp->const.ci;
551: break;
552:
553: case TYREAL:
554: case TYDREAL:
555: case TYCOMPLEX:
556: case TYDCOMPLEX:
557: overflow = 0;
558: minp = (double *) dminreal;
559: maxp = (double *) dmaxreal;
560: rp = (long *) &(cp->const.cd[0]);
561: re.q.word1 = rp[0];
562: re.q.word2 = rp[1];
563: im.q.word1 = rp[2];
564: im.q.word2 = rp[3];
565: if (((re.f.sign == 0 || re.f.exp != 0) &&
566: (re.d < *minp || re.d > *maxp)) ||
567: ((im.f.sign == 0 || re.f.exp != 0) &&
568: (im.d < *minp || re.d > *maxp)))
569: {
570: if (badvalue <= 1)
571: {
572: badvalue = 2;
573: err(toobig);
574: }
575: p = errnode();
576: }
577: else
578: {
579: p = (expptr) mkconst(TYCOMPLEX);
580: if (re.f.sign == 1 && re.f.exp == 0)
581: re.q.word2 = 0;
582: else
583: {
584: x = re.d;
585: re.d = x;
586: }
587: if (im.f.sign == 1 && im.f.exp == 0)
588: im.q.word2 = 0;
589: else
590: {
591: x = im.d;
592: im.d = x;
593: }
594: rp = (long *) &(p->constblock.const.cd[0]);
595: rp[0] = re.q.word1;
596: rp[1] = re.q.word2;
597: rp[2] = im.q.word1;
598: rp[3] = im.q.word2;
599: }
600: break;
601:
602: case TYLOGICAL:
603: if (badvalue <= 1)
604: {
605: badvalue = 2;
606: err(compat1);
607: }
608: break;
609:
610: case TYCHAR:
611: if ( !ftn66flag && badvalue == 0)
612: {
613: badvalue = 1;
614: warn(compat2);
615: }
616:
617: case TYHOLLERITH:
618: longp = (long *) grabbytes(8, cp);
619: p = (expptr) mkconst(TYCOMPLEX);
620: rp = (long *) &(p->constblock.const.cd[0]);
621: rp[0] = longp[0];
622: rp[2] = longp[1];
623: free((char *) longp);
624: break;
625:
626: case TYERROR:
627: p = errnode();
628: break;
629: }
630:
631: return (p);
632: }
633:
634:
635:
636: LOCAL expptr
637: cdcomplex(cp)
638: Constp cp;
639: {
640: static char *compat1 = "logical datum assigned to a complex variable";
641: static char *compat2 = "character datum assigned to a complex variable";
642:
643: register expptr p;
644: register long *longp;
645: register long *rp;
646:
647: switch (cp->vtype)
648: {
649: case TYBITSTR:
650: longp = (long *) grabbits(16, cp);
651: p = (expptr) mkconst(TYDCOMPLEX);
652: rp = (long *) &(p->constblock.const.cd[0]);
653: rp[0] = longp[0];
654: rp[1] = longp[1];
655: rp[2] = longp[2];
656: rp[3] = longp[3];
657: free((char *) longp);
658: break;
659:
660: case TYSHORT:
661: case TYLONG:
662: p = (expptr) mkconst(TYDCOMPLEX);
663: p->constblock.const.cd[0] = cp->const.ci;
664: break;
665:
666: case TYREAL:
667: case TYDREAL:
668: case TYCOMPLEX:
669: case TYDCOMPLEX:
670: p = (expptr) mkconst(TYDCOMPLEX);
671: longp = (long *) &(cp->const.cd[0]);
672: rp = (long *) &(p->constblock.const.cd[0]);
673: rp[0] = longp[0];
674: rp[1] = longp[1];
675: rp[2] = longp[2];
676: rp[3] = longp[3];
677: break;
678:
679: case TYLOGICAL:
680: if (badvalue <= 1)
681: {
682: badvalue = 2;
683: err(compat1);
684: }
685: p = errnode();
686: break;
687:
688: case TYCHAR:
689: if ( !ftn66flag && badvalue == 0 )
690: {
691: badvalue = 1;
692: warn(compat2);
693: }
694:
695: case TYHOLLERITH:
696: longp = (long *) grabbytes(16, cp);
697: p = (expptr) mkconst(TYDCOMPLEX);
698: rp = (long *) &(p->constblock.const.cd[0]);
699: rp[0] = longp[0];
700: rp[1] = longp[1];
701: rp[2] = longp[2];
702: rp[3] = longp[3];
703: free((char *) longp);
704: break;
705:
706: case TYERROR:
707: p = errnode();
708: break;
709: }
710:
711: return (p);
712: }
713:
714:
715:
716: LOCAL expptr
717: clogical(cp)
718: Constp cp;
719: {
720: static char *compat1 = "numeric datum assigned to a logical variable";
721: static char *compat2 = "character datum assigned to a logical variable";
722:
723: register expptr p;
724: register long *longp;
725: register short *shortp;
726: register int size;
727:
728: size = typesize[tylogical];
729:
730: switch (cp->vtype)
731: {
732: case TYBITSTR:
733: p = (expptr) mkconst(tylogical);
734: if (tylogical == TYSHORT)
735: {
736: shortp = (short *) grabbits(size, cp);
737: p->constblock.const.ci = (int) *shortp;
738: free((char *) shortp);
739: }
740: else
741: {
742: longp = (long *) grabbits(size, cp);
743: p->constblock.const.ci = *longp;
744: free((char *) longp);
745: }
746: break;
747:
748: case TYSHORT:
749: case TYLONG:
750: case TYREAL:
751: case TYDREAL:
752: case TYCOMPLEX:
753: case TYDCOMPLEX:
754: if (badvalue <= 1)
755: {
756: badvalue = 2;
757: err(compat1);
758: }
759: p = errnode();
760: break;
761:
762: case TYLOGICAL:
763: p = (expptr) cpexpr(cp);
764: p->constblock.vtype = tylogical;
765: break;
766:
767: case TYCHAR:
768: if ( !ftn66flag && badvalue == 0 )
769: {
770: badvalue = 1;
771: warn(compat2);
772: }
773:
774: case TYHOLLERITH:
775: p = (expptr) mkconst(tylogical);
776: if (tylogical == TYSHORT)
777: {
778: shortp = (short *) grabbytes(size, cp);
779: p->constblock.const.ci = (int) *shortp;
780: free((char *) shortp);
781: }
782: else
783: {
784: longp = (long *) grabbytes(4, cp);
785: p->constblock.const.ci = *longp;
786: free((char *) longp);
787: }
788: break;
789:
790: case TYERROR:
791: p = errnode();
792: break;
793: }
794:
795: return (p);
796: }
797:
798:
799:
800: LOCAL expptr
801: cchar(len, cp)
802: int len;
803: Constp cp;
804: {
805: static char *compat1 = "numeric datum assigned to a character variable";
806: static char *compat2 = "logical datum assigned to a character variable";
807:
808: register expptr p;
809: register char *value;
810:
811: switch (cp->vtype)
812: {
813: case TYBITSTR:
814: value = grabbits(len, cp);
815: p = (expptr) mkstrcon(len, value);
816: free(value);
817: break;
818:
819: case TYSHORT:
820: case TYLONG:
821: case TYREAL:
822: case TYDREAL:
823: case TYCOMPLEX:
824: case TYDCOMPLEX:
825: if (badvalue <= 1)
826: {
827: badvalue = 2;
828: err(compat1);
829: }
830: p = errnode();
831: break;
832:
833: case TYLOGICAL:
834: if (badvalue <= 1)
835: {
836: badvalue = 2;
837: err(compat2);
838: }
839: p = errnode();
840: break;
841:
842: case TYCHAR:
843: case TYHOLLERITH:
844: value = grabbytes(len, cp);
845: p = (expptr) mkstrcon(len, value);
846: free(value);
847: break;
848:
849: case TYERROR:
850: p = errnode();
851: break;
852: }
853:
854: return (p);
855: }
856:
857:
858:
859: expptr
860: convconst(type, len, const)
861: int type;
862: int len;
863: Constp const;
864: {
865: register expptr p;
866:
867: switch (type)
868: {
869: case TYSHORT:
870: p = cshort(const);
871: break;
872:
873: case TYLONG:
874: p = clong(const);
875: break;
876:
877: case TYREAL:
878: p = creal(const);
879: break;
880:
881: case TYDREAL:
882: p = cdreal(const);
883: break;
884:
885: case TYCOMPLEX:
886: p = ccomplex(const);
887: break;
888:
889: case TYDCOMPLEX:
890: p = cdcomplex(const);
891: break;
892:
893: case TYLOGICAL:
894: p = clogical(const);
895: break;
896:
897: case TYCHAR:
898: p = cchar(len, const);
899: break;
900:
901: case TYERROR:
902: case TYUNKNOWN:
903: p = errnode();
904: break;
905:
906: default:
907: badtype("convconst", type);
908: }
909:
910: return (p);
911: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.