Annotation of 42BSD/old/f77/misc.c, revision 1.1.1.1

1.1       root        1: #include "defs"
                      2: 
                      3: 
                      4: 
                      5: cpn(n, a, b)
                      6: register int n;
                      7: register char *a, *b;
                      8: {
                      9: while(--n >= 0)
                     10:        *b++ = *a++;
                     11: }
                     12: 
                     13: 
                     14: 
                     15: eqn(n, a, b)
                     16: register int n;
                     17: register char *a, *b;
                     18: {
                     19: while(--n >= 0)
                     20:        if(*a++ != *b++)
                     21:                return(NO);
                     22: return(YES);
                     23: }
                     24: 
                     25: 
                     26: 
                     27: 
                     28: 
                     29: 
                     30: 
                     31: cmpstr(a, b, la, lb)   /* compare two strings */
                     32: register char *a, *b;
                     33: ftnint la, lb;
                     34: {
                     35: register char *aend, *bend;
                     36: aend = a + la;
                     37: bend = b + lb;
                     38: 
                     39: 
                     40: if(la <= lb)
                     41:        {
                     42:        while(a < aend)
                     43:                if(*a != *b)
                     44:                        return( *a - *b );
                     45:                else
                     46:                        { ++a; ++b; }
                     47: 
                     48:        while(b < bend)
                     49:                if(*b != ' ')
                     50:                        return(' ' - *b);
                     51:                else
                     52:                        ++b;
                     53:        }
                     54: 
                     55: else
                     56:        {
                     57:        while(b < bend)
                     58:                if(*a != *b)
                     59:                        return( *a - *b );
                     60:                else
                     61:                        { ++a; ++b; }
                     62:        while(a < aend)
                     63:                if(*a != ' ')
                     64:                        return(*a - ' ');
                     65:                else
                     66:                        ++a;
                     67:        }
                     68: return(0);
                     69: }
                     70: 
                     71: 
                     72: 
                     73: 
                     74: 
                     75: chainp hookup(x,y)
                     76: register chainp x, y;
                     77: {
                     78: register chainp p;
                     79: 
                     80: if(x == NULL)
                     81:        return(y);
                     82: 
                     83: for(p = x ; p->nextp ; p = p->nextp)
                     84:        ;
                     85: p->nextp = y;
                     86: return(x);
                     87: }
                     88: 
                     89: 
                     90: 
                     91: struct Listblock *mklist(p)
                     92: chainp p;
                     93: {
                     94: register struct Listblock *q;
                     95: 
                     96: q = ALLOC(Listblock);
                     97: q->tag = TLIST;
                     98: q->listp = p;
                     99: return(q);
                    100: }
                    101: 
                    102: 
                    103: chainp mkchain(p,q)
                    104: register tagptr p;
                    105: register chainp q;
                    106: {
                    107: register chainp r;
                    108: 
                    109: if(chains)
                    110:        {
                    111:        r = chains;
                    112:        chains = chains->nextp;
                    113:        }
                    114: else
                    115:        r = ALLOC(Chain);
                    116: 
                    117: r->datap = p;
                    118: r->nextp = q;
                    119: return(r);
                    120: }
                    121: 
                    122: 
                    123: 
                    124: char * varstr(n, s)
                    125: register int n;
                    126: register char *s;
                    127: {
                    128: register int i;
                    129: static char name[XL+1];
                    130: 
                    131: for(i=0;  i<n && *s!=' ' && *s!='\0' ; ++i)
                    132:        name[i] = *s++;
                    133: 
                    134: name[i] = '\0';
                    135: 
                    136: return( name );
                    137: }
                    138: 
                    139: 
                    140: 
                    141: 
                    142: char * varunder(n, s)
                    143: register int n;
                    144: register char *s;
                    145: {
                    146: register int i;
                    147: static char name[XL+1];
                    148: 
                    149: for(i=0;  i<n && *s!=' ' && *s!='\0' ; ++i)
                    150:        name[i] = *s++;
                    151: 
                    152: #if TARGET != GCOS
                    153: name[i++] = '_';
                    154: #endif
                    155: 
                    156: name[i] = '\0';
                    157: 
                    158: return( name );
                    159: }
                    160: 
                    161: 
                    162: 
                    163: 
                    164: 
                    165: char * nounder(n, s)
                    166: register int n;
                    167: register char *s;
                    168: {
                    169: register int i;
                    170: static char name[XL+1];
                    171: 
                    172: for(i=0;  i<n && *s!=' ' && *s!='\0' ; ++s)
                    173:        if(*s != '_')
                    174:                name[i++] = *s;
                    175: 
                    176: name[i] = '\0';
                    177: 
                    178: return( name );
                    179: }
                    180: 
                    181: 
                    182: 
                    183: char *copyn(n, s)
                    184: register int n;
                    185: register char *s;
                    186: {
                    187: register char *p, *q;
                    188: 
                    189: p = q = (char *) ckalloc(n);
                    190: while(--n >= 0)
                    191:        *q++ = *s++;
                    192: return(p);
                    193: }
                    194: 
                    195: 
                    196: 
                    197: char *copys(s)
                    198: char *s;
                    199: {
                    200: return( copyn( strlen(s)+1 , s) );
                    201: }
                    202: 
                    203: 
                    204: 
                    205: ftnint convci(n, s)
                    206: register int n;
                    207: register char *s;
                    208: {
                    209: ftnint sum;
                    210: sum = 0;
                    211: while(n-- > 0)
                    212:        sum = 10*sum + (*s++ - '0');
                    213: return(sum);
                    214: }
                    215: 
                    216: char *convic(n)
                    217: ftnint n;
                    218: {
                    219: static char s[20];
                    220: register char *t;
                    221: 
                    222: s[19] = '\0';
                    223: t = s+19;
                    224: 
                    225: do     {
                    226:        *--t = '0' + n%10;
                    227:        n /= 10;
                    228:        } while(n > 0);
                    229: 
                    230: return(t);
                    231: }
                    232: 
                    233: 
                    234: 
                    235: double convcd(n, s)
                    236: int n;
                    237: register char *s;
                    238: {
                    239: double atof();
                    240: char v[100];
                    241: register char *t;
                    242: if(n > 90)
                    243:        {
                    244:        err("too many digits in floating constant");
                    245:        n = 90;
                    246:        }
                    247: for(t = v ; n-- > 0 ; s++)
                    248:        *t++ = (*s=='d' ? 'e' : *s);
                    249: *t = '\0';
                    250: return( atof(v) );
                    251: }
                    252: 
                    253: 
                    254: 
                    255: Namep mkname(l, s)
                    256: int l;
                    257: register char *s;
                    258: {
                    259: struct Hashentry *hp;
                    260: int hash;
                    261: register Namep q;
                    262: register int i;
                    263: char n[VL];
                    264: 
                    265: hash = 0;
                    266: for(i = 0 ; i<l && *s!='\0' ; ++i)
                    267:        {
                    268:        hash += *s;
                    269:        n[i] = *s++;
                    270:        }
                    271: hash %= maxhash;
                    272: while( i < VL )
                    273:        n[i++] = ' ';
                    274: 
                    275: hp = hashtab + hash;
                    276: while(q = hp->varp)
                    277:        if( hash==hp->hashval && eqn(VL,n,q->varname) )
                    278:                return(q);
                    279:        else if(++hp >= lasthash)
                    280:                hp = hashtab;
                    281: 
                    282: if(++nintnames >= maxhash-1)
                    283:        many("names", 'n');
                    284: hp->varp = q = ALLOC(Nameblock);
                    285: hp->hashval = hash;
                    286: q->tag = TNAME;
                    287: cpn(VL, n, q->varname);
                    288: return(q);
                    289: }
                    290: 
                    291: 
                    292: 
                    293: struct Labelblock *mklabel(l)
                    294: ftnint l;
                    295: {
                    296: register struct Labelblock *lp;
                    297: 
                    298: if(l <= 0)
                    299:        return(NULL);
                    300: 
                    301: for(lp = labeltab ; lp < highlabtab ; ++lp)
                    302:        if(lp->stateno == l)
                    303:                return(lp);
                    304: 
                    305: if(++highlabtab > labtabend)
                    306:        many("statement numbers", 's');
                    307: 
                    308: lp->stateno = l;
                    309: lp->labelno = newlabel();
                    310: lp->blklevel = 0;
                    311: lp->labused = NO;
                    312: lp->labdefined = NO;
                    313: lp->labinacc = NO;
                    314: lp->labtype = LABUNKNOWN;
                    315: return(lp);
                    316: }
                    317: 
                    318: 
                    319: newlabel()
                    320: {
                    321: return( ++lastlabno );
                    322: }
                    323: 
                    324: 
                    325: /* this label appears in a branch context */
                    326: 
                    327: struct Labelblock *execlab(stateno)
                    328: ftnint stateno;
                    329: {
                    330: register struct Labelblock *lp;
                    331: 
                    332: if(lp = mklabel(stateno))
                    333:        {
                    334:        if(lp->labinacc)
                    335:                warn1("illegal branch to inner block, statement %s",
                    336:                        convic(stateno) );
                    337:        else if(lp->labdefined == NO)
                    338:                lp->blklevel = blklevel;
                    339:        lp->labused = YES;
                    340:        if(lp->labtype == LABFORMAT)
                    341:                err("may not branch to a format");
                    342:        else
                    343:                lp->labtype = LABEXEC;
                    344:        }
                    345: else
                    346:        execerr("illegal label %s", convic(stateno));
                    347: 
                    348: return(lp);
                    349: }
                    350: 
                    351: 
                    352: 
                    353: 
                    354: 
                    355: /* find or put a name in the external symbol table */
                    356: 
                    357: struct Extsym *mkext(s)
                    358: char *s;
                    359: {
                    360: int i;
                    361: register char *t;
                    362: char n[XL];
                    363: struct Extsym *p;
                    364: 
                    365: i = 0;
                    366: t = n;
                    367: while(i<XL && *s)
                    368:        *t++ = *s++;
                    369: while(t < n+XL)
                    370:        *t++ = ' ';
                    371: 
                    372: for(p = extsymtab ; p<nextext ; ++p)
                    373:        if(eqn(XL, n, p->extname))
                    374:                return( p );
                    375: 
                    376: if(nextext >= lastext)
                    377:        many("external symbols", 'x');
                    378: 
                    379: cpn(XL, n, nextext->extname);
                    380: nextext->extstg = STGUNKNOWN;
                    381: nextext->extsave = NO;
                    382: nextext->extp = 0;
                    383: nextext->extleng = 0;
                    384: nextext->maxleng = 0;
                    385: nextext->extinit = NO;
                    386: return( nextext++ );
                    387: }
                    388: 
                    389: 
                    390: 
                    391: 
                    392: 
                    393: 
                    394: 
                    395: 
                    396: Addrp builtin(t, s)
                    397: int t;
                    398: char *s;
                    399: {
                    400: register struct Extsym *p;
                    401: register Addrp q;
                    402: 
                    403: p = mkext(s);
                    404: if(p->extstg == STGUNKNOWN)
                    405:        p->extstg = STGEXT;
                    406: else if(p->extstg != STGEXT)
                    407:        {
                    408:        errstr("improper use of builtin %s", s);
                    409:        return(0);
                    410:        }
                    411: 
                    412: q = ALLOC(Addrblock);
                    413: q->tag = TADDR;
                    414: q->vtype = t;
                    415: q->vclass = CLPROC;
                    416: q->vstg = STGEXT;
                    417: q->memno = p - extsymtab;
                    418: return(q);
                    419: }
                    420: 
                    421: 
                    422: 
                    423: frchain(p)
                    424: register chainp *p;
                    425: {
                    426: register chainp q;
                    427: 
                    428: if(p==0 || *p==0)
                    429:        return;
                    430: 
                    431: for(q = *p; q->nextp ; q = q->nextp)
                    432:        ;
                    433: q->nextp = chains;
                    434: chains = *p;
                    435: *p = 0;
                    436: }
                    437: 
                    438: 
                    439: tagptr cpblock(n,p)
                    440: register int n;
                    441: register char * p;
                    442: {
                    443: register char *q;
                    444: ptr q0;
                    445: 
                    446: q0 = ckalloc(n);
                    447: q = (char *) q0;
                    448: while(n-- > 0)
                    449:        *q++ = *p++;
                    450: return( (tagptr) q0);
                    451: }
                    452: 
                    453: 
                    454: 
                    455: max(a,b)
                    456: int a,b;
                    457: {
                    458: return( a>b ? a : b);
                    459: }
                    460: 
                    461: 
                    462: ftnint lmax(a, b)
                    463: ftnint a, b;
                    464: {
                    465: return( a>b ? a : b);
                    466: }
                    467: 
                    468: ftnint lmin(a, b)
                    469: ftnint a, b;
                    470: {
                    471: return(a < b ? a : b);
                    472: }
                    473: 
                    474: 
                    475: 
                    476: 
                    477: maxtype(t1, t2)
                    478: int t1, t2;
                    479: {
                    480: int t;
                    481: 
                    482: t = max(t1, t2);
                    483: if(t==TYCOMPLEX && (t1==TYDREAL || t2==TYDREAL) )
                    484:        t = TYDCOMPLEX;
                    485: return(t);
                    486: }
                    487: 
                    488: 
                    489: 
                    490: /* return log base 2 of n if n a power of 2; otherwise -1 */
                    491: #if FAMILY == PCC
                    492: log2(n)
                    493: ftnint n;
                    494: {
                    495: int k;
                    496: 
                    497: /* trick based on binary representation */
                    498: 
                    499: if(n<=0 || (n & (n-1))!=0)
                    500:        return(-1);
                    501: 
                    502: for(k = 0 ;  n >>= 1  ; ++k)
                    503:        ;
                    504: return(k);
                    505: }
                    506: #endif
                    507: 
                    508: 
                    509: 
                    510: frrpl()
                    511: {
                    512: struct Rplblock *rp;
                    513: 
                    514: while(rpllist)
                    515:        {
                    516:        rp = rpllist->rplnextp;
                    517:        free( (charptr) rpllist);
                    518:        rpllist = rp;
                    519:        }
                    520: }
                    521: 
                    522: 
                    523: 
                    524: expptr callk(type, name, args)
                    525: int type;
                    526: char *name;
                    527: chainp args;
                    528: {
                    529: register expptr p;
                    530: 
                    531: p = mkexpr(OPCALL, builtin(type,name), args);
                    532: p->exprblock.vtype = type;
                    533: return(p);
                    534: }
                    535: 
                    536: 
                    537: 
                    538: expptr call4(type, name, arg1, arg2, arg3, arg4)
                    539: int type;
                    540: char *name;
                    541: expptr arg1, arg2, arg3, arg4;
                    542: {
                    543: struct Listblock *args;
                    544: args = mklist( mkchain(arg1, mkchain(arg2, mkchain(arg3,
                    545:        mkchain(arg4, CHNULL)) ) ) );
                    546: return( callk(type, name, args) );
                    547: }
                    548: 
                    549: 
                    550: 
                    551: 
                    552: expptr call3(type, name, arg1, arg2, arg3)
                    553: int type;
                    554: char *name;
                    555: expptr arg1, arg2, arg3;
                    556: {
                    557: struct Listblock *args;
                    558: args = mklist( mkchain(arg1, mkchain(arg2, mkchain(arg3, CHNULL) ) ) );
                    559: return( callk(type, name, args) );
                    560: }
                    561: 
                    562: 
                    563: 
                    564: 
                    565: 
                    566: expptr call2(type, name, arg1, arg2)
                    567: int type;
                    568: char *name;
                    569: expptr arg1, arg2;
                    570: {
                    571: struct Listblock *args;
                    572: 
                    573: args = mklist( mkchain(arg1, mkchain(arg2, CHNULL) ) );
                    574: return( callk(type,name, args) );
                    575: }
                    576: 
                    577: 
                    578: 
                    579: 
                    580: expptr call1(type, name, arg)
                    581: int type;
                    582: char *name;
                    583: expptr arg;
                    584: {
                    585: return( callk(type,name, mklist(mkchain(arg,CHNULL)) ));
                    586: }
                    587: 
                    588: 
                    589: expptr call0(type, name)
                    590: int type;
                    591: char *name;
                    592: {
                    593: return( callk(type, name, PNULL) );
                    594: }
                    595: 
                    596: 
                    597: 
                    598: struct Impldoblock *mkiodo(dospec, list)
                    599: chainp dospec, list;
                    600: {
                    601: register struct Impldoblock *q;
                    602: 
                    603: q = ALLOC(Impldoblock);
                    604: q->tag = TIMPLDO;
                    605: q->impdospec = dospec;
                    606: q->datalist = list;
                    607: return(q);
                    608: }
                    609: 
                    610: 
                    611: 
                    612: 
                    613: ptr ckalloc(n)
                    614: register int n;
                    615: {
                    616: register ptr p;
                    617: ptr calloc();
                    618: 
                    619: if( p = calloc(1, (unsigned) n) )
                    620:        return(p);
                    621: 
                    622: fatal("out of memory");
                    623: /* NOTREACHED */
                    624: }
                    625: 
                    626: 
                    627: 
                    628: 
                    629: 
                    630: isaddr(p)
                    631: register expptr p;
                    632: {
                    633: if(p->tag == TADDR)
                    634:        return(YES);
                    635: if(p->tag == TEXPR)
                    636:        switch(p->exprblock.opcode)
                    637:                {
                    638:                case OPCOMMA:
                    639:                        return( isaddr(p->exprblock.rightp) );
                    640: 
                    641:                case OPASSIGN:
                    642:                case OPPLUSEQ:
                    643:                        return( isaddr(p->exprblock.leftp) );
                    644:                }
                    645: return(NO);
                    646: }
                    647: 
                    648: 
                    649: 
                    650: 
                    651: isstatic(p)
                    652: register expptr p;
                    653: {
                    654: if(p->headblock.vleng && !ISCONST(p->headblock.vleng))
                    655:        return(NO);
                    656: 
                    657: switch(p->tag)
                    658:        {
                    659:        case TCONST:
                    660:                return(YES);
                    661: 
                    662:        case TADDR:
                    663:                if(ONEOF(p->addrblock.vstg,MSKSTATIC) &&
                    664:                   ISCONST(p->addrblock.memoffset))
                    665:                        return(YES);
                    666: 
                    667:        default:
                    668:                return(NO);
                    669:        }
                    670: }
                    671:                
                    672: 
                    673: 
                    674: addressable(p)
                    675: register expptr p;
                    676: {
                    677: switch(p->tag)
                    678:        {
                    679:        case TCONST:
                    680:                return(YES);
                    681: 
                    682:        case TADDR:
                    683:                return( addressable(p->addrblock.memoffset) );
                    684: 
                    685:        default:
                    686:                return(NO);
                    687:        }
                    688: }
                    689: 
                    690: 
                    691: 
                    692: hextoi(c)
                    693: register int c;
                    694: {
                    695: register char *p;
                    696: static char p0[17] = "0123456789abcdef";
                    697: 
                    698: for(p = p0 ; *p ; ++p)
                    699:        if(*p == c)
                    700:                return( p-p0 );
                    701: return(16);
                    702: }

unix.superglobalmegacorp.com

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