Annotation of 42BSD/usr.bin/f77/src/f77pass1/conv.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.