Home | History | Annotate | Download | only in sh
      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