diff -urNk.orig ed-0.2.orig/configure.in ed-0.2/configure.in --- ed-0.2.orig/configure.in 1994-11-19 15:38:00 +0300 +++ ed-0.2/configure.in 2002-09-01 16:19:42 +0400 @@ -11,12 +11,17 @@ AC_PROG_CC AC_C_CONST AC_HEADER_STDC -AC_CHECK_HEADERS(limits.h memory.h string.h unistd.h locale.h) -AC_CHECK_FUNCS(setbuffer sigsetjmp sigaction strerror) +AC_CHECK_HEADERS(limits.h memory.h string.h unistd.h locale.h libintl.h) +AC_CHECK_FUNCS(setbuffer sigsetjmp sigaction strerror strerror_r error) AC_FUNC_VPRINTF AC_FUNC_ALLOCA +if test "$ac_cv_func_error" = yes; then + AC_CHECK_HEADERS(error.h) +else + AC_LIBOBJ(error) +fi if test "$ALLOCA" = alloca.o; then - AC_SUBST(LIBOBJS)LIBOBJS="$LIBOBJS xmalloc.o error.o" + AC_LIBOBJ(xmalloc) fi AC_OUTPUT(Makefile) diff -urNk.orig ed-0.2.orig/ed.h ed-0.2/ed.h --- ed-0.2.orig/ed.h 1994-11-19 15:38:00 +0300 +++ ed-0.2/ed.h 2002-09-01 16:00:25 +0400 @@ -36,6 +36,12 @@ extern int errno; #endif +#ifdef HAVE_ERROR_H +#include +#else +#include "myerror.h" +#endif + #ifdef HAVE_LIMITS_H #include #endif diff -urNk.orig ed-0.2.orig/error.c ed-0.2/error.c --- ed-0.2.orig/error.c 1994-11-19 15:38:01 +0300 +++ ed-0.2/error.c 2002-09-01 16:16:11 +0400 @@ -1,21 +1,24 @@ -/* error.c -- error handler for noninteractive utilities - Copyright (C) 1990, 1991, 1992, 1993 Free Software Foundation, Inc. +/* Error handler for noninteractive utilities + Copyright (C) 1990-1998, 2000, 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. Its master source is NOT part of + the C library, however. The master source lives in /gd/gnu/lib. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - This program is distributed in the hope that it will be useful, + The GNU C Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ -/* Written by David MacKenzie. */ +/* Written by David MacKenzie . */ #ifdef HAVE_CONFIG_H #if defined (CONFIG_BROKETS) @@ -29,52 +32,105 @@ #endif #include +#if HAVE_LIBINTL_H +# include +#endif -#ifdef HAVE_VPRINTF +#if HAVE_VPRINTF || HAVE_DOPRNT +# if __STDC__ +# include +# define VA_START(args, lastarg) va_start(args, lastarg) +# else +# include +# define VA_START(args, lastarg) va_start(args) +# endif +#else +# define va_alist a1, a2, a3, a4, a5, a6, a7, a8 +# define va_dcl char *a1, *a2, *a3, *a4, *a5, *a6, *a7, *a8; +#endif -#if __STDC__ -#include -#define VA_START(args, lastarg) va_start(args, lastarg) -#else /* !__STDC__ */ -#include -#define VA_START(args, lastarg) va_start(args) -#endif /* !__STDC__ */ - -#else /* !HAVE_VPRINTF */ - -#ifdef HAVE_DOPRNT -#define va_alist args -#define va_dcl int args; -#else /* !HAVE_DOPRNT */ -#define va_alist a1, a2, a3, a4, a5, a6, a7, a8 -#define va_dcl char *a1, *a2, *a3, *a4, *a5, *a6, *a7, *a8; -#endif /* !HAVE_DOPRNT */ - -#endif /* !HAVE_VPRINTF */ - -#ifdef STDC_HEADERS -#include -#include -#else /* !STDC_HEADERS */ +#if STDC_HEADERS +# include +# include +#else void exit (); -#endif /* !STDC_HEADERS */ +#endif + +#include "myerror.h" + +#ifndef _ +# define _(String) String +#endif + +/* If NULL, error will flush stdout, then print on stderr the program + name, a colon and a space. Otherwise, error will call this + function without parameters instead. */ +void (*error_print_progname) ( +#if __STDC__ - 0 + void +#endif + ); + +/* This variable is incremented each time `error' is called. */ +unsigned int error_message_count; +/* The calling program should define program_name and set it to the + name of the executing program. */ extern char *program_name; -#ifndef HAVE_STRERROR -static const char * +# ifdef HAVE_STRERROR_R +# define __strerror_r strerror_r +# else +# if HAVE_STRERROR +# ifndef strerror /* On some systems, strerror is a macro */ +char *strerror (); +# endif +# else +static char * private_strerror (errnum) int errnum; { - extern const char *sys_errlist[]; + extern char *sys_errlist[]; extern int sys_nerr; if (errnum > 0 && errnum <= sys_nerr) - return sys_errlist[errnum]; - return "Unknown system error"; + return _(sys_errlist[errnum]); + return _("Unknown system error"); } -#define strerror private_strerror -#endif /* !HAVE_STRERROR */ +# define strerror private_strerror +# endif /* HAVE_STRERROR */ +# endif /* HAVE_STRERROR_R */ + + +#ifdef VA_START +static void +error_tail (int status, int errnum, const char *message, va_list args) +{ +# if HAVE_VPRINTF + vfprintf (stderr, message, args); +# else + _doprnt (message, args, stderr); +# endif + va_end (args); + + ++error_message_count; + if (errnum) + { +#if defined HAVE_STRERROR_R + char errbuf[1024]; + char *s = __strerror_r (errnum, errbuf, sizeof errbuf); + fprintf (stderr, ": %s", s); +#else + fprintf (stderr, ": %s", strerror (errnum)); +#endif + } + putc ('\n', stderr); + fflush (stderr); + if (status) + exit (status); +} +#endif + /* Print the program name and error message MESSAGE, which is a printf-style format string with optional args. @@ -82,37 +138,107 @@ Exit with status STATUS if it is nonzero. */ /* VARARGS */ void -#if defined (HAVE_VPRINTF) && __STDC__ -error (int status, int errnum, char *message, ...) -#else /* !HAVE_VPRINTF or !__STDC__ */ +#if defined VA_START && __STDC__ +error (int status, int errnum, const char *message, ...) +#else error (status, errnum, message, va_alist) int status; int errnum; char *message; va_dcl -#endif /* !HAVE_VPRINTF or !__STDC__ */ +#endif { -#ifdef HAVE_VPRINTF +#ifdef VA_START va_list args; -#endif /* HAVE_VPRINTF */ +#endif fflush (stdout); - fprintf (stderr, "%s: ", program_name); -#ifdef HAVE_VPRINTF + if (error_print_progname) + (*error_print_progname) (); + else + { + fprintf (stderr, "%s: ", program_name); + } + +#ifdef VA_START VA_START (args, message); - vfprintf (stderr, message, args); - va_end (args); -#else /* !HAVE_VPRINTF */ -#ifdef HAVE_DOPRNT - _doprnt (message, &args, stderr); -#else /* !HAVE_DOPRNT */ + error_tail (status, errnum, message, args); +#else fprintf (stderr, message, a1, a2, a3, a4, a5, a6, a7, a8); -#endif /* !HAVE_DOPRNT */ -#endif /* !HAVE_VPRINTF */ + + ++error_message_count; if (errnum) fprintf (stderr, ": %s", strerror (errnum)); putc ('\n', stderr); fflush (stderr); if (status) exit (status); +#endif + +} + +/* Sometimes we want to have at most one error per line. This + variable controls whether this mode is selected or not. */ +int error_one_per_line; + +void +#if defined VA_START && __STDC__ +error_at_line (int status, int errnum, const char *file_name, + unsigned int line_number, const char *message, ...) +#else +error_at_line (status, errnum, file_name, line_number, message, va_alist) + int status; + int errnum; + const char *file_name; + unsigned int line_number; + char *message; + va_dcl +#endif +{ +#ifdef VA_START + va_list args; +#endif + + if (error_one_per_line) + { + static const char *old_file_name; + static unsigned int old_line_number; + + if (old_line_number == line_number + && (file_name == old_file_name + || strcmp (old_file_name, file_name) == 0)) + /* Simply return and print nothing. */ + return; + + old_file_name = file_name; + old_line_number = line_number; + } + + fflush (stdout); + if (error_print_progname) + (*error_print_progname) (); + else + { + fprintf (stderr, "%s:", program_name); + } + + if (file_name != NULL) + { + fprintf (stderr, "%s:%d: ", file_name, line_number); + } + +#ifdef VA_START + VA_START (args, message); + error_tail (status, errnum, message, args); +#else + fprintf (stderr, message, a1, a2, a3, a4, a5, a6, a7, a8); + + ++error_message_count; + if (errnum) + fprintf (stderr, ": %s", strerror (errnum)); + putc ('\n', stderr); + fflush (stderr); + if (status) + exit (status); +#endif } diff -urNk.orig ed-0.2.orig/myerror.h ed-0.2/myerror.h --- ed-0.2.orig/myerror.h 1970-01-01 03:00:00 +0300 +++ ed-0.2/myerror.h 2001-07-06 08:55:35 +0400 @@ -0,0 +1,76 @@ +/* Declaration for error-reporting function + Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. Its master source is NOT part of + the C library, however. The master source lives in /gd/gnu/lib. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#ifndef _ERROR_H +#define _ERROR_H 1 + +#ifndef __attribute__ +/* This feature is available in gcc versions 2.5 and later. */ +# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) || __STRICT_ANSI__ +# define __attribute__(Spec) /* empty */ +# endif +/* The __-protected variants of `format' and `printf' attributes + are accepted by gcc versions 2.6.4 (effectively 2.7) and later. */ +# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7) +# define __format__ format +# define __printf__ printf +# endif +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined (__STDC__) && __STDC__ + +/* Print a message with `fprintf (stderr, FORMAT, ...)'; + if ERRNUM is nonzero, follow it with ": " and strerror (ERRNUM). + If STATUS is nonzero, terminate the program with `exit (STATUS)'. */ + +extern void error (int status, int errnum, const char *format, ...) + __attribute__ ((__format__ (__printf__, 3, 4))); + +extern void error_at_line (int status, int errnum, const char *fname, + unsigned int lineno, const char *format, ...) + __attribute__ ((__format__ (__printf__, 5, 6))); + +/* If NULL, error will flush stdout, then print on stderr the program + name, a colon and a space. Otherwise, error will call this + function without parameters instead. */ +extern void (*error_print_progname) (void); + +#else +void error (); +void error_at_line (); +extern void (*error_print_progname) (); +#endif + +/* This variable is incremented each time `error' is called. */ +extern unsigned int error_message_count; + +/* Sometimes we want to have at most one error per line. This + variable controls whether this mode is selected or not. */ +extern int error_one_per_line; + +#ifdef __cplusplus +} +#endif + +#endif /* error.h */ diff -urNk.orig ed-0.2.orig/xmalloc.c ed-0.2/xmalloc.c --- ed-0.2.orig/xmalloc.c 1994-11-19 15:38:05 +0300 +++ ed-0.2/xmalloc.c 2002-09-01 16:00:13 +0400 @@ -15,16 +15,7 @@ along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#ifdef HAVE_CONFIG_H -#if defined (CONFIG_BROKETS) -/* We use instead of "config.h" so that a compilation - using -I. -I$srcdir will use ./config.h rather than $srcdir/config.h - (which it would do because it found this file in $srcdir). */ -#include -#else -#include "config.h" -#endif -#endif +#include "ed.h" #if __STDC__ #define VOID void @@ -32,22 +23,6 @@ #define VOID char #endif -#include - -#if STDC_HEADERS -#include -#else -VOID *malloc (); -VOID *realloc (); -void free (); -#endif - -#if __STDC__ && defined (HAVE_VPRINTF) -void error (int, int, char const *, ...); -#else -void error (); -#endif - /* Allocate N bytes of memory dynamically, with error checking. */ VOID *