diff --git a/CHANGES b/CHANGES
index 721144b..19a728f 100644
--- a/CHANGES
+++ b/CHANGES
@@ -267,3 +267,4 @@
    updated some of the makefiles (Tom Lane)
    changed some typedefs (s_start, etc.) in pngrutil.c
    fixed dimensions of "short_months" array in pngwrite.c
+   Replaced ansi2knr.c with the one from jpeg-v6
diff --git a/ansi2knr.c b/ansi2knr.c
index 3924215..4e05fc2 100644
--- a/ansi2knr.c
+++ b/ansi2knr.c
@@ -1,26 +1,32 @@
-/* Copyright (C) 1989, 1991, 1993 Aladdin Enterprises. All rights reserved. */
-
 /* ansi2knr.c */
-/* Convert ANSI function declarations to K&R syntax */
+/* Convert ANSI C function definitions to K&R ("traditional C") syntax */
 
 /*
-ansi2knr is distributed in the hope that it will be useful, but
-WITHOUT ANY WARRANTY.  No author or distributor accepts responsibility
-to anyone for the consequences of using it or for whether it serves any
-particular purpose or works at all, unless he says so in writing.  Refer
-to the GNU General Public License for full details.
+ansi2knr is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY.  No author or distributor accepts responsibility to anyone for the
+consequences of using it or for whether it serves any particular purpose or
+works at all, unless he says so in writing.  Refer to the GNU General Public
+License (the "GPL") for full details.
 
-Everyone is granted permission to copy, modify and redistribute
-ansi2knr, but only under the conditions described in the GNU
-General Public License.  A copy of this license is supposed to have been
-given to you along with ansi2knr so you can know your rights and
-responsibilities.  It should be in a file named COPYING.  Among other
-things, the copyright notice and this notice must be preserved on all
-copies.
+Everyone is granted permission to copy, modify and redistribute ansi2knr,
+but only under the conditions described in the GPL.  A copy of this license
+is supposed to have been given to you along with ansi2knr so you can know
+your rights and responsibilities.  It should be in a file named COPYLEFT.
+[In the IJG distribution, the GPL appears below, not in a separate file.]
+Among other things, the copyright notice and this notice must be preserved
+on all copies.
+
+We explicitly state here what we believe is already implied by the GPL: if
+the ansi2knr program is distributed as a separate set of sources and a
+separate executable file which are aggregated on a storage medium together
+with another program, this in itself does not bring the other program under
+the GPL, nor does the mere fact that such a program or the procedures for
+constructing it invoke the ansi2knr executable bring any other part of the
+program under the GPL.
 */
 
 /*
----------- Here is the GNU GPL file COPYING, referred to above ----------
+---------- Here is the GNU GPL file COPYLEFT, referred to above ----------
 ----- These terms do NOT apply to the JPEG software itself; see README ------
 
 		    GHOSTSCRIPT GENERAL PUBLIC LICENSE
@@ -166,59 +172,142 @@
 HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES, OR FOR ANY CLAIM
 BY ANY OTHER PARTY.
 
--------------------- End of file COPYING ------------------------------
+-------------------- End of file COPYLEFT ------------------------------
 */
 
-
-#include <stdio.h>
-#include <ctype.h>
-
-#ifdef BSD
-#include <strings.h>
-#else
-#ifdef VMS
-	extern int strlen(), strncmp();
-#else
-#include <string.h>
-#endif
-#endif
-
-/* malloc and free should be declared in stdlib.h, */
-/* but if you've got a K&R compiler, they probably aren't. */
-#ifdef MSDOS
-#include <malloc.h>
-#else
-#ifdef VMS
-     extern char *malloc();
-     extern void free();
-#else
-     extern char *malloc();
-     extern int free();
-#endif
-#endif
-
-/* Usage:
+/*
+ * Usage:
 	ansi2knr input_file [output_file]
  * If no output_file is supplied, output goes to stdout.
  * There are no error messages.
  *
- * ansi2knr recognizes functions by seeing a non-keyword identifier
- * at the left margin, followed by a left parenthesis,
- * with a right parenthesis as the last character on the line.
- * It will recognize a multi-line header provided that the last character
- * of the last line of the header is a right parenthesis,
- * and no intervening line ends with a left brace or a semicolon.
+ * ansi2knr recognizes function definitions by seeing a non-keyword
+ * identifier at the left margin, followed by a left parenthesis,
+ * with a right parenthesis as the last character on the line,
+ * and with a left brace as the first token on the following line
+ * (ignoring possible intervening comments).
+ * It will recognize a multi-line header provided that no intervening
+ * line ends with a left or right brace or a semicolon.
  * These algorithms ignore whitespace and comments, except that
  * the function name must be the first thing on the line.
  * The following constructs will confuse it:
  *	- Any other construct that starts at the left margin and
  *	    follows the above syntax (such as a macro or function call).
- *	- Macros that tinker with the syntax of the function header.
+ *	- Some macros that tinker with the syntax of the function header.
  */
 
+/*
+ * The original and principal author of ansi2knr is L. Peter Deutsch
+ * <ghost@aladdin.com>.  Other authors are noted in the change history
+ * that follows (in reverse chronological order):
+	lpd 96-01-21 added code to cope with not HAVE_CONFIG_H and with
+		compilers that don't understand void, as suggested by
+		Tom Lane
+	lpd 96-01-15 changed to require that the first non-comment token
+		on the line following a function header be a left brace,
+		to reduce sensitivity to macros, as suggested by Tom Lane
+		<tgl@sss.pgh.pa.us>
+	lpd 95-06-22 removed #ifndefs whose sole purpose was to define
+		undefined preprocessor symbols as 0; changed all #ifdefs
+		for configuration symbols to #ifs
+	lpd 95-04-05 changed copyright notice to make it clear that
+		including ansi2knr in a program does not bring the entire
+		program under the GPL
+	lpd 94-12-18 added conditionals for systems where ctype macros
+		don't handle 8-bit characters properly, suggested by
+		Francois Pinard <pinard@iro.umontreal.ca>;
+		removed --varargs switch (this is now the default)
+	lpd 94-10-10 removed CONFIG_BROKETS conditional
+	lpd 94-07-16 added some conditionals to help GNU `configure',
+		suggested by Francois Pinard <pinard@iro.umontreal.ca>;
+		properly erase prototype args in function parameters,
+		contributed by Jim Avera <jima@netcom.com>;
+		correct error in writeblanks (it shouldn't erase EOLs)
+	lpd 89-xx-xx original version
+ */
+
+/* Most of the conditionals here are to make ansi2knr work with */
+/* or without the GNU configure machinery. */
+
+#if HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdio.h>
+#include <ctype.h>
+
+#if HAVE_CONFIG_H
+
+/*
+   For properly autoconfiguring ansi2knr, use AC_CONFIG_HEADER(config.h).
+   This will define HAVE_CONFIG_H and so, activate the following lines.
+ */
+
+# if STDC_HEADERS || HAVE_STRING_H
+#  include <string.h>
+# else
+#  include <strings.h>
+# endif
+
+#else /* not HAVE_CONFIG_H */
+
+/* Otherwise do it the hard way */
+
+# ifdef BSD
+#  include <strings.h>
+# else
+#  ifdef VMS
+    extern int strlen(), strncmp();
+#  else
+#   include <string.h>
+#  endif
+# endif
+
+#endif /* not HAVE_CONFIG_H */
+
+#if STDC_HEADERS
+# include <stdlib.h>
+#else
+/*
+   malloc and free should be declared in stdlib.h,
+   but if you've got a K&R compiler, they probably aren't.
+ */
+# ifdef MSDOS
+#  include <malloc.h>
+# else
+#  ifdef VMS
+     extern char *malloc();
+     extern void free();
+#  else
+     extern char *malloc();
+     extern int free();
+#  endif
+# endif
+
+#endif
+
+/*
+ * The ctype macros don't always handle 8-bit characters correctly.
+ * Compensate for this here.
+ */
+#ifdef isascii
+#  undef HAVE_ISASCII		/* just in case */
+#  define HAVE_ISASCII 1
+#else
+#endif
+#if STDC_HEADERS || !HAVE_ISASCII
+#  define is_ascii(c) 1
+#else
+#  define is_ascii(c) isascii(c)
+#endif
+
+#define is_space(c) (is_ascii(c) && isspace(c))
+#define is_alpha(c) (is_ascii(c) && isalpha(c))
+#define is_alnum(c) (is_ascii(c) && isalnum(c))
+
 /* Scanning macros */
-#define isidchar(ch) (isalnum(ch) || (ch) == '_')
-#define isidfirstchar(ch) (isalpha(ch) || (ch) == '_')
+#define isidchar(ch) (is_alnum(ch) || (ch) == '_')
+#define isidfirstchar(ch) (is_alpha(ch) || (ch) == '_')
 
 /* Forward references */
 char *skipspace();
@@ -227,6 +316,7 @@
 int convert1();
 
 /* The main program */
+int
 main(argc, argv)
     int argc;
     char *argv[];
@@ -234,46 +324,99 @@
 #define bufsize 5000			/* arbitrary size */
 	char *buf;
 	char *line;
+	char *more;
+	/*
+	 * In previous versions, ansi2knr recognized a --varargs switch.
+	 * If this switch was supplied, ansi2knr would attempt to convert
+	 * a ... argument to va_alist and va_dcl; if this switch was not
+	 * supplied, ansi2knr would simply drop any such arguments.
+	 * Now, ansi2knr always does this conversion, and we only
+	 * check for this switch for backward compatibility.
+	 */
+	int convert_varargs = 1;
+
+	if ( argc > 1 && argv[1][0] == '-' )
+	  {	if ( !strcmp(argv[1], "--varargs") )
+		  {	convert_varargs = 1;
+			argc--;
+			argv++;
+		  }
+		else
+		  {	fprintf(stderr, "Unrecognized switch: %s\n", argv[1]);
+			exit(1);
+		  }
+	  }
 	switch ( argc )
 	   {
 	default:
 		printf("Usage: ansi2knr input_file [output_file]\n");
 		exit(0);
 	case 2:
-		out = stdout; break;
+		out = stdout;
+		break;
 	case 3:
 		out = fopen(argv[2], "w");
 		if ( out == NULL )
-		   {	fprintf(stderr, "Cannot open %s\n", argv[2]);
+		   {	fprintf(stderr, "Cannot open output file %s\n", argv[2]);
 			exit(1);
 		   }
 	   }
 	in = fopen(argv[1], "r");
 	if ( in == NULL )
-	   {	fprintf(stderr, "Cannot open %s\n", argv[1]);
+	   {	fprintf(stderr, "Cannot open input file %s\n", argv[1]);
 		exit(1);
 	   }
 	fprintf(out, "#line 1 \"%s\"\n", argv[1]);
 	buf = malloc(bufsize);
 	line = buf;
 	while ( fgets(line, (unsigned)(buf + bufsize - line), in) != NULL )
-	   {	switch ( test1(buf) )
+	   {
+test:		line += strlen(line);
+		switch ( test1(buf) )
 		   {
+		case 2:			/* a function header */
+			convert1(buf, out, 1, convert_varargs);
+			break;
 		case 1:			/* a function */
-			convert1(buf, out);
+			/* Check for a { at the start of the next line. */
+			more = ++line;
+f:			if ( line >= buf + (bufsize - 1) ) /* overflow check */
+			  goto wl;
+			if ( fgets(line, (unsigned)(buf + bufsize - line), in) == NULL )
+			  goto wl;
+			switch ( *skipspace(more, 1) )
+			  {
+			  case '{':
+			    /* Definitely a function header. */
+			    convert1(buf, out, 0, convert_varargs);
+			    fputs(more, out);
+			    break;
+			  case 0:
+			    /* The next line was blank or a comment: */
+			    /* keep scanning for a non-comment. */
+			    line += strlen(line);
+			    goto f;
+			  default:
+			    /* buf isn't a function header, but */
+			    /* more might be. */
+			    fputs(buf, out);
+			    strcpy(buf, more);
+			    line = buf;
+			    goto test;
+			  }
 			break;
 		case -1:		/* maybe the start of a function */
-			line = buf + strlen(buf);
 			if ( line != buf + (bufsize - 1) ) /* overflow check */
-				continue;
+			  continue;
 			/* falls through */
 		default:		/* not a function */
-			fputs(buf, out);
+wl:			fputs(buf, out);
 			break;
 		   }
 		line = buf;
 	   }
-	if ( line != buf ) fputs(buf, out);
+	if ( line != buf )
+	  fputs(buf, out);
 	free(buf);
 	fclose(out);
 	fclose(in);
@@ -286,11 +429,14 @@
     register char *p;
     register int dir;			/* 1 for forward, -1 for backward */
 {	for ( ; ; )
-	   {	while ( isspace(*p) ) p += dir;
-		if ( !(*p == '/' && p[dir] == '*') ) break;
+	   {	while ( is_space(*p) )
+		  p += dir;
+		if ( !(*p == '/' && p[dir] == '*') )
+		  break;
 		p += dir;  p += dir;
 		while ( !(*p == '*' && p[dir] == '/') )
-		   {	if ( *p == 0 ) return p;	/* multi-line comment?? */
+		   {	if ( *p == 0 )
+			  return p;	/* multi-line comment?? */
 			p += dir;
 		   }
 		p += dir;  p += dir;
@@ -300,13 +446,16 @@
 
 /*
  * Write blanks over part of a string.
+ * Don't overwrite end-of-line characters.
  */
 int
 writeblanks(start, end)
     char *start;
     char *end;
 {	char *p;
-	for ( p = start; p < end; p++ ) *p = ' ';
+	for ( p = start; p < end; p++ )
+	  if ( *p != '\r' && *p != '\n' )
+	    *p = ' ';
 	return 0;
 }
 
@@ -316,8 +465,12 @@
  * Return as follows:
  *	0 - definitely not a function definition;
  *	1 - definitely a function definition;
+ *	2 - definitely a function prototype (NOT USED);
  *	-1 - may be the beginning of a function definition,
  *		append another line and look again.
+ * The reason we don't attempt to convert function prototypes is that
+ * Ghostscript's declaration-generating macros look too much like
+ * prototypes, and confuse the algorithms.
  */
 int
 test1(buf)
@@ -326,24 +479,27 @@
 	char *bend;
 	char *endfn;
 	int contin;
+
 	if ( !isidfirstchar(*p) )
-		return 0;		/* no name at left margin */
+	  return 0;		/* no name at left margin */
 	bend = skipspace(buf + strlen(buf) - 1, -1);
 	switch ( *bend )
 	   {
-	case ')': contin = 1; break;
-	case '{':
-	case ';': return 0;		/* not a function */
-	default: contin = -1;
+	   case ';': contin = 0 /*2*/; break;
+	   case ')': contin = 1; break;
+	   case '{': return 0;		/* not a function */
+	   case '}': return 0;		/* not a function */
+	   default: contin = -1;
 	   }
-	while ( isidchar(*p) ) p++;
+	while ( isidchar(*p) )
+	  p++;
 	endfn = p;
 	p = skipspace(p, 1);
 	if ( *p++ != '(' )
-		return 0;		/* not a function */
+	  return 0;		/* not a function */
 	p = skipspace(p, 1);
 	if ( *p == ')' )
-		return 0;		/* no parameters */
+	  return 0;		/* no parameters */
 	/* Check that the apparent function name isn't a keyword. */
 	/* We only need to check for keywords that could be followed */
 	/* by a left parenthesis (which, unfortunately, is most of them). */
@@ -357,19 +513,23 @@
 		char **key = words;
 		char *kp;
 		int len = endfn - buf;
+
 		while ( (kp = *key) != 0 )
 		   {	if ( strlen(kp) == len && !strncmp(kp, buf, len) )
-				return 0;	/* name is a keyword */
+			  return 0;	/* name is a keyword */
 			key++;
 		   }
 	   }
 	return contin;
 }
 
+/* Convert a recognized function definition or header to K&R syntax. */
 int
-convert1(buf, out)
+convert1(buf, out, header, convert_varargs)
     char *buf;
     FILE *out;
+    int header;			/* Boolean */
+    int convert_varargs;	/* Boolean */
 {	char *endfn;
 	register char *p;
 	char **breaks;
@@ -377,9 +537,12 @@
 	char **btop;
 	char **bp;
 	char **ap;
+	char *vararg = 0;
+
 	/* Pre-ANSI implementations don't agree on whether strchr */
 	/* is called strchr or index, so we open-code it here. */
-	for ( endfn = buf; *(endfn++) != '('; ) ;
+	for ( endfn = buf; *(endfn++) != '('; )
+	  ;
 top:	p = endfn;
 	breaks = (char **)malloc(sizeof(char *) * num_breaks * 2);
 	if ( breaks == 0 )
@@ -393,7 +556,10 @@
 	/* Parse the argument list */
 	do
 	   {	int level = 0;
+		char *lp = NULL;
+		char *rp;
 		char *end = NULL;
+
 		if ( bp >= btop )
 		   {	/* Filled up break table. */
 			/* Allocate a bigger one and start over. */
@@ -406,13 +572,27 @@
 		for ( ; end == NULL; p++ )
 		   {	switch(*p)
 			   {
-			case ',': if ( !level ) end = p; break;
-			case '(': level++; break;
-			case ')': if ( --level < 0 ) end = p; break;
-			case '/': p = skipspace(p, 1) - 1; break;
-			default: ;
+			   case ',':
+				if ( !level ) end = p;
+				break;
+			   case '(':
+				if ( !level ) lp = p;
+				level++;
+				break;
+			   case ')':
+				if ( --level < 0 ) end = p;
+				else rp = p;
+				break;
+			   case '/':
+				p = skipspace(p, 1) - 1;
+				break;
+			   default:
+				;
 			   }
 		   }
+		/* Erase any embedded prototype parameters. */
+		if ( lp )
+		  writeblanks(lp + 1, rp);
 		p--;			/* back up over terminator */
 		/* Find the name being declared. */
 		/* This is complicated because of procedure and */
@@ -421,35 +601,42 @@
 		   {	p = skipspace(p - 1, -1);
 			switch ( *p )
 			   {
-			case ']':	/* skip array dimension(s) */
-			case ')':	/* skip procedure args OR name */
+			   case ']':	/* skip array dimension(s) */
+			   case ')':	/* skip procedure args OR name */
 			   {	int level = 1;
 				while ( level )
 				 switch ( *--p )
 				   {
-				case ']': case ')': level++; break;
-				case '[': case '(': level--; break;
-				case '/': p = skipspace(p, -1) + 1; break;
-				default: ;
+				   case ']': case ')': level++; break;
+				   case '[': case '(': level--; break;
+				   case '/': p = skipspace(p, -1) + 1; break;
+				   default: ;
 				   }
 			   }
 				if ( *p == '(' && *skipspace(p + 1, 1) == '*' )
 				   {	/* We found the name being declared */
 					while ( !isidfirstchar(*p) )
-						p = skipspace(p, 1) + 1;
+					  p = skipspace(p, 1) + 1;
 					goto found;
 				   }
 				break;
-			default: goto found;
+			   default:
+				goto found;
 			   }
 		   }
 found:		if ( *p == '.' && p[-1] == '.' && p[-2] == '.' )
-		   {	p++;
-			if ( bp == breaks + 1 )	/* sole argument */
-				writeblanks(breaks[0], p);
+		  {	if ( convert_varargs )
+			  {	*bp++ = "va_alist";
+				vararg = p-2;
+			  }
 			else
-				writeblanks(bp[-1] - 1, p);
-			bp--;
+			  {	p++;
+				if ( bp == breaks + 1 )	/* sole argument */
+				  writeblanks(breaks[0], p);
+				else
+				  writeblanks(bp[-1] - 1, p);
+				bp--;
+			  }
 		   }
 		else
 		   {	while ( isidchar(*p) ) p--;
@@ -470,19 +657,37 @@
 			   }
 		   }
 	   }
-	/* Put out the function name */
+	/* Put out the function name and left parenthesis. */
 	p = buf;
 	while ( p != endfn ) putc(*p, out), p++;
-	/* Put out the declaration */
-	for ( ap = breaks+1; ap < bp; ap += 2 )
-	   {	p = *ap;
-		while ( isidchar(*p) ) putc(*p, out), p++;
-		if ( ap < bp - 1 ) fputs(", ", out);
-	   }
-	fputs(")  ", out);
-	/* Put out the argument declarations */
-	for ( ap = breaks+2; ap <= bp; ap += 2 ) (*ap)[-1] = ';';
-	fputs(breaks[0], out);
+	/* Put out the declaration. */
+	if ( header )
+	  {	fputs(");", out);
+		for ( p = breaks[0]; *p; p++ )
+		  if ( *p == '\r' || *p == '\n' )
+		    putc(*p, out);
+	  }
+	else
+	  {	for ( ap = breaks+1; ap < bp; ap += 2 )
+		  {	p = *ap;
+			while ( isidchar(*p) )
+			  putc(*p, out), p++;
+			if ( ap < bp - 1 )
+			  fputs(", ", out);
+		  }
+		fputs(")  ", out);
+		/* Put out the argument declarations */
+		for ( ap = breaks+2; ap <= bp; ap += 2 )
+		  (*ap)[-1] = ';';
+		if ( vararg != 0 )
+		  {	*vararg = 0;
+			fputs(breaks[0], out);		/* any prior args */
+			fputs("va_dcl", out);		/* the final arg */
+			fputs(bp[0], out);
+		  }
+		else
+		  fputs(breaks[0], out);
+	  }
 	free((char *)breaks);
 	return 0;
 }
diff --git a/pngerror.c b/pngerror.c
index fec83a0..98d5930 100644
--- a/pngerror.c
+++ b/pngerror.c
@@ -59,7 +59,7 @@
  * if the character is invalid.
  */
 #define isnonalpha(c) ((c) < 41 || (c) > 122 || ((c) > 90 && (c) < 97))
-static const char png_digit[16] = {
+static PNG_CONST char png_digit[16] = {
    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
 };
 
diff --git a/pngtest.c b/pngtest.c
index 700ad74..8ca4012 100644
--- a/pngtest.c
+++ b/pngtest.c
@@ -52,7 +52,8 @@
 static int status_dots_requested=0;
 static int status_dots=1;
 
-void read_row_callback(png_structp png_ptr, png_uint_32 row_number, int pass)
+void
+read_row_callback(png_structp png_ptr, png_uint_32 row_number, int pass)
 {
     if(png_ptr == NULL || row_number > 0x3fffffffL) return;
     if(status_pass != pass)
@@ -70,7 +71,8 @@
     fprintf(stdout, "r");
 }
 
-void write_row_callback(png_structp png_ptr, png_uint_32 row_number, int pass)
+void
+write_row_callback(png_structp png_ptr, png_uint_32 row_number, int pass)
 {
     if(png_ptr == NULL || row_number > 0x3fffffffL || pass > 7) return;
     fprintf(stdout, "w");
@@ -84,8 +86,8 @@
 
 static png_uint_32 black_pixels;
 
-void count_black_pixels(png_structp png_ptr, png_row_infop row_info,
-		   png_bytep data)
+void
+count_black_pixels(png_structp png_ptr, png_row_infop row_info, png_bytep data)
 {
    png_bytep dp = data;
    if(png_ptr == NULL)return; 
@@ -203,8 +205,8 @@
 #define NEAR_BUF_SIZE 1024
 #define MIN(a,b) (a <= b ? a : b)
  
-static void png_default_read_data(png_structp png_ptr, png_bytep data,
-   png_size_t length)
+static void
+png_default_read_data(png_structp png_ptr, png_bytep data, png_size_t length)
 {
    int check;
    png_byte *n_data;
@@ -245,7 +247,8 @@
 #endif /* USE_FAR_KEYWORD */
 
 #if defined(PNG_WRITE_FLUSH_SUPPORTED)
-static void png_default_flush(png_structp png_ptr)
+static void
+png_default_flush(png_structp png_ptr)
 {
    FILE *io_ptr;
    io_ptr = (FILE *)CVT_PTR((png_ptr->io_ptr));
@@ -452,7 +455,8 @@
 /* END of code to test memory allocation/deallocation */
 
 /* Test one file */
-int test_one_file(PNG_CONST char *inname, PNG_CONST char *outname)
+int
+test_one_file(PNG_CONST char *inname, PNG_CONST char *outname)
 {
    static FILE *fpin, *fpout;  /* "static" prevents setjmp corruption */
    png_structp read_ptr, write_ptr;
diff --git a/pngwrite.c b/pngwrite.c
index 77bb90d..c8f7abd 100644
--- a/pngwrite.c
+++ b/pngwrite.c
@@ -225,7 +225,7 @@
 png_charp
 png_convert_to_rfc1123(png_structp png_ptr, png_timep ptime)
 {
-   static const char *short_months[12][4] =
+   static const char short_months[12][4] =
 	{"Jan", "Feb", "Mar", "Apr", "May", "Jun",
 	 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
 
