📄 misc.c
字号:
#include "defs"cpn(n, a, b)register int n;register char *a, *b;{while(--n >= 0) *b++ = *a++;}eqn(n, a, b)register int n;register char *a, *b;{while(--n >= 0) if(*a++ != *b++) return(NO);return(YES);}cmpstr(a, b, la, lb) /* compare two strings */register char *a, *b;ftnint la, lb;{register char *aend, *bend;aend = a + la;bend = b + lb;if(la <= lb) { while(a < aend) if(*a != *b) return( *a - *b ); else { ++a; ++b; } while(b < bend) if(*b != ' ') return(' ' - *b); else ++b; }else { while(b < bend) if(*a != *b) return( *a - *b ); else { ++a; ++b; } while(a < aend) if(*a != ' ') return(*a - ' '); else ++a; }return(0);}chainp hookup(x,y)register chainp x, y;{register chainp p;if(x == NULL) return(y);for(p = x ; p->nextp ; p = p->nextp) ;p->nextp = y;return(x);}struct listblock *mklist(p)chainp p;{register struct listblock *q;q = ALLOC(listblock);q->tag = TLIST;q->listp = p;return(q);}chainp mkchain(p,q)register int p, q;{register chainp r;if(chains) { r = chains; chains = chains->nextp; }else r = ALLOC(chain);r->datap = p;r->nextp = q;return(r);}char * varstr(n, s)register int n;register char *s;{register int i;static char name[XL+1];for(i=0; i<n && *s!=' ' && *s!='\0' ; ++i) name[i] = *s++;name[i] = '\0';return( name );}char * varunder(n, s)register int n;register char *s;{register int i;static char name[XL+1];for(i=0; i<n && *s!=' ' && *s!='\0' ; ++i) name[i] = *s++;#if TARGET != GCOSname[i++] = '_';#endifname[i] = '\0';return( name );}char * nounder(n, s)register int n;register char *s;{register int i;static char name[XL+1];for(i=0; i<n && *s!=' ' && *s!='\0' ; ++s) if(*s != '_') name[i++] = *s;name[i] = '\0';return( name );}char *copyn(n, s)register int n;register char *s;{register char *p, *q;p = q = ckalloc(n);while(--n >= 0) *q++ = *s++;return(p);}char *copys(s)char *s;{return( copyn( strlen(s)+1 , s) );}ftnint convci(n, s)register int n;register char *s;{ftnint sum;sum = 0;while(n-- > 0) sum = 10*sum + (*s++ - '0');return(sum);}char *convic(n)ftnint n;{static char s[20];register char *t;s[19] = '\0';t = s+19;do { *--t = '0' + n%10; n /= 10; } while(n > 0);return(t);}double convcd(n, s)int n;register char *s;{double atof();char v[100];register char *t;if(n > 90) { err("too many digits in floating constant"); n = 90; }for(t = v ; n-- > 0 ; s++) *t++ = (*s=='d' ? 'e' : *s);*t = '\0';return( atof(v) );}struct nameblock *mkname(l, s)int l;register char *s;{struct hashentry *hp;int hash;register struct nameblock *q;register int i;char n[VL];hash = 0;for(i = 0 ; i<l && *s!='\0' ; ++i) { hash += *s; n[i] = *s++; }hash %= MAXHASH;while( i < VL ) n[i++] = ' ';hp = hashtab + hash;while(q = hp->varp) if( hash==hp->hashval && eqn(VL,n,q->varname) ) return(q); else if(++hp >= lasthash) hp = hashtab;if(++nintnames >= MAXHASH-1) fatal("hash table full");hp->varp = q = ALLOC(nameblock);hp->hashval = hash;q->tag = TNAME;cpn(VL, n, q->varname);return(q);}struct labelblock *mklabel(l)ftnint l;{register struct labelblock *lp;if(l == 0) return(0);for(lp = labeltab ; lp < highlabtab ; ++lp) if(lp->stateno == l) return(lp);if(++highlabtab >= labtabend) fatal("too many statement numbers");lp->stateno = l;lp->labelno = newlabel();lp->blklevel = 0;lp->labused = NO;lp->labdefined = NO;lp->labinacc = NO;lp->labtype = LABUNKNOWN;return(lp);}newlabel(){return( ++lastlabno );}/* find or put a name in the external symbol table */struct extsym *mkext(s)char *s;{int i;register char *t;char n[XL];struct extsym *p;i = 0;t = n;while(i<XL && *s) *t++ = *s++;while(t < n+XL) *t++ = ' ';for(p = extsymtab ; p<nextext ; ++p) if(eqn(XL, n, p->extname)) return( p );if(nextext >= lastext) fatal("too many external symbols");cpn(XL, n, nextext->extname);nextext->extstg = STGUNKNOWN;nextext->extsave = NO;nextext->extp = 0;nextext->extleng = 0;nextext->maxleng = 0;nextext->extinit = NO;return( nextext++ );}struct addrblock *builtin(t, s)int t;char *s;{register struct extsym *p;register struct addrblock *q;p = mkext(s);if(p->extstg == STGUNKNOWN) p->extstg = STGEXT;else if(p->extstg != STGEXT) { err1("improper use of builtin %s", s); return(0); }q = ALLOC(addrblock);q->tag = TADDR;q->vtype = t;q->vclass = CLPROC;q->vstg = STGEXT;q->memno = p - extsymtab;return(q);}frchain(p)register chainp *p;{register chainp q;if(p==0 || *p==0) return;for(q = *p; q->nextp ; q = q->nextp) ;q->nextp = chains;chains = *p;*p = 0;}ptr cpblock(n,p)register int n;register char * p;{register char *q;ptr q0;q = q0 = ckalloc(n);while(n-- > 0) *q++ = *p++;return(q0);}max(a,b)int a,b;{return( a>b ? a : b);}ftnint lmax(a, b)ftnint a, b;{return( a>b ? a : b);}ftnint lmin(a, b)ftnint a, b;{return(a < b ? a : b);}maxtype(t1, t2)int t1, t2;{int t;t = max(t1, t2);if(t==TYCOMPLEX && (t1==TYDREAL || t2==TYDREAL) ) t = TYDCOMPLEX;return(t);}/* return log base 2 of n if n a power of 2; otherwise -1 */#if FAMILY == SCJlog2(n)ftnint n;{int k;/* trick based on binary representation */if(n<=0 || (n & (n-1))!=0) return(-1);for(k = 0 ; n >>= 1 ; ++k) ;return(k);}#endiffrrpl(){struct rplblock *rp;while(rpllist) { rp = rpllist->nextp; free(rpllist); rpllist = rp; }}popstack(p)register chainp *p;{register chainp q;if(p==NULL || *p==NULL) fatal("popstack: stack empty");q = (*p)->nextp;free(*p);*p = q;}struct exprblock *callk(type, name, args)int type;char *name;chainp args;{register struct exprblock *p;p = mkexpr(OPCALL, builtin(type,name), args);p->vtype = type;return(p);}struct exprblock *call4(type, name, arg1, arg2, arg3, arg4)int type;char *name;expptr arg1, arg2, arg3, arg4;{struct listblock *args;args = mklist( mkchain(arg1, mkchain(arg2, mkchain(arg3, mkchain(arg4, NULL)) ) ) );return( callk(type, name, args) );}struct exprblock *call3(type, name, arg1, arg2, arg3)int type;char *name;expptr arg1, arg2, arg3;{struct listblock *args;args = mklist( mkchain(arg1, mkchain(arg2, mkchain(arg3, NULL) ) ) );return( callk(type, name, args) );}struct exprblock *call2(type, name, arg1, arg2)int type;char *name;expptr arg1, arg2;{struct listblock *args;args = mklist( mkchain(arg1, mkchain(arg2, NULL) ) );return( callk(type,name, args) );}struct exprblock *call1(type, name, arg)int type;char *name;expptr arg;{return( callk(type,name, mklist(mkchain(arg,0)) ));}struct exprblock *call0(type, name)int type;char *name;{return( callk(type, name, NULL) );}struct impldoblock *mkiodo(dospec, list)chainp dospec, list;{register struct impldoblock *q;q = ALLOC(impldoblock);q->tag = TIMPLDO;q->varnp = dospec;q->datalist = list;return(q);}ptr ckalloc(n)register int n;{register ptr p;ptr calloc();if( p = calloc(1, (unsigned) n) ) return(p);fatal("out of memory");/* NOTREACHED */}isaddr(p)register expptr p;{if(p->tag == TADDR) return(YES);if(p->tag == TEXPR) switch(p->opcode) { case OPCOMMA: return( isaddr(p->rightp) ); case OPASSIGN: case OPPLUSEQ: return( isaddr(p->leftp) ); }return(NO);}addressable(p)register expptr p;{switch(p->tag) { case TCONST: return(YES); case TADDR: return( addressable(p->memoffset) ); default: return(NO); }}hextoi(c)register int c;{register char *p;static char p0[17] = "0123456789abcdef";for(p = p0 ; *p ; ++p) if(*p == c) return( p-p0 );return(16);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -