230 lines
		
	
	
	
		
			4.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			230 lines
		
	
	
	
		
			4.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /****************************************************************
 | |
| 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;
 | |
| 
 | |
| 	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);
 | |
| 	nice_printf(outfile, "#define %s %s", d->defname, 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");
 | |
| 		}
 | |
| 	}
 |