1*14480Ssam #ifndef lint 2*14480Ssam static char sccsid[] = "@(#)stak.c 4.2 08/11/83"; 3*14480Ssam #endif 46704Smckusick 56704Smckusick # 66704Smckusick /* 76704Smckusick * UNIX shell 86704Smckusick * 96704Smckusick * S. R. Bourne 106704Smckusick * Bell Telephone Laboratories 116704Smckusick * 126704Smckusick */ 136704Smckusick 146704Smckusick #include "defs.h" 156704Smckusick 166704Smckusick STKPTR stakbot=nullstr; 176704Smckusick 186704Smckusick 196704Smckusick 206704Smckusick /* ======== storage allocation ======== */ 216704Smckusick getstak(asize)226704SmckusickSTKPTR getstak(asize) 236704Smckusick INT asize; 246704Smckusick { /* allocate requested stack */ 256704Smckusick REG STKPTR oldstak; 266704Smckusick REG INT size; 276704Smckusick 286704Smckusick size=round(asize,BYTESPERWORD); 296704Smckusick oldstak=stakbot; 306704Smckusick staktop = stakbot += size; 316704Smckusick return(oldstak); 326704Smckusick } 336704Smckusick locstak()346704SmckusickSTKPTR locstak() 356704Smckusick { /* set up stack for local use 366704Smckusick * should be followed by `endstak' 376704Smckusick */ 386704Smckusick IF brkend-stakbot<BRKINCR 396704Smckusick THEN setbrk(brkincr); 406704Smckusick IF brkincr < BRKMAX 416704Smckusick THEN brkincr += 256; 426704Smckusick FI 436704Smckusick FI 446704Smckusick return(stakbot); 456704Smckusick } 466704Smckusick savstak()476704SmckusickSTKPTR savstak() 486704Smckusick { 496704Smckusick assert(staktop==stakbot); 506704Smckusick return(stakbot); 516704Smckusick } 526704Smckusick endstak(argp)536704SmckusickSTKPTR endstak(argp) 546704Smckusick REG STRING argp; 556704Smckusick { /* tidy up after `locstak' */ 566704Smckusick REG STKPTR oldstak; 576704Smckusick *argp++=0; 586704Smckusick oldstak=stakbot; stakbot=staktop=round(argp,BYTESPERWORD); 596704Smckusick return(oldstak); 606704Smckusick } 616704Smckusick tdystak(x)626704SmckusickVOID tdystak(x) 636704Smckusick REG STKPTR x; 646704Smckusick { 656704Smckusick /* try to bring stack back to x */ 666704Smckusick WHILE ADR(stakbsy)>ADR(x) 676704Smckusick DO free(stakbsy); 686704Smckusick stakbsy = stakbsy->word; 696704Smckusick OD 706704Smckusick staktop=stakbot=max(ADR(x),ADR(stakbas)); 716704Smckusick rmtemp(x); 726704Smckusick } 736704Smckusick stakchk()746704Smckusickstakchk() 756704Smckusick { 766704Smckusick IF (brkend-stakbas)>BRKINCR+BRKINCR 776704Smckusick THEN setbrk(-BRKINCR); 786704Smckusick FI 796704Smckusick } 806704Smckusick cpystak(x)816704SmckusickSTKPTR cpystak(x) 826704Smckusick STKPTR x; 836704Smckusick { 846704Smckusick return(endstak(movstr(x,locstak()))); 856704Smckusick } 86