diff options
Diffstat (limited to 'usr.bin/f2c/mem.c')
| -rw-r--r-- | usr.bin/f2c/mem.c | 234 | 
1 files changed, 234 insertions, 0 deletions
| diff --git a/usr.bin/f2c/mem.c b/usr.bin/f2c/mem.c new file mode 100644 index 000000000000..940e9c1848c0 --- /dev/null +++ b/usr.bin/f2c/mem.c @@ -0,0 +1,234 @@ +/**************************************************************** +Copyright 1990, 1991 by AT&T Bell Laboratories and Bellcore. + +Permission to use, copy, modify, and distribute this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the names of AT&T Bell Laboratories or +Bellcore or any of their entities not be used in advertising or +publicity pertaining to distribution of the software without +specific, written prior permission. + +AT&T and Bellcore disclaim all warranties with regard to this +software, including all implied warranties of merchantability +and fitness.  In no event shall AT&T or Bellcore be liable for +any special, indirect or consequential damages or any damages +whatsoever resulting from loss of use, data or profits, whether +in an action of contract, negligence or other tortious action, +arising out of or in connection with the use or performance of +this software. +****************************************************************/ + +#include "defs.h" +#include "iob.h" + +#define MEMBSIZE	32000 +#define GMEMBSIZE	16000 + + extern void exit(); + + char * +gmem(n, round) + int n, round; +{ +	static char *last, *next; +	char *rv; +	if (round) +#ifdef CRAY +		if ((long)next & 0xe000000000000000) +			next = (char *)(((long)next & 0x1fffffffffffffff) + 1); +#else +#ifdef MSDOS +		if ((int)next & 1) +			next++; +#else +		next = (char *)(((long)next + sizeof(char *)-1) +				& ~((long)sizeof(char *)-1)); +#endif +#endif +	rv = next; +	if ((next += n) > last) { +		rv = Alloc(n + GMEMBSIZE); + +		next = rv + n; +		last = next + GMEMBSIZE; +		} +	return rv; +	} + + struct memblock { +	struct memblock *next; +	char buf[MEMBSIZE]; +	}; + typedef struct memblock memblock; + + static memblock *mem0; + memblock *curmemblock, *firstmemblock; + + char *mem_first, *mem_next, *mem_last, *mem0_last; + + void +mem_init() +{ +	curmemblock = firstmemblock = mem0 +		= (memblock *)Alloc(sizeof(memblock)); +	mem_first = mem0->buf; +	mem_next  = mem0->buf; +	mem_last  = mem0->buf + MEMBSIZE; +	mem0_last = mem0->buf + MEMBSIZE; +	mem0->next = 0; +	} + + char * +mem(n, round) + int n, round; +{ +	memblock *b; +	register char *rv, *s; + +	if (round) +#ifdef CRAY +		if ((long)mem_next & 0xe000000000000000) +			mem_next = (char *)(((long)mem_next & 0x1fffffffffffffff) + 1); +#else +#ifdef MSDOS +		if ((int)mem_next & 1) +			mem_next++; +#else +		mem_next = (char *)(((long)mem_next + sizeof(char *)-1) +				& ~((long)sizeof(char *)-1)); +#endif +#endif +	rv = mem_next; +	s = rv + n; +	if (s >= mem_last) { +		if (n > MEMBSIZE)  { +			fprintf(stderr, "mem(%d) failure!\n", n); +			exit(1); +			} +		if (!(b = curmemblock->next)) { +			b = (memblock *)Alloc(sizeof(memblock)); +			curmemblock->next = b; +			b->next = 0; +			} +		curmemblock = b; +		rv = b->buf; +		mem_last = rv + sizeof(b->buf); +		s = rv + n; +		} +	mem_next = s; +	return rv; +	} + + char * +tostring(s,n) + register char *s; + int n; +{ +	register char *s1, *se, **sf; +	char *rv, *s0; +	register int k = n + 2, t; + +	sf = str_fmt; +	sf['%'] = "%"; +	s0 = s; +	se = s + n; +	for(; s < se; s++) { +		t = *(unsigned char *)s; +		s1 = sf[t]; +		while(*++s1) +			k++; +		} +	sf['%'] = "%%"; +	rv = s1 = mem(k,0); +	*s1++ = '"'; +	for(s = s0; s < se; s++) { +		t = *(unsigned char *)s; +		sprintf(s1, sf[t], t); +		s1 += strlen(s1); +		} +	*s1 = 0; +	return rv; +	} + + char * +cpstring(s) + register char *s; +{ +	return strcpy(mem(strlen(s)+1,0), s); +	} + + void +new_iob_data(ios, name) + register io_setup *ios; + char *name; +{ +	register iob_data *iod; +	register char **s, **se; + +	iod = (iob_data *) +		mem(sizeof(iob_data) + ios->nelt*sizeof(char *), 1); +	iod->next = iob_list; +	iob_list = iod; +	iod->type = ios->fields[0]; +	iod->name = cpstring(name); +	s = iod->fields; +	se = s + ios->nelt; +	while(s < se) +		*s++ = "0"; +	*s = 0; +	} + + char * +string_num(pfx, n) + char *pfx; + long n; +{ +	char buf[32]; +	sprintf(buf, "%s%ld", pfx, n); +	/* can't trust return type of sprintf -- BSD gets it wrong */ +	return strcpy(mem(strlen(buf)+1,0), buf); +	} + +static defines *define_list; + + void +def_start(outfile, s1, s2, post) + FILE *outfile; + char *s1, *s2, *post; +{ +	defines *d; +	int n, n1; +	extern int in_define; + +	n = n1 = strlen(s1); +	if (s2) +		n += strlen(s2); +	d = (defines *)mem(sizeof(defines)+n, 1); +	d->next = define_list; +	define_list = d; +	strcpy(d->defname, s1); +	if (s2) +		strcpy(d->defname + n1, s2); +	in_define = 1; +	nice_printf(outfile, "#define %s", d->defname); +	if (post) +		nice_printf(outfile, " %s", post); +	} + + void +other_undefs(outfile) + FILE *outfile; +{ +	defines *d; +	if (d = define_list) { +		define_list = 0; +		nice_printf(outfile, "\n"); +		do +			nice_printf(outfile, "#undef %s\n", d->defname); +			while(d = d->next); +		nice_printf(outfile, "\n"); +		} +	} | 
