Browse Source

Update generic part of the AS

Godzil 11 years ago
parent
commit
a39e88ecca
7 changed files with 305 additions and 253 deletions
  1. 4 2
      mach/proto/as/comm0.h
  2. 73 9
      mach/proto/as/comm1.h
  3. 21 21
      mach/proto/as/comm3.c
  4. 42 43
      mach/proto/as/comm4.c
  5. 55 64
      mach/proto/as/comm5.c
  6. 40 40
      mach/proto/as/comm6.c
  7. 70 74
      mach/proto/as/comm7.c

+ 4 - 2
mach/proto/as/comm0.h

@@ -83,17 +83,21 @@ _include	<stdio.h>
 _include    <string.h>
 _include	<ctype.h>
 _include	<signal.h>
+_include	<unistd.h>
 #else
 #include    <stdlib.h>
 #include	<stdio.h>
 #include    <string.h>
+#include	<stdarg.h>
 #include	<ctype.h>
 #include	<signal.h>
+#include	<unistd.h>
 #endif
 
 #ifdef ASLD
 #include	"arch.h"
 #endif
+#include	"object.h"
 #include	"out.h"
 
 #if DEBUG == 0
@@ -262,5 +266,3 @@ typedef	struct sect_t	sect_t;
 #define	MACHREL_BWR	(0)
 #endif
 #endif
-
-extern FILE *fopen();   /* some systems don't have this in stdio.h */

+ 73 - 9
mach/proto/as/comm1.h

@@ -104,17 +104,81 @@ extern struct outhead	outhead;
 extern int	curr_token;
 
 /* forward function declarations */
+int yyparse();
+
+/* ========== comm4.c prototypes =========== */
+void stop(int signal);
+int main(int argc, char *argv[]);
+int pass_1(int argc, char *argv[]);
+void parse(char *s);
+void pass_23(int n);
+void newmodule(char *s);
+void setupoutput(void);
+void commfinish(void);
+
+/* ========== comm5.c prototypes =========== */
+int yylex(void);
+void putval(int c);
+int getval(int c);
+int nextchar(void);
+void readcode(int n);
+int induo(int c);
+int inident(int c);
+int innumber(int c);
+int instring(int termc);
+int inescape(void);
+int infbsym(char *p);
+int hash(char *p);
+item_t *item_search(char *p);
+void item_insert(item_t *ip, int h);
+item_t *item_alloc(int typ);
+item_t *fb_alloc(int lab);
+item_t *fb_shift(int lab);
 #ifdef ASLD
-extern char	*readident();
+char *readident(int c);
 #endif
-extern char	*remember();
-extern item_t	*fb_shift();
-extern item_t	*fb_alloc();
-extern item_t	*item_alloc();
-extern item_t	*item_search();
-extern valu_t	load();
-extern FILE	*ffcreat();
-extern FILE	*fftemp();
+
+/* ========== comm6.c prototypes =========== */
+void newequate(item_t *ip, int typ);
+void newident(item_t *ip, int typ);
+void newlabel(item_t *ip);
+void newsect(item_t *ip);
+void newbase(valu_t base);
+void newcomm(item_t *ip, valu_t val);
+void switchsect(int newtyp);
+void align(valu_t bytes);
+long new_string(char *s);
+void newsymb(char *name, int type, int desc, valu_t valu);
+void new_common(item_t *ip);
+#ifdef RELOCATION
+void newrelo(int s, int n);
+#endif
+
+/* ========== comm7.c prototypes =========== */
+valu_t load(item_t *ip);
+int store(item_t *ip, valu_t val);
+char *remember(char *s);
+int combine(int typ1, int typ2, int op);
+int small(int fitsmall, int gain);
+void emit1(int arg);
+void emit2(int arg);
+void emit4(long arg);
+void emitx(valu_t val, int n);
+void emitstr(int zero);
+void ffreopen(char *s, FILE *f);
+FILE *ffcreat(char *s);
+FILE *fftemp(char *path, char *tail);
+void yyerror(char *str);
+int printx(int ndig, valu_t val);
+void nosect(void);
+void wr_fatal(void);
+void fatal(char *s, ...);
+void assert1(void);
+void serror(char *s, ...);
+void warning(char *s, ...);
+void diag(char *tail, char *s, ...);
+void nofit(void);
+void listline(int textline);
 
 /* ========== Machine dependent C declarations ========== */
 

+ 21 - 21
mach/proto/as/comm3.c

@@ -23,28 +23,28 @@ struct outhead	outhead = {
 #include	"y.tab.h"
 
 item_t	keytab[] = {
-	0,	EXTERN,		0,		".define",
-	0,	EXTERN,		0,		".extern",
-	0,	DOT,		0,		".",
-	0,	DATA,		1,		".data1",
-	0,	DATA,		2,		".data2",
-	0,	DATA,		4,		".data4",
-	0,	ASCII,		0,		".ascii",
-	0,	ASCII,		1,		".asciz",
-	0,	ALIGN,		0,		".align",
-	0,	ASSERT,		0,		".assert",
-	0,	SPACE,		0,		".space",
-	0,	COMMON,		0,		".comm",
-	0,	SECTION,	0,		".sect",
-	0,	BASE,		0,		".base",
-	0,	SYMB,		0,		".symb",
-	0,	SYMD,		0,		".symd",
-	0,	LINE,		0,		".line",
-	0,	FILe,		0,		".file",
+	{ 0,	EXTERN,		0,		".define" },
+	{ 0,	EXTERN,		0,		".extern" },
+	{ 0,	DOT,		0,		"." },
+	{ 0,	DATA,		1,		".data1" },
+	{ 0,	DATA,		2,		".data2" },
+	{ 0,	DATA,		4,		".data4" },
+	{ 0,	ASCII,		0,		".ascii" },
+	{ 0,	ASCII,		1,		".asciz" },
+	{ 0,	ALIGN,		0,		".align" },
+	{ 0,	ASSERT,		0,		".assert" },
+	{ 0,	SPACE,		0,		".space" },
+	{ 0,	COMMON,		0,		".comm" },
+	{ 0,	SECTION,	0,		".sect" },
+	{ 0,	BASE,		0,		".base" },
+	{ 0,	SYMB,		0,		".symb" },
+	{ 0,	SYMD,		0,		".symd" },
+	{ 0,	LINE,		0,		".line" },
+	{ 0,	FILe,		0,		".file" },
 #ifdef LISTING
-	0,	LIST,		0,		".nolist",
-	0,	LIST,		1,		".list",
+	{ 0,	LIST,		0,		".nolist" },
+	{ 0,	LIST,		1,		".list" },
 #endif
 #include	"mach3.c"
-	0,	0,		0,		0
+	{ 0,	0,		0,		0 }
 };

+ 42 - 43
mach/proto/as/comm4.c

@@ -11,7 +11,6 @@
  *	Johan Stevenson, Han Schaminee and Hans de Vries
  *		Philips S&I, T&M, PMDS, Eindhoven
  */
-
 #include	"comm0.h"
 #include	"comm1.h"
 #include	"y.tab.h"
@@ -20,7 +19,8 @@ extern YYSTYPE	yylval;
 
 /* ========== Machine independent C routines ========== */
 
-void stop() {
+void stop(int signal)
+{
 #if DEBUG < 2
 	unlink(temppath);
 #ifdef LISTING
@@ -30,11 +30,10 @@ void stop() {
 	exit(nerrors != 0);
 }
 
-main(argc, argv)
-char **argv;
+int main(int argc, char *argv[])
 {
-	register char *p;
-	register i;
+	char *p;
+	int i;
 	static char sigs[] = {
 		SIGHUP, SIGINT, SIGQUIT, SIGTERM, 0
 	};
@@ -49,7 +48,7 @@ char **argv;
 	}
 
 	progname = *argv++; argc--;
-	for (p = sigs; i = *p++; )
+	for (p = sigs; (i = *p++); )
 		if (signal(i, SIG_IGN) != SIG_IGN)
 			signal(i, stop);
 	for (i = 0; i < argc; i++) {
@@ -122,20 +121,20 @@ char **argv;
 #endif
 	pass_23(PASS_3);
 	wr_close();
-	stop();
+	stop(0);
+	return 0;
 }
 
 /* ---------- pass 1: arguments, modules, archives ---------- */
 
-pass_1(argc, argv)
-char **argv;
+int pass_1(int argc, char *argv[])
 {
-	register char *p;
-	register item_t *ip;
+	char *p;
+	item_t *ip;
 #ifdef ASLD
 	char armagic[2];
 #else
-	register nfile = 0;
+	int nfile = 0;
 #endif
 
 #ifdef THREE_PASS
@@ -195,7 +194,7 @@ char **argv;
 	machfinish(PASS_1);
 #ifdef ASLD
 	if (unresolved) {
-		register int i;
+		int i;
 
 		nerrors++;
 		fflush(stdout);
@@ -217,12 +216,14 @@ char **argv;
 		fatal("no source file");
 	*/
 #endif
+	return 0;
 }
 
 #ifdef ASLD
 
-archive() {
-	register long offset;
+void archive()
+{
+	long offset;
 	struct ar_hdr header;
 	char getsize[AR_TOTAL];
 
@@ -254,14 +255,14 @@ archive() {
 	archmode = 0;
 }
 
-needed()
+int needed()
 {
-	register c, first;
-	register item_t *ip;
-	register need;
+	c, first;
+	item_t *ip;
+	int need;
 
 #ifdef LISTING
-	register save;
+	int save;
 
 	save = listflag; listflag = 0;
 #endif
@@ -306,12 +307,11 @@ needed()
 }
 #endif /* ASLD */
 
-parse(s)
-char *s;
+void parse(char *s)
 {
-	register i;
-	register item_t *ip;
-	register char *p;
+	int i;
+	item_t *ip;
+	char *p;
 
 	for (p = s; *p; )
 		if (*p++ == '/')
@@ -371,16 +371,16 @@ char *s;
 	}
 }
 
-pass_23(n)
+void pass_23(int n)
 {
-	register i;
+	int i;
 #ifdef ASLD
-	register ADDR_T base = 0;
+	ADDR_T base = 0;
 #endif
-	register sect_t *sp;
+	sect_t *sp;
 
 	if (nerrors)
-		stop();
+		stop(0);
 	pass = n;
 #ifdef LISTING
 	listmode >>= 3;
@@ -430,8 +430,7 @@ pass_23(n)
 	machfinish(n);
 }
 
-newmodule(s)
-char *s;
+void newmodule(char *s)
 {
 	static char nmbuf[STRINGMAX];
 
@@ -458,12 +457,12 @@ char *s;
 #endif
 }
 
-setupoutput()
+void setupoutput()
 {
-	register sect_t *sp;
-	register long off;
+	sect_t *sp;
+	long off;
 	struct outsect outsect;
-	register struct outsect *pos = &outsect;
+	struct outsect *pos = &outsect;
 
 	if (! wr_open(aoutpath)) {
 		fatal("can't create %s", aoutpath);
@@ -493,15 +492,15 @@ setupoutput()
 	outhead.oh_nchar = off;	/* see newsymb() */
 }
 
-commfinish()
+void commfinish()
 {
 #ifndef ASLD
-	register int i;
+	int i;
 #endif
-	register struct common_t *cp;
-	register item_t *ip;
-	register sect_t *sp;
-	register valu_t addr;
+	struct common_t *cp;
+	item_t *ip;
+	sect_t *sp;
+	valu_t addr;
 
 	switchsect(S_UND);
 	/*

+ 55 - 64
mach/proto/as/comm5.c

@@ -11,9 +11,9 @@
 
 extern YYSTYPE	yylval;
 
-yylex()
+int yylex()
 {
-	register c;
+	int c;
 
 	if (pass == PASS_1) {
 		/* scan the input file */
@@ -68,11 +68,11 @@ yylex()
 	return(c);
 }
 
-putval(c)
+void putval(int c)
 {
-	register valu_t v;
-	register n = 0;
-	register char *p = 0;
+	valu_t v;
+	int n = 0;
+	char *p = 0;
 
 	assert(c >= 256 && c < 256+128);
 	switch (c) {
@@ -141,11 +141,11 @@ putval(c)
 		putc(*p++, tempfile);
 }
 
-getval(c)
+int getval(int c)
 {
-	register n = 0;
-	register valu_t v;
-	register char *p = 0;
+	int n = 0;
+	valu_t v;
+	char *p = 0;
 
 	switch (c) {
 	case CODE1:
@@ -206,9 +206,9 @@ getval(c)
 
 /* ---------- lexical scan in pass 1 ---------- */
 
-nextchar()
+int nextchar()
 {
-	register c;
+	int c;
 
 	if (peekc != -1) {
 		c = peekc;
@@ -230,9 +230,9 @@ nextchar()
 	return(c);
 }
 
-readcode(n)
+void readcode(int n)
 {
-	register c;
+	int c;
 
 	yylval.y_valu = 0;
 	do {
@@ -249,8 +249,7 @@ readcode(n)
 	} while (--n);
 }
 
-induo(c)
-register c;
+int induo(int c)
 {
 	static short duo[] = {
 		('='<<8) | '=', OP_EQ,
@@ -262,7 +261,7 @@ register c;
 		('|'<<8) | '|', OP_OO,
 		('&'<<8) | '&', OP_AA,
 	};
-	register short *p;
+	short *p;
 
 	c = (c<<8) | nextchar();
 	for (p = duo; *p; p++)
@@ -274,12 +273,11 @@ register c;
 
 static char name[NAMEMAX+1];
 
-inident(c)
-register  c;
+int inident(int c)
 {
-	register char *p = name;
-	register item_t *ip;
-	register n = NAMEMAX;
+	char *p = name;
+	item_t *ip;
+	int n = NAMEMAX;
 
 	do {
 		if (--n >= 0)
@@ -305,12 +303,10 @@ register  c;
 }
 
 #ifdef ASLD
-char *
-readident(c)
-register c;
+char *readident(int c)
 {
-	register n = NAMEMAX;
-	register char *p = name;
+	int n = NAMEMAX;
+	char *p = name;
 
 	do {
 		if (--n >= 0)
@@ -323,11 +319,10 @@ register c;
 }
 #endif
 
-innumber(c)
-register c;
+int innumber(int c)
 {
-	register char *p;
-	register radix;
+	char *p;
+	int radix;
 	static char num[20+1];
 
 	p = num;
@@ -359,7 +354,7 @@ register c;
 	if (radix != 16 && (c == 'f' || c == 'b'))
 		return(infbsym(num));
 	yylval.y_valu = 0;
-	while (c = *p++) {
+	while ( (c = *p++) ) {
 		if (c > '9')
 			c -= ('a' - '9' - 1);
 		c -= '0';
@@ -370,10 +365,10 @@ register c;
 	return(NUMBER);
 }
 
-instring(termc)
+int instring(int termc)
 {
-	register char *p;
-	register c;
+	char *p;
+	int c;
 	static int maxstring = 0;
 
 	if (! maxstring) {
@@ -409,9 +404,9 @@ instring(termc)
 	return(STRING);
 }
 
-inescape()
+int inescape()
 {
-	register c, j, r;
+	int c, j, r;
 
 	c = nextchar();
 	if (c >= '0' && c <= '7') {
@@ -439,11 +434,10 @@ inescape()
 	return(c);
 }
 
-infbsym(p)
-register char *p;
+int infbsym(char *p)
 {
-	register lab;
-	register item_t *ip;
+	int lab;
+	item_t *ip;
 
 	lab = *p++ - '0';
 	if ((unsigned)lab < 10) {
@@ -466,26 +460,23 @@ ok:
 	return(FBSYM);
 }
 
-hash(p)
-register char *p;
+int hash(char *p)
 {
-	register unsigned short h;
-	register c;
+	unsigned short h;
+	int c;
 
 	h = 0;
-	while (c = *p++) {
+	while ( (c = *p++) ) {
 		h <<= 2;
 		h += c;
 	}
 	return(h % H_SIZE);
 }
 
-item_t *
-item_search(p)
-char *p;
+item_t *item_search(char *p)
 {
-	register h;
-	register item_t *ip;
+	int h;
+	item_t *ip;
 
 	for (h = hash(p); h < H_TOTAL; h += H_SIZE) {
 		ip = hashtab[h];
@@ -500,17 +491,15 @@ done:
 	return(ip);
 }
 
-item_insert(ip, h)
-item_t *ip;
+void item_insert(item_t *ip, int h)
 {
 	ip->i_next = hashtab[h];
 	hashtab[h] = ip;
 }
 
-item_t *
-item_alloc(typ)
+item_t *item_alloc(int typ)
 {
-	register item_t *ip;
+	item_t *ip;
 	static nleft = 0;
 	static item_t *next;
 
@@ -528,11 +517,9 @@ item_alloc(typ)
 	return(ip);
 }
 
-item_t *
-fb_alloc(lab)
-register lab;
+item_t *fb_alloc(int lab)
 {
-	register item_t *ip, *p;
+	item_t *ip, *p;
 
 	ip = item_alloc(S_UND);
 	p = fb_ptr[FB_TAIL+lab];
@@ -544,18 +531,22 @@ register lab;
 	return(ip);
 }
 
-item_t *
-fb_shift(lab)
-register lab;
+item_t *fb_shift(int lab)
 {
-	register item_t *ip;
+	item_t *ip;
 
 	ip = fb_ptr[FB_FORW+lab];
 	if (ip == 0)
+	{
 		if (pass == PASS_1)
+		{
 			ip = fb_alloc(lab);
+		}
 		else
+		{
 			ip = fb_ptr[FB_HEAD+lab];
+		}
+	}
 	fb_ptr[FB_BACK+lab] = ip;
 	fb_ptr[FB_FORW+lab] = ip->i_next;
 	return(ip);

+ 40 - 40
mach/proto/as/comm6.c

@@ -12,9 +12,7 @@
 #include	"comm1.h"
 #include	"y.tab.h"
 
-newequate(ip, typ)
-register item_t *ip;
-register int typ;
+void newequate(item_t *ip, int typ)
 {
 	typ &= ~S_EXT;
 	if (typ & S_COM)
@@ -34,10 +32,9 @@ register int typ;
 	newident(ip, typ);
 }
 
-newident(ip, typ)
-register item_t *ip;
+void newident(item_t *ip, int typ)
 {
-	register flag;
+	int flag;
 #ifdef GENLAB
 	static char genlab[] = GENLAB;
 #endif /* GENLAB */
@@ -74,12 +71,11 @@ register item_t *ip;
 		);
 }
 
-newlabel(ip)
-register item_t *ip;
+void newlabel(item_t *ip)
 {
 #if DEBUG != 0
 #ifdef THREE_PASS
-	register ADDR_T oldval = ip->i_valu;
+	ADDR_T oldval = ip->i_valu;
 #endif
 #endif
 
@@ -94,11 +90,10 @@ register item_t *ip;
 #endif
 }
 
-newsect(ip)
-register item_t *ip;
+void newsect(item_t *ip)
 {
-	register int typ;
-	register sect_t *sp = NULL;
+	int typ;
+	sect_t *sp = NULL;
 
 	typ = ip->i_type & S_TYP;
 	if (typ == S_UND) {
@@ -132,11 +127,10 @@ register item_t *ip;
 }
 
 /*ARGSUSED*/
-newbase(base)
-valu_t base;
+void newbase(valu_t base)
 {
 #ifdef ASLD
-	register sect_t *sp;
+	sect_t *sp;
 	
 	if ((sp = DOTSCT) == NULL)
 		nosect();
@@ -160,9 +154,7 @@ valu_t base;
  *   -	maximum length of .comm is recorded in i_valu during PASS_1
  *   -	i_valu is used for relocation info during PASS_3
  */
-newcomm(ip, val)
-register item_t *ip;
-valu_t val;
+void newcomm(item_t *ip, valu_t val)
 {
 	if (pass == PASS_1) {
 		if (DOTSCT == NULL)
@@ -183,12 +175,11 @@ valu_t val;
 	}
 }
 
-switchsect(newtyp)
-int newtyp;
+void switchsect(int newtyp)
 {
-	register sect_t *sp;
+	sect_t *sp;
 	
-	if (sp = DOTSCT)
+	if ( (sp = DOTSCT) )
 		sp->s_size = DOTVAL - sp->s_base;
 	if (newtyp == S_UND) {
 		DOTSCT = NULL;
@@ -202,27 +193,35 @@ int newtyp;
 	DOTTYP = newtyp;
 }
 
-align(bytes)
-valu_t bytes;
+void align(valu_t bytes)
 {
-	register valu_t gap;
-	register sect_t *sp;
+	valu_t gap;
+	sect_t *sp;
 
 	if ((sp = DOTSCT) == NULL)
 		nosect();
 	if (bytes == 0)
 		bytes = ALIGNWORD;
 	if (sp->s_lign % bytes)
+	{
 		if (bytes % sp->s_lign)
+		{
 			serror("illegal alignment");
+		}
 		else
+		{
 			sp->s_lign = bytes;
+		}
+	}
 	if (pass == PASS_1)
+	{
 		/*
 		 * be pessimistic: biggest gap possible
 		 */
 		gap = bytes - 1;
-	else {
+	}	
+	else
+	{
 		/*
 		 * calculate gap correctly;
 		 * will be the same in PASS_2 and PASS_3
@@ -242,7 +241,7 @@ valu_t bytes;
 }
 
 #ifdef RELOCATION
-newrelo(s, n)
+void newrelo(int s, int n)
 {
 	int	iscomm;
 	struct outrelo	outrelo;
@@ -270,16 +269,19 @@ newrelo(s, n)
 	s &= ~S_COM;
 	if ((n & RELPC) == 0 && ((s & ~S_VAR) == S_ABS))
 		return;
+
 	if ((n & RELPC) != 0 && s == DOTTYP
 #ifndef ASLD
 	    && ! iscomm
 #endif
 	   )
 		return;
+
 	if (pass != PASS_3) {
 		outhead.oh_nrelo++;
 		return;
 	}
+
 	s &= ~S_VAR;
 	outrelo.or_type = (char)n;
 	outrelo.or_sect = (char)DOTTYP;
@@ -290,13 +292,16 @@ newrelo(s, n)
 		relonami = 0;
 	} else
 #endif
-	if (s < S_MIN) {
+	if (s < S_MIN)
+	{
 		assert(s == S_ABS);
 		/*
 		 * use first non existing entry (argh)
 		 */
 		outrelo.or_nami = outhead.oh_nname;
-	} else {
+	}
+	else
+	{
 		/*
 		 * section symbols are at the end
 		 */
@@ -310,9 +315,7 @@ newrelo(s, n)
 }
 #endif
 
-long
-new_string(s)
-	char	*s;
+long new_string(char *s)
 {
 	long	r = 0;
 
@@ -326,9 +329,7 @@ new_string(s)
 	return r;
 }
 
-newsymb(name, type, desc, valu)
-register char *name;
-valu_t valu;
+void newsymb(char *name, int type, int desc, valu_t valu)
 {
 	struct outname outname;
 
@@ -350,10 +351,9 @@ valu_t valu;
 	wr_name(&outname, 1);
 }
 
-new_common(ip)
-	item_t *ip;
+void new_common(item_t *ip)
 {
-	register struct common_t *cp;
+	struct common_t *cp;
 	static nleft = 0;
 	static struct common_t *next;
 

+ 70 - 74
mach/proto/as/comm7.c

@@ -12,12 +12,10 @@
 #include	"comm1.h"
 #include	"y.tab.h"
 
-valu_t
-load(ip)
-register item_t *ip;
+valu_t load(item_t *ip)
 {
 #ifdef ASLD
-	register typ;
+	int typ;
 
 	typ = ip->i_type & S_TYP;
 	if ((typ -= S_MIN) < 0)		/* S_UND or S_ABS */
@@ -36,12 +34,10 @@ register item_t *ip;
 #endif
 }
 
-store(ip, val)
-register item_t *ip;
-valu_t val;
+int store(item_t *ip, valu_t val)
 {
 #ifdef ASLD
-	register typ;
+	int typ;
 
 	typ = ip->i_type & S_TYP;
 	if ((typ -= S_MIN) >= 0)
@@ -55,12 +51,10 @@ valu_t val;
 	return(1);
 }
 
-char *
-remember(s)
-register char *s;
+char *remember(char *s)
 {
-	register char *p;
-	register n;
+	char *p;
+	int n;
 	static nleft = 0;
 	static char *next;
 
@@ -77,15 +71,14 @@ register char *s;
 		assert(nleft >= 0);
 	}
 	p = next;
-	while (*p++ = *s++)
+	while ( (*p++ = *s++) )
 		;
 	s = next;
 	next = p;
 	return(s);
 }
 
-combine(typ1, typ2, op)
-register typ1, typ2;
+int combine(int typ1, int typ2, int op)
 {
 	switch (op) {
 	case '+':
@@ -121,12 +114,11 @@ register typ1, typ2;
 }
 
 #ifdef LISTING
-printx(ndig, val)
-valu_t val;
+int printx(int ndig, valu_t val)
 {
 	static char buf[8];
-	register char *p;
-	register c, n;
+	char *p;
+	int c, n;
 
 	p = buf; n = ndig;
 	do {
@@ -134,7 +126,7 @@ valu_t val;
 		val >>= 4;
 	} while (--n);
 	do {
-		c = "0123456789ABCDEF"[*--p];
+		c = "0123456789ABCDEF"[*(unsigned char *)--p];
 		putchar(c);
 	} while (p > buf);
 	return(ndig);
@@ -142,9 +134,9 @@ valu_t val;
 #endif
 
 #ifdef LISTING
-listline(textline)
+void listline(int textline)
 {
-	register c;
+	int c;
 
 	if ((listflag & 4) && (c = getc(listfile)) != '\n' && textline) {
 		if (listcolm >= 24)
@@ -175,10 +167,10 @@ listline(textline)
 #define PBITTABSZ	128
 static char *pbittab[PBITTABSZ];
 
-small(fitsmall, gain)
+int small(int fitsmall, int gain)
 {
-	register bit;
-	register char *p;
+	int bit;
+	char *p;
 
 	if (DOTSCT == NULL)
 		nosect();
@@ -225,12 +217,13 @@ small(fitsmall, gain)
 		return(*p & bit);
 	}
 	/*NOTREACHED*/
+	return 0;
 }
 #endif
 
 /* ---------- output ---------- */
 
-emit1(arg)
+void emit1(int arg)
 {
 	static int olddottyp = -1;
 #ifdef LISTING
@@ -268,8 +261,7 @@ emit1(arg)
 	DOTVAL++;
 }
 
-emit2(arg)
-int arg;
+void emit2(int arg)
 {
 #ifdef BYTES_REVERSED
 	emit1((arg>>8)); emit1(arg);
@@ -278,8 +270,7 @@ int arg;
 #endif
 }
 
-emit4(arg)
-long arg;
+void emit4(long arg)
 {
 #ifdef WORDS_REVERSED
 	emit2((int)(arg>>16)); emit2((int)(arg));
@@ -288,9 +279,7 @@ long arg;
 #endif
 }
 
-emitx(val, n)
-valu_t val;
-int n;
+void emitx(valu_t val, int n)
 {
 	switch (n) {
 	case 1:
@@ -314,10 +303,10 @@ int n;
 	}
 }
 
-emitstr(zero)
+void emitstr(int zero)
 {
-	register i;
-	register char *p;
+	int i;
+	char *p;
 
 	p = stringbuf;
 	i = stringlen;
@@ -329,17 +318,13 @@ emitstr(zero)
 
 /* ---------- Error checked file I/O  ---------- */
 
-ffreopen(s, f)
-char *s;
-FILE *f;
+void ffreopen(char *s, FILE *f)
 {
 	if (freopen(s, "r", f) == NULL)
 		fatal("can't reopen %s", s);
 }
 
-FILE *
-ffcreat(s)
-char *s;
+FILE *ffcreat(char *s)
 {
 	FILE *f;
 
@@ -353,11 +338,9 @@ char *s;
 #endif
 char *tmp_dir = TMPDIR;
 
-FILE *
-fftemp(path, tail)
-char *path, *tail;
+FILE *fftemp(char *path, char *tail)
 {
-	register char *dir;
+	char *dir;
 
 	if ((dir = getenv("TMPDIR")) == NULL)
 		dir = tmp_dir;
@@ -368,72 +351,85 @@ char *path, *tail;
 /* ---------- Error handling ---------- */
 
 /*VARARGS*/
-yyerror(){}		/* we will do our own error printing */
+void yyerror(char *str){}		/* we will do our own error printing */
 
-nosect()
+/* VARARGS1 */
+static void vdiag(char *tail, char *s, va_list ap)
+{
+	fflush(stdout);
+	if (modulename)
+		fprintf(stderr, "\"%s\", line %ld: ", modulename, lineno);
+	else
+		fprintf(stderr, "%s: ", progname);
+	vfprintf(stderr, s, ap);
+	fprintf(stderr, "%s", tail);
+}
+
+void nosect()
 {
 	fatal("no sections");
 }
 
-wr_fatal()
+void wr_fatal()
 {
 	fatal("write error");
 }
 
 /* VARARGS1 */
-fatal(s, a1, a2, a3, a4)
-char *s;
+void fatal(char *s, ...)
 {
+	va_list ap;
 	nerrors++;
-	diag(" (fatal)\n", s, a1, a2, a3, a4);
-	stop();
+	va_start(ap, s);
+	vdiag(" (fatal)\n", s, ap);
+	va_end(ap);
+	stop(0);
 }
 
 #if DEBUG == 2
-assert2(file, line)
-char *file;
+void assert2(char *file, int line)
 {
 	fatal("assertion failed (%s, %d)", file, line);
 }
 #endif
 
 #if DEBUG == 1
-assert1()
+void assert1()
 {
-	diag(" (fatal)\n", "assertion failed");
+	vdiag(" (fatal)\n", "assertion failed");
 	abort();
 }
 #endif
 
 /* VARARGS1 */
-serror(s, a1, a2, a3, a4)
-char *s;
+void serror(char *s, ...)
 {
+	va_list ap;
 	nerrors++;
-	diag("\n", s, a1, a2, a3, a4);
+	va_start(ap, s);
+	vdiag("\n", s, ap);
+	va_end(ap);
 }
 
 /* VARARGS1 */
-warning(s, a1, a2, a3, a4)
-char *s;
+void warning(char *s, ...)
 {
-	diag(" (warning)\n", s, a1, a2, a3, a4);
+	va_list ap;
+	va_start(ap, s);
+	vdiag(" (warning)\n", s, ap);
+	va_end(ap);
 }
 
 /* VARARGS1 */
-diag(tail, s, a1, a2, a3, a4)
-char *tail, *s;
+void diag(char *tail, char *s, ...)
 {
-	fflush(stdout);
-	if (modulename)
-		fprintf(stderr, "\"%s\", line %ld: ", modulename, lineno);
-	else
-		fprintf(stderr, "%s: ", progname);
-	fprintf(stderr, s, a1, a2, a3, a4);
-	fprintf(stderr, tail);
+	va_list ap;
+	va_start(ap, s);
+	vdiag(tail, s, ap);
+	va_end(ap);
 }
 
-nofit()
+void nofit()
 {
 	if (pass == PASS_3)
 		warning("too big");