VOID setargs(STRING argi[]) { /* count args */ REG STRING *argp=argi; REG INT argn=0; WHILE Rcheat(*argp++)!=ENDARGS DO argn++ OD /* free old ones unless on for loop chain */ freeargs(dolh); dolh=(DOLPTR)copyargs(argi,argn); /* sets dolv */ assnum(&dolladr,dolc=argn-1); }
void * alloc(size_t nbytes) { size_t rbytes = round(nbytes + ALIGNSIZ, ALIGNSIZ); if (stakbot == 0) { addblok((unsigned int)0); } for (;;) { int c = 0; struct blk *p = blokp; struct blk *q; do { if (!busy(p)) { while (!busy(q = p->word)) p->word = q->word; if ((char *)q - (char *)p >= rbytes) { blokp = (struct blk *) ((char *)p + rbytes); if (q > blokp) blokp->word = p->word; p->word = (struct blk *) (Rcheat(blokp) | BUSY); #ifdef DEBUG fill_pat(p, PAT_INIT); #endif return ((char *)(p + 1)); } } q = p; p = (struct blk *)(Rcheat(p->word) & ~BUSY); } while (p > q || (c++) == 0); addblok(rbytes); } }
DOLPTR freeargs(DOLPTR blk) { REG STRING *argp; REG DOLPTR argr=0; REG DOLPTR argblk; IF argblk=blk THEN argr = argblk->dolnxt; IF (--argblk->doluse)==0 THEN FOR argp=(STRING *)(argblk->dolarg); Rcheat(*argp)!=ENDARGS; argp++ DO freemem(*argp) OD freemem(argblk); FI FI return(argr); }
void addblok(unsigned int reqd) { if (stakbot == 0) { brkbegin = setbrk(3 * BRKINCR); /* * setbrk() returns 8 byte aligned address * but we could need larger align in future */ brkbegin = (unsigned char *)round(brkbegin, ALIGNSIZ); bloktop = (struct blk *)brkbegin; } if (stakbas != staktop) { unsigned char *rndstak; struct blk *blokstak; if (staktop >= brkend) growstak(staktop); pushstak(0); rndstak = (unsigned char *)round(staktop, ALIGNSIZ); blokstak = (struct blk *)(stakbas) - 1; blokstak->word = stakbsy; stakbsy = blokstak; bloktop->word = (struct blk *)(Rcheat(rndstak) | BUSY); bloktop = (struct blk *)(rndstak); } reqd += brkincr; reqd &= ~(brkincr - 1); blokp = bloktop; /* * brkend points to the first invalid address. * make sure bloktop is valid. */ if ((unsigned char *)&bloktop->word >= brkend) { if (setbrk((unsigned)((unsigned char *) (&bloktop->word) - brkend + sizeof (struct blk))) == (unsigned char *)-1) error(nospace); } bloktop = bloktop->word = (struct blk *)(Rcheat(bloktop) + reqd); if ((unsigned char *)&bloktop->word >= brkend) { if (setbrk((unsigned)((unsigned char *) (&bloktop->word) - brkend + sizeof (struct blk))) == (unsigned char *)-1) error(nospace); } bloktop->word = (struct blk *)(brkbegin + 1); { unsigned char *stakadr = (unsigned char *) (bloktop + 2); unsigned char *sp = stakadr; if (reqd = (staktop-stakbot)) { if (stakadr + reqd >= brkend) growstak(stakadr + reqd); while (reqd-- > 0) *sp++ = *stakbot++; sp--; } staktop = sp; if (staktop >= brkend) growstak(staktop); stakbas = stakbot = stakadr; } }