--- newoldar.c.orig	2020-11-19 16:42:08.172565183 -0500
+++ newoldar.c	2020-11-19 16:44:50.784705159 -0500
@@ -1,21 +1,30 @@
-/* from 2.9bsd src/cmd/ar.c and include/ar.h -- this takes care of 0177545 archive files
- * (the "new old" type) 
+/*
+ * newoldar - from 2.9bsd src/command/ar.c and include/ar.h -- this takes care of 0177545 archive files
+ * (the "new old" type)  
+ * updated 11/19/20 to compile with a modern compiler on a Mac
  */
 
+#include <stdlib.h>
+#include <unistd.h>
+#include <fcntl.h>
 #include <stdio.h>
+#include <machine/types.h>
 #include <sys/types.h>
 #include <sys/stat.h>
+#include <string.h>
 #include <signal.h>
+#include <time.h>
+
 struct	stat	stbuf;
 
 #if BYTE_ORDER == LITTLE_ENDIAN
 #define PDPTOHL(x) (((x & 0xffff) << 16) | ((x & 0xffff0000) >> 16))
 #define HTOPDPL(x) PDPTOHL(x)
 #else
-#define SWITCHWORD(x) (((x & 0xff) << 8) | ((x & 0xff00) >> 8))
+#define BYTESWAPWORD(x) ((unsigned short int) ((((x) & 0xff) << 8) | (((x) >>8) & 0xff)))
 #define PDPTOHL(x) \
-		((SWITCHWORD(x & 0xffff) << 16) \
-		 | SWITCHWORD((x & 0xffff0000) >> 16)))
+		((BYTESWAPWORD(x & 0xffff) << 16) \
+		 | BYTESWAPWORD((x & 0xffff0000) >> 16)))
 #define HTOPDPL(x) PDPTOHL(x)
 #endif
 
@@ -24,29 +33,22 @@
 #define	OODD	4
 #define	HEAD	8
 
+#define	OARMAG	0177555
 #define	ARMAG	0177545
+
 struct	ar_hdr {
-	char	ar_name[14];
-	long	ar_date;
-	char	ar_uid;
-	char	ar_gid;
-	unsigned short ar_mode;
-	long 	ar_size;
+	int8_t	ar_name[14];
+	int32_t	ar_date;
+	int8_t	ar_uid;
+	int8_t	ar_gid;
+	uint16_t ar_mode;
+	int32_t 	ar_size;
 }__attribute__((packed));
 struct	ar_hdr	arbuf;
 char	*man	=	{ "mrxtdpq" };
 char	*opt	=	{ "uvnbail" };
 
 int	signum[] = {SIGHUP, SIGINT, SIGQUIT, 0};
-int	sigdone();
-int	rcmd();
-int	dcmd();
-int	xcmd();
-int	tcmd();
-int	pcmd();
-int	mcmd();
-int	qcmd();
-int	(*comfun)();
 char	flg[26];
 char	**namv;
 int	namc;
@@ -68,14 +70,46 @@
 int	bastate;
 char	buf[512];
 
-char	*trim();
-char	*mktemp();
-char	*ctime();
+void bamatch(void);
+void cleanup(void);
+void copyfil(int, int, int);
+void dcommand(void);
+void done(int);
+int getaf(void);
+int getdir(void);
+void getqf(void);
+void init(void);
+void install(void);
+void longt(void);
+int match(void);
+void mcommand(void);
+void mesg(int);
+int morefil(void);
+void movefil(int);
+void noar(void);
+int notfound(void);
+void pcommand(void);
+void phserr(void);
+void pmode(void);
+void qcommand(void);
+void rcommand(void);
+void selectp(int *);
+void sigdone(int);
+int stats(void);
+void tcommand(void);
+char *trim(char *);
+void usage(void);
+void wrerr(void);
+void xcommand(void);
 
-main(argc, argv)
-char *argv[];
+
+int	(*comfun)(void);
+void setcom(int (*)(void));
+
+int
+main(int argc, char *argv[])
 {
-	register i;
+	register int i;
 	register char *cp;
 
 	for(i=0; signum[i]; i++)
@@ -98,31 +132,31 @@
 		continue;
 
 	case 'r':
-		setcom(rcmd);
+		setcom((int (*)(void))rcommand);
 		continue;
 
 	case 'd':
-		setcom(dcmd);
+		setcom((int (*)(void))dcommand);
 		continue;
 
 	case 'x':
-		setcom(xcmd);
+		setcom((int (*)(void))xcommand);
 		continue;
 
 	case 't':
-		setcom(tcmd);
+		setcom((int (*)(void))tcommand);
 		continue;
 
 	case 'p':
-		setcom(pcmd);
+		setcom((int (*)(void))pcommand);
 		continue;
 
 	case 'm':
-		setcom(mcmd);
+		setcom((int (*)(void))mcommand);
 		continue;
 
 	case 'q':
-		setcom(qcmd);
+		setcom((int (*)(void))qcommand);
 		continue;
 
 	default:
@@ -152,14 +186,15 @@
 			fprintf(stderr, "ar: one of [%s] must be specified\n", man);
 			done(1);
 		}
-		setcom(rcmd);
+		setcom((int (*)(void))rcommand);
 	}
 	(*comfun)();
 	done(notfound());
+	return(0);
 }
 
-setcom(fun)
-int (*fun)();
+void
+setcom(int (*fun)(void) )
 {
 
 	if(comfun != 0) {
@@ -169,9 +204,9 @@
 	comfun = fun;
 }
 
-rcmd()
+void rcommand(void)
 {
-	register f;
+	register int f;
 
 	init();
 	getaf();
@@ -201,7 +236,7 @@
 	cleanup();
 }
 
-dcmd()
+void dcommand(void)
 {
 
 	init();
@@ -219,9 +254,10 @@
 	install();
 }
 
-xcmd()
+
+void xcommand(void)
 {
-	register f;
+	register int f;
 
 	if(getaf())
 		noar();
@@ -245,7 +281,8 @@
 	}
 }
 
-pcmd()
+
+void pcommand(void)
 {
 
 	if(getaf())
@@ -263,7 +300,7 @@
 	}
 }
 
-mcmd()
+void mcommand(void)
 {
 
 	init();
@@ -289,7 +326,8 @@
 	install();
 }
 
-tcmd()
+
+void tcommand(void)
 {
 
 	if(getaf())
@@ -304,9 +342,9 @@
 	}
 }
 
-qcmd()
+void qcommand(void)
 {
-	register i, f;
+	register int i, f;
 
 	if (flg['a'-'a'] || flg['b'-'a']) {
 		fprintf(stderr, "ar: abi not allowed with q\n");
@@ -333,9 +371,9 @@
 	}
 }
 
-init()
+void init(void)
 {
-	static mbuf = ARMAG;
+	static uint16_t mbuf = ARMAG;
 
 	tfnam = mktemp(tmpnam_hah_hah);
 	close(creat(tfnam, 0600));
@@ -348,9 +386,9 @@
 		wrerr();
 }
 
-getaf()
+int getaf(void)
 {
-	unsigned short mbuf;
+	uint16_t mbuf;
 
 	af = open(arnam, 0);
 	if(af < 0)
@@ -363,9 +401,9 @@
 	return(0);
 }
 
-getqf()
+void getqf(void)
 {
-	unsigned short mbuf;
+	uint16_t mbuf;
 
 	if ((qf = open(arnam, 2)) < 0) {
 		if(!flg['c'-'a'])
@@ -386,25 +424,27 @@
 	}
 }
 
-usage()
+void usage(void)
 {
 	printf("usage: ar [%s][%s] archive files ...\n", opt, man);
 	done(1);
 }
 
-noar()
+void noar(void)
 {
 
 	fprintf(stderr, "ar: %s does not exist\n", arnam);
 	done(1);
 }
 
-sigdone()
+void sigdone(int sig)
 {
 	done(100);
 }
 
-done(c)
+
+void 
+done(int c)
 {
 
 	if(tfnam)
@@ -416,9 +456,10 @@
 	exit(c);
 }
 
-notfound()
+int
+notfound(void)
 {
-	register i, n;
+	register int i, n;
 
 	n = 0;
 	for(i=0; i<namc; i++)
@@ -429,9 +470,10 @@
 	return(n);
 }
 
-morefil()
+int
+morefil(void)
 {
-	register i, n;
+	register int i, n;
 
 	n = 0;
 	for(i=0; i<namc; i++)
@@ -440,9 +482,9 @@
 	return(n);
 }
 
-cleanup()
+void cleanup(void)
 {
-	register i, f;
+	register int i, f;
 
 	for(i=0; i<namc; i++) {
 		file = namv[i];
@@ -460,9 +502,10 @@
 	install();
 }
 
-install()
+void
+install(void)
 {
-	register i;
+	register int i;
 
 	for(i=0; signum[i]; i++)
 		signal(signum[i], SIG_IGN);
@@ -499,15 +542,16 @@
  * insert the file 'file'
  * into the temporary file
  */
-movefil(f)
+void movefil(int f)
 {
 	register char *cp;
-	register i;
+	register int i;
 
 	cp = trim(file);
 	for(i=0; i<14; i++)
-		if(arbuf.ar_name[i] = *cp)
+		if ((arbuf.ar_name[i] = *cp)) {
 			cp++;
+        }
 	arbuf.ar_size = HTOPDPL(stbuf.st_size);
 	arbuf.ar_date = HTOPDPL(stbuf.st_mtime);
 	arbuf.ar_uid = stbuf.st_uid;
@@ -517,9 +561,9 @@
 	close(f);
 }
 
-stats()
+int stats(void)
 {
-	register f;
+	register int f;
 
 	f = open(file, 0);
 	if(f < 0)
@@ -535,9 +579,10 @@
  * copy next file
  * size given in arbuf
  */
-copyfil(fi, fo, flag)
+void
+copyfil(int fi, int fo, int flag)
 {
-	register i, o;
+	register int i, o;
 	int pe;
 	int arsize = PDPTOHL(arbuf.ar_size);
 
@@ -567,9 +612,9 @@
 		phserr();
 }
 
-getdir()
+int getdir(void)
 {
-	register i;
+	register int i;
 
 	i = read(af, (char *)&arbuf, sizeof arbuf);
 	if(i != sizeof arbuf) {
@@ -586,9 +631,10 @@
 	return(0);
 }
 
-match()
+int
+match(void)
 {
-	register i;
+	register int i;
 
 	for(i=0; i<namc; i++) {
 		if(namv[i] == 0)
@@ -602,9 +648,10 @@
 	return(0);
 }
 
-bamatch()
+void
+bamatch(void)
 {
-	register f;
+	register int f;
 
 	switch(bastate) {
 
@@ -629,12 +676,13 @@
 	}
 }
 
-phserr()
+void phserr(void)
 {
 	fprintf(stderr, "ar: phase error on %s\n", file);
 }
 
-mesg(c)
+void
+mesg(int c)
 {
 
 	if(flg['v'-'a'])
@@ -642,9 +690,9 @@
 			printf("%c - %s\n", c, file);
 }
 
+
 char *
-trim(s)
-char *s;
+trim(char *s)
 {
 	register char *p1, *p2;
 
@@ -678,16 +726,17 @@
 #define	XOTH	01
 #define	STXT	01000
 
-longt()
+void
+longt(void)
 {
-	register char *cp;
-	long ardate = PDPTOHL(arbuf.ar_date);
-	long arsize = PDPTOHL(arbuf.ar_size);
+	char *cp;
+	time_t ardate = PDPTOHL(arbuf.ar_date);
+	int32_t arsize = PDPTOHL(arbuf.ar_size);
 	
 	pmode();
 	printf("%3d/%1d", arbuf.ar_uid, arbuf.ar_gid);
 	printf(" %7D", arsize);
-	cp = ctime(&ardate);
+	cp = ctime(&(ardate));
 	printf(" %-12.12s %-4.4s ", cp+4, cp+20);
 }
 
@@ -703,16 +752,17 @@
 
 int	*m[] = { m1, m2, m3, m4, m5, m6, m7, m8, m9};
 
-pmode()
+void
+pmode(void)
 {
 	register int **mp;
 
 	for (mp = &m[0]; mp < &m[9];)
-		select(*mp++);
+		selectp(*mp++);
 }
 
-select(pairp)
-int *pairp;
+void
+selectp(int *pairp)
 {
 	register int n, *ap;
 
@@ -723,7 +773,8 @@
 	putchar(*ap);
 }
 
-wrerr()
+void
+wrerr(void)
 {
 	perror("ar write error");
 	done(1);