1 0 stevel /* 2 0 stevel * CDDL HEADER START 3 0 stevel * 4 0 stevel * The contents of this file are subject to the terms of the 5 5976 nakanon * Common Development and Distribution License (the "License"). 6 5976 nakanon * You may not use this file except in compliance with the License. 7 0 stevel * 8 0 stevel * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 0 stevel * or http://www.opensolaris.org/os/licensing. 10 0 stevel * See the License for the specific language governing permissions 11 0 stevel * and limitations under the License. 12 0 stevel * 13 0 stevel * When distributing Covered Code, include this CDDL HEADER in each 14 0 stevel * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 0 stevel * If applicable, add the following below this CDDL HEADER, with the 16 0 stevel * fields enclosed by brackets "[]" replaced with your own identifying 17 0 stevel * information: Portions Copyright [yyyy] [name of copyright owner] 18 0 stevel * 19 0 stevel * CDDL HEADER END 20 0 stevel */ 21 0 stevel /* 22 5976 nakanon * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 23 0 stevel * Use is subject to license terms. 24 0 stevel */ 25 0 stevel 26 0 stevel /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */ 27 0 stevel /* All Rights Reserved */ 28 0 stevel 29 0 stevel #pragma ident "%Z%%M% %I% %E% SMI" 30 0 stevel /* 31 0 stevel * UNIX shell 32 0 stevel */ 33 0 stevel 34 0 stevel #include "defs.h" 35 0 stevel 36 0 stevel 37 0 stevel /* ======== storage allocation ======== */ 38 0 stevel 39 0 stevel unsigned char * 40 0 stevel getstak(asize) /* allocate requested stack */ 41 0 stevel int asize; 42 0 stevel { 43 527 chin unsigned char *oldstak; 44 527 chin int size; 45 0 stevel 46 0 stevel size = round(asize, BYTESPERWORD); 47 0 stevel oldstak = stakbot; 48 0 stevel staktop = stakbot += size; 49 0 stevel if (staktop >= brkend) 50 0 stevel growstak(staktop); 51 0 stevel return(oldstak); 52 0 stevel } 53 0 stevel 54 0 stevel /* 55 0 stevel * set up stack for local use 56 0 stevel * should be followed by `endstak' 57 0 stevel */ 58 0 stevel unsigned char * 59 0 stevel locstak() 60 0 stevel { 61 0 stevel if (brkend - stakbot < BRKINCR) 62 0 stevel { 63 0 stevel if (setbrk(brkincr) == -1) 64 0 stevel error(nostack); 65 0 stevel if (brkincr < BRKMAX) 66 0 stevel brkincr += 256; 67 0 stevel } 68 0 stevel return(stakbot); 69 0 stevel } 70 0 stevel 71 0 stevel void 72 0 stevel growstak(newtop) 73 0 stevel unsigned char *newtop; 74 0 stevel { 75 527 chin unsigned incr; 76 0 stevel 77 0 stevel incr = (unsigned)round(newtop - brkend + 1, BYTESPERWORD); 78 0 stevel if (brkincr > incr) 79 0 stevel incr = brkincr; 80 0 stevel if (setbrk(incr) == -1) 81 0 stevel error(nospace); 82 0 stevel } 83 0 stevel 84 0 stevel unsigned char * 85 0 stevel savstak() 86 0 stevel { 87 0 stevel assert(staktop == stakbot); 88 0 stevel return(stakbot); 89 0 stevel } 90 0 stevel 91 0 stevel unsigned char * 92 527 chin endstak(unsigned char *argp) /* tidy up after `locstak' */ 93 0 stevel { 94 527 chin unsigned char *oldstak; 95 0 stevel 96 0 stevel if (argp >= brkend) 97 0 stevel growstak(argp); 98 0 stevel *argp++ = 0; 99 0 stevel oldstak = stakbot; 100 0 stevel stakbot = staktop = (unsigned char *)round(argp, BYTESPERWORD); 101 0 stevel if (staktop >= brkend) 102 0 stevel growstak(staktop); 103 0 stevel return(oldstak); 104 0 stevel } 105 0 stevel 106 527 chin void 107 527 chin tdystak(unsigned char *x) /* try to bring stack back to x */ 108 0 stevel { 109 5976 nakanon struct blk *next; 110 5976 nakanon 111 0 stevel while ((unsigned char *)stakbsy > x) 112 0 stevel { 113 5976 nakanon next = stakbsy->word; 114 0 stevel free(stakbsy); 115 5976 nakanon stakbsy = next; 116 0 stevel } 117 0 stevel staktop = stakbot = max(x, stakbas); 118 0 stevel rmtemp(x); 119 0 stevel } 120 0 stevel 121 527 chin void 122 527 chin stakchk(void) 123 0 stevel { 124 0 stevel if ((brkend - stakbas) > BRKINCR + BRKINCR) 125 0 stevel setbrk(-BRKINCR); 126 0 stevel } 127 0 stevel 128 0 stevel unsigned char * 129 0 stevel cpystak(x) 130 0 stevel unsigned char *x; 131 0 stevel { 132 0 stevel return(endstak(movstrstak(x, locstak()))); 133 0 stevel } 134 0 stevel 135 0 stevel unsigned char * 136 527 chin movstrstak(unsigned char *a, unsigned char *b) 137 0 stevel { 138 0 stevel do 139 0 stevel { 140 0 stevel if (b >= brkend) 141 0 stevel growstak(b); 142 0 stevel } 143 0 stevel while (*b++ = *a++); 144 0 stevel return(--b); 145 0 stevel } 146 0 stevel 147 0 stevel /* 148 0 stevel * Copy s2 to s1, always copy n bytes. 149 0 stevel * Return s1 150 0 stevel */ 151 0 stevel unsigned char * 152 527 chin memcpystak(unsigned char *s1, unsigned char *s2, int n) 153 0 stevel { 154 527 chin unsigned char *os1 = s1; 155 0 stevel 156 0 stevel while (--n >= 0) { 157 0 stevel if (s1 >= brkend) 158 0 stevel growstak(s1); 159 0 stevel *s1++ = *s2++; 160 0 stevel } 161 0 stevel return (os1); 162 0 stevel } 163