glibc/isomac.c
Ulrich Drepper 2f6d1f1be9 update from main archive 970225
1997-02-24 23:05  Wolfram Gloger  <wmglo@dent.med.uni-muenchen.de>

	* malloc/malloc.c (malloc_get_state): New function.
	Saves global malloc state to an opaque data structure which
	is dynamically allocated in the heap.
	* malloc/malloc.c (malloc_set_state): New function.
	Restore previously obtained state.
	* malloc/malloc.h: Add declaration of malloc_get_state()
	and malloc_set_state().

1997-02-24 23:27  Ulrich Drepper  <drepper@cygnus.com>

	* sysdeps/libm-ieee754/s_cbrtl.c: Shift B1_EXP value to right
	position.

1997-02-24 17:38  Ulrich Drepper  <drepper@cygnus.com>

	* misc/error.c: Make error and error_at_line weak aliases of
	__error and __error_at_line respectively.
	Suggested by David Mosberger-Tang <davidm@AZStarNet.COM>.

	* sysdeps/unix/sysv/linux/i386/socket.S: Update copyright.

1997-02-22 11:30  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* elf/ldd.bash.in: Run the program directly, not as argument
	to the dynamic linker, if it contains an interpreter segment.
	* elf/ldd.sh.in: Likewise.

	* elf/rtld.c (dl_main): In verify mode check whether the dynamic
	object contains an interpreter segment and exit with 2 if not.

1997-02-23 01:23  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* Makefile (distribute): Remove nsswitch.h, netgroup.h, mcheck.h
	and xlocale.h.  Make-dist adds them automagically.

1997-02-22 12:25  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* locale/C-time.c (_nl_C_LC_TIME): Add missing entry for
	time-era-num-entries.

1997-02-06 13:49  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* rellns-sh: No need to check for existance of first parameter.

1997-02-24 15:20  Jonathan T. Agnew  <jtagnew@amherst.edu>

	* glibcbug.in: Don't mention destination on MAIL_AGENT command line
	to avoid duplicate mail.

1997-02-24 03:51  Ulrich Drepper  <drepper@cygnus.com>

	* Makefile (distribute): Add isomac.c.
	(tests): Run isomac test.

	* features.h (__USE_ISOC9X): New macro.

	* catgets/catgets.c: Don't use global variable `optind'.  Instead
	use result computed by argp_parse.
	* db/makedb: Likewise.
	* locale/programs/locale.c: Likewise.
	* locale/programs/localedef.c: Likewise.

	* libio/stdio.h: Rewrite.  Make it more readable and add comments.

	* libio/clearerr.c: Remove clearerr_locked alias.
	* libio/feof.c: Remove feof_locked alias.
	* libio/ferror.c: Remove feof_locked alias.
	* libio/fileno.c: Remove fileno_locked alias.
	* libio/fputc.c: Remove fputc_locked alias.
	* libio/getc.c: Remove getc_locked alias.
	* libio/getchar.c: Remove getchar_locked alias.
	* libio/iofflush.c: Remove fflush_locked alias.
	* libio/putc.c: Remove putc_locked alias.
	* libio/putc.c: Remove putchar_locked alias.

	* stdio-common/printf_fp.c: When number is inifinity print INF
	or inf depending on case of specifier.  Same for NaN where NAN
	or nan is printed.  Specified in ISO C 9X.

	* misc/sys/cdefs.h (__restrict): Define to empty string for now.
	* stdio/stdio.h: Add __restrict to prototypes where necessary.
	* libio/stdio.h: Likewise.
	* stdlib/stdlib.h: Likewise.
	* string/string.h: Likewise.
	* time/time.h: Likewise.
	* wcsmbs/wchar.h: Likewise.

	* stdlib/strtod.c: Change to recognize INF, INFINITY, NAN, and
	NAN(...).

	* sysdeps/ieee754/huge_val.h: Define HUGE_VALF and HUGE_VALL instead
	of HUGE_VALf and HUGE_VALL.
	* stdlib/strtof.c (FLOAT_HUGE_VAL): Use standard name HUGE_VALF
	instead of HUGE_VALf.
	* wcsmbs/wcstof.c: Likewise.
	* stdlib/strtold.c (FLOAT_HUGE_VAL): Use standard name HUGE_VALL
	instead of HUGE_VALl.
	* wcsmbs/wcstold.c: Likewise.

	* sysdeps/posix/gai_strerror.c: Use size_t for counter variable to
	avoid warning.

	* wcsmbs/Makefile (routines): Add wcscasecmp and wcsncase.
	* wcsmbs/wchar.h: Add prototypes for wcscasecmp and wcsncase.
	* wcsmbs/wcscasecmp.c: New file.
	* wcsmbs/wcsncase.c: New file.

	* stdlib/strtol.c: Define wide character quad word functions as
	wcstoll and wcstoull and normal versions as strtoll and strtoull.
	* wcsmbs/wchar.h: Add prototypes for wcstoll and wcstoull.
	* wcsmbs/wcstoq: Renamed to wcstoll.c.
	* wcsmbs/wcstouq: Renamed to wcstoull.c.
	* wcsmbs/wcstoll.c: Renamed from wcstoq.c.  Make wcstoq a weak
	alias of wcstoll.
	* wcsmbs/wcstoull.c: Renamed from wcstouq.c.  Make wcstouq a weak
	alias of wcstoull.
	* wcsmbs/Makefile (routines): Replace wcstoq and wcstouq by
	wcstoll and wcstoull respectively.
	* stdlib/strtoq.c: Rename to strtoll.c.
	* stdlib/strtouq.c: Rename to strtoull.c.
	* stdlib/strtoll.c: Renamed from strtoq.c.  Make strtoq a weak
	alias of strtoll.
	* stdlib/strtoll.c: Renamed from strtouq.c.  Make strtouq a weak
	alias of strtoull.
	* stdlib/Makefile (routines): Replace strtoq and strtouq by
	strtoll and strtoull respectively.
	* stdio-common/vfscanf.c: Don't use __strtoq_internal and
	__strtouq_internal but instead __strtoll_internal and
	__strtoull_internal respectively.
	* stdlib/stdlib.h (strtoq): Use __internal_strtoll in inline version.
	(strtouq): Similar with __internal_strtoull.
	* wcsmbs/wchar.h (wcstoq): Use __internal_wcstoll in inline version.
	(wcstouq): Similar with __internal_wcstoull.

1997-02-23 04:38  Ulrich Drepper  <drepper@cygnus.com>

	* stdlib/strtol.c (STRTOL): It is not illegal to parse a minus
	sign in the strtouXX functions.  The results gets simply negated.
	* stdio-common/tstscanf.c: Add testcase for above case.
	* stdlib/tst-strtol.c: Correct tests.

	* manual/stdio-fp.c: New file.  Generate output for example program
	in stdio.texi.

	* stdio-common/Makefile (routines): Add printf_fphex.
	* stdio-common/vfprintf.c: Add handling of %a and %A specifier.
	* stdio-common/printf_fphex.c: New file.  Implement %a and %A
	specifier.

1997-02-22 03:01  Ulrich Drepper  <drepper@cygnus.com>

	* sysdeps/unix/sysv/linux/timebits.h (CLK_TCK): Don't defined if
	__STRICT_ANSI__.

	* math/math.h: Prevent definition of struct exception when using
	C++.

1997-02-22 01:45  Ulrich Drepper  <drepper@cygnus.com>

	* sysdeps/unix/syscalls.list: Dup takes only one argument.
	Reported by Greg McGary.

1997-02-21 00:22  Miles Bader  <miles@gnu.ai.mit.edu>
1997-02-20 01:28  Miles Bader  <miles@gnu.ai.mit.edu>
1997-02-19 13:56  Miles Bader  <miles@gnu.ai.mit.edu>
1997-02-18 15:39  Miles Bader  <miles@gnu.ai.mit.edu>
1997-02-17 10:58  Miles Bader  <miles@gnu.ai.mit.edu>
1997-02-15 10:23  Miles Bader  <miles@gnu.ai.mit.edu>
	(mutex_lock, mutex_unlock, mutex_trylock): Defined in terms of
	__mutex_*.
	(mutex_t): Type removed & replaced by new macro.
	(tsd_key_t): Typedef to int instead of pthread_key_t.
	(tsd_key_create, tsd_setspecific, tsd_getspecific): New macros.
	(__pthread_initialize): New macro, work around assumption of pthreads.

	* sysdeps/mach/hurd/i386/init-first.c (__libc_argv, __libc_argc):
	__hurd_sigthread_stack_end, __hurd_sigthread_stack_variables,
	__hurd_threadvar_max, __hurd_threadvar_stack_offset,
	__hurd_threadvar_stack_mask): Variables removed.
1997-02-14 14:07  Miles Bader  <miles@gnu.ai.mit.edu>
	* hurd/hurd.h (_hurd_pids_changed_stamp, _hurd_pids_changed_sync):
1997-02-24 17:06  Geoffrey Keating  <geoffk@discus.anu.edu.au>

	* sysdeps/unix/sysv/linux/accept.S (NARGS): Describe number of
	arguments taken, for sysdeps/unix/sysv/linux/powerpc/socket.S.
	* sysdeps/unix/sysv/linux/bind.S: Likewise.
	* sysdeps/unix/sysv/linux/connect.S: Likewise.
	* sysdeps/unix/sysv/linux/getpeername.S: Likewise.
	* sysdeps/unix/sysv/linux/getsockname.S: Likewise.
	* sysdeps/unix/sysv/linux/getsockopt.S: Likewise.
	* sysdeps/unix/sysv/linux/listen.S: Likewise.
	* sysdeps/unix/sysv/linux/recv.S: Likewise.
	* sysdeps/unix/sysv/linux/recvfrom.S: Likewise.
	* sysdeps/unix/sysv/linux/recvmsg.S: Likewise.
	* sysdeps/unix/sysv/linux/send.S: Likewise.
	* sysdeps/unix/sysv/linux/sendmsg.S: Likewise.
	* sysdeps/unix/sysv/linux/sendto.S: Likewise.
	* sysdeps/unix/sysv/linux/setsockopt.S: Likewise.
	* sysdeps/unix/sysv/linux/shutdown.S: Likewise.
	* sysdeps/unix/sysv/linux/socketpair.S: Likewise.

1997-02-15 04:51  Ulrich Drepper  <drepper@cygnus.com>
1997-02-25 05:18:05 +00:00

321 lines
11 KiB
C

/* Check system header files for ISO 9899:1990 (ISO C) compliance.
Copyright (C) 1996, 1997 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Jens Schweikhardt <schweikh@noc.dfn.de>, 1996.
The GNU C Library 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 of
the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be
useful, but WITHOUT ANY WARRANTY; without even the implied warranty
of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If
not, write to the Free Software Foundation, Inc., 59 Temple Place -
Suite 330, Boston, MA 02111-1307, USA. */
/* This is a simple minded program that tries to find illegal macro
definitions in system header files. Illegal macro definitions are
those not from the implementation namespace (i.e. not starting with
an underscore) or not matching any identifier mandated by The
Standard. Some common macro names are considered okay, e.g. all those
beginning with E (which may be defined in <errno.h>) or ending in
_MAX. See the arrays prefix[] and suffix[] below for details.
In a compliant implementation no other macros can be defined, because
you could write strictly conforming programs that may fail to compile
due to syntax errors: suppose <stdio.h> defines PIPE_BUF, then the
conforming
#include <assert.h>
#include <stdio.h> <- or where the bogus macro is defined
#include <string.h>
#define STR(x) #x
#define XSTR(x) STR(x)
int main (void)
{
int PIPE_BUF = 0;
assert (strcmp ("PIPE_BUF", XSTR (PIPE_BUF)) == 0);
return 0;
}
is expected to compile and meet the assertion. If it does not, your
compiler compiles some other language than Standard C.
REQUIREMENTS:
This program calls gcc to get the list of defined macros. If you
don't have gcc you're probably out of luck unless your compiler or
preprocessor has something similar to gcc's -dM option. Tune
PRINT_MACROS in this case. This program assumes headers are found
under /usr/include and that there is a writable /tmp directory.
Tune SYSTEM_INCLUDE and TMPFILE if your system differs.
#define BROKEN_SYSTEM if system(NULL) bombs -- one more violation
of ISO C, by the way.
OUTPUT:
Each header file name is printed, followed by illegal macro names
and their definition. For the above example, you would see
...
/usr/include/stdio.h
#define PIPE_BUF 5120
...
If your implementation does not yet incorporate Amendment 1 you
will see messages about iso646.h, wctype.h and wchar.h not being
found. */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define TMPFILE "/tmp/macros"
#define HEADER_MAX 256
/* ISO C header names including Amendment 1 (without ".h" suffix). */
static char *header[] =
{
"assert", "ctype", "errno", "float", "iso646", "limits", "locale",
"math", "setjmp", "signal", "stdarg", "stddef", "stdio", "stdlib",
"string", "time", "wchar", "wctype"
};
/* Macros with these prefixes are considered okay. */
static char *prefix[] =
{
"_", "E", "is", "str", "mem", "SIG", "FLT_", "DBL_", "LDBL_",
"LC_", "wmem", "wcs"
};
/* Macros with these suffixes are considered okay. Will not work for
parametrized macros with arguments. */
static char *suffix[] =
{
"_MAX", "_MIN"
};
/* These macros are considered okay. In fact, these are just more prefixes. */
static char *macros[] =
{
"BUFSIZ", "CHAR_BIT", "CHAR_MAX", "CHAR_MIN", "CLOCKS_PER_SEC",
"DBL_DIG", "DBL_EPSILON", "DBL_MANT_DIG", "DBL_MAX",
"DBL_MAX_10_EXP", "DBL_MAX_EXP", "DBL_MIN", "DBL_MIN_10_EXP",
"DBL_MIN_EXP", "EDOM", "EILSEQ", "EOF", "ERANGE", "EXIT_FAILURE",
"EXIT_SUCCESS", "FILENAME_MAX", "FLT_DIG", "FLT_EPSILON",
"FLT_MANT_DIG", "FLT_MAX", "FLT_MAX_10_EXP", "FLT_MAX_EXP",
"FLT_MIN", "FLT_MIN_10_EXP", "FLT_MIN_EXP", "FLT_RADIX",
"FLT_ROUNDS", "FOPEN_MAX", "HUGE_VAL", "INT_MAX", "INT_MIN",
"LC_ALL", "LC_COLLATE", "LC_CTYPE", "LC_MONETARY", "LC_NUMERIC",
"LC_TIME", "LDBL_DIG", "LDBL_EPSILON", "LDBL_MANT_DIG", "LDBL_MAX",
"LDBL_MAX_10_EXP", "LDBL_MAX_EXP", "LDBL_MIN", "LDBL_MIN_10_EXP",
"LDBL_MIN_EXP", "LONG_MAX", "LONG_MIN", "L_tmpnam", "MB_CUR_MAX",
"MB_LEN_MAX", "NDEBUG", "NULL", "RAND_MAX", "SCHAR_MAX",
"SCHAR_MIN", "SEEK_CUR", "SEEK_END", "SEEK_SET", "SHRT_MAX",
"SHRT_MIN", "SIGABRT", "SIGFPE", "SIGILL", "SIGINT", "SIGSEGV",
"SIGTERM", "SIG_DFL", "SIG_ERR", "SIG_IGN", "TMP_MAX", "UCHAR_MAX",
"UINT_MAX", "ULONG_MAX", "USHRT_MAX", "WCHAR_MAX", "WCHAR_MIN",
"WEOF", "_IOFBF", "_IOLBF", "_IONBF", "abort", "abs", "acos",
"acosf", "acosl", "and", "and_eq", "asctime", "asin", "asinf",
"asinl", "assert", "atan", "atan2", "atan2f", "atan2l", "atanf",
"atanl", "atexit", "atof", "atoi", "atol", "bitand", "bitor",
"bsearch", "btowc", "calloc", "ceil", "ceilf", "ceill", "clearerr",
"clock", "clock_t", "compl", "cos", "cosf", "cosh", "coshf",
"coshl", "cosl", "ctime", "difftime", "div", "div_t", "errno",
"exit", "exp", "expf", "expl", "fabs", "fabsf", "fabsl", "fclose",
"feof", "ferror", "fflush", "fgetc", "fgetpos", "fgets", "fgetwc",
"fgetws", "floor", "floorf", "floorl", "fmod", "fmodf", "fmodl",
"fopen", "fprintf", "fputc", "fputs", "fputwc", "fputws", "fread",
"free", "freopen", "frexp", "frexpf", "frexpl", "fscanf", "fseek",
"fsetpos", "ftell", "fwide", "fwprintf", "fwrite", "fwscanf",
"getc", "getchar", "getenv", "gets", "getwc", "getwchar", "gmtime",
"isalnum", "isalpha", "iscntrl", "isdigit", "isgraph", "islower",
"isprint", "ispunct", "isspace", "isupper", "iswalnum", "iswalpha",
"iswcntrl", "iswctype", "iswdigit", "iswgraph", "iswlower",
"iswprint", "iswpunct", "iswspace", "iswupper", "iswxdigit",
"isxdigit", "labs", "ldexp", "ldexpf", "ldexpl", "ldiv", "ldiv_t",
"localeconv", "localtime", "log", "log10", "log10f", "log10l",
"logf", "logl", "longjmp", "malloc", "mblen", "mbrlen", "mbrtowc",
"mbsinit", "mbsrtowcs", "mbstate_t", "mbstowcs", "mbtowc", "memchr",
"memcmp", "memcpy", "memmove", "memset", "mktime", "modf", "modff",
"modfl", "not", "not_eq", "offsetof", "or", "or_eq", "perror",
"pow", "powf", "powl", "printf", "ptrdiff_t", "putc", "putchar",
"puts", "putwc", "putwchar", "qsort", "raise", "rand", "realloc",
"remove", "rename", "rewind", "scanf", "setbuf", "setjmp",
"setlocale", "setvbuf", "sig_atomic_t", "signal", "sin", "sinf",
"sinh", "sinhf", "sinhl", "sinl", "size_t", "sprintf", "sqrt",
"sqrtf", "sqrtl", "srand", "sscanf", "stderr", "stdin", "stdout",
"strcat", "strchr", "strcmp", "strcoll", "strcpy", "strcspn",
"strerror", "strftime", "strlen", "strncat", "strncmp", "strncpy",
"strpbrk", "strrchr", "strspn", "strstr", "strtod", "strtok",
"strtol", "strtoul", "strxfrm", "swprintf", "swscanf", "system",
"tan", "tanf", "tanh", "tanhf", "tanhl", "tanl", "time", "time_t",
"tmpfile", "tmpnam", "tolower", "toupper", "towctrans", "towlower",
"towupper", "ungetc", "ungetwc", "va_arg", "va_end", "va_start",
"vfprintf", "vfwprintf", "vprintf", "vsprintf", "vswprintf",
"vwprintf", "wchar_t", "wcrtomb", "wcscat", "wcschr", "wcscmp",
"wcscoll", "wcscpy", "wcscspn", "wcsftime", "wcslen", "wcsncat",
"wcsncmp", "wcsncpy", "wcspbrk", "wcsrchr", "wcsrtombs", "wcsspn",
"wcsstr", "wcstod", "wcstok", "wcstol", "wcstombs", "wcstoul",
"wcsxfrm", "wctob", "wctomb", "wctrans", "wctrans_t", "wctype",
"wctype_t", "wint_t", "wmemchr", "wmemcmp", "wmemcpy", "wmemmove",
"wmemset", "wprintf", "wscanf", "xor", "xor_eq"
};
#define NUMBER_OF_HEADERS (sizeof header / sizeof *header)
#define NUMBER_OF_PREFIXES (sizeof prefix / sizeof *prefix)
#define NUMBER_OF_SUFFIXES (sizeof suffix / sizeof *suffix)
#define NUMBER_OF_MACROS (sizeof macros / sizeof *macros)
/* The compiler we use (given on the command line). */
char *CC;
/* The -I parameters for CC to find all headers. */
char *INC;
static int check_header (const char *);
int
main (int argc, char *argv[])
{
int h;
int result = 0;
CC = argc > 1 ? argv[1] : "gcc";
INC = argc > 2 ? argv[2] : "";
if (system (NULL) == 0)
{
puts ("Sorry, no command processor.");
return EXIT_FAILURE;
}
for (h = 0; h < NUMBER_OF_HEADERS; ++h)
{
char file_name[HEADER_MAX];
sprintf (file_name, "%s.h", header[h]);
result |= check_header (file_name);
}
#if 0
/* The test suite should return errors but for now this is not
practical. Give a warning and ask the user to correct the bugs. */
return result;
#else
if (result)
fputs ("\
##########################################################################\n\
# The test suite found some problems with your system (see the generated #\n\
# isomac.out file). These are all violations of the ISO C rules and #\n\
# should be corrected. If the problem is in the libc, report it using #\n\
# the glibcbug script to <bugs@gnu.ai.mit.edu>. If it is a problem with #\n\
# your compiler, contact the compiler manufacturer. #\n\
##########################################################################\n",
stderr);
return 0;
#endif
}
static int
check_header (const char *file_name)
{
char line[BUFSIZ], *command;
FILE *input;
int result = 0;
static const char fmt[] = "\
echo \"#include <%s>\" |\
%s -E -dM -ansi -pedantic %s -D_LIBC -I. -I `%s --print-prog-name=include` -\
> %s";
command = malloc (sizeof fmt + strlen (file_name) + 2 * strlen (CC)
+ strlen (INC) + strlen (TMPFILE));
if (command == NULL)
{
puts ("No more memory.");
exit (1);
}
puts (file_name);
sprintf (command, fmt, file_name, CC, INC, CC, TMPFILE);
if (system (command))
{
puts ("system() returned nonzero");
result = 1;
}
free (command);
input = fopen (TMPFILE, "r");
if (input == NULL)
{
printf ("Could not read %s: ", TMPFILE);
perror (NULL);
return 1;
}
while (fgets (line, sizeof line, input) != NULL)
{
int i, okay = 0;
size_t endmac;
if (strlen (line) < 9 || line[7] != ' ')
{ /* "#define A" */
printf ("Malformed input, expected '#define MACRO'\ngot '%s'\n",
line);
result = 1;
continue;
}
for (i = 0; i < NUMBER_OF_PREFIXES; ++i)
{
if (!strncmp (line+8, prefix[i], strlen (prefix[i]))) {
++okay;
break;
}
}
if (okay)
continue;
for (i = 0; i < NUMBER_OF_MACROS; ++i)
{
if (!strncmp (line+8, macros[i], strlen (macros[i])))
{
++okay;
break;
}
}
if (okay)
continue;
/* Find next char after the macro identifier; this can be either
a space or an open parenthesis. */
endmac = strcspn (line + 8, " (");
if (line[8+endmac] == '\0')
{
printf ("malformed input, expected '#define MACRO VALUE'\n"
"got '%s'\n", line);
result = 1;
continue;
}
for (i = 0; i < NUMBER_OF_SUFFIXES; ++i)
{
size_t len = strlen (suffix[i]);
if (!strncmp (line + 8 + endmac - len, suffix[i], len))
{
++okay;
break;
}
}
if (!okay)
{
fputs (line, stdout);
result = 2;
}
}
fclose (input);
remove (TMPFILE);
return result;
}
/* EOF */