--- zoo/ar.h
+++ zoo/ar.h
@@ -15,11 +15,9 @@
 /* uchar should be 8 bits or more */
 /* typedef unsigned char  uchar;   -- already in zoo.h */
 
-typedef unsigned int   uint;    /* 16 bits or more */
-#if !defined(__386BSD__) || !defined(_TYPES_H_)
-typedef unsigned short ushort;  /* 16 bits or more */
-#endif
-typedef unsigned long  ulong;   /* 32 bits or more */
+typedef unsigned int   my_uint;    /* 16 bits or more */
+typedef unsigned short my_ushort;  /* 16 bits or more */
+typedef unsigned long  my_ulong;   /* 32 bits or more */
 
 /* T_UINT16 must be #defined in options.h to be 
 a 16-bit unsigned integer type */
@@ -49,7 +47,7 @@
 /* ar.c */
 
 extern int unpackable;
-extern ulong origsize, compsize;
+extern my_ulong origsize, compsize;
 
 /* all the prototypes follow here for all files */
 
@@ -78,7 +76,7 @@
 
 /* DECODE.C */
 void decode_start PARMS((void ));
-int decode PARMS((uint count , uchar *buffer));
+int decode PARMS((uint count , uchar buffer []));
 
 /* ENCODE.C */
 void encode PARMS((FILE *, FILE *));
@@ -87,14 +85,14 @@
 void output PARMS((uint c , uint p ));
 void huf_encode_start PARMS((void ));
 void huf_encode_end PARMS((void ));
-uint decode_c PARMS((void ));
-uint decode_p PARMS((void ));
+my_uint decode_c PARMS((void ));
+my_uint decode_p PARMS((void ));
 void huf_decode_start PARMS((void ));
 
 /* IO.C */
 void make_crctable PARMS((void ));
 void fillbuf PARMS((int n ));
-uint getbits PARMS((int n ));
+my_uint getbits PARMS((int n ));
 void putbits PARMS((int n , uint x ));
 int fread_crc PARMS((uchar *p , int n , FILE *f ));
 void fwrite_crc PARMS((uchar *p , int n , FILE *f ));
--- zoo/basename.c
+++ zoo/basename.c
@@ -18,7 +18,7 @@
 
 /* This function strips device/directory information from
 a pathname and returns just the plain filename */
-void basename (pathname, fname)
+void mybasename (pathname, fname)
 char *pathname;
 char fname[];
 {
--- zoo/bsd.c
+++ zoo/bsd.c
@@ -74,26 +74,14 @@
 #define SEC_IN_DAY	(24L * 60L * 60L)
 #define INV_VALUE		(SEC_IN_DAY + 1L)
 	static long retval = INV_VALUE;	     /* cache, init to impossible value */
-#ifndef __386BSD__
    struct timeval tp;
    struct timezone tzp;
-#else
-   time_t lt;
-   struct tm *tm;
-#endif
 	if (retval != INV_VALUE)				 /* if have cached value, return it */
 		return retval;
-#ifndef __386BSD__
    gettimeofday (&tp, &tzp);              /* specific to 4.3BSD */
    /* return (tzp.tz_minuteswest * 60); */ /* old incorrect code */
 	/* Timezone fix thanks to Bill Davidsen <wedu@ge-crd.ARPA> */
-	/* !! - ache@hq.demos.su */
-	retval = tzp.tz_minuteswest * 60 - (tzp.tz_dsttime != 0) * 3600L;
-#else
-	time(&lt);
-	tm = localtime(&lt);
-	retval = -tm->tm_gmtoff;
-#endif
+	retval = tzp.tz_minuteswest * 60 - tzp.tz_dsttime * 3600L;
 	return retval;
 }
 
--- zoo/decode.c
+++ zoo/decode.c
@@ -27,8 +27,8 @@
 */
 
 int decode(count, buffer)
-uint count;
-uchar *buffer;
+my_uint count;
+uchar buffer[];
 	/* The calling function must keep the number of
 	   bytes to be processed.  This function decodes
 	   either 'count' bytes or 'DICSIZ' bytes, whichever
@@ -37,8 +37,8 @@
 	   Call decode_start() once for each new file
 	   before calling this function. */
 {
-	static uint i;
-	uint r, c;
+	static my_uint i;
+	my_uint r, c;
 
 	r = 0;
 	while (--j >= 0) {
--- zoo/encode.c
+++ zoo/encode.c
@@ -5,11 +5,6 @@
 Adapted from "ar" archiver written by Haruhiko Okumura.
 */
 
-#ifdef ANSI_HDRS
-# include <stdlib.h>
-# include <string.h>
-#endif
-
 #include "options.h"
 #include "zoo.h"
 #include "ar.h"
@@ -20,6 +15,11 @@
 
 #include <assert.h>
 
+#ifdef ANSI_HDRS
+# include <stdlib.h>
+# include <string.h>
+#endif
+
 #include "errors.i"
 
 FILE *lzh_infile;
--- zoo/huf.c
+++ zoo/huf.c
@@ -5,10 +5,6 @@
 
 Adapted from "ar" archiver written by Haruhiko Okumura.
 ***********************************************************/
-#ifdef ANSI_HDRS
-# include <stdlib.h>
-#endif
-
 #include "options.h"
 #include "zoo.h"
 #include "ar.h"
@@ -17,6 +13,10 @@
 
 extern void prterror();
 
+#ifdef ANSI_HDRS
+# include <stdlib.h>
+#endif
+
 #define NP (DICBIT + 1)
 #define NT (CODE_BIT + 3)
 #define PBIT 4  /* smallest integer such that (1U << PBIT) > NP */
--- zoo/lzd.c
+++ zoo/lzd.c
@@ -59,7 +59,7 @@
 extern unsigned int filt_lzd_word;
 #endif /* FILTER */
 
-void xwr_dchar PARMS ((int));
+void xwr_dchar PARMS ((char));
 static int firstchar PARMS ((int));
 static void cbfill PARMS ((void));
 
--- zoo/lzh.c
+++ zoo/lzh.c
@@ -45,14 +45,14 @@
 
 	decode_start();
 	while (!decoded) {
-		n = decode((uint) DICSIZ, (uchar *)out_buf_adr); /* n = count of chars decoded */
+		n = decode((my_uint) DICSIZ, out_buf_adr); /* n = count of chars decoded */
 #ifdef COUNT_BYTES
 		bytes_decoded += n;	/*debug*/
 #endif
 #ifdef CHECK_BREAK
 		check_break();
 #endif
-		fwrite_crc((uchar *)out_buf_adr, n, outfile);
+		fwrite_crc(out_buf_adr, n, outfile);
 #ifdef SHOW_DOTS
 		(void) putc('.', stderr);
 		(void) fflush(stderr);
--- zoo/lzh.h
+++ zoo/lzh.h
@@ -34,4 +34,4 @@
 #define CBIT 9  /* $\lfloor \log_2 NC \rfloor + 1$ */
 #define CODE_BIT  16  /* codeword length */
 
-extern ushort left[], right[];
+extern my_ushort left[], right[];
--- zoo/makefile
+++ zoo/makefile
@@ -18,13 +18,12 @@
 
 MAKE = make	      # needed for some systems e.g. older BSD
 
-CC = cc
+CC = gcc
-CFLAGS =
 MODEL =
 EXTRA = -DBIG_MEM -DNDEBUG
 LINTFLAGS = -DLINT
-OPTIM = -O
-DESTDIR = /usr/local/bin
+OPTIM = $(CFLAGS)
+DESTDIR = /usr/bin
 
 #List of all object files created for Zoo
 ZOOOBJS = addbfcrc.o addfname.o basename.o comment.o crcdefs.o \
@@ -50,6 +50,7 @@
 	@echo "generic:      generic **IX environment, minimal functionlity"
 	@echo "bsd:          4.3BSD or reasonable equivalent"
 	@echo "bsdansi:      4.3BSD with ANSI C"
+	@echo "linux:	     Linux for Alpha & i386"
 	@echo "ultrix:       ULTRIX 4.1"
 	@echo "convex:       Convex C200 series"
 	@echo "sysv:         System V Release 2 or 3; or SCO Xenix"
@@ -106,6 +107,10 @@
 convex:
 	$(MAKE) CFLAGS="-c $(OPTIM) -DBSD4_3 -DANSI_HDRS" $(TARGETS)
 
+# Linux
+linux:
+	$(MAKE) CFLAGS="-c $(OPTIM) -DSYS_V -DANSI_HDRS -DHAVE_MKDIR" $(TARGETS)
+
 # SysV.2, V.3, SCO Xenix
 sysv:
 	$(MAKE) CFLAGS="-c $(OPTIM) -DSYS_V" $(TARGETS)
@@ -235,7 +240,7 @@
 parse.o: zoofns.h zooio.h
 portable.o: /usr/include/stdio.h assert.h debug.h machine.h options.h
 portable.o: portable.h various.h zoo.h zoofns.h zooio.h
-prterror.o: /usr/include/stdio.h /usr/include/varargs.h options.h various.h
+prterror.o: /usr/include/stdio.h options.h various.h
 prterror.o: zoofns.h zooio.h
 sysv.o: /usr/include/sys/stat.h /usr/include/sys/types.h /usr/include/time.h
 sysv.o: nixmode.i nixtime.i
--- zoo/maketbl.c
+++ zoo/maketbl.c
@@ -16,10 +16,10 @@
 int nchar;
 uchar bitlen[];
 int tablebits;
-ushort table[];
+my_ushort table[];
 {
-	ushort count[17], weight[17], start[18], *p;
-	uint i, k, len, ch, jutbits, avail, nextcode, mask;
+	my_ushort count[17], weight[17], start[18], *p;
+	my_uint i, k, len, ch, jutbits, avail, nextcode, mask;
 
 	for (i = 1; i <= 16; i++) count[i] = 0;
 	for (i = 0; i < nchar; i++) count[bitlen[i]]++;
@@ -27,7 +27,7 @@
 	start[1] = 0;
 	for (i = 1; i <= 16; i++)
 		start[i + 1] = start[i] + (count[i] << (16 - i));
-	if (start[17] != (ushort)((unsigned) 1 << 16))
+	if (start[17] != (my_ushort)((unsigned) 1 << 16))
 		prterror('f', "Bad decode table\n");
 
 	jutbits = 16 - tablebits;
@@ -41,7 +41,7 @@
         }
 
 	i = start[tablebits + 1] >> jutbits;
-	if (i != (ushort)((unsigned) 1 << 16)) {
+	if (i != (my_ushort)((unsigned) 1 << 16)) {
 		k = 1 << tablebits;
 		while (i != k) table[i++] = 0;
 	}
--- zoo/maketree.c
+++ zoo/maketree.c
@@ -12,7 +12,7 @@
 
 static int    n, heapsize;
 static short  heap[NC + 1];
-static ushort *freq, *sortptr, len_cnt[17];
+static my_ushort *freq, *sortptr, len_cnt[17];
 static uchar  *len;
 
 static void count_len(i)  /* call with i = root */
@@ -33,7 +33,7 @@
 int root;
 {
 	int i, k;
-	uint cum;
+	my_uint cum;
 
 	for (i = 0; i <= 16; i++) len_cnt[i] = 0;
 	count_len(root);
@@ -75,10 +75,10 @@
 static void make_code(j, length, code)
 int j;
 uchar length[];
-ushort code[];
+my_ushort code[];
 {
 	int    i;
-	ushort start[18];
+	my_ushort start[18];
 
 	start[1] = 0;
 	for (i = 1; i <= 16; i++)
@@ -88,9 +88,9 @@
 
 int make_tree(nparm, freqparm, lenparm, codeparm)
 int nparm;
-ushort freqparm[];
+my_ushort freqparm[];
 uchar lenparm[];
-ushort codeparm[];
+my_ushort codeparm[];
 	/* make tree, calculate len[], return root */
 {
 	int i, j, k, avail;
--- zoo/options.h
+++ zoo/options.h
@@ -31,7 +31,7 @@
 #define GETTZ
 #define FATTR
 #define T_SIGNAL	void
-#define VARARGS
+#define STDARG
 #define NEED_MEMMOVE
 /* #define NEED_MEMCPY */
 #define T_UINT16		unsigned short		/* must be 16 bit unsigned */
@@ -73,6 +73,7 @@
 /* #define UNBUF_LIMIT	512 */
 #define  T_SIGNAL void
 #define DIRECT_CONVERT
+#define STDARG
 #define CHECK_BREAK
 #define check_break kbhit
 #define HAVE_ISATTY
@@ -88,6 +89,7 @@
 /***********************************************************************/
 
 #ifdef BSD4_3
+#define NOSTRCHR /* not really needed for 4.3BSD */
 #define FILTER
 #define IO_MACROS
 #define EXISTS(f)		(access(f, 00) == 0)
@@ -101,23 +103,12 @@
 #define SETBUF
 #define GETTZ
 #define FATTR
-#ifdef __STDC__
-#ifndef ANSI_HDRS
-#define ANSI_HDRS
-#endif
-#define T_SIGNAL        void
-#define STDARG
-#define ANSI_PROTO
-#define VOIDPTR		void *
-#else
-#define NOSTRCHR /* not really needed for 4.3BSD */
 #define T_SIGNAL	int
 #define VARARGS
 #define NEED_MEMMOVE
-#define NEED_VPRINTF		/* older BSDs only; newer ones have vprintf */
-#endif
 #define T_UINT16		unsigned short		/* must be 16 bit unsigned */
 #define HAVE_ISATTY
+#define NEED_VPRINTF		/* older BSDs only; newer ones have vprintf */
 #endif /* BSD4_3 */
 
 /*  Ultrix 4.1 */
--- zoo/prterror.c
+++ zoo/prterror.c
@@ -23,15 +23,7 @@
 # include <ctype.h>	/* for isdigit() */
 #endif
 
-#ifdef STDARG
 # include <stdarg.h>
-#else
-# ifdef VARARGS
-#  include <varargs.h>
-# else
-#  include "MUST DEFINE STDARG OR VARARGS"
-# endif
-#endif
 
 #ifdef NEED_VPRINTF
 static int zvfprintf();
@@ -115,29 +107,11 @@
 char could_not_open[] = "Could not open %s.\n";
 #endif
 
-#ifdef STDARG
-void prterror(int level, char *format, ...)
-#else
-/*VARARGS*/
-void prterror(va_alist)
-va_dcl
-#endif
+void prterror(level, format, a, b, c, d)
+register int level;
+char *format, *a, *b, *c, *d;
 {
-	va_list args;
    char string[120];       /* local format string */
-#ifdef VARARGS
-	int level;
-	char *format;
-#endif
-
-#ifdef STDARG
-	va_start(args, format);
-#else
-	va_start(args);
-	level = va_arg(args, int);
-	format = va_arg(args, char *);
-#endif
-
    *string = '\0';         /* get a null string to begin with */
 
 #ifdef OOZ
@@ -149,7 +123,7 @@
    switch (level) {
       case 'M': *string = '\0';                    /* fall through to 'm' */
       case 'm': if (quiet) return; break;
-      case 'w': 
+      case 'w':
 			if (quiet > 1) return;
 			strcat (string, "WARNING:  "); break;
       case 'e': 
@@ -163,12 +137,8 @@
    strcat (string, format);      /* just append supplied format string */
 
 	/* and print the whole thing */
-#ifdef NEED_VPRINTF
-	(void) zvfprintf(stdout, string, args);
-#else
-   (void) vprintf(string, args);
-#endif
-	fflush (stdout);
+   printf (string, a, b, c, d);   /* and print the whole thing */
+        fflush (stdout);
 
    if (level == 'f')       /* and abort on fatal error 'f' but not 'F' */
       zooexit (1);
--- zoo/sysv.c
+++ zoo/sysv.c
@@ -129,6 +129,7 @@
 exists by the name of the needed directory.
 */
 
+#ifndef HAVE_MKDIR
 int mkdir(dirname)
 char *dirname;
 {
@@ -140,6 +141,7 @@
    }
 	return (0);
 }
+#endif
 
 /* No file truncate system call in older System V.  If yours has one,
 add it here -- see bsd.c for example.  It's ok for zootrunc to be
--- zoo/zoo.1
+++ zoo/zoo.1
@@ -176,15 +176,15 @@
 Novice@@Equivalent
 Command@Description@Expert Command
 _
-\-add@add files to archive@ahP
+\-add@add files to archive@aP:
 \-extract@extract files from archive@x
-\-move@move files to archive@ahMP
+\-move@move files to archive@aMP:
 \-test@test archive integrity@xNd
 \-print@extract files to standard output@xp
 \-delete@delete files from archive@DP
-\-list@list archive contents@Vm
-\-update@add new or newer files@ahunP
-\-freshen@by add newer files@ahuP
+\-list@list archive contents@VC
+\-update@add new or newer files@aunP:
+\-freshen@by add newer files@auP:
 \-comment@add comments to files@c
 .TE
 .fi
@@ -1041,7 +1041,7 @@
 Matches any sequence of zero or more characters.
 .PP
 .TP
-.B ?
+.B \?
 Matches any single character.
 .sp 1
 Arbitrary combinations of 
--- zoo/zoo.c
+++ zoo/zoo.c
@@ -225,17 +225,17 @@
    if (cmd != NONE) {
       switch (cmd) {
 
-	 case ADD:      zooadd (zooname, filecount, &argv[3], "ahP"); break;
-	 case FRESHEN:  zooadd (zooname, filecount, &argv[3], "ahuP"); break;
-	 case UPDATE:   zooadd (zooname, filecount, &argv[3], "ahunP"); break;
-	 case MOVE:     zooadd (zooname, filecount, &argv[3], "ahMP"); break;
+	 case ADD:      zooadd (zooname, filecount, &argv[3], "aP:"); break;
+	 case FRESHEN:  zooadd (zooname, filecount, &argv[3], "auP:"); break;
+	 case UPDATE:   zooadd (zooname, filecount, &argv[3], "aunP:"); break;
+	 case MOVE:     zooadd (zooname, filecount, &argv[3], "aMP:"); break;
 
          case EXTRACT:  zooext (zooname, "x"); break;
          case TEST:     zooext (zooname, "xNd"); break;
          case PRINT:    zooext (zooname, "xp"); break;
 
          case DELETE:   zoodel (zooname, "DP",1); break;
-	 case LIST:     zoolist (&argv[2], "Vm", argc-2); break;
+	 case LIST:     zoolist (&argv[2], "VC", argc-2); break;
          case COMMENT:  comment (zooname, "c"); break;
          default: goto show_usage;
       }
--- zoo/zoo.h
+++ zoo/zoo.h
@@ -131,7 +127,7 @@
    char fname[FNAMESIZE]; 		/* filename */
 
    int var_dir_len;           /* length of variable part of dir entry */
-   char tz;                   /* timezone where file was archived */
+   uchar tz;                   /* timezone where file was archived */
    unsigned int dir_crc;      /* CRC of directory entry */
 
    /* fields for variable part of directory entry follow */
--- zoo/zoo.man
+++ zoo/zoo.man
@@ -121,15 +121,15 @@
      Novice                                        Equivalent
      Command    Description                        Expert Command
      ____________________________________________________________
-     -add       add files to archive               ahP
+     -add       add files to archive               aP
      -extract   extract files from archive         x
-     -move      move files to archive              ahMP
+     -move      move files to archive              aMP
      -test      test archive integrity             xNd
      -print     extract files to standard output   xp
      -delete    delete files from archive          DP
-     -list      list archive contents              Vm
-     -update    add new or newer files             ahunP
-     -freshen   by add newer files                 ahuP
+     -list      list archive contents              VC
+     -update    add new or newer files             aunP
+     -freshen   by add newer files                 auP
      -comment   add comments to files              c
 
      Expert commands
--- zoo/zooadd.c
+++ zoo/zooadd.c
@@ -34,9 +34,7 @@
                int *, int *, int *, int *, int *, int *, int *, int *));
 int ver_too_high PARMS ((struct zoo_header *));
 void get_comment PARMS ((struct direntry *, ZOOFILE, char *));
-#ifndef PORTABLE
 void copyfields PARMS ((struct direntry *, struct tiny_header *));
-#endif
 void storefname PARMS ((struct direntry *, char *, int));
 char *choosefname PARMS ((struct direntry *));
 
@@ -134,7 +132,7 @@
 
 if (zoo_file == NOFILE)
    prterror ('f', could_not_open, zoo_path);
-basename(zoo_path, zoo_fname);      /* get basename of archive */
+mybasename(zoo_path, zoo_fname);      /* get basename of archive */
 rootname (zoo_path, zoo_bak);       /* name without extension */
 strcat (zoo_bak, BACKUP_EXT);       /* name of backup of this archive */
 
@@ -224,7 +222,7 @@
 		break;
 	}
 
-   basename (this_path, this_fname);   /* get just filename for later */
+   mybasename (this_path, this_fname);   /* get just filename for later */
 
    this_file = zooopen(this_path, Z_READ);
    if (this_file == NOFILE) {
--- zoo/zooadd2.c
+++ zoo/zooadd2.c
@@ -263,7 +263,7 @@
    direntry->zoo_tag = ZOO_TAG;
    direntry->type = 2;                  /* type is now 2 */
 #ifdef GETTZ
-	direntry->tz = gettz() / (15 * 60); /* seconds => 15-min units */
+	direntry->tz = (uchar) (gettz() / (15 * 60)); /* seconds => 15-min units */
 #else
    direntry->tz = NO_TZ;                /* timezone unknown */
 #endif
--- zoo/zooext.c
+++ zoo/zooext.c
@@ -626,7 +626,7 @@
 
 /* Ctrl_c() is called if ^C is hit while a file is being extracted.
    It closes the files, deletes it, and exits. */
-T_SIGNAL ctrl_c(int foo)
+T_SIGNAL ctrl_c()
 {
 #ifndef NOSIGNAL
    signal (SIGINT, SIG_IGN);     /* ignore any more */
--- zoo/zoofns.h
+++ zoo/zoofns.h
@@ -42,12 +42,12 @@
 int cfactor PARMS ((long, long));
 int chname PARMS ((char *, char *));
 int cmpnum PARMS ((unsigned int, unsigned int, unsigned int, unsigned int));
-T_SIGNAL ctrl_c PARMS ((int));
+T_SIGNAL ctrl_c PARMS ((void));
 int exists PARMS ((char *));
 int getfile PARMS ((ZOOFILE, ZOOFILE, long, int));
 int getutime PARMS ((char *, unsigned *, unsigned *));
 int gettime PARMS ((ZOOFILE, unsigned *, unsigned *));
-T_SIGNAL handle_break PARMS ((int));
+T_SIGNAL handle_break PARMS ((void));
 
 #ifdef USE_ASCII
 int isupper PARMS ((int));
@@ -85,7 +85,9 @@
 void addfname PARMS ((char *, long, unsigned int, unsigned int, 
 							unsigned, unsigned));
 void add_version PARMS ((char *, struct direntry *));
-void basename PARMS ((char *, char []));
+void mybasename PARMS ((char *, char []));
+int isfdir PARMS ((char *));
+int isadir PARMS ((ZOOFILE));
 void break_off PARMS ((void));
 void close_file PARMS ((ZOOFILE));
 void comment PARMS ((char *, char *));
--- zoo/zooio.h
+++ zoo/zooio.h
@@ -12,8 +12,6 @@
 #define	OK_STDIO
 #endif
 
-#include "zoo.h"
-
 #ifndef PARMS
 #ifdef LINT_ARGS
 #define	PARMS(x)		x
--- zoo/zoopack.c
+++ zoo/zoopack.c
@@ -171,8 +171,19 @@
 } else {
    strcpy (temp_file, xes);
 }
-mktemp (temp_file);                    /* ... and make unique */
-new_file = zoocreate (temp_file);
+
+/* make unique name */
+/* my god, this coding style sucks */
+new_file = NOFILE;
+{
+  int fd;
+
+  if ((fd = mkstemp(temp_file)) >= 0) {
+    new_file = zoocreate (temp_file);
+    close(fd);
+  }
+}
+
 if (new_file == NOFILE)
    prterror ('f', "Could not create temporary file %s.\n", temp_file);
 
@@ -388,7 +388,7 @@
 
 /* handle_break() */
 /* Sets break_hit to 1 when called */
-T_SIGNAL handle_break(int foo)
+T_SIGNAL handle_break()
 {
 #ifndef NOSIGNAL
    signal (SIGINT, SIG_IGN);     /* ignore future control ^Cs for now */

--- zoo/various.h
+++ zoo/various.h
@@ -23,6 +23,8 @@
 #endif
 #endif
 
+#include <unistd.h>
+
 #ifdef ANSI_HDRS /* if not defined in stdio.h */
 # include <string.h>
 # include <stdlib.h>
@@ -44,7 +44,6 @@
 int fgetc PARMS ((FILE *));
 int fgetchar PARMS (());
 int fprintf PARMS ((FILE *, char *, ...));
-int fputchar PARMS ((int));
 int fputs PARMS ((char *, FILE *));
 
 #ifndef NO_STDIO_FN
@@ -71,3 +70,4 @@
 
 #endif /* ! ANSI_HDRS */
 
+int fputchar PARMS ((int));
