mirror of
git://git.gnupg.org/gnupg.git
synced 2024-12-22 10:19:57 +01:00
This commit was manufactured by cvs2svn to create branch
'GNUPG-1-9-BRANCH'.
This commit is contained in:
parent
f67c66e56f
commit
dd3b12f3b1
119
intl/printf-args.c
Normal file
119
intl/printf-args.c
Normal file
@ -0,0 +1,119 @@
|
|||||||
|
/* Decomposed printf argument list.
|
||||||
|
Copyright (C) 1999, 2002-2003 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU Library 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,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Library General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Library General Public
|
||||||
|
License along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||||
|
USA. */
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Specification. */
|
||||||
|
#include "printf-args.h"
|
||||||
|
|
||||||
|
#ifdef STATIC
|
||||||
|
STATIC
|
||||||
|
#endif
|
||||||
|
int
|
||||||
|
printf_fetchargs (va_list args, arguments *a)
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
argument *ap;
|
||||||
|
|
||||||
|
for (i = 0, ap = &a->arg[0]; i < a->count; i++, ap++)
|
||||||
|
switch (ap->type)
|
||||||
|
{
|
||||||
|
case TYPE_SCHAR:
|
||||||
|
ap->a.a_schar = va_arg (args, /*signed char*/ int);
|
||||||
|
break;
|
||||||
|
case TYPE_UCHAR:
|
||||||
|
ap->a.a_uchar = va_arg (args, /*unsigned char*/ int);
|
||||||
|
break;
|
||||||
|
case TYPE_SHORT:
|
||||||
|
ap->a.a_short = va_arg (args, /*short*/ int);
|
||||||
|
break;
|
||||||
|
case TYPE_USHORT:
|
||||||
|
ap->a.a_ushort = va_arg (args, /*unsigned short*/ int);
|
||||||
|
break;
|
||||||
|
case TYPE_INT:
|
||||||
|
ap->a.a_int = va_arg (args, int);
|
||||||
|
break;
|
||||||
|
case TYPE_UINT:
|
||||||
|
ap->a.a_uint = va_arg (args, unsigned int);
|
||||||
|
break;
|
||||||
|
case TYPE_LONGINT:
|
||||||
|
ap->a.a_longint = va_arg (args, long int);
|
||||||
|
break;
|
||||||
|
case TYPE_ULONGINT:
|
||||||
|
ap->a.a_ulongint = va_arg (args, unsigned long int);
|
||||||
|
break;
|
||||||
|
#ifdef HAVE_LONG_LONG
|
||||||
|
case TYPE_LONGLONGINT:
|
||||||
|
ap->a.a_longlongint = va_arg (args, long long int);
|
||||||
|
break;
|
||||||
|
case TYPE_ULONGLONGINT:
|
||||||
|
ap->a.a_ulonglongint = va_arg (args, unsigned long long int);
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
case TYPE_DOUBLE:
|
||||||
|
ap->a.a_double = va_arg (args, double);
|
||||||
|
break;
|
||||||
|
#ifdef HAVE_LONG_DOUBLE
|
||||||
|
case TYPE_LONGDOUBLE:
|
||||||
|
ap->a.a_longdouble = va_arg (args, long double);
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
case TYPE_CHAR:
|
||||||
|
ap->a.a_char = va_arg (args, int);
|
||||||
|
break;
|
||||||
|
#ifdef HAVE_WINT_T
|
||||||
|
case TYPE_WIDE_CHAR:
|
||||||
|
ap->a.a_wide_char = va_arg (args, wint_t);
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
case TYPE_STRING:
|
||||||
|
ap->a.a_string = va_arg (args, const char *);
|
||||||
|
break;
|
||||||
|
#ifdef HAVE_WCHAR_T
|
||||||
|
case TYPE_WIDE_STRING:
|
||||||
|
ap->a.a_wide_string = va_arg (args, const wchar_t *);
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
case TYPE_POINTER:
|
||||||
|
ap->a.a_pointer = va_arg (args, void *);
|
||||||
|
break;
|
||||||
|
case TYPE_COUNT_SCHAR_POINTER:
|
||||||
|
ap->a.a_count_schar_pointer = va_arg (args, signed char *);
|
||||||
|
break;
|
||||||
|
case TYPE_COUNT_SHORT_POINTER:
|
||||||
|
ap->a.a_count_short_pointer = va_arg (args, short *);
|
||||||
|
break;
|
||||||
|
case TYPE_COUNT_INT_POINTER:
|
||||||
|
ap->a.a_count_int_pointer = va_arg (args, int *);
|
||||||
|
break;
|
||||||
|
case TYPE_COUNT_LONGINT_POINTER:
|
||||||
|
ap->a.a_count_longint_pointer = va_arg (args, long int *);
|
||||||
|
break;
|
||||||
|
#ifdef HAVE_LONG_LONG
|
||||||
|
case TYPE_COUNT_LONGLONGINT_POINTER:
|
||||||
|
ap->a.a_count_longlongint_pointer = va_arg (args, long long int *);
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
default:
|
||||||
|
/* Unknown type. */
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
137
intl/printf-args.h
Normal file
137
intl/printf-args.h
Normal file
@ -0,0 +1,137 @@
|
|||||||
|
/* Decomposed printf argument list.
|
||||||
|
Copyright (C) 1999, 2002-2003 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU Library 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,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Library General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Library General Public
|
||||||
|
License along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||||
|
USA. */
|
||||||
|
|
||||||
|
#ifndef _PRINTF_ARGS_H
|
||||||
|
#define _PRINTF_ARGS_H
|
||||||
|
|
||||||
|
/* Get size_t. */
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
/* Get wchar_t. */
|
||||||
|
#ifdef HAVE_WCHAR_T
|
||||||
|
# include <stddef.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Get wint_t. */
|
||||||
|
#ifdef HAVE_WINT_T
|
||||||
|
# include <wchar.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Get va_list. */
|
||||||
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
|
||||||
|
/* Argument types */
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
TYPE_NONE,
|
||||||
|
TYPE_SCHAR,
|
||||||
|
TYPE_UCHAR,
|
||||||
|
TYPE_SHORT,
|
||||||
|
TYPE_USHORT,
|
||||||
|
TYPE_INT,
|
||||||
|
TYPE_UINT,
|
||||||
|
TYPE_LONGINT,
|
||||||
|
TYPE_ULONGINT,
|
||||||
|
#ifdef HAVE_LONG_LONG
|
||||||
|
TYPE_LONGLONGINT,
|
||||||
|
TYPE_ULONGLONGINT,
|
||||||
|
#endif
|
||||||
|
TYPE_DOUBLE,
|
||||||
|
#ifdef HAVE_LONG_DOUBLE
|
||||||
|
TYPE_LONGDOUBLE,
|
||||||
|
#endif
|
||||||
|
TYPE_CHAR,
|
||||||
|
#ifdef HAVE_WINT_T
|
||||||
|
TYPE_WIDE_CHAR,
|
||||||
|
#endif
|
||||||
|
TYPE_STRING,
|
||||||
|
#ifdef HAVE_WCHAR_T
|
||||||
|
TYPE_WIDE_STRING,
|
||||||
|
#endif
|
||||||
|
TYPE_POINTER,
|
||||||
|
TYPE_COUNT_SCHAR_POINTER,
|
||||||
|
TYPE_COUNT_SHORT_POINTER,
|
||||||
|
TYPE_COUNT_INT_POINTER,
|
||||||
|
TYPE_COUNT_LONGINT_POINTER
|
||||||
|
#ifdef HAVE_LONG_LONG
|
||||||
|
, TYPE_COUNT_LONGLONGINT_POINTER
|
||||||
|
#endif
|
||||||
|
} arg_type;
|
||||||
|
|
||||||
|
/* Polymorphic argument */
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
arg_type type;
|
||||||
|
union
|
||||||
|
{
|
||||||
|
signed char a_schar;
|
||||||
|
unsigned char a_uchar;
|
||||||
|
short a_short;
|
||||||
|
unsigned short a_ushort;
|
||||||
|
int a_int;
|
||||||
|
unsigned int a_uint;
|
||||||
|
long int a_longint;
|
||||||
|
unsigned long int a_ulongint;
|
||||||
|
#ifdef HAVE_LONG_LONG
|
||||||
|
long long int a_longlongint;
|
||||||
|
unsigned long long int a_ulonglongint;
|
||||||
|
#endif
|
||||||
|
float a_float;
|
||||||
|
double a_double;
|
||||||
|
#ifdef HAVE_LONG_DOUBLE
|
||||||
|
long double a_longdouble;
|
||||||
|
#endif
|
||||||
|
int a_char;
|
||||||
|
#ifdef HAVE_WINT_T
|
||||||
|
wint_t a_wide_char;
|
||||||
|
#endif
|
||||||
|
const char* a_string;
|
||||||
|
#ifdef HAVE_WCHAR_T
|
||||||
|
const wchar_t* a_wide_string;
|
||||||
|
#endif
|
||||||
|
void* a_pointer;
|
||||||
|
signed char * a_count_schar_pointer;
|
||||||
|
short * a_count_short_pointer;
|
||||||
|
int * a_count_int_pointer;
|
||||||
|
long int * a_count_longint_pointer;
|
||||||
|
#ifdef HAVE_LONG_LONG
|
||||||
|
long long int * a_count_longlongint_pointer;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
a;
|
||||||
|
}
|
||||||
|
argument;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
size_t count;
|
||||||
|
argument *arg;
|
||||||
|
}
|
||||||
|
arguments;
|
||||||
|
|
||||||
|
|
||||||
|
/* Fetch the arguments, putting them into a. */
|
||||||
|
#ifdef STATIC
|
||||||
|
STATIC
|
||||||
|
#else
|
||||||
|
extern
|
||||||
|
#endif
|
||||||
|
int printf_fetchargs (va_list args, arguments *a);
|
||||||
|
|
||||||
|
#endif /* _PRINTF_ARGS_H */
|
537
intl/printf-parse.c
Normal file
537
intl/printf-parse.c
Normal file
@ -0,0 +1,537 @@
|
|||||||
|
/* Formatted output to strings.
|
||||||
|
Copyright (C) 1999-2000, 2002-2003 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU Library 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,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Library General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Library General Public
|
||||||
|
License along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||||
|
USA. */
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Specification. */
|
||||||
|
#if WIDE_CHAR_VERSION
|
||||||
|
# include "wprintf-parse.h"
|
||||||
|
#else
|
||||||
|
# include "printf-parse.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Get size_t, NULL. */
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
/* Get intmax_t. */
|
||||||
|
#if HAVE_STDINT_H_WITH_UINTMAX
|
||||||
|
# include <stdint.h>
|
||||||
|
#endif
|
||||||
|
#if HAVE_INTTYPES_H_WITH_UINTMAX
|
||||||
|
# include <inttypes.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* malloc(), realloc(), free(). */
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
/* Checked size_t computations. */
|
||||||
|
#include "xsize.h"
|
||||||
|
|
||||||
|
#if WIDE_CHAR_VERSION
|
||||||
|
# define PRINTF_PARSE wprintf_parse
|
||||||
|
# define CHAR_T wchar_t
|
||||||
|
# define DIRECTIVE wchar_t_directive
|
||||||
|
# define DIRECTIVES wchar_t_directives
|
||||||
|
#else
|
||||||
|
# define PRINTF_PARSE printf_parse
|
||||||
|
# define CHAR_T char
|
||||||
|
# define DIRECTIVE char_directive
|
||||||
|
# define DIRECTIVES char_directives
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef STATIC
|
||||||
|
STATIC
|
||||||
|
#endif
|
||||||
|
int
|
||||||
|
PRINTF_PARSE (const CHAR_T *format, DIRECTIVES *d, arguments *a)
|
||||||
|
{
|
||||||
|
const CHAR_T *cp = format; /* pointer into format */
|
||||||
|
size_t arg_posn = 0; /* number of regular arguments consumed */
|
||||||
|
size_t d_allocated; /* allocated elements of d->dir */
|
||||||
|
size_t a_allocated; /* allocated elements of a->arg */
|
||||||
|
size_t max_width_length = 0;
|
||||||
|
size_t max_precision_length = 0;
|
||||||
|
|
||||||
|
d->count = 0;
|
||||||
|
d_allocated = 1;
|
||||||
|
d->dir = malloc (d_allocated * sizeof (DIRECTIVE));
|
||||||
|
if (d->dir == NULL)
|
||||||
|
/* Out of memory. */
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
a->count = 0;
|
||||||
|
a_allocated = 0;
|
||||||
|
a->arg = NULL;
|
||||||
|
|
||||||
|
#define REGISTER_ARG(_index_,_type_) \
|
||||||
|
{ \
|
||||||
|
size_t n = (_index_); \
|
||||||
|
if (n >= a_allocated) \
|
||||||
|
{ \
|
||||||
|
size_t memory_size; \
|
||||||
|
argument *memory; \
|
||||||
|
\
|
||||||
|
a_allocated = xtimes (a_allocated, 2); \
|
||||||
|
if (a_allocated <= n) \
|
||||||
|
a_allocated = xsum (n, 1); \
|
||||||
|
memory_size = xtimes (a_allocated, sizeof (argument)); \
|
||||||
|
if (size_overflow_p (memory_size)) \
|
||||||
|
/* Overflow, would lead to out of memory. */ \
|
||||||
|
goto error; \
|
||||||
|
memory = (a->arg \
|
||||||
|
? realloc (a->arg, memory_size) \
|
||||||
|
: malloc (memory_size)); \
|
||||||
|
if (memory == NULL) \
|
||||||
|
/* Out of memory. */ \
|
||||||
|
goto error; \
|
||||||
|
a->arg = memory; \
|
||||||
|
} \
|
||||||
|
while (a->count <= n) \
|
||||||
|
a->arg[a->count++].type = TYPE_NONE; \
|
||||||
|
if (a->arg[n].type == TYPE_NONE) \
|
||||||
|
a->arg[n].type = (_type_); \
|
||||||
|
else if (a->arg[n].type != (_type_)) \
|
||||||
|
/* Ambiguous type for positional argument. */ \
|
||||||
|
goto error; \
|
||||||
|
}
|
||||||
|
|
||||||
|
while (*cp != '\0')
|
||||||
|
{
|
||||||
|
CHAR_T c = *cp++;
|
||||||
|
if (c == '%')
|
||||||
|
{
|
||||||
|
size_t arg_index = ARG_NONE;
|
||||||
|
DIRECTIVE *dp = &d->dir[d->count];/* pointer to next directive */
|
||||||
|
|
||||||
|
/* Initialize the next directive. */
|
||||||
|
dp->dir_start = cp - 1;
|
||||||
|
dp->flags = 0;
|
||||||
|
dp->width_start = NULL;
|
||||||
|
dp->width_end = NULL;
|
||||||
|
dp->width_arg_index = ARG_NONE;
|
||||||
|
dp->precision_start = NULL;
|
||||||
|
dp->precision_end = NULL;
|
||||||
|
dp->precision_arg_index = ARG_NONE;
|
||||||
|
dp->arg_index = ARG_NONE;
|
||||||
|
|
||||||
|
/* Test for positional argument. */
|
||||||
|
if (*cp >= '0' && *cp <= '9')
|
||||||
|
{
|
||||||
|
const CHAR_T *np;
|
||||||
|
|
||||||
|
for (np = cp; *np >= '0' && *np <= '9'; np++)
|
||||||
|
;
|
||||||
|
if (*np == '$')
|
||||||
|
{
|
||||||
|
size_t n = 0;
|
||||||
|
|
||||||
|
for (np = cp; *np >= '0' && *np <= '9'; np++)
|
||||||
|
n = xsum (xtimes (n, 10), *np - '0');
|
||||||
|
if (n == 0)
|
||||||
|
/* Positional argument 0. */
|
||||||
|
goto error;
|
||||||
|
if (size_overflow_p (n))
|
||||||
|
/* n too large, would lead to out of memory later. */
|
||||||
|
goto error;
|
||||||
|
arg_index = n - 1;
|
||||||
|
cp = np + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Read the flags. */
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
if (*cp == '\'')
|
||||||
|
{
|
||||||
|
dp->flags |= FLAG_GROUP;
|
||||||
|
cp++;
|
||||||
|
}
|
||||||
|
else if (*cp == '-')
|
||||||
|
{
|
||||||
|
dp->flags |= FLAG_LEFT;
|
||||||
|
cp++;
|
||||||
|
}
|
||||||
|
else if (*cp == '+')
|
||||||
|
{
|
||||||
|
dp->flags |= FLAG_SHOWSIGN;
|
||||||
|
cp++;
|
||||||
|
}
|
||||||
|
else if (*cp == ' ')
|
||||||
|
{
|
||||||
|
dp->flags |= FLAG_SPACE;
|
||||||
|
cp++;
|
||||||
|
}
|
||||||
|
else if (*cp == '#')
|
||||||
|
{
|
||||||
|
dp->flags |= FLAG_ALT;
|
||||||
|
cp++;
|
||||||
|
}
|
||||||
|
else if (*cp == '0')
|
||||||
|
{
|
||||||
|
dp->flags |= FLAG_ZERO;
|
||||||
|
cp++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Parse the field width. */
|
||||||
|
if (*cp == '*')
|
||||||
|
{
|
||||||
|
dp->width_start = cp;
|
||||||
|
cp++;
|
||||||
|
dp->width_end = cp;
|
||||||
|
if (max_width_length < 1)
|
||||||
|
max_width_length = 1;
|
||||||
|
|
||||||
|
/* Test for positional argument. */
|
||||||
|
if (*cp >= '0' && *cp <= '9')
|
||||||
|
{
|
||||||
|
const CHAR_T *np;
|
||||||
|
|
||||||
|
for (np = cp; *np >= '0' && *np <= '9'; np++)
|
||||||
|
;
|
||||||
|
if (*np == '$')
|
||||||
|
{
|
||||||
|
size_t n = 0;
|
||||||
|
|
||||||
|
for (np = cp; *np >= '0' && *np <= '9'; np++)
|
||||||
|
n = xsum (xtimes (n, 10), *np - '0');
|
||||||
|
if (n == 0)
|
||||||
|
/* Positional argument 0. */
|
||||||
|
goto error;
|
||||||
|
if (size_overflow_p (n))
|
||||||
|
/* n too large, would lead to out of memory later. */
|
||||||
|
goto error;
|
||||||
|
dp->width_arg_index = n - 1;
|
||||||
|
cp = np + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (dp->width_arg_index == ARG_NONE)
|
||||||
|
{
|
||||||
|
dp->width_arg_index = arg_posn++;
|
||||||
|
if (dp->width_arg_index == ARG_NONE)
|
||||||
|
/* arg_posn wrapped around. */
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
REGISTER_ARG (dp->width_arg_index, TYPE_INT);
|
||||||
|
}
|
||||||
|
else if (*cp >= '0' && *cp <= '9')
|
||||||
|
{
|
||||||
|
size_t width_length;
|
||||||
|
|
||||||
|
dp->width_start = cp;
|
||||||
|
for (; *cp >= '0' && *cp <= '9'; cp++)
|
||||||
|
;
|
||||||
|
dp->width_end = cp;
|
||||||
|
width_length = dp->width_end - dp->width_start;
|
||||||
|
if (max_width_length < width_length)
|
||||||
|
max_width_length = width_length;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Parse the precision. */
|
||||||
|
if (*cp == '.')
|
||||||
|
{
|
||||||
|
cp++;
|
||||||
|
if (*cp == '*')
|
||||||
|
{
|
||||||
|
dp->precision_start = cp - 1;
|
||||||
|
cp++;
|
||||||
|
dp->precision_end = cp;
|
||||||
|
if (max_precision_length < 2)
|
||||||
|
max_precision_length = 2;
|
||||||
|
|
||||||
|
/* Test for positional argument. */
|
||||||
|
if (*cp >= '0' && *cp <= '9')
|
||||||
|
{
|
||||||
|
const CHAR_T *np;
|
||||||
|
|
||||||
|
for (np = cp; *np >= '0' && *np <= '9'; np++)
|
||||||
|
;
|
||||||
|
if (*np == '$')
|
||||||
|
{
|
||||||
|
size_t n = 0;
|
||||||
|
|
||||||
|
for (np = cp; *np >= '0' && *np <= '9'; np++)
|
||||||
|
n = xsum (xtimes (n, 10), *np - '0');
|
||||||
|
if (n == 0)
|
||||||
|
/* Positional argument 0. */
|
||||||
|
goto error;
|
||||||
|
if (size_overflow_p (n))
|
||||||
|
/* n too large, would lead to out of memory
|
||||||
|
later. */
|
||||||
|
goto error;
|
||||||
|
dp->precision_arg_index = n - 1;
|
||||||
|
cp = np + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (dp->precision_arg_index == ARG_NONE)
|
||||||
|
{
|
||||||
|
dp->precision_arg_index = arg_posn++;
|
||||||
|
if (dp->precision_arg_index == ARG_NONE)
|
||||||
|
/* arg_posn wrapped around. */
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
REGISTER_ARG (dp->precision_arg_index, TYPE_INT);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
size_t precision_length;
|
||||||
|
|
||||||
|
dp->precision_start = cp - 1;
|
||||||
|
for (; *cp >= '0' && *cp <= '9'; cp++)
|
||||||
|
;
|
||||||
|
dp->precision_end = cp;
|
||||||
|
precision_length = dp->precision_end - dp->precision_start;
|
||||||
|
if (max_precision_length < precision_length)
|
||||||
|
max_precision_length = precision_length;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
arg_type type;
|
||||||
|
|
||||||
|
/* Parse argument type/size specifiers. */
|
||||||
|
{
|
||||||
|
int flags = 0;
|
||||||
|
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
if (*cp == 'h')
|
||||||
|
{
|
||||||
|
flags |= (1 << (flags & 1));
|
||||||
|
cp++;
|
||||||
|
}
|
||||||
|
else if (*cp == 'L')
|
||||||
|
{
|
||||||
|
flags |= 4;
|
||||||
|
cp++;
|
||||||
|
}
|
||||||
|
else if (*cp == 'l')
|
||||||
|
{
|
||||||
|
flags += 8;
|
||||||
|
cp++;
|
||||||
|
}
|
||||||
|
#ifdef HAVE_INTMAX_T
|
||||||
|
else if (*cp == 'j')
|
||||||
|
{
|
||||||
|
if (sizeof (intmax_t) > sizeof (long))
|
||||||
|
{
|
||||||
|
/* intmax_t = long long */
|
||||||
|
flags += 16;
|
||||||
|
}
|
||||||
|
else if (sizeof (intmax_t) > sizeof (int))
|
||||||
|
{
|
||||||
|
/* intmax_t = long */
|
||||||
|
flags += 8;
|
||||||
|
}
|
||||||
|
cp++;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
else if (*cp == 'z' || *cp == 'Z')
|
||||||
|
{
|
||||||
|
/* 'z' is standardized in ISO C 99, but glibc uses 'Z'
|
||||||
|
because the warning facility in gcc-2.95.2 understands
|
||||||
|
only 'Z' (see gcc-2.95.2/gcc/c-common.c:1784). */
|
||||||
|
if (sizeof (size_t) > sizeof (long))
|
||||||
|
{
|
||||||
|
/* size_t = long long */
|
||||||
|
flags += 16;
|
||||||
|
}
|
||||||
|
else if (sizeof (size_t) > sizeof (int))
|
||||||
|
{
|
||||||
|
/* size_t = long */
|
||||||
|
flags += 8;
|
||||||
|
}
|
||||||
|
cp++;
|
||||||
|
}
|
||||||
|
else if (*cp == 't')
|
||||||
|
{
|
||||||
|
if (sizeof (ptrdiff_t) > sizeof (long))
|
||||||
|
{
|
||||||
|
/* ptrdiff_t = long long */
|
||||||
|
flags += 16;
|
||||||
|
}
|
||||||
|
else if (sizeof (ptrdiff_t) > sizeof (int))
|
||||||
|
{
|
||||||
|
/* ptrdiff_t = long */
|
||||||
|
flags += 8;
|
||||||
|
}
|
||||||
|
cp++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Read the conversion character. */
|
||||||
|
c = *cp++;
|
||||||
|
switch (c)
|
||||||
|
{
|
||||||
|
case 'd': case 'i':
|
||||||
|
#ifdef HAVE_LONG_LONG
|
||||||
|
if (flags >= 16 || (flags & 4))
|
||||||
|
type = TYPE_LONGLONGINT;
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
if (flags >= 8)
|
||||||
|
type = TYPE_LONGINT;
|
||||||
|
else if (flags & 2)
|
||||||
|
type = TYPE_SCHAR;
|
||||||
|
else if (flags & 1)
|
||||||
|
type = TYPE_SHORT;
|
||||||
|
else
|
||||||
|
type = TYPE_INT;
|
||||||
|
break;
|
||||||
|
case 'o': case 'u': case 'x': case 'X':
|
||||||
|
#ifdef HAVE_LONG_LONG
|
||||||
|
if (flags >= 16 || (flags & 4))
|
||||||
|
type = TYPE_ULONGLONGINT;
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
if (flags >= 8)
|
||||||
|
type = TYPE_ULONGINT;
|
||||||
|
else if (flags & 2)
|
||||||
|
type = TYPE_UCHAR;
|
||||||
|
else if (flags & 1)
|
||||||
|
type = TYPE_USHORT;
|
||||||
|
else
|
||||||
|
type = TYPE_UINT;
|
||||||
|
break;
|
||||||
|
case 'f': case 'F': case 'e': case 'E': case 'g': case 'G':
|
||||||
|
case 'a': case 'A':
|
||||||
|
#ifdef HAVE_LONG_DOUBLE
|
||||||
|
if (flags >= 16 || (flags & 4))
|
||||||
|
type = TYPE_LONGDOUBLE;
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
type = TYPE_DOUBLE;
|
||||||
|
break;
|
||||||
|
case 'c':
|
||||||
|
if (flags >= 8)
|
||||||
|
#ifdef HAVE_WINT_T
|
||||||
|
type = TYPE_WIDE_CHAR;
|
||||||
|
#else
|
||||||
|
goto error;
|
||||||
|
#endif
|
||||||
|
else
|
||||||
|
type = TYPE_CHAR;
|
||||||
|
break;
|
||||||
|
#ifdef HAVE_WINT_T
|
||||||
|
case 'C':
|
||||||
|
type = TYPE_WIDE_CHAR;
|
||||||
|
c = 'c';
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
case 's':
|
||||||
|
if (flags >= 8)
|
||||||
|
#ifdef HAVE_WCHAR_T
|
||||||
|
type = TYPE_WIDE_STRING;
|
||||||
|
#else
|
||||||
|
goto error;
|
||||||
|
#endif
|
||||||
|
else
|
||||||
|
type = TYPE_STRING;
|
||||||
|
break;
|
||||||
|
#ifdef HAVE_WCHAR_T
|
||||||
|
case 'S':
|
||||||
|
type = TYPE_WIDE_STRING;
|
||||||
|
c = 's';
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
case 'p':
|
||||||
|
type = TYPE_POINTER;
|
||||||
|
break;
|
||||||
|
case 'n':
|
||||||
|
#ifdef HAVE_LONG_LONG
|
||||||
|
if (flags >= 16 || (flags & 4))
|
||||||
|
type = TYPE_COUNT_LONGLONGINT_POINTER;
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
if (flags >= 8)
|
||||||
|
type = TYPE_COUNT_LONGINT_POINTER;
|
||||||
|
else if (flags & 2)
|
||||||
|
type = TYPE_COUNT_SCHAR_POINTER;
|
||||||
|
else if (flags & 1)
|
||||||
|
type = TYPE_COUNT_SHORT_POINTER;
|
||||||
|
else
|
||||||
|
type = TYPE_COUNT_INT_POINTER;
|
||||||
|
break;
|
||||||
|
case '%':
|
||||||
|
type = TYPE_NONE;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
/* Unknown conversion character. */
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (type != TYPE_NONE)
|
||||||
|
{
|
||||||
|
dp->arg_index = arg_index;
|
||||||
|
if (dp->arg_index == ARG_NONE)
|
||||||
|
{
|
||||||
|
dp->arg_index = arg_posn++;
|
||||||
|
if (dp->arg_index == ARG_NONE)
|
||||||
|
/* arg_posn wrapped around. */
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
REGISTER_ARG (dp->arg_index, type);
|
||||||
|
}
|
||||||
|
dp->conversion = c;
|
||||||
|
dp->dir_end = cp;
|
||||||
|
}
|
||||||
|
|
||||||
|
d->count++;
|
||||||
|
if (d->count >= d_allocated)
|
||||||
|
{
|
||||||
|
size_t memory_size;
|
||||||
|
DIRECTIVE *memory;
|
||||||
|
|
||||||
|
d_allocated = xtimes (d_allocated, 2);
|
||||||
|
memory_size = xtimes (d_allocated, sizeof (DIRECTIVE));
|
||||||
|
if (size_overflow_p (memory_size))
|
||||||
|
/* Overflow, would lead to out of memory. */
|
||||||
|
goto error;
|
||||||
|
memory = realloc (d->dir, memory_size);
|
||||||
|
if (memory == NULL)
|
||||||
|
/* Out of memory. */
|
||||||
|
goto error;
|
||||||
|
d->dir = memory;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
d->dir[d->count].dir_start = cp;
|
||||||
|
|
||||||
|
d->max_width_length = max_width_length;
|
||||||
|
d->max_precision_length = max_precision_length;
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
error:
|
||||||
|
if (a->arg)
|
||||||
|
free (a->arg);
|
||||||
|
if (d->dir)
|
||||||
|
free (d->dir);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#undef DIRECTIVES
|
||||||
|
#undef DIRECTIVE
|
||||||
|
#undef CHAR_T
|
||||||
|
#undef PRINTF_PARSE
|
75
intl/printf-parse.h
Normal file
75
intl/printf-parse.h
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
/* Parse printf format string.
|
||||||
|
Copyright (C) 1999, 2002-2003 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU Library 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,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Library General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Library General Public
|
||||||
|
License along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||||
|
USA. */
|
||||||
|
|
||||||
|
#ifndef _PRINTF_PARSE_H
|
||||||
|
#define _PRINTF_PARSE_H
|
||||||
|
|
||||||
|
#include "printf-args.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* Flags */
|
||||||
|
#define FLAG_GROUP 1 /* ' flag */
|
||||||
|
#define FLAG_LEFT 2 /* - flag */
|
||||||
|
#define FLAG_SHOWSIGN 4 /* + flag */
|
||||||
|
#define FLAG_SPACE 8 /* space flag */
|
||||||
|
#define FLAG_ALT 16 /* # flag */
|
||||||
|
#define FLAG_ZERO 32
|
||||||
|
|
||||||
|
/* arg_index value indicating that no argument is consumed. */
|
||||||
|
#define ARG_NONE (~(size_t)0)
|
||||||
|
|
||||||
|
/* A parsed directive. */
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
const char* dir_start;
|
||||||
|
const char* dir_end;
|
||||||
|
int flags;
|
||||||
|
const char* width_start;
|
||||||
|
const char* width_end;
|
||||||
|
size_t width_arg_index;
|
||||||
|
const char* precision_start;
|
||||||
|
const char* precision_end;
|
||||||
|
size_t precision_arg_index;
|
||||||
|
char conversion; /* d i o u x X f e E g G c s p n U % but not C S */
|
||||||
|
size_t arg_index;
|
||||||
|
}
|
||||||
|
char_directive;
|
||||||
|
|
||||||
|
/* A parsed format string. */
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
size_t count;
|
||||||
|
char_directive *dir;
|
||||||
|
size_t max_width_length;
|
||||||
|
size_t max_precision_length;
|
||||||
|
}
|
||||||
|
char_directives;
|
||||||
|
|
||||||
|
|
||||||
|
/* Parses the format string. Fills in the number N of directives, and fills
|
||||||
|
in directives[0], ..., directives[N-1], and sets directives[N].dir_start
|
||||||
|
to the end of the format string. Also fills in the arg_type fields of the
|
||||||
|
arguments and the needed count of arguments. */
|
||||||
|
#ifdef STATIC
|
||||||
|
STATIC
|
||||||
|
#else
|
||||||
|
extern
|
||||||
|
#endif
|
||||||
|
int printf_parse (const char *format, char_directives *d, arguments *a);
|
||||||
|
|
||||||
|
#endif /* _PRINTF_PARSE_H */
|
371
intl/printf.c
Normal file
371
intl/printf.c
Normal file
@ -0,0 +1,371 @@
|
|||||||
|
/* Formatted output to strings, using POSIX/XSI format strings with positions.
|
||||||
|
Copyright (C) 2003 Free Software Foundation, Inc.
|
||||||
|
Written by Bruno Haible <bruno@clisp.org>, 2003.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU Library 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,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Library General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Library General Public
|
||||||
|
License along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||||
|
USA. */
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __GNUC__
|
||||||
|
# define alloca __builtin_alloca
|
||||||
|
# define HAVE_ALLOCA 1
|
||||||
|
#else
|
||||||
|
# ifdef _MSC_VER
|
||||||
|
# include <malloc.h>
|
||||||
|
# define alloca _alloca
|
||||||
|
# else
|
||||||
|
# if defined HAVE_ALLOCA_H || defined _LIBC
|
||||||
|
# include <alloca.h>
|
||||||
|
# else
|
||||||
|
# ifdef _AIX
|
||||||
|
#pragma alloca
|
||||||
|
# else
|
||||||
|
# ifndef alloca
|
||||||
|
char *alloca ();
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#if !HAVE_POSIX_PRINTF
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
/* When building a DLL, we must export some functions. Note that because
|
||||||
|
the functions are only defined for binary backward compatibility, we
|
||||||
|
don't need to use __declspec(dllimport) in any case. */
|
||||||
|
#if defined _MSC_VER && BUILDING_DLL
|
||||||
|
# define DLL_EXPORTED __declspec(dllexport)
|
||||||
|
#else
|
||||||
|
# define DLL_EXPORTED
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define STATIC static
|
||||||
|
|
||||||
|
/* Define auxiliary functions declared in "printf-args.h". */
|
||||||
|
#include "printf-args.c"
|
||||||
|
|
||||||
|
/* Define auxiliary functions declared in "printf-parse.h". */
|
||||||
|
#include "printf-parse.c"
|
||||||
|
|
||||||
|
/* Define functions declared in "vasnprintf.h". */
|
||||||
|
#define vasnprintf libintl_vasnprintf
|
||||||
|
#include "vasnprintf.c"
|
||||||
|
#if 0 /* not needed */
|
||||||
|
#define asnprintf libintl_asnprintf
|
||||||
|
#include "asnprintf.c"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
DLL_EXPORTED
|
||||||
|
int
|
||||||
|
libintl_vfprintf (FILE *stream, const char *format, va_list args)
|
||||||
|
{
|
||||||
|
if (strchr (format, '$') == NULL)
|
||||||
|
return vfprintf (stream, format, args);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
size_t length;
|
||||||
|
char *result = libintl_vasnprintf (NULL, &length, format, args);
|
||||||
|
int retval = -1;
|
||||||
|
if (result != NULL)
|
||||||
|
{
|
||||||
|
if (fwrite (result, 1, length, stream) == length)
|
||||||
|
retval = length;
|
||||||
|
free (result);
|
||||||
|
}
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
DLL_EXPORTED
|
||||||
|
int
|
||||||
|
libintl_fprintf (FILE *stream, const char *format, ...)
|
||||||
|
{
|
||||||
|
va_list args;
|
||||||
|
int retval;
|
||||||
|
|
||||||
|
va_start (args, format);
|
||||||
|
retval = libintl_vfprintf (stream, format, args);
|
||||||
|
va_end (args);
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
DLL_EXPORTED
|
||||||
|
int
|
||||||
|
libintl_vprintf (const char *format, va_list args)
|
||||||
|
{
|
||||||
|
return libintl_vfprintf (stdout, format, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
DLL_EXPORTED
|
||||||
|
int
|
||||||
|
libintl_printf (const char *format, ...)
|
||||||
|
{
|
||||||
|
va_list args;
|
||||||
|
int retval;
|
||||||
|
|
||||||
|
va_start (args, format);
|
||||||
|
retval = libintl_vprintf (format, args);
|
||||||
|
va_end (args);
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
DLL_EXPORTED
|
||||||
|
int
|
||||||
|
libintl_vsprintf (char *resultbuf, const char *format, va_list args)
|
||||||
|
{
|
||||||
|
if (strchr (format, '$') == NULL)
|
||||||
|
return vsprintf (resultbuf, format, args);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
size_t length = (size_t) ~0 / (4 * sizeof (char));
|
||||||
|
char *result = libintl_vasnprintf (resultbuf, &length, format, args);
|
||||||
|
if (result != resultbuf)
|
||||||
|
{
|
||||||
|
free (result);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return length;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
DLL_EXPORTED
|
||||||
|
int
|
||||||
|
libintl_sprintf (char *resultbuf, const char *format, ...)
|
||||||
|
{
|
||||||
|
va_list args;
|
||||||
|
int retval;
|
||||||
|
|
||||||
|
va_start (args, format);
|
||||||
|
retval = libintl_vsprintf (resultbuf, format, args);
|
||||||
|
va_end (args);
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if HAVE_SNPRINTF
|
||||||
|
|
||||||
|
# if HAVE_DECL__SNPRINTF
|
||||||
|
/* Windows. */
|
||||||
|
# define system_vsnprintf _vsnprintf
|
||||||
|
# else
|
||||||
|
/* Unix. */
|
||||||
|
# define system_vsnprintf vsnprintf
|
||||||
|
# endif
|
||||||
|
|
||||||
|
DLL_EXPORTED
|
||||||
|
int
|
||||||
|
libintl_vsnprintf (char *resultbuf, size_t length, const char *format, va_list args)
|
||||||
|
{
|
||||||
|
if (strchr (format, '$') == NULL)
|
||||||
|
return system_vsnprintf (resultbuf, length, format, args);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
size_t maxlength = length;
|
||||||
|
char *result = libintl_vasnprintf (resultbuf, &length, format, args);
|
||||||
|
if (result != resultbuf)
|
||||||
|
{
|
||||||
|
if (maxlength > 0)
|
||||||
|
{
|
||||||
|
if (length < maxlength)
|
||||||
|
abort ();
|
||||||
|
memcpy (resultbuf, result, maxlength - 1);
|
||||||
|
resultbuf[maxlength - 1] = '\0';
|
||||||
|
}
|
||||||
|
free (result);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return length;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
DLL_EXPORTED
|
||||||
|
int
|
||||||
|
libintl_snprintf (char *resultbuf, size_t length, const char *format, ...)
|
||||||
|
{
|
||||||
|
va_list args;
|
||||||
|
int retval;
|
||||||
|
|
||||||
|
va_start (args, format);
|
||||||
|
retval = libintl_vsnprintf (resultbuf, length, format, args);
|
||||||
|
va_end (args);
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if HAVE_ASPRINTF
|
||||||
|
|
||||||
|
DLL_EXPORTED
|
||||||
|
int
|
||||||
|
libintl_vasprintf (char **resultp, const char *format, va_list args)
|
||||||
|
{
|
||||||
|
size_t length;
|
||||||
|
char *result = libintl_vasnprintf (NULL, &length, format, args);
|
||||||
|
if (result == NULL)
|
||||||
|
return -1;
|
||||||
|
*resultp = result;
|
||||||
|
return length;
|
||||||
|
}
|
||||||
|
|
||||||
|
DLL_EXPORTED
|
||||||
|
int
|
||||||
|
libintl_asprintf (char **resultp, const char *format, ...)
|
||||||
|
{
|
||||||
|
va_list args;
|
||||||
|
int retval;
|
||||||
|
|
||||||
|
va_start (args, format);
|
||||||
|
retval = libintl_vasprintf (resultp, format, args);
|
||||||
|
va_end (args);
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if HAVE_FWPRINTF
|
||||||
|
|
||||||
|
#include <wchar.h>
|
||||||
|
|
||||||
|
#define WIDE_CHAR_VERSION 1
|
||||||
|
|
||||||
|
/* Define auxiliary functions declared in "wprintf-parse.h". */
|
||||||
|
#include "printf-parse.c"
|
||||||
|
|
||||||
|
/* Define functions declared in "vasnprintf.h". */
|
||||||
|
#define vasnwprintf libintl_vasnwprintf
|
||||||
|
#include "vasnprintf.c"
|
||||||
|
#if 0 /* not needed */
|
||||||
|
#define asnwprintf libintl_asnwprintf
|
||||||
|
#include "asnprintf.c"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
# if HAVE_DECL__SNWPRINTF
|
||||||
|
/* Windows. */
|
||||||
|
# define system_vswprintf _vsnwprintf
|
||||||
|
# else
|
||||||
|
/* Unix. */
|
||||||
|
# define system_vswprintf vswprintf
|
||||||
|
# endif
|
||||||
|
|
||||||
|
DLL_EXPORTED
|
||||||
|
int
|
||||||
|
libintl_vfwprintf (FILE *stream, const wchar_t *format, va_list args)
|
||||||
|
{
|
||||||
|
if (wcschr (format, '$') == NULL)
|
||||||
|
return vfwprintf (stream, format, args);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
size_t length;
|
||||||
|
wchar_t *result = libintl_vasnwprintf (NULL, &length, format, args);
|
||||||
|
int retval = -1;
|
||||||
|
if (result != NULL)
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
for (i = 0; i < length; i++)
|
||||||
|
if (fputwc (result[i], stream) == WEOF)
|
||||||
|
break;
|
||||||
|
if (i == length)
|
||||||
|
retval = length;
|
||||||
|
free (result);
|
||||||
|
}
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
DLL_EXPORTED
|
||||||
|
int
|
||||||
|
libintl_fwprintf (FILE *stream, const wchar_t *format, ...)
|
||||||
|
{
|
||||||
|
va_list args;
|
||||||
|
int retval;
|
||||||
|
|
||||||
|
va_start (args, format);
|
||||||
|
retval = libintl_vfwprintf (stream, format, args);
|
||||||
|
va_end (args);
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
DLL_EXPORTED
|
||||||
|
int
|
||||||
|
libintl_vwprintf (const wchar_t *format, va_list args)
|
||||||
|
{
|
||||||
|
return libintl_vfwprintf (stdout, format, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
DLL_EXPORTED
|
||||||
|
int
|
||||||
|
libintl_wprintf (const wchar_t *format, ...)
|
||||||
|
{
|
||||||
|
va_list args;
|
||||||
|
int retval;
|
||||||
|
|
||||||
|
va_start (args, format);
|
||||||
|
retval = libintl_vwprintf (format, args);
|
||||||
|
va_end (args);
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
DLL_EXPORTED
|
||||||
|
int
|
||||||
|
libintl_vswprintf (wchar_t *resultbuf, size_t length, const wchar_t *format, va_list args)
|
||||||
|
{
|
||||||
|
if (wcschr (format, '$') == NULL)
|
||||||
|
return system_vswprintf (resultbuf, length, format, args);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
size_t maxlength = length;
|
||||||
|
wchar_t *result = libintl_vasnwprintf (resultbuf, &length, format, args);
|
||||||
|
if (result != resultbuf)
|
||||||
|
{
|
||||||
|
if (maxlength > 0)
|
||||||
|
{
|
||||||
|
if (length < maxlength)
|
||||||
|
abort ();
|
||||||
|
memcpy (resultbuf, result, (maxlength - 1) * sizeof (wchar_t));
|
||||||
|
resultbuf[maxlength - 1] = 0;
|
||||||
|
}
|
||||||
|
free (result);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return length;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
DLL_EXPORTED
|
||||||
|
int
|
||||||
|
libintl_swprintf (wchar_t *resultbuf, size_t length, const wchar_t *format, ...)
|
||||||
|
{
|
||||||
|
va_list args;
|
||||||
|
int retval;
|
||||||
|
|
||||||
|
va_start (args, format);
|
||||||
|
retval = libintl_vswprintf (resultbuf, length, format, args);
|
||||||
|
va_end (args);
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
887
intl/vasnprintf.c
Normal file
887
intl/vasnprintf.c
Normal file
@ -0,0 +1,887 @@
|
|||||||
|
/* vsprintf with automatic memory allocation.
|
||||||
|
Copyright (C) 1999, 2002-2003 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU Library 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,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Library General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Library General Public
|
||||||
|
License along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||||
|
USA. */
|
||||||
|
|
||||||
|
/* Tell glibc's <stdio.h> to provide a prototype for snprintf().
|
||||||
|
This must come before <config.h> because <config.h> may include
|
||||||
|
<features.h>, and once <features.h> has been included, it's too late. */
|
||||||
|
#ifndef _GNU_SOURCE
|
||||||
|
# define _GNU_SOURCE 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include <config.h>
|
||||||
|
#endif
|
||||||
|
#ifndef IN_LIBINTL
|
||||||
|
# include <alloca.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Specification. */
|
||||||
|
#if WIDE_CHAR_VERSION
|
||||||
|
# include "vasnwprintf.h"
|
||||||
|
#else
|
||||||
|
# include "vasnprintf.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdio.h> /* snprintf(), sprintf() */
|
||||||
|
#include <stdlib.h> /* abort(), malloc(), realloc(), free() */
|
||||||
|
#include <string.h> /* memcpy(), strlen() */
|
||||||
|
#include <errno.h> /* errno */
|
||||||
|
#include <limits.h> /* CHAR_BIT */
|
||||||
|
#include <float.h> /* DBL_MAX_EXP, LDBL_MAX_EXP */
|
||||||
|
#if WIDE_CHAR_VERSION
|
||||||
|
# include "wprintf-parse.h"
|
||||||
|
#else
|
||||||
|
# include "printf-parse.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Checked size_t computations. */
|
||||||
|
#include "xsize.h"
|
||||||
|
|
||||||
|
#ifdef HAVE_WCHAR_T
|
||||||
|
# ifdef HAVE_WCSLEN
|
||||||
|
# define local_wcslen wcslen
|
||||||
|
# else
|
||||||
|
/* Solaris 2.5.1 has wcslen() in a separate library libw.so. To avoid
|
||||||
|
a dependency towards this library, here is a local substitute.
|
||||||
|
Define this substitute only once, even if this file is included
|
||||||
|
twice in the same compilation unit. */
|
||||||
|
# ifndef local_wcslen_defined
|
||||||
|
# define local_wcslen_defined 1
|
||||||
|
static size_t
|
||||||
|
local_wcslen (const wchar_t *s)
|
||||||
|
{
|
||||||
|
const wchar_t *ptr;
|
||||||
|
|
||||||
|
for (ptr = s; *ptr != (wchar_t) 0; ptr++)
|
||||||
|
;
|
||||||
|
return ptr - s;
|
||||||
|
}
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if WIDE_CHAR_VERSION
|
||||||
|
# define VASNPRINTF vasnwprintf
|
||||||
|
# define CHAR_T wchar_t
|
||||||
|
# define DIRECTIVE wchar_t_directive
|
||||||
|
# define DIRECTIVES wchar_t_directives
|
||||||
|
# define PRINTF_PARSE wprintf_parse
|
||||||
|
# define USE_SNPRINTF 1
|
||||||
|
# if HAVE_DECL__SNWPRINTF
|
||||||
|
/* On Windows, the function swprintf() has a different signature than
|
||||||
|
on Unix; we use the _snwprintf() function instead. */
|
||||||
|
# define SNPRINTF _snwprintf
|
||||||
|
# else
|
||||||
|
/* Unix. */
|
||||||
|
# define SNPRINTF swprintf
|
||||||
|
# endif
|
||||||
|
#else
|
||||||
|
# define VASNPRINTF vasnprintf
|
||||||
|
# define CHAR_T char
|
||||||
|
# define DIRECTIVE char_directive
|
||||||
|
# define DIRECTIVES char_directives
|
||||||
|
# define PRINTF_PARSE printf_parse
|
||||||
|
# define USE_SNPRINTF (HAVE_DECL__SNPRINTF || HAVE_SNPRINTF)
|
||||||
|
# if HAVE_DECL__SNPRINTF
|
||||||
|
/* Windows. */
|
||||||
|
# define SNPRINTF _snprintf
|
||||||
|
# else
|
||||||
|
/* Unix. */
|
||||||
|
# define SNPRINTF snprintf
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
CHAR_T *
|
||||||
|
VASNPRINTF (CHAR_T *resultbuf, size_t *lengthp, const CHAR_T *format, va_list args)
|
||||||
|
{
|
||||||
|
DIRECTIVES d;
|
||||||
|
arguments a;
|
||||||
|
|
||||||
|
if (PRINTF_PARSE (format, &d, &a) < 0)
|
||||||
|
{
|
||||||
|
errno = EINVAL;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define CLEANUP() \
|
||||||
|
free (d.dir); \
|
||||||
|
if (a.arg) \
|
||||||
|
free (a.arg);
|
||||||
|
|
||||||
|
if (printf_fetchargs (args, &a) < 0)
|
||||||
|
{
|
||||||
|
CLEANUP ();
|
||||||
|
errno = EINVAL;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
size_t buf_neededlength;
|
||||||
|
CHAR_T *buf;
|
||||||
|
CHAR_T *buf_malloced;
|
||||||
|
const CHAR_T *cp;
|
||||||
|
size_t i;
|
||||||
|
DIRECTIVE *dp;
|
||||||
|
/* Output string accumulator. */
|
||||||
|
CHAR_T *result;
|
||||||
|
size_t allocated;
|
||||||
|
size_t length;
|
||||||
|
|
||||||
|
/* Allocate a small buffer that will hold a directive passed to
|
||||||
|
sprintf or snprintf. */
|
||||||
|
buf_neededlength =
|
||||||
|
xsum4 (7, d.max_width_length, d.max_precision_length, 6);
|
||||||
|
#if HAVE_ALLOCA
|
||||||
|
if (buf_neededlength < 4000 / sizeof (CHAR_T))
|
||||||
|
{
|
||||||
|
buf = (CHAR_T *) alloca (buf_neededlength * sizeof (CHAR_T));
|
||||||
|
buf_malloced = NULL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
size_t buf_memsize = xtimes (buf_neededlength, sizeof (CHAR_T));
|
||||||
|
if (size_overflow_p (buf_memsize))
|
||||||
|
goto out_of_memory_1;
|
||||||
|
buf = (CHAR_T *) malloc (buf_memsize);
|
||||||
|
if (buf == NULL)
|
||||||
|
goto out_of_memory_1;
|
||||||
|
buf_malloced = buf;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (resultbuf != NULL)
|
||||||
|
{
|
||||||
|
result = resultbuf;
|
||||||
|
allocated = *lengthp;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = NULL;
|
||||||
|
allocated = 0;
|
||||||
|
}
|
||||||
|
length = 0;
|
||||||
|
/* Invariants:
|
||||||
|
result is either == resultbuf or == NULL or malloc-allocated.
|
||||||
|
If length > 0, then result != NULL. */
|
||||||
|
|
||||||
|
/* Ensures that allocated >= needed. Aborts through a jump to
|
||||||
|
out_of_memory if needed is SIZE_MAX or otherwise too big. */
|
||||||
|
#define ENSURE_ALLOCATION(needed) \
|
||||||
|
if ((needed) > allocated) \
|
||||||
|
{ \
|
||||||
|
size_t memory_size; \
|
||||||
|
CHAR_T *memory; \
|
||||||
|
\
|
||||||
|
allocated = (allocated > 0 ? xtimes (allocated, 2) : 12); \
|
||||||
|
if ((needed) > allocated) \
|
||||||
|
allocated = (needed); \
|
||||||
|
memory_size = xtimes (allocated, sizeof (CHAR_T)); \
|
||||||
|
if (size_overflow_p (memory_size)) \
|
||||||
|
goto out_of_memory; \
|
||||||
|
if (result == resultbuf || result == NULL) \
|
||||||
|
memory = (CHAR_T *) malloc (memory_size); \
|
||||||
|
else \
|
||||||
|
memory = (CHAR_T *) realloc (result, memory_size); \
|
||||||
|
if (memory == NULL) \
|
||||||
|
goto out_of_memory; \
|
||||||
|
if (result == resultbuf && length > 0) \
|
||||||
|
memcpy (memory, result, length * sizeof (CHAR_T)); \
|
||||||
|
result = memory; \
|
||||||
|
}
|
||||||
|
|
||||||
|
for (cp = format, i = 0, dp = &d.dir[0]; ; cp = dp->dir_end, i++, dp++)
|
||||||
|
{
|
||||||
|
if (cp != dp->dir_start)
|
||||||
|
{
|
||||||
|
size_t n = dp->dir_start - cp;
|
||||||
|
size_t augmented_length = xsum (length, n);
|
||||||
|
|
||||||
|
ENSURE_ALLOCATION (augmented_length);
|
||||||
|
memcpy (result + length, cp, n * sizeof (CHAR_T));
|
||||||
|
length = augmented_length;
|
||||||
|
}
|
||||||
|
if (i == d.count)
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* Execute a single directive. */
|
||||||
|
if (dp->conversion == '%')
|
||||||
|
{
|
||||||
|
size_t augmented_length;
|
||||||
|
|
||||||
|
if (!(dp->arg_index == ARG_NONE))
|
||||||
|
abort ();
|
||||||
|
augmented_length = xsum (length, 1);
|
||||||
|
ENSURE_ALLOCATION (augmented_length);
|
||||||
|
result[length] = '%';
|
||||||
|
length = augmented_length;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!(dp->arg_index != ARG_NONE))
|
||||||
|
abort ();
|
||||||
|
|
||||||
|
if (dp->conversion == 'n')
|
||||||
|
{
|
||||||
|
switch (a.arg[dp->arg_index].type)
|
||||||
|
{
|
||||||
|
case TYPE_COUNT_SCHAR_POINTER:
|
||||||
|
*a.arg[dp->arg_index].a.a_count_schar_pointer = length;
|
||||||
|
break;
|
||||||
|
case TYPE_COUNT_SHORT_POINTER:
|
||||||
|
*a.arg[dp->arg_index].a.a_count_short_pointer = length;
|
||||||
|
break;
|
||||||
|
case TYPE_COUNT_INT_POINTER:
|
||||||
|
*a.arg[dp->arg_index].a.a_count_int_pointer = length;
|
||||||
|
break;
|
||||||
|
case TYPE_COUNT_LONGINT_POINTER:
|
||||||
|
*a.arg[dp->arg_index].a.a_count_longint_pointer = length;
|
||||||
|
break;
|
||||||
|
#ifdef HAVE_LONG_LONG
|
||||||
|
case TYPE_COUNT_LONGLONGINT_POINTER:
|
||||||
|
*a.arg[dp->arg_index].a.a_count_longlongint_pointer = length;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
default:
|
||||||
|
abort ();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
arg_type type = a.arg[dp->arg_index].type;
|
||||||
|
CHAR_T *p;
|
||||||
|
unsigned int prefix_count;
|
||||||
|
int prefixes[2];
|
||||||
|
#if !USE_SNPRINTF
|
||||||
|
size_t tmp_length;
|
||||||
|
CHAR_T tmpbuf[700];
|
||||||
|
CHAR_T *tmp;
|
||||||
|
|
||||||
|
/* Allocate a temporary buffer of sufficient size for calling
|
||||||
|
sprintf. */
|
||||||
|
{
|
||||||
|
size_t width;
|
||||||
|
size_t precision;
|
||||||
|
|
||||||
|
width = 0;
|
||||||
|
if (dp->width_start != dp->width_end)
|
||||||
|
{
|
||||||
|
if (dp->width_arg_index != ARG_NONE)
|
||||||
|
{
|
||||||
|
int arg;
|
||||||
|
|
||||||
|
if (!(a.arg[dp->width_arg_index].type == TYPE_INT))
|
||||||
|
abort ();
|
||||||
|
arg = a.arg[dp->width_arg_index].a.a_int;
|
||||||
|
width = (arg < 0 ? (unsigned int) (-arg) : arg);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
const CHAR_T *digitp = dp->width_start;
|
||||||
|
|
||||||
|
do
|
||||||
|
width = xsum (xtimes (width, 10), *digitp++ - '0');
|
||||||
|
while (digitp != dp->width_end);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
precision = 6;
|
||||||
|
if (dp->precision_start != dp->precision_end)
|
||||||
|
{
|
||||||
|
if (dp->precision_arg_index != ARG_NONE)
|
||||||
|
{
|
||||||
|
int arg;
|
||||||
|
|
||||||
|
if (!(a.arg[dp->precision_arg_index].type == TYPE_INT))
|
||||||
|
abort ();
|
||||||
|
arg = a.arg[dp->precision_arg_index].a.a_int;
|
||||||
|
precision = (arg < 0 ? 0 : arg);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
const CHAR_T *digitp = dp->precision_start + 1;
|
||||||
|
|
||||||
|
precision = 0;
|
||||||
|
do
|
||||||
|
precision = xsum (xtimes (precision, 10), *digitp++ - '0');
|
||||||
|
while (digitp != dp->precision_end);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (dp->conversion)
|
||||||
|
{
|
||||||
|
|
||||||
|
case 'd': case 'i': case 'u':
|
||||||
|
# ifdef HAVE_LONG_LONG
|
||||||
|
if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT)
|
||||||
|
tmp_length =
|
||||||
|
(unsigned int) (sizeof (unsigned long long) * CHAR_BIT
|
||||||
|
* 0.30103 /* binary -> decimal */
|
||||||
|
* 2 /* estimate for FLAG_GROUP */
|
||||||
|
)
|
||||||
|
+ 1 /* turn floor into ceil */
|
||||||
|
+ 1; /* account for leading sign */
|
||||||
|
else
|
||||||
|
# endif
|
||||||
|
if (type == TYPE_LONGINT || type == TYPE_ULONGINT)
|
||||||
|
tmp_length =
|
||||||
|
(unsigned int) (sizeof (unsigned long) * CHAR_BIT
|
||||||
|
* 0.30103 /* binary -> decimal */
|
||||||
|
* 2 /* estimate for FLAG_GROUP */
|
||||||
|
)
|
||||||
|
+ 1 /* turn floor into ceil */
|
||||||
|
+ 1; /* account for leading sign */
|
||||||
|
else
|
||||||
|
tmp_length =
|
||||||
|
(unsigned int) (sizeof (unsigned int) * CHAR_BIT
|
||||||
|
* 0.30103 /* binary -> decimal */
|
||||||
|
* 2 /* estimate for FLAG_GROUP */
|
||||||
|
)
|
||||||
|
+ 1 /* turn floor into ceil */
|
||||||
|
+ 1; /* account for leading sign */
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'o':
|
||||||
|
# ifdef HAVE_LONG_LONG
|
||||||
|
if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT)
|
||||||
|
tmp_length =
|
||||||
|
(unsigned int) (sizeof (unsigned long long) * CHAR_BIT
|
||||||
|
* 0.333334 /* binary -> octal */
|
||||||
|
)
|
||||||
|
+ 1 /* turn floor into ceil */
|
||||||
|
+ 1; /* account for leading sign */
|
||||||
|
else
|
||||||
|
# endif
|
||||||
|
if (type == TYPE_LONGINT || type == TYPE_ULONGINT)
|
||||||
|
tmp_length =
|
||||||
|
(unsigned int) (sizeof (unsigned long) * CHAR_BIT
|
||||||
|
* 0.333334 /* binary -> octal */
|
||||||
|
)
|
||||||
|
+ 1 /* turn floor into ceil */
|
||||||
|
+ 1; /* account for leading sign */
|
||||||
|
else
|
||||||
|
tmp_length =
|
||||||
|
(unsigned int) (sizeof (unsigned int) * CHAR_BIT
|
||||||
|
* 0.333334 /* binary -> octal */
|
||||||
|
)
|
||||||
|
+ 1 /* turn floor into ceil */
|
||||||
|
+ 1; /* account for leading sign */
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'x': case 'X':
|
||||||
|
# ifdef HAVE_LONG_LONG
|
||||||
|
if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT)
|
||||||
|
tmp_length =
|
||||||
|
(unsigned int) (sizeof (unsigned long long) * CHAR_BIT
|
||||||
|
* 0.25 /* binary -> hexadecimal */
|
||||||
|
)
|
||||||
|
+ 1 /* turn floor into ceil */
|
||||||
|
+ 2; /* account for leading sign or alternate form */
|
||||||
|
else
|
||||||
|
# endif
|
||||||
|
if (type == TYPE_LONGINT || type == TYPE_ULONGINT)
|
||||||
|
tmp_length =
|
||||||
|
(unsigned int) (sizeof (unsigned long) * CHAR_BIT
|
||||||
|
* 0.25 /* binary -> hexadecimal */
|
||||||
|
)
|
||||||
|
+ 1 /* turn floor into ceil */
|
||||||
|
+ 2; /* account for leading sign or alternate form */
|
||||||
|
else
|
||||||
|
tmp_length =
|
||||||
|
(unsigned int) (sizeof (unsigned int) * CHAR_BIT
|
||||||
|
* 0.25 /* binary -> hexadecimal */
|
||||||
|
)
|
||||||
|
+ 1 /* turn floor into ceil */
|
||||||
|
+ 2; /* account for leading sign or alternate form */
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'f': case 'F':
|
||||||
|
# ifdef HAVE_LONG_DOUBLE
|
||||||
|
if (type == TYPE_LONGDOUBLE)
|
||||||
|
tmp_length =
|
||||||
|
(unsigned int) (LDBL_MAX_EXP
|
||||||
|
* 0.30103 /* binary -> decimal */
|
||||||
|
* 2 /* estimate for FLAG_GROUP */
|
||||||
|
)
|
||||||
|
+ 1 /* turn floor into ceil */
|
||||||
|
+ 10; /* sign, decimal point etc. */
|
||||||
|
else
|
||||||
|
# endif
|
||||||
|
tmp_length =
|
||||||
|
(unsigned int) (DBL_MAX_EXP
|
||||||
|
* 0.30103 /* binary -> decimal */
|
||||||
|
* 2 /* estimate for FLAG_GROUP */
|
||||||
|
)
|
||||||
|
+ 1 /* turn floor into ceil */
|
||||||
|
+ 10; /* sign, decimal point etc. */
|
||||||
|
tmp_length = xsum (tmp_length, precision);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'e': case 'E': case 'g': case 'G':
|
||||||
|
case 'a': case 'A':
|
||||||
|
tmp_length =
|
||||||
|
12; /* sign, decimal point, exponent etc. */
|
||||||
|
tmp_length = xsum (tmp_length, precision);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'c':
|
||||||
|
# if defined HAVE_WINT_T && !WIDE_CHAR_VERSION
|
||||||
|
if (type == TYPE_WIDE_CHAR)
|
||||||
|
tmp_length = MB_CUR_MAX;
|
||||||
|
else
|
||||||
|
# endif
|
||||||
|
tmp_length = 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 's':
|
||||||
|
# ifdef HAVE_WCHAR_T
|
||||||
|
if (type == TYPE_WIDE_STRING)
|
||||||
|
{
|
||||||
|
tmp_length =
|
||||||
|
local_wcslen (a.arg[dp->arg_index].a.a_wide_string);
|
||||||
|
|
||||||
|
# if !WIDE_CHAR_VERSION
|
||||||
|
tmp_length = xtimes (tmp_length, MB_CUR_MAX);
|
||||||
|
# endif
|
||||||
|
}
|
||||||
|
else
|
||||||
|
# endif
|
||||||
|
tmp_length = strlen (a.arg[dp->arg_index].a.a_string);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'p':
|
||||||
|
tmp_length =
|
||||||
|
(unsigned int) (sizeof (void *) * CHAR_BIT
|
||||||
|
* 0.25 /* binary -> hexadecimal */
|
||||||
|
)
|
||||||
|
+ 1 /* turn floor into ceil */
|
||||||
|
+ 2; /* account for leading 0x */
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
abort ();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tmp_length < width)
|
||||||
|
tmp_length = width;
|
||||||
|
|
||||||
|
tmp_length = xsum (tmp_length, 1); /* account for trailing NUL */
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tmp_length <= sizeof (tmpbuf) / sizeof (CHAR_T))
|
||||||
|
tmp = tmpbuf;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
size_t tmp_memsize = xtimes (tmp_length, sizeof (CHAR_T));
|
||||||
|
|
||||||
|
if (size_overflow_p (tmp_memsize))
|
||||||
|
/* Overflow, would lead to out of memory. */
|
||||||
|
goto out_of_memory;
|
||||||
|
tmp = (CHAR_T *) malloc (tmp_memsize);
|
||||||
|
if (tmp == NULL)
|
||||||
|
/* Out of memory. */
|
||||||
|
goto out_of_memory;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Construct the format string for calling snprintf or
|
||||||
|
sprintf. */
|
||||||
|
p = buf;
|
||||||
|
*p++ = '%';
|
||||||
|
if (dp->flags & FLAG_GROUP)
|
||||||
|
*p++ = '\'';
|
||||||
|
if (dp->flags & FLAG_LEFT)
|
||||||
|
*p++ = '-';
|
||||||
|
if (dp->flags & FLAG_SHOWSIGN)
|
||||||
|
*p++ = '+';
|
||||||
|
if (dp->flags & FLAG_SPACE)
|
||||||
|
*p++ = ' ';
|
||||||
|
if (dp->flags & FLAG_ALT)
|
||||||
|
*p++ = '#';
|
||||||
|
if (dp->flags & FLAG_ZERO)
|
||||||
|
*p++ = '0';
|
||||||
|
if (dp->width_start != dp->width_end)
|
||||||
|
{
|
||||||
|
size_t n = dp->width_end - dp->width_start;
|
||||||
|
memcpy (p, dp->width_start, n * sizeof (CHAR_T));
|
||||||
|
p += n;
|
||||||
|
}
|
||||||
|
if (dp->precision_start != dp->precision_end)
|
||||||
|
{
|
||||||
|
size_t n = dp->precision_end - dp->precision_start;
|
||||||
|
memcpy (p, dp->precision_start, n * sizeof (CHAR_T));
|
||||||
|
p += n;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (type)
|
||||||
|
{
|
||||||
|
#ifdef HAVE_LONG_LONG
|
||||||
|
case TYPE_LONGLONGINT:
|
||||||
|
case TYPE_ULONGLONGINT:
|
||||||
|
*p++ = 'l';
|
||||||
|
/*FALLTHROUGH*/
|
||||||
|
#endif
|
||||||
|
case TYPE_LONGINT:
|
||||||
|
case TYPE_ULONGINT:
|
||||||
|
#ifdef HAVE_WINT_T
|
||||||
|
case TYPE_WIDE_CHAR:
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_WCHAR_T
|
||||||
|
case TYPE_WIDE_STRING:
|
||||||
|
#endif
|
||||||
|
*p++ = 'l';
|
||||||
|
break;
|
||||||
|
#ifdef HAVE_LONG_DOUBLE
|
||||||
|
case TYPE_LONGDOUBLE:
|
||||||
|
*p++ = 'L';
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
*p = dp->conversion;
|
||||||
|
#if USE_SNPRINTF
|
||||||
|
p[1] = '%';
|
||||||
|
p[2] = 'n';
|
||||||
|
p[3] = '\0';
|
||||||
|
#else
|
||||||
|
p[1] = '\0';
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Construct the arguments for calling snprintf or sprintf. */
|
||||||
|
prefix_count = 0;
|
||||||
|
if (dp->width_arg_index != ARG_NONE)
|
||||||
|
{
|
||||||
|
if (!(a.arg[dp->width_arg_index].type == TYPE_INT))
|
||||||
|
abort ();
|
||||||
|
prefixes[prefix_count++] = a.arg[dp->width_arg_index].a.a_int;
|
||||||
|
}
|
||||||
|
if (dp->precision_arg_index != ARG_NONE)
|
||||||
|
{
|
||||||
|
if (!(a.arg[dp->precision_arg_index].type == TYPE_INT))
|
||||||
|
abort ();
|
||||||
|
prefixes[prefix_count++] = a.arg[dp->precision_arg_index].a.a_int;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if USE_SNPRINTF
|
||||||
|
/* Prepare checking whether snprintf returns the count
|
||||||
|
via %n. */
|
||||||
|
ENSURE_ALLOCATION (xsum (length, 1));
|
||||||
|
result[length] = '\0';
|
||||||
|
#endif
|
||||||
|
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
size_t maxlen;
|
||||||
|
int count;
|
||||||
|
int retcount;
|
||||||
|
|
||||||
|
maxlen = allocated - length;
|
||||||
|
count = -1;
|
||||||
|
retcount = 0;
|
||||||
|
|
||||||
|
#if USE_SNPRINTF
|
||||||
|
# define SNPRINTF_BUF(arg) \
|
||||||
|
switch (prefix_count) \
|
||||||
|
{ \
|
||||||
|
case 0: \
|
||||||
|
retcount = SNPRINTF (result + length, maxlen, buf, \
|
||||||
|
arg, &count); \
|
||||||
|
break; \
|
||||||
|
case 1: \
|
||||||
|
retcount = SNPRINTF (result + length, maxlen, buf, \
|
||||||
|
prefixes[0], arg, &count); \
|
||||||
|
break; \
|
||||||
|
case 2: \
|
||||||
|
retcount = SNPRINTF (result + length, maxlen, buf, \
|
||||||
|
prefixes[0], prefixes[1], arg, \
|
||||||
|
&count); \
|
||||||
|
break; \
|
||||||
|
default: \
|
||||||
|
abort (); \
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
# define SNPRINTF_BUF(arg) \
|
||||||
|
switch (prefix_count) \
|
||||||
|
{ \
|
||||||
|
case 0: \
|
||||||
|
count = sprintf (tmp, buf, arg); \
|
||||||
|
break; \
|
||||||
|
case 1: \
|
||||||
|
count = sprintf (tmp, buf, prefixes[0], arg); \
|
||||||
|
break; \
|
||||||
|
case 2: \
|
||||||
|
count = sprintf (tmp, buf, prefixes[0], prefixes[1],\
|
||||||
|
arg); \
|
||||||
|
break; \
|
||||||
|
default: \
|
||||||
|
abort (); \
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
switch (type)
|
||||||
|
{
|
||||||
|
case TYPE_SCHAR:
|
||||||
|
{
|
||||||
|
int arg = a.arg[dp->arg_index].a.a_schar;
|
||||||
|
SNPRINTF_BUF (arg);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case TYPE_UCHAR:
|
||||||
|
{
|
||||||
|
unsigned int arg = a.arg[dp->arg_index].a.a_uchar;
|
||||||
|
SNPRINTF_BUF (arg);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case TYPE_SHORT:
|
||||||
|
{
|
||||||
|
int arg = a.arg[dp->arg_index].a.a_short;
|
||||||
|
SNPRINTF_BUF (arg);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case TYPE_USHORT:
|
||||||
|
{
|
||||||
|
unsigned int arg = a.arg[dp->arg_index].a.a_ushort;
|
||||||
|
SNPRINTF_BUF (arg);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case TYPE_INT:
|
||||||
|
{
|
||||||
|
int arg = a.arg[dp->arg_index].a.a_int;
|
||||||
|
SNPRINTF_BUF (arg);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case TYPE_UINT:
|
||||||
|
{
|
||||||
|
unsigned int arg = a.arg[dp->arg_index].a.a_uint;
|
||||||
|
SNPRINTF_BUF (arg);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case TYPE_LONGINT:
|
||||||
|
{
|
||||||
|
long int arg = a.arg[dp->arg_index].a.a_longint;
|
||||||
|
SNPRINTF_BUF (arg);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case TYPE_ULONGINT:
|
||||||
|
{
|
||||||
|
unsigned long int arg = a.arg[dp->arg_index].a.a_ulongint;
|
||||||
|
SNPRINTF_BUF (arg);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
#ifdef HAVE_LONG_LONG
|
||||||
|
case TYPE_LONGLONGINT:
|
||||||
|
{
|
||||||
|
long long int arg = a.arg[dp->arg_index].a.a_longlongint;
|
||||||
|
SNPRINTF_BUF (arg);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case TYPE_ULONGLONGINT:
|
||||||
|
{
|
||||||
|
unsigned long long int arg = a.arg[dp->arg_index].a.a_ulonglongint;
|
||||||
|
SNPRINTF_BUF (arg);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
case TYPE_DOUBLE:
|
||||||
|
{
|
||||||
|
double arg = a.arg[dp->arg_index].a.a_double;
|
||||||
|
SNPRINTF_BUF (arg);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
#ifdef HAVE_LONG_DOUBLE
|
||||||
|
case TYPE_LONGDOUBLE:
|
||||||
|
{
|
||||||
|
long double arg = a.arg[dp->arg_index].a.a_longdouble;
|
||||||
|
SNPRINTF_BUF (arg);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
case TYPE_CHAR:
|
||||||
|
{
|
||||||
|
int arg = a.arg[dp->arg_index].a.a_char;
|
||||||
|
SNPRINTF_BUF (arg);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
#ifdef HAVE_WINT_T
|
||||||
|
case TYPE_WIDE_CHAR:
|
||||||
|
{
|
||||||
|
wint_t arg = a.arg[dp->arg_index].a.a_wide_char;
|
||||||
|
SNPRINTF_BUF (arg);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
case TYPE_STRING:
|
||||||
|
{
|
||||||
|
const char *arg = a.arg[dp->arg_index].a.a_string;
|
||||||
|
SNPRINTF_BUF (arg);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
#ifdef HAVE_WCHAR_T
|
||||||
|
case TYPE_WIDE_STRING:
|
||||||
|
{
|
||||||
|
const wchar_t *arg = a.arg[dp->arg_index].a.a_wide_string;
|
||||||
|
SNPRINTF_BUF (arg);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
case TYPE_POINTER:
|
||||||
|
{
|
||||||
|
void *arg = a.arg[dp->arg_index].a.a_pointer;
|
||||||
|
SNPRINTF_BUF (arg);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
abort ();
|
||||||
|
}
|
||||||
|
|
||||||
|
#if USE_SNPRINTF
|
||||||
|
/* Portability: Not all implementations of snprintf()
|
||||||
|
are ISO C 99 compliant. Determine the number of
|
||||||
|
bytes that snprintf() has produced or would have
|
||||||
|
produced. */
|
||||||
|
if (count >= 0)
|
||||||
|
{
|
||||||
|
/* Verify that snprintf() has NUL-terminated its
|
||||||
|
result. */
|
||||||
|
if (count < maxlen && result[length + count] != '\0')
|
||||||
|
abort ();
|
||||||
|
/* Portability hack. */
|
||||||
|
if (retcount > count)
|
||||||
|
count = retcount;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* snprintf() doesn't understand the '%n'
|
||||||
|
directive. */
|
||||||
|
if (p[1] != '\0')
|
||||||
|
{
|
||||||
|
/* Don't use the '%n' directive; instead, look
|
||||||
|
at the snprintf() return value. */
|
||||||
|
p[1] = '\0';
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Look at the snprintf() return value. */
|
||||||
|
if (retcount < 0)
|
||||||
|
{
|
||||||
|
/* HP-UX 10.20 snprintf() is doubly deficient:
|
||||||
|
It doesn't understand the '%n' directive,
|
||||||
|
*and* it returns -1 (rather than the length
|
||||||
|
that would have been required) when the
|
||||||
|
buffer is too small. */
|
||||||
|
size_t bigger_need =
|
||||||
|
xsum (xtimes (allocated, 2), 12);
|
||||||
|
ENSURE_ALLOCATION (bigger_need);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
count = retcount;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Attempt to handle failure. */
|
||||||
|
if (count < 0)
|
||||||
|
{
|
||||||
|
if (!(result == resultbuf || result == NULL))
|
||||||
|
free (result);
|
||||||
|
if (buf_malloced != NULL)
|
||||||
|
free (buf_malloced);
|
||||||
|
CLEANUP ();
|
||||||
|
errno = EINVAL;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if !USE_SNPRINTF
|
||||||
|
if (count >= tmp_length)
|
||||||
|
/* tmp_length was incorrectly calculated - fix the
|
||||||
|
code above! */
|
||||||
|
abort ();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Make room for the result. */
|
||||||
|
if (count >= maxlen)
|
||||||
|
{
|
||||||
|
/* Need at least count bytes. But allocate
|
||||||
|
proportionally, to avoid looping eternally if
|
||||||
|
snprintf() reports a too small count. */
|
||||||
|
size_t n =
|
||||||
|
xmax (xsum (length, count), xtimes (allocated, 2));
|
||||||
|
|
||||||
|
ENSURE_ALLOCATION (n);
|
||||||
|
#if USE_SNPRINTF
|
||||||
|
continue;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#if USE_SNPRINTF
|
||||||
|
/* The snprintf() result did fit. */
|
||||||
|
#else
|
||||||
|
/* Append the sprintf() result. */
|
||||||
|
memcpy (result + length, tmp, count * sizeof (CHAR_T));
|
||||||
|
if (tmp != tmpbuf)
|
||||||
|
free (tmp);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
length += count;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Add the final NUL. */
|
||||||
|
ENSURE_ALLOCATION (xsum (length, 1));
|
||||||
|
result[length] = '\0';
|
||||||
|
|
||||||
|
if (result != resultbuf && length + 1 < allocated)
|
||||||
|
{
|
||||||
|
/* Shrink the allocated memory if possible. */
|
||||||
|
CHAR_T *memory;
|
||||||
|
|
||||||
|
memory = (CHAR_T *) realloc (result, (length + 1) * sizeof (CHAR_T));
|
||||||
|
if (memory != NULL)
|
||||||
|
result = memory;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (buf_malloced != NULL)
|
||||||
|
free (buf_malloced);
|
||||||
|
CLEANUP ();
|
||||||
|
*lengthp = length;
|
||||||
|
return result;
|
||||||
|
|
||||||
|
out_of_memory:
|
||||||
|
if (!(result == resultbuf || result == NULL))
|
||||||
|
free (result);
|
||||||
|
if (buf_malloced != NULL)
|
||||||
|
free (buf_malloced);
|
||||||
|
out_of_memory_1:
|
||||||
|
CLEANUP ();
|
||||||
|
errno = ENOMEM;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#undef SNPRINTF
|
||||||
|
#undef USE_SNPRINTF
|
||||||
|
#undef PRINTF_PARSE
|
||||||
|
#undef DIRECTIVES
|
||||||
|
#undef DIRECTIVE
|
||||||
|
#undef CHAR_T
|
||||||
|
#undef VASNPRINTF
|
61
intl/vasnprintf.h
Normal file
61
intl/vasnprintf.h
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
/* vsprintf with automatic memory allocation.
|
||||||
|
Copyright (C) 2002-2003 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU Library 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,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Library General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Library General Public
|
||||||
|
License along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||||
|
USA. */
|
||||||
|
|
||||||
|
#ifndef _VASNPRINTF_H
|
||||||
|
#define _VASNPRINTF_H
|
||||||
|
|
||||||
|
/* Get va_list. */
|
||||||
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
/* Get size_t. */
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
#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
|
||||||
|
|
||||||
|
/* Write formatted output to a string dynamically allocated with malloc().
|
||||||
|
You can pass a preallocated buffer for the result in RESULTBUF and its
|
||||||
|
size in *LENGTHP; otherwise you pass RESULTBUF = NULL.
|
||||||
|
If successful, return the address of the string (this may be = RESULTBUF
|
||||||
|
if no dynamic memory allocation was necessary) and set *LENGTHP to the
|
||||||
|
number of resulting bytes, excluding the trailing NUL. Upon error, set
|
||||||
|
errno and return NULL. */
|
||||||
|
extern char * asnprintf (char *resultbuf, size_t *lengthp, const char *format, ...)
|
||||||
|
__attribute__ ((__format__ (__printf__, 3, 4)));
|
||||||
|
extern char * vasnprintf (char *resultbuf, size_t *lengthp, const char *format, va_list args)
|
||||||
|
__attribute__ ((__format__ (__printf__, 3, 0)));
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* _VASNPRINTF_H */
|
46
intl/vasnwprintf.h
Normal file
46
intl/vasnwprintf.h
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
/* vswprintf with automatic memory allocation.
|
||||||
|
Copyright (C) 2002-2003 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU Library 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,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Library General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Library General Public
|
||||||
|
License along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||||
|
USA. */
|
||||||
|
|
||||||
|
#ifndef _VASNWPRINTF_H
|
||||||
|
#define _VASNWPRINTF_H
|
||||||
|
|
||||||
|
/* Get va_list. */
|
||||||
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
/* Get wchar_t, size_t. */
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Write formatted output to a string dynamically allocated with malloc().
|
||||||
|
You can pass a preallocated buffer for the result in RESULTBUF and its
|
||||||
|
size in *LENGTHP; otherwise you pass RESULTBUF = NULL.
|
||||||
|
If successful, return the address of the string (this may be = RESULTBUF
|
||||||
|
if no dynamic memory allocation was necessary) and set *LENGTHP to the
|
||||||
|
number of resulting bytes, excluding the trailing NUL. Upon error, set
|
||||||
|
errno and return NULL. */
|
||||||
|
extern wchar_t * asnwprintf (wchar_t *resultbuf, size_t *lengthp, const wchar_t *format, ...);
|
||||||
|
extern wchar_t * vasnwprintf (wchar_t *resultbuf, size_t *lengthp, const wchar_t *format, va_list args);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* _VASNWPRINTF_H */
|
75
intl/wprintf-parse.h
Normal file
75
intl/wprintf-parse.h
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
/* Parse printf format string.
|
||||||
|
Copyright (C) 1999, 2002-2003 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU Library 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,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Library General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Library General Public
|
||||||
|
License along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||||
|
USA. */
|
||||||
|
|
||||||
|
#ifndef _WPRINTF_PARSE_H
|
||||||
|
#define _WPRINTF_PARSE_H
|
||||||
|
|
||||||
|
#include "printf-args.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* Flags */
|
||||||
|
#define FLAG_GROUP 1 /* ' flag */
|
||||||
|
#define FLAG_LEFT 2 /* - flag */
|
||||||
|
#define FLAG_SHOWSIGN 4 /* + flag */
|
||||||
|
#define FLAG_SPACE 8 /* space flag */
|
||||||
|
#define FLAG_ALT 16 /* # flag */
|
||||||
|
#define FLAG_ZERO 32
|
||||||
|
|
||||||
|
/* arg_index value indicating that no argument is consumed. */
|
||||||
|
#define ARG_NONE (~(size_t)0)
|
||||||
|
|
||||||
|
/* A parsed directive. */
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
const wchar_t* dir_start;
|
||||||
|
const wchar_t* dir_end;
|
||||||
|
int flags;
|
||||||
|
const wchar_t* width_start;
|
||||||
|
const wchar_t* width_end;
|
||||||
|
size_t width_arg_index;
|
||||||
|
const wchar_t* precision_start;
|
||||||
|
const wchar_t* precision_end;
|
||||||
|
size_t precision_arg_index;
|
||||||
|
wchar_t conversion; /* d i o u x X f e E g G c s p n U % but not C S */
|
||||||
|
size_t arg_index;
|
||||||
|
}
|
||||||
|
wchar_t_directive;
|
||||||
|
|
||||||
|
/* A parsed format string. */
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
size_t count;
|
||||||
|
wchar_t_directive *dir;
|
||||||
|
size_t max_width_length;
|
||||||
|
size_t max_precision_length;
|
||||||
|
}
|
||||||
|
wchar_t_directives;
|
||||||
|
|
||||||
|
|
||||||
|
/* Parses the format string. Fills in the number N of directives, and fills
|
||||||
|
in directives[0], ..., directives[N-1], and sets directives[N].dir_start
|
||||||
|
to the end of the format string. Also fills in the arg_type fields of the
|
||||||
|
arguments and the needed count of arguments. */
|
||||||
|
#ifdef STATIC
|
||||||
|
STATIC
|
||||||
|
#else
|
||||||
|
extern
|
||||||
|
#endif
|
||||||
|
int wprintf_parse (const wchar_t *format, wchar_t_directives *d, arguments *a);
|
||||||
|
|
||||||
|
#endif /* _WPRINTF_PARSE_H */
|
109
intl/xsize.h
Normal file
109
intl/xsize.h
Normal file
@ -0,0 +1,109 @@
|
|||||||
|
/* xsize.h -- Checked size_t computations.
|
||||||
|
|
||||||
|
Copyright (C) 2003 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU Library 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,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Library General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Library General Public
|
||||||
|
License along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||||
|
USA. */
|
||||||
|
|
||||||
|
#ifndef _XSIZE_H
|
||||||
|
#define _XSIZE_H
|
||||||
|
|
||||||
|
/* Get size_t. */
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
/* Get SIZE_MAX. */
|
||||||
|
#include <limits.h>
|
||||||
|
#if HAVE_STDINT_H
|
||||||
|
# include <stdint.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* The size of memory objects is often computed through expressions of
|
||||||
|
type size_t. Example:
|
||||||
|
void* p = malloc (header_size + n * element_size).
|
||||||
|
These computations can lead to overflow. When this happens, malloc()
|
||||||
|
returns a piece of memory that is way too small, and the program then
|
||||||
|
crashes while attempting to fill the memory.
|
||||||
|
To avoid this, the functions and macros in this file check for overflow.
|
||||||
|
The convention is that SIZE_MAX represents overflow.
|
||||||
|
malloc (SIZE_MAX) is not guaranteed to fail -- think of a malloc
|
||||||
|
implementation that uses mmap --, it's recommended to use size_overflow_p()
|
||||||
|
or size_in_bounds_p() before invoking malloc().
|
||||||
|
The example thus becomes:
|
||||||
|
size_t size = xsum (header_size, xtimes (n, element_size));
|
||||||
|
void *p = (size_in_bounds_p (size) ? malloc (size) : NULL);
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Convert an arbitrary value >= 0 to type size_t. */
|
||||||
|
#define xcast_size_t(N) \
|
||||||
|
((N) <= SIZE_MAX ? (size_t) (N) : SIZE_MAX)
|
||||||
|
|
||||||
|
/* Sum of two sizes, with overflow check. */
|
||||||
|
static inline size_t
|
||||||
|
#if __GNUC__ >= 3
|
||||||
|
__attribute__ ((__pure__))
|
||||||
|
#endif
|
||||||
|
xsum (size_t size1, size_t size2)
|
||||||
|
{
|
||||||
|
size_t sum = size1 + size2;
|
||||||
|
return (sum >= size1 ? sum : SIZE_MAX);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Sum of three sizes, with overflow check. */
|
||||||
|
static inline size_t
|
||||||
|
#if __GNUC__ >= 3
|
||||||
|
__attribute__ ((__pure__))
|
||||||
|
#endif
|
||||||
|
xsum3 (size_t size1, size_t size2, size_t size3)
|
||||||
|
{
|
||||||
|
return xsum (xsum (size1, size2), size3);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Sum of four sizes, with overflow check. */
|
||||||
|
static inline size_t
|
||||||
|
#if __GNUC__ >= 3
|
||||||
|
__attribute__ ((__pure__))
|
||||||
|
#endif
|
||||||
|
xsum4 (size_t size1, size_t size2, size_t size3, size_t size4)
|
||||||
|
{
|
||||||
|
return xsum (xsum (xsum (size1, size2), size3), size4);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Maximum of two sizes, with overflow check. */
|
||||||
|
static inline size_t
|
||||||
|
#if __GNUC__ >= 3
|
||||||
|
__attribute__ ((__pure__))
|
||||||
|
#endif
|
||||||
|
xmax (size_t size1, size_t size2)
|
||||||
|
{
|
||||||
|
/* No explicit check is needed here, because for any n:
|
||||||
|
max (SIZE_MAX, n) == SIZE_MAX and max (n, SIZE_MAX) == SIZE_MAX. */
|
||||||
|
return (size1 >= size2 ? size1 : size2);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Multiplication of a count with an element size, with overflow check.
|
||||||
|
The count must be >= 0 and the element size must be > 0.
|
||||||
|
This is a macro, not an inline function, so that it works correctly even
|
||||||
|
when N is of a wider tupe and N > SIZE_MAX. */
|
||||||
|
#define xtimes(N, ELSIZE) \
|
||||||
|
((N) <= SIZE_MAX / (ELSIZE) ? (size_t) (N) * (ELSIZE) : SIZE_MAX)
|
||||||
|
|
||||||
|
/* Check for overflow. */
|
||||||
|
#define size_overflow_p(SIZE) \
|
||||||
|
((SIZE) == SIZE_MAX)
|
||||||
|
/* Check against overflow. */
|
||||||
|
#define size_in_bounds_p(SIZE) \
|
||||||
|
((SIZE) != SIZE_MAX)
|
||||||
|
|
||||||
|
#endif /* _XSIZE_H */
|
32
m4/intmax.m4
Normal file
32
m4/intmax.m4
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
# intmax.m4 serial 1 (gettext-0.12)
|
||||||
|
dnl Copyright (C) 2002-2003 Free Software Foundation, Inc.
|
||||||
|
dnl This file is free software, distributed under the terms of the GNU
|
||||||
|
dnl General Public License. As a special exception to the GNU General
|
||||||
|
dnl Public License, this file may be distributed as part of a program
|
||||||
|
dnl that contains a configuration script generated by Autoconf, under
|
||||||
|
dnl the same distribution terms as the rest of that program.
|
||||||
|
|
||||||
|
dnl From Bruno Haible.
|
||||||
|
dnl Test whether the system has the 'intmax_t' type, but don't attempt to
|
||||||
|
dnl find a replacement if it is lacking.
|
||||||
|
|
||||||
|
AC_DEFUN([gt_TYPE_INTMAX_T],
|
||||||
|
[
|
||||||
|
AC_REQUIRE([jm_AC_HEADER_INTTYPES_H])
|
||||||
|
AC_REQUIRE([jm_AC_HEADER_STDINT_H])
|
||||||
|
AC_CACHE_CHECK(for intmax_t, gt_cv_c_intmax_t,
|
||||||
|
[AC_TRY_COMPILE([
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#if HAVE_STDINT_H_WITH_UINTMAX
|
||||||
|
#include <stdint.h>
|
||||||
|
#endif
|
||||||
|
#if HAVE_INTTYPES_H_WITH_UINTMAX
|
||||||
|
#include <inttypes.h>
|
||||||
|
#endif
|
||||||
|
], [intmax_t x = -1;], gt_cv_c_intmax_t=yes, gt_cv_c_intmax_t=no)])
|
||||||
|
if test $gt_cv_c_intmax_t = yes; then
|
||||||
|
AC_DEFINE(HAVE_INTMAX_T, 1,
|
||||||
|
[Define if you have the 'intmax_t' type in <stdint.h> or <inttypes.h>.])
|
||||||
|
fi
|
||||||
|
])
|
30
m4/longdouble.m4
Normal file
30
m4/longdouble.m4
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
# longdouble.m4 serial 1 (gettext-0.12)
|
||||||
|
dnl Copyright (C) 2002-2003 Free Software Foundation, Inc.
|
||||||
|
dnl This file is free software, distributed under the terms of the GNU
|
||||||
|
dnl General Public License. As a special exception to the GNU General
|
||||||
|
dnl Public License, this file may be distributed as part of a program
|
||||||
|
dnl that contains a configuration script generated by Autoconf, under
|
||||||
|
dnl the same distribution terms as the rest of that program.
|
||||||
|
|
||||||
|
dnl From Bruno Haible.
|
||||||
|
dnl Test whether the compiler supports the 'long double' type.
|
||||||
|
dnl Prerequisite: AC_PROG_CC
|
||||||
|
|
||||||
|
AC_DEFUN([gt_TYPE_LONGDOUBLE],
|
||||||
|
[
|
||||||
|
AC_CACHE_CHECK([for long double], gt_cv_c_long_double,
|
||||||
|
[if test "$GCC" = yes; then
|
||||||
|
gt_cv_c_long_double=yes
|
||||||
|
else
|
||||||
|
AC_TRY_COMPILE([
|
||||||
|
/* The Stardent Vistra knows sizeof(long double), but does not support it. */
|
||||||
|
long double foo = 0.0;
|
||||||
|
/* On Ultrix 4.3 cc, long double is 4 and double is 8. */
|
||||||
|
int array [2*(sizeof(long double) >= sizeof(double)) - 1];
|
||||||
|
], ,
|
||||||
|
gt_cv_c_long_double=yes, gt_cv_c_long_double=no)
|
||||||
|
fi])
|
||||||
|
if test $gt_cv_c_long_double = yes; then
|
||||||
|
AC_DEFINE(HAVE_LONG_DOUBLE, 1, [Define if you have the 'long double' type.])
|
||||||
|
fi
|
||||||
|
])
|
25
m4/longlong.m4
Normal file
25
m4/longlong.m4
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
# longlong.m4 serial 4
|
||||||
|
dnl Copyright (C) 1999-2003 Free Software Foundation, Inc.
|
||||||
|
dnl This file is free software, distributed under the terms of the GNU
|
||||||
|
dnl General Public License. As a special exception to the GNU General
|
||||||
|
dnl Public License, this file may be distributed as part of a program
|
||||||
|
dnl that contains a configuration script generated by Autoconf, under
|
||||||
|
dnl the same distribution terms as the rest of that program.
|
||||||
|
|
||||||
|
dnl From Paul Eggert.
|
||||||
|
|
||||||
|
# Define HAVE_LONG_LONG if 'long long' works.
|
||||||
|
|
||||||
|
AC_DEFUN([jm_AC_TYPE_LONG_LONG],
|
||||||
|
[
|
||||||
|
AC_CACHE_CHECK([for long long], ac_cv_type_long_long,
|
||||||
|
[AC_TRY_LINK([long long ll = 1LL; int i = 63;],
|
||||||
|
[long long llmax = (long long) -1;
|
||||||
|
return ll << i | ll >> i | llmax / ll | llmax % ll;],
|
||||||
|
ac_cv_type_long_long=yes,
|
||||||
|
ac_cv_type_long_long=no)])
|
||||||
|
if test $ac_cv_type_long_long = yes; then
|
||||||
|
AC_DEFINE(HAVE_LONG_LONG, 1,
|
||||||
|
[Define if you have the 'long long' type.])
|
||||||
|
fi
|
||||||
|
])
|
46
m4/printf-posix.m4
Normal file
46
m4/printf-posix.m4
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
# printf-posix.m4 serial 2 (gettext-0.13.1)
|
||||||
|
dnl Copyright (C) 2003 Free Software Foundation, Inc.
|
||||||
|
dnl This file is free software, distributed under the terms of the GNU
|
||||||
|
dnl General Public License. As a special exception to the GNU General
|
||||||
|
dnl Public License, this file may be distributed as part of a program
|
||||||
|
dnl that contains a configuration script generated by Autoconf, under
|
||||||
|
dnl the same distribution terms as the rest of that program.
|
||||||
|
|
||||||
|
dnl From Bruno Haible.
|
||||||
|
dnl Test whether the printf() function supports POSIX/XSI format strings with
|
||||||
|
dnl positions.
|
||||||
|
|
||||||
|
AC_DEFUN([gt_PRINTF_POSIX],
|
||||||
|
[
|
||||||
|
AC_REQUIRE([AC_PROG_CC])
|
||||||
|
AC_CACHE_CHECK([whether printf() supports POSIX/XSI format strings],
|
||||||
|
gt_cv_func_printf_posix,
|
||||||
|
[
|
||||||
|
AC_TRY_RUN([
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
/* The string "%2$d %1$d", with dollar characters protected from the shell's
|
||||||
|
dollar expansion (possibly an autoconf bug). */
|
||||||
|
static char format[] = { '%', '2', '$', 'd', ' ', '%', '1', '$', 'd', '\0' };
|
||||||
|
static char buf[100];
|
||||||
|
int main ()
|
||||||
|
{
|
||||||
|
sprintf (buf, format, 33, 55);
|
||||||
|
return (strcmp (buf, "55 33") != 0);
|
||||||
|
}], gt_cv_func_printf_posix=yes, gt_cv_func_printf_posix=no,
|
||||||
|
[
|
||||||
|
AC_EGREP_CPP(notposix, [
|
||||||
|
#if defined __NetBSD__ || defined _MSC_VER || defined __MINGW32__ || defined __CYGWIN__
|
||||||
|
notposix
|
||||||
|
#endif
|
||||||
|
], gt_cv_func_printf_posix="guessing no",
|
||||||
|
gt_cv_func_printf_posix="guessing yes")
|
||||||
|
])
|
||||||
|
])
|
||||||
|
case $gt_cv_func_printf_posix in
|
||||||
|
*yes)
|
||||||
|
AC_DEFINE(HAVE_POSIX_PRINTF, 1,
|
||||||
|
[Define if your printf() function supports format strings with positions.])
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
])
|
19
m4/signed.m4
Normal file
19
m4/signed.m4
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
# signed.m4 serial 1 (gettext-0.10.40)
|
||||||
|
dnl Copyright (C) 2001-2002 Free Software Foundation, Inc.
|
||||||
|
dnl This file is free software, distributed under the terms of the GNU
|
||||||
|
dnl General Public License. As a special exception to the GNU General
|
||||||
|
dnl Public License, this file may be distributed as part of a program
|
||||||
|
dnl that contains a configuration script generated by Autoconf, under
|
||||||
|
dnl the same distribution terms as the rest of that program.
|
||||||
|
|
||||||
|
dnl From Bruno Haible.
|
||||||
|
|
||||||
|
AC_DEFUN([bh_C_SIGNED],
|
||||||
|
[
|
||||||
|
AC_CACHE_CHECK([for signed], bh_cv_c_signed,
|
||||||
|
[AC_TRY_COMPILE(, [signed char x;], bh_cv_c_signed=yes, bh_cv_c_signed=no)])
|
||||||
|
if test $bh_cv_c_signed = no; then
|
||||||
|
AC_DEFINE(signed, ,
|
||||||
|
[Define to empty if the C compiler doesn't support this keyword.])
|
||||||
|
fi
|
||||||
|
])
|
61
m4/size_max.m4
Normal file
61
m4/size_max.m4
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
# size_max.m4 serial 2
|
||||||
|
dnl Copyright (C) 2003 Free Software Foundation, Inc.
|
||||||
|
dnl This file is free software, distributed under the terms of the GNU
|
||||||
|
dnl General Public License. As a special exception to the GNU General
|
||||||
|
dnl Public License, this file may be distributed as part of a program
|
||||||
|
dnl that contains a configuration script generated by Autoconf, under
|
||||||
|
dnl the same distribution terms as the rest of that program.
|
||||||
|
|
||||||
|
dnl From Bruno Haible.
|
||||||
|
|
||||||
|
AC_DEFUN([gl_SIZE_MAX],
|
||||||
|
[
|
||||||
|
AC_CHECK_HEADERS(stdint.h)
|
||||||
|
dnl First test whether the system already has SIZE_MAX.
|
||||||
|
AC_MSG_CHECKING([for SIZE_MAX])
|
||||||
|
result=
|
||||||
|
AC_EGREP_CPP([Found it], [
|
||||||
|
#include <limits.h>
|
||||||
|
#if HAVE_STDINT_H
|
||||||
|
#include <stdint.h>
|
||||||
|
#endif
|
||||||
|
#ifdef SIZE_MAX
|
||||||
|
Found it
|
||||||
|
#endif
|
||||||
|
], result=yes)
|
||||||
|
if test -z "$result"; then
|
||||||
|
dnl Define it ourselves. Here we assume that the type 'size_t' is not wider
|
||||||
|
dnl than the type 'unsigned long'.
|
||||||
|
dnl The _AC_COMPUTE_INT macro works up to LONG_MAX, since it uses 'expr',
|
||||||
|
dnl which is guaranteed to work from LONG_MIN to LONG_MAX.
|
||||||
|
_AC_COMPUTE_INT([~(size_t)0 / 10], res_hi,
|
||||||
|
[#include <stddef.h>], result=?)
|
||||||
|
_AC_COMPUTE_INT([~(size_t)0 % 10], res_lo,
|
||||||
|
[#include <stddef.h>], result=?)
|
||||||
|
_AC_COMPUTE_INT([sizeof (size_t) <= sizeof (unsigned int)], fits_in_uint,
|
||||||
|
[#include <stddef.h>], result=?)
|
||||||
|
if test "$fits_in_uint" = 1; then
|
||||||
|
dnl Even though SIZE_MAX fits in an unsigned int, it must be of type
|
||||||
|
dnl 'unsigned long' if the type 'size_t' is the same as 'unsigned long'.
|
||||||
|
AC_TRY_COMPILE([#include <stddef.h>
|
||||||
|
extern size_t foo;
|
||||||
|
extern unsigned long foo;
|
||||||
|
], [], fits_in_uint=0)
|
||||||
|
fi
|
||||||
|
if test -z "$result"; then
|
||||||
|
if test "$fits_in_uint" = 1; then
|
||||||
|
result="$res_hi$res_lo"U
|
||||||
|
else
|
||||||
|
result="$res_hi$res_lo"UL
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
dnl Shouldn't happen, but who knows...
|
||||||
|
result='~(size_t)0'
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
AC_MSG_RESULT([$result])
|
||||||
|
if test "$result" != yes; then
|
||||||
|
AC_DEFINE_UNQUOTED([SIZE_MAX], [$result],
|
||||||
|
[Define as the maximum value of type 'size_t', if the system doesn't define it.])
|
||||||
|
fi
|
||||||
|
])
|
22
m4/wchar_t.m4
Normal file
22
m4/wchar_t.m4
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
# wchar_t.m4 serial 1 (gettext-0.12)
|
||||||
|
dnl Copyright (C) 2002-2003 Free Software Foundation, Inc.
|
||||||
|
dnl This file is free software, distributed under the terms of the GNU
|
||||||
|
dnl General Public License. As a special exception to the GNU General
|
||||||
|
dnl Public License, this file may be distributed as part of a program
|
||||||
|
dnl that contains a configuration script generated by Autoconf, under
|
||||||
|
dnl the same distribution terms as the rest of that program.
|
||||||
|
|
||||||
|
dnl From Bruno Haible.
|
||||||
|
dnl Test whether <stddef.h> has the 'wchar_t' type.
|
||||||
|
dnl Prerequisite: AC_PROG_CC
|
||||||
|
|
||||||
|
AC_DEFUN([gt_TYPE_WCHAR_T],
|
||||||
|
[
|
||||||
|
AC_CACHE_CHECK([for wchar_t], gt_cv_c_wchar_t,
|
||||||
|
[AC_TRY_COMPILE([#include <stddef.h>
|
||||||
|
wchar_t foo = (wchar_t)'\0';], ,
|
||||||
|
gt_cv_c_wchar_t=yes, gt_cv_c_wchar_t=no)])
|
||||||
|
if test $gt_cv_c_wchar_t = yes; then
|
||||||
|
AC_DEFINE(HAVE_WCHAR_T, 1, [Define if you have the 'wchar_t' type.])
|
||||||
|
fi
|
||||||
|
])
|
22
m4/wint_t.m4
Normal file
22
m4/wint_t.m4
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
# wint_t.m4 serial 1 (gettext-0.12)
|
||||||
|
dnl Copyright (C) 2003 Free Software Foundation, Inc.
|
||||||
|
dnl This file is free software, distributed under the terms of the GNU
|
||||||
|
dnl General Public License. As a special exception to the GNU General
|
||||||
|
dnl Public License, this file may be distributed as part of a program
|
||||||
|
dnl that contains a configuration script generated by Autoconf, under
|
||||||
|
dnl the same distribution terms as the rest of that program.
|
||||||
|
|
||||||
|
dnl From Bruno Haible.
|
||||||
|
dnl Test whether <wchar.h> has the 'wint_t' type.
|
||||||
|
dnl Prerequisite: AC_PROG_CC
|
||||||
|
|
||||||
|
AC_DEFUN([gt_TYPE_WINT_T],
|
||||||
|
[
|
||||||
|
AC_CACHE_CHECK([for wint_t], gt_cv_c_wint_t,
|
||||||
|
[AC_TRY_COMPILE([#include <wchar.h>
|
||||||
|
wint_t foo = (wchar_t)'\0';], ,
|
||||||
|
gt_cv_c_wint_t=yes, gt_cv_c_wint_t=no)])
|
||||||
|
if test $gt_cv_c_wint_t = yes; then
|
||||||
|
AC_DEFINE(HAVE_WINT_T, 1, [Define if you have the 'wint_t' type.])
|
||||||
|
fi
|
||||||
|
])
|
14
m4/xsize.m4
Normal file
14
m4/xsize.m4
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
# xsize.m4 serial 2
|
||||||
|
dnl Copyright (C) 2003 Free Software Foundation, Inc.
|
||||||
|
dnl This file is free software, distributed under the terms of the GNU
|
||||||
|
dnl General Public License. As a special exception to the GNU General
|
||||||
|
dnl Public License, this file may be distributed as part of a program
|
||||||
|
dnl that contains a configuration script generated by Autoconf, under
|
||||||
|
dnl the same distribution terms as the rest of that program.
|
||||||
|
|
||||||
|
AC_DEFUN([gl_XSIZE],
|
||||||
|
[
|
||||||
|
dnl Prerequisites of lib/xsize.h.
|
||||||
|
AC_REQUIRE([gl_SIZE_MAX])
|
||||||
|
AC_CHECK_HEADERS(stdint.h)
|
||||||
|
])
|
377
scripts/ChangeLog
Normal file
377
scripts/ChangeLog
Normal file
@ -0,0 +1,377 @@
|
|||||||
|
2004-07-27 Werner Koch <wk@g10code.de>
|
||||||
|
|
||||||
|
* autogen.sh: Updated to the moder version, grepping the required
|
||||||
|
tool versions from configure.ac.
|
||||||
|
|
||||||
|
2004-06-14 Werner Koch <wk@gnupg.org>
|
||||||
|
|
||||||
|
* mk-w32-dist: Do not include the en@* po files.
|
||||||
|
|
||||||
|
* autogen.sh <--build-w32>: Build keyserver helpers again.
|
||||||
|
|
||||||
|
2004-04-02 Thomas Schwinge <schwinge@nic-nac-project.de>
|
||||||
|
|
||||||
|
* autogen.sh: Added ACLOCAL_FLAGS.
|
||||||
|
|
||||||
|
2003-12-28 Stefan Bellon <sbellon@sbellon.de>
|
||||||
|
|
||||||
|
* build-riscos, conf-riscos/*: Updated to reflect latest changes.
|
||||||
|
|
||||||
|
2003-10-25 Werner Koch <wk@gnupg.org>
|
||||||
|
|
||||||
|
* autogen.sh: Updated required versions and add -I m4 to aclocal.
|
||||||
|
|
||||||
|
2003-08-28 David Shaw <dshaw@jabberwocky.com>
|
||||||
|
|
||||||
|
* autogen.sh: Touch po/all for --build-w32. From Werner on stable
|
||||||
|
branch.
|
||||||
|
|
||||||
|
2003-08-25 David Shaw <dshaw@jabberwocky.com>
|
||||||
|
|
||||||
|
* gnupg.spec.in: Rework much of the spec to use %-macros
|
||||||
|
throughout. Fix to work properly with RPM 4.1 (all files in
|
||||||
|
buildroot must be packaged). Package and install info files. Tweak
|
||||||
|
the English description. Do not install gpgv and gpgsplit setuid
|
||||||
|
root. Make sure that install-info is called in such a way that
|
||||||
|
doesn't bork the RPM install if it cannot complete (necessary for
|
||||||
|
some upgrade scenarios).
|
||||||
|
|
||||||
|
2003-05-26 David Shaw <dshaw@jabberwocky.com>
|
||||||
|
|
||||||
|
* mk-w32-dist: Don't iconv {hu,sk,zh_TW}.po. (From wk on stable
|
||||||
|
branch)
|
||||||
|
|
||||||
|
2003-04-08 Werner Koch <wk@gnupg.org>
|
||||||
|
|
||||||
|
* autogen.sh: Add options to build for coldfire and uClinux.
|
||||||
|
|
||||||
|
2003-02-22 David Shaw <dshaw@jabberwocky.com>
|
||||||
|
|
||||||
|
* distfiles, gnupg.spec.in: convert-from-106 is in the tools
|
||||||
|
directory now.
|
||||||
|
|
||||||
|
* convert-from-106: Move to the tools directory.
|
||||||
|
|
||||||
|
2002-12-01 David Shaw <dshaw@jabberwocky.com>
|
||||||
|
|
||||||
|
* distfiles, gnupg.spec.in: Include convert-from-106.
|
||||||
|
|
||||||
|
* convert-from-106: Script to automate the 1.0.6->later
|
||||||
|
conversion. It marks all secret keys as ultimately trusted, adds
|
||||||
|
the signature caches, and checks the trustdb.
|
||||||
|
|
||||||
|
2002-11-13 David Shaw <dshaw@jabberwocky.com>
|
||||||
|
|
||||||
|
* mk-w32-dist: Don't use iconv for pl.po. From Werner on stable
|
||||||
|
branch.
|
||||||
|
|
||||||
|
* mk-w32-dist: Include gpgkeys_ldap and gpgkeys_hkp.
|
||||||
|
|
||||||
|
2002-11-12 Werner Koch <wk@gnupg.org>
|
||||||
|
|
||||||
|
* config.sub, config.guess: Updated from ftp.gnu.org/gnu/config
|
||||||
|
to version 2002-11-08.
|
||||||
|
|
||||||
|
2002-10-31 David Shaw <dshaw@jabberwocky.com>
|
||||||
|
|
||||||
|
* gnupg.spec.in: Update source ftp path.
|
||||||
|
|
||||||
|
2002-10-31 Stefan Bellon <sbellon@sbellon.de>
|
||||||
|
|
||||||
|
* conf-riscos/Makefile: Updated to reflect latest changes.
|
||||||
|
|
||||||
|
2002-10-28 Stefan Bellon <sbellon@sbellon.de>
|
||||||
|
|
||||||
|
* conf-riscos/include/config.h: Updated to reflect latest changes.
|
||||||
|
|
||||||
|
2002-10-26 David Shaw <dshaw@jabberwocky.com>
|
||||||
|
|
||||||
|
* gnupg.spec.in: Use new path for keyserver helpers, /usr/lib is
|
||||||
|
no longer used for cipher/hash plugins, and include gpgv,
|
||||||
|
gpgsplit, and the new gnupg.7 man page.
|
||||||
|
|
||||||
|
2002-10-17 Werner Koch <wk@gnupg.org>
|
||||||
|
|
||||||
|
* autogen.sh: Allow env variables to override the auto* tool
|
||||||
|
names. Suggested by Simon Josefsson.
|
||||||
|
|
||||||
|
2002-09-11 Werner Koch <wk@gnupg.org>
|
||||||
|
|
||||||
|
* distfiles: Include mk-w32-dist.
|
||||||
|
|
||||||
|
* mk-w32-dist: Convert the character sets on a per language base.
|
||||||
|
|
||||||
|
2002-09-02 Werner Koch <wk@gnupg.org>
|
||||||
|
|
||||||
|
* mk-w32-dist: Include more man pages and gpg split. Changed name
|
||||||
|
of ZIP file to better indicate that this is a command line version.
|
||||||
|
|
||||||
|
2002-08-23 Werner Koch <wk@gnupg.org>
|
||||||
|
|
||||||
|
* autogen.sh : Don't run gettextize.
|
||||||
|
|
||||||
|
2002-08-06 Stefan Bellon <sbellon@sbellon.de>
|
||||||
|
|
||||||
|
* conf-riscos/include/config.h: Changed #define FOO to
|
||||||
|
#define FOO 1.
|
||||||
|
* conf-riscos/include/g10defs.h: Likewise.
|
||||||
|
|
||||||
|
2002-08-03 Stefan Bellon <sbellon@sbellon.de>
|
||||||
|
|
||||||
|
* conf-riscos/include/g10defs.h: Added GNUPG_LIBEXECDIR.
|
||||||
|
* conf-riscos/include/config.h: Changes due to dynload removal and
|
||||||
|
minor changes to avoid some warnings.
|
||||||
|
* conf-riscos/Makefile: Changes due to dynload removal.
|
||||||
|
* conf-riscos/cipher/*: Not needed anymore due to dynload removal.
|
||||||
|
|
||||||
|
2002-07-25 David Shaw <dshaw@jabberwocky.com>
|
||||||
|
|
||||||
|
* gnupgbug: "Warning" -> "WARNING"
|
||||||
|
|
||||||
|
2002-07-01 Werner Koch <wk@gnupg.org>
|
||||||
|
|
||||||
|
* mk-gpg-texi: New.
|
||||||
|
|
||||||
|
2002-06-30 Werner Koch <wk@gnupg.org>
|
||||||
|
|
||||||
|
* mk-w32-dist (bindir): Fixes vor VPATH builds in a subdir,
|
||||||
|
include gpgv.
|
||||||
|
|
||||||
|
2002-06-21 Stefan Bellon <sbellon@sbellon.de>
|
||||||
|
|
||||||
|
* conf-riscos/Makefile: Changes due to moving around RISC OS
|
||||||
|
specific stuff in the code.
|
||||||
|
|
||||||
|
2002-06-07 Stefan Bellon <sbellon@sbellon.de>
|
||||||
|
|
||||||
|
* conf-riscos/include/config.h [__riscos__]: Fixed macro bug.
|
||||||
|
|
||||||
|
2002-05-10 Stefan Bellon <sbellon@sbellon.de>
|
||||||
|
|
||||||
|
* conf-riscos/include/config.h [__riscos__]: Changes for later
|
||||||
|
Norcroft compilers.
|
||||||
|
|
||||||
|
* conf-riscos/Makefile [__riscos__]: Updated.
|
||||||
|
|
||||||
|
2002-04-22 Stefan Bellon <sbellon@sbellon.de>
|
||||||
|
|
||||||
|
* conf-riscos/include/config.h [__riscos__]: Development
|
||||||
|
versions automatically define DEBUG from now on.
|
||||||
|
|
||||||
|
* conf-riscos/Makefile [__riscos__]: Updated for LDAP keyserver
|
||||||
|
code.
|
||||||
|
|
||||||
|
2002-04-19 David Shaw <dshaw@jabberwocky.com>
|
||||||
|
|
||||||
|
* gnupg.spec.in: Removed pubring.asc and OPTIONS. Added
|
||||||
|
samplekeys.asc.
|
||||||
|
|
||||||
|
2002-03-31 David Shaw <dshaw@jabberwocky.com>
|
||||||
|
|
||||||
|
* gnupg.spec.in: Added the gpgkeys_xxx keyserver helpers. Added a
|
||||||
|
* to catch variations on the basic gpg man page (gpg, gpgv). Mark
|
||||||
|
options.skel as a config file. Do not include the FAQ/faq.html
|
||||||
|
twice (in /doc/ and /share/).
|
||||||
|
|
||||||
|
2002-01-02 Stefan Bellon <sbellon@sbellon.de>
|
||||||
|
|
||||||
|
* build-riscos [__riscos__]: Set filetype of Makefile correctly.
|
||||||
|
|
||||||
|
* conf-riscos/include/g10defs.h [__riscos__]: Added GNU GPL
|
||||||
|
header and exec code defines.
|
||||||
|
|
||||||
|
* conf-riscos/include/config.h [__riscos__]: Moved parts to
|
||||||
|
include/util.h where they really belong to.
|
||||||
|
|
||||||
|
* conf-riscos/Makefile [__riscos__]: Updated for new keyserver,
|
||||||
|
exec and photo id code.
|
||||||
|
|
||||||
|
2001-12-22 Werner Koch <wk@gnupg.org>
|
||||||
|
|
||||||
|
* autogen.sh: Fixed last change.
|
||||||
|
|
||||||
|
2001-12-21 Werner Koch <wk@gnupg.org>
|
||||||
|
|
||||||
|
* distfiles: Removed those files which which automake installs by
|
||||||
|
default.
|
||||||
|
|
||||||
|
* autogen.sh: Replaced $() by backticks for system without a posix
|
||||||
|
shell. Removed gawk specific quoting. By David Champion.
|
||||||
|
|
||||||
|
2001-10-22 Werner Koch <wk@gnupg.org>
|
||||||
|
|
||||||
|
* autogen.sh (aclocal_vers): Require automalke 1.5.
|
||||||
|
|
||||||
|
2001-08-21 Stefan Bellon <sbellon@sbellon.de>
|
||||||
|
|
||||||
|
* build-riscos [__riscos__]: New.
|
||||||
|
* conf-riscos [__riscos__]: Ditto.
|
||||||
|
|
||||||
|
2001-08-13 Werner Koch <wk@gnupg.org>
|
||||||
|
|
||||||
|
* autogen.sh: Test on gettext 0.10.38. By Michael Engels.
|
||||||
|
|
||||||
|
2001-08-07 Werner Koch <wk@gnupg.org>
|
||||||
|
|
||||||
|
* autogen.sh: Adjusted --build-w32 for autoconf 2.52
|
||||||
|
|
||||||
|
2001-07-09 Werner Koch <wk@gnupg.org>
|
||||||
|
|
||||||
|
* autogen.sh (autoconf_vers): Require autoconf 2.50
|
||||||
|
|
||||||
|
2001-05-06 Werner Koch <wk@gnupg.org>
|
||||||
|
|
||||||
|
* config.guess, config.sub: Add updates from subversions.gnu.org.
|
||||||
|
|
||||||
|
2001-04-19 Werner Koch <wk@gnupg.org>
|
||||||
|
|
||||||
|
* autogen.sh: Add VPATH build support for option --build-w32.
|
||||||
|
|
||||||
|
2001-03-12 Werner Koch <wk@gnupg.org>
|
||||||
|
|
||||||
|
* config.guess, config.sub: Replaced with the current GNU CVS ones.
|
||||||
|
|
||||||
|
2001-01-18 Werner Koch <wk@gnupg.org>
|
||||||
|
|
||||||
|
* autogen.sh: New options --build-w32
|
||||||
|
* build-w32: Does now call autogen.sh
|
||||||
|
|
||||||
|
2000-11-24 Werner Koch <wk@gnupg.org>
|
||||||
|
|
||||||
|
* build-w32: New script to build the W32 version.
|
||||||
|
* distfiles: And put it into the distribution
|
||||||
|
|
||||||
|
Thu Sep 14 17:45:11 CEST 2000 Werner Koch <wk@openit.de>
|
||||||
|
|
||||||
|
* gnupg.spec.in: Updated.
|
||||||
|
|
||||||
|
Wed Sep 6 17:55:47 CEST 2000 Werner Koch <wk@openit.de>
|
||||||
|
|
||||||
|
* config.guess, config.sub: Replaced with the latest version from the
|
||||||
|
CVS archive. Hope that does not break too much.
|
||||||
|
|
||||||
|
Fri May 12 14:01:20 CEST 2000 Werner Koch <wk@openit.de>
|
||||||
|
|
||||||
|
* gnupg.spec.in: New version from Fabio with some updated descriptions.
|
||||||
|
|
||||||
|
Mon May 1 15:38:04 CEST 2000 Werner Koch <wk@openit.de>
|
||||||
|
|
||||||
|
* gnupg.spec.in: New version from Fabio.
|
||||||
|
|
||||||
|
Fri Mar 17 16:26:05 CET 2000 Werner Koch <wk@openit.de>
|
||||||
|
|
||||||
|
* config.gues, config.sub: Support for s390-ibm-linux-gnu. Thanks
|
||||||
|
to Holger Smolinski.
|
||||||
|
|
||||||
|
Thu Mar 2 15:37:46 CET 2000 Werner Koch <wk@gnupg.de>
|
||||||
|
|
||||||
|
* config.guess: Add support for QNX. By Sam Roberts.
|
||||||
|
* config.sub: Ditto.
|
||||||
|
|
||||||
|
Thu Sep 23 09:49:25 1999 Werner Koch (wk@gnupg.org)
|
||||||
|
|
||||||
|
* commit: Remove leading and trailing empty lines when copying
|
||||||
|
Changes to Changelog
|
||||||
|
|
||||||
|
Wed Sep 15 16:22:17 CEST 1999 Werner Koch <wk@isil.d.shuttle.de>
|
||||||
|
|
||||||
|
* gnupg.spec: Add Portuguese description
|
||||||
|
|
||||||
|
Thu Sep 2 16:40:55 CEST 1999 Werner Koch <wk@isil.d.shuttle.de>
|
||||||
|
|
||||||
|
* mkdiff: changed format of diff file name and made script more
|
||||||
|
general.
|
||||||
|
|
||||||
|
Wed Aug 4 10:34:18 CEST 1999 Werner Koch <wk@isil.d.shuttle.de>
|
||||||
|
|
||||||
|
* config.guess: Updated from gnu/common and applied my emx patch again.
|
||||||
|
* config.sub: Updated from gnu/common.
|
||||||
|
|
||||||
|
Wed Jul 14 19:42:08 CEST 1999 Werner Koch <wk@isil.d.shuttle.de>
|
||||||
|
|
||||||
|
* ltmain.sh, ltconfig.sh : Updated to libtool 1.3.3
|
||||||
|
|
||||||
|
Mon Jul 12 14:55:34 CEST 1999 Werner Koch <wk@isil.d.shuttle.de>
|
||||||
|
|
||||||
|
* autogen.sh: Run libtoolize
|
||||||
|
|
||||||
|
Sat May 22 22:47:26 CEST 1999 Werner Koch <wk@isil.d.shuttle.de>
|
||||||
|
|
||||||
|
* autogen.sh: Fixed the error message for a missing libtool.
|
||||||
|
|
||||||
|
Sat May 8 19:28:08 CEST 1999 Werner Koch <wk@isil.d.shuttle.de>
|
||||||
|
|
||||||
|
* mkinstalldirs, install-sh: New from GNU repository
|
||||||
|
* config.sub, config.guess: Merged with rep version.
|
||||||
|
|
||||||
|
Sun Mar 14 19:34:36 CET 1999 Werner Koch <wk@isil.d.shuttle.de>
|
||||||
|
|
||||||
|
* autogen.sh: Add a check for libtool because some autoconf macros
|
||||||
|
are needed.
|
||||||
|
|
||||||
|
Mon Feb 22 20:04:00 CET 1999 Werner Koch <wk@isil.d.shuttle.de>
|
||||||
|
|
||||||
|
* autogen.sh: Enhanced the version testing code (Philippe Laliberte)
|
||||||
|
|
||||||
|
* mkwebpage: Edits the buglist.
|
||||||
|
|
||||||
|
Sat Feb 13 12:04:43 CET 1999 Werner Koch <wk@isil.d.shuttle.de>
|
||||||
|
|
||||||
|
* autogen.sh: Now uses gettextize
|
||||||
|
|
||||||
|
Wed Feb 10 17:15:39 CET 1999 Werner Koch <wk@isil.d.shuttle.de>
|
||||||
|
|
||||||
|
* config.sub, config.guess: Support i386-emx-os2
|
||||||
|
|
||||||
|
Sun Jan 17 11:04:33 CET 1999 Werner Koch <wk@isil.d.shuttle.de>
|
||||||
|
|
||||||
|
* autogen.sh: Now checks for installed gettext
|
||||||
|
|
||||||
|
Sat Jan 16 09:27:30 CET 1999 Werner Koch <wk@isil.d.shuttle.de>
|
||||||
|
|
||||||
|
* config.guess (m68k-atari-mint): New.
|
||||||
|
* config.sub: Add support for atarist-MiNT
|
||||||
|
|
||||||
|
Wed Jan 13 12:49:36 CET 1999 Werner Koch <wk@isil.d.shuttle.de>
|
||||||
|
|
||||||
|
* gnupg.spec.in: New
|
||||||
|
* gnupg.spec: Removed
|
||||||
|
|
||||||
|
Wed Dec 23 13:18:14 CET 1998 Werner Koch <wk@isil.d.shuttle.de>
|
||||||
|
|
||||||
|
* gnupg.spec: Updated version by Fabio Coatti
|
||||||
|
|
||||||
|
Thu Dec 17 18:31:15 CET 1998 Werner Koch <wk@isil.d.shuttle.de>
|
||||||
|
|
||||||
|
* gnupg.spec: New version by Reuben Sumner and did some more
|
||||||
|
changes.
|
||||||
|
|
||||||
|
Fri Nov 27 12:39:29 CET 1998 Werner Koch <wk@isil.d.shuttle.de>
|
||||||
|
|
||||||
|
|
||||||
|
* commit: New
|
||||||
|
|
||||||
|
|
||||||
|
Fri Nov 20 12:01:57 1998 Werner Koch (wk@isil.d.shuttle.de)
|
||||||
|
|
||||||
|
* mkdiff: signs the patch file
|
||||||
|
|
||||||
|
Sat Oct 17 16:10:16 1998 Werner Koch (wk@isil.d.shuttle.de)
|
||||||
|
|
||||||
|
* autogen.sh: New.
|
||||||
|
|
||||||
|
Wed Oct 14 09:55:25 1998 Werner Koch (wk@isil.d.shuttle.de)
|
||||||
|
|
||||||
|
* config.guess (FreeBSD): Changes from Jun Kuriyama to support ELF
|
||||||
|
* config.sub: (freebsd): Add to maybe_os
|
||||||
|
|
||||||
|
|
||||||
|
Copyright 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
This file is free software; as a special exception the author gives
|
||||||
|
unlimited permission to copy and/or distribute it, with or without
|
||||||
|
modifications, as long as this notice is preserved.
|
||||||
|
|
||||||
|
This file is distributed in the hope that it will be useful, but
|
||||||
|
WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
|
||||||
|
implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
Loading…
x
Reference in New Issue
Block a user