* hashtab.c, partition.c, xmemdup.c: Include string.h

if HAVE_STRING_H.
	* pexecute.c, xexit.c: Include stdlib.h if HAVE_STDLIB_H.
	* objalloc.c: Include config.h.  Include stdlib.h and don't
	declare malloc or free if HAVE_STDLIB_H.
	* strerror.c, strsignal.c: Include stdlib.h if HAVE_STDLIB_H,
	else declare malloc without prototype.  Include string.h if
	HAVE_STRING_H, else declare memset without prototype.  Don't
	include stddef.h.

	* sort.c: Bring over from GCC.
This commit is contained in:
Zack Weinberg 2000-05-29 20:45:32 +00:00
parent dcb87e5cf4
commit 5c82d20a26
10 changed files with 245 additions and 16 deletions

View File

@ -1,3 +1,17 @@
2000-05-29 Zack Weinberg <zack@wolery.cumb.org>
* hashtab.c, partition.c, xmemdup.c: Include string.h
if HAVE_STRING_H.
* pexecute.c, xexit.c: Include stdlib.h if HAVE_STDLIB_H.
* objalloc.c: Include config.h. Include stdlib.h and don't
declare malloc or free if HAVE_STDLIB_H.
* strerror.c, strsignal.c: Include stdlib.h if HAVE_STDLIB_H,
else declare malloc without prototype. Include string.h if
HAVE_STRING_H, else declare memset without prototype. Don't
include stddef.h.
* sort.c: Bring over from GCC.
2000-05-26 Alexandre Oliva <aoliva@cygnus.com> 2000-05-26 Alexandre Oliva <aoliva@cygnus.com>
* Makefile.in (maintainer-clean-subdir): Fix handling of empty * Makefile.in (maintainer-clean-subdir): Fix handling of empty

View File

@ -41,6 +41,10 @@ Boston, MA 02111-1307, USA. */
#include <stdlib.h> #include <stdlib.h>
#endif #endif
#ifdef HAVE_STRING_H
#include <string.h>
#endif
#include <stdio.h> #include <stdio.h>
#include "libiberty.h" #include "libiberty.h"

View File

@ -18,6 +18,8 @@ Foundation, 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */ Boston, MA 02111-1307, USA. */
#include "ansidecl.h" #include "ansidecl.h"
#include "config.h"
#include "objalloc.h" #include "objalloc.h"
/* Get a definition for NULL. */ /* Get a definition for NULL. */
@ -33,11 +35,16 @@ Boston, MA 02111-1307, USA. */
#include <stddef.h> #include <stddef.h>
#endif #endif
#ifdef HAVE_STDLIB_H
#include <stdlib.h>
#else
/* For systems with larger pointers than ints, this must be declared. */ /* For systems with larger pointers than ints, this must be declared. */
extern PTR malloc PARAMS ((size_t)); extern PTR malloc PARAMS ((size_t));
extern void free PARAMS ((PTR)); extern void free PARAMS ((PTR));
#endif #endif
#endif
/* These routines allocate space for an object. Freeing allocated /* These routines allocate space for an object. Freeing allocated
space may or may not free all more recently allocated space. space may or may not free all more recently allocated space.

View File

@ -27,6 +27,10 @@
#include <stdlib.h> #include <stdlib.h>
#endif #endif
#ifdef HAVE_STRING_H
#include <string.h>
#endif
#include "libiberty.h" #include "libiberty.h"
#include "partition.h" #include "partition.h"

View File

@ -35,6 +35,9 @@ Boston, MA 02111-1307, USA. */
#ifdef HAVE_UNISTD_H #ifdef HAVE_UNISTD_H
#include <unistd.h> #include <unistd.h>
#endif #endif
#ifdef HAVE_STDLIB_H
#include <stdlib.h>
#endif
#define ISSPACE (x) isspace(x) #define ISSPACE (x) isspace(x)
#ifdef HAVE_SYS_WAIT_H #ifdef HAVE_SYS_WAIT_H
#include <sys/wait.h> #include <sys/wait.h>

185
libiberty/sort.c Normal file
View File

@ -0,0 +1,185 @@
/* Sorting algorithms.
Copyright (C) 2000 Free Software Foundation, Inc.
Contributed by Mark Mitchell <mark@codesourcery.com>.
This file is part of GNU CC.
GNU CC is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU CC is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU CC; see the file COPYING. If not, write to
the Free Software Foundation, 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "libiberty.h"
#include "sort.h"
#include <limits.h>
#ifdef HAVE_STDLIB_H
#include <stdlib.h>
#endif
#ifdef HAVE_STRING_H
#include <string.h>
#endif
#ifndef UCHAR_MAX
#define UCHAR_MAX ((unsigned char)(-1))
#endif
/* POINTERS and WORK are both arrays of N pointers. When this
function returns POINTERS will be sorted in ascending order. */
void sort_pointers (n, pointers, work)
size_t n;
void **pointers;
void **work;
{
/* The type of a single digit. This can be any unsigned integral
type. When changing this, DIGIT_MAX should be changed as
well. */
typedef unsigned char digit_t;
/* The maximum value a single digit can have. */
#define DIGIT_MAX (UCHAR_MAX + 1)
/* The Ith entry is the number of elements in *POINTERSP that have I
in the digit on which we are currently sorting. */
unsigned int count[DIGIT_MAX];
/* Nonzero if we are running on a big-endian machine. */
int big_endian_p;
size_t i;
size_t j;
/* The algorithm used here is radix sort which takes time linear in
the number of elements in the array. */
/* The algorithm here depends on being able to swap the two arrays
an even number of times. */
if ((sizeof (void *) / sizeof (digit_t)) % 2 != 0)
abort ();
/* Figure out the endianness of the machine. */
for (i = 0, j = 0; i < sizeof (size_t); ++i)
{
j *= (UCHAR_MAX + 1);
j += i;
}
big_endian_p = (((char *)&j)[0] == 0);
/* Move through the pointer values from least significant to most
significant digits. */
for (i = 0; i < sizeof (void *) / sizeof (digit_t); ++i)
{
digit_t *digit;
digit_t *bias;
digit_t *top;
unsigned int *countp;
void **pointerp;
/* The offset from the start of the pointer will depend on the
endianness of the machine. */
if (big_endian_p)
j = sizeof (void *) / sizeof (digit_t) - i;
else
j = i;
/* Now, perform a stable sort on this digit. We use counting
sort. */
memset (count, 0, DIGIT_MAX * sizeof (unsigned int));
/* Compute the address of the appropriate digit in the first and
one-past-the-end elements of the array. On a little-endian
machine, the least-significant digit is closest to the front. */
bias = ((digit_t *) pointers) + j;
top = ((digit_t *) (pointers + n)) + j;
/* Count how many there are of each value. At the end of this
loop, COUNT[K] will contain the number of pointers whose Ith
digit is K. */
for (digit = bias;
digit < top;
digit += sizeof (void *) / sizeof (digit_t))
++count[*digit];
/* Now, make COUNT[K] contain the number of pointers whose Ith
digit is less than or equal to K. */
for (countp = count + 1; countp < count + DIGIT_MAX; ++countp)
*countp += countp[-1];
/* Now, drop the pointers into their correct locations. */
for (pointerp = pointers + n - 1; pointerp >= pointers; --pointerp)
work[--count[((digit_t *) pointerp)[j]]] = *pointerp;
/* Swap WORK and POINTERS so that POINTERS contains the sorted
array. */
pointerp = pointers;
pointers = work;
work = pointerp;
}
}
/* Everything below here is a unit test for the routines in this
file. */
#ifdef UNIT_TEST
#include <stdio.h>
void *xmalloc (n)
size_t n;
{
return malloc (n);
}
int main (int argc, char **argv)
{
int k;
int result;
size_t i;
void **pointers;
void **work;
if (argc > 1)
k = atoi (argv[1]);
else
k = 10;
pointers = xmalloc (k * sizeof (void *));
work = xmalloc (k * sizeof (void *));
for (i = 0; i < k; ++i)
{
pointers[i] = (void *) random ();
printf ("%x\n", pointers[i]);
}
sort_pointers (k, pointers, work);
printf ("\nSorted\n\n");
result = 0;
for (i = 0; i < k; ++i)
{
printf ("%x\n", pointers[i]);
if (i > 0 && (char*) pointers[i] < (char*) pointers[i - 1])
result = 1;
}
free (pointers);
free (work);
return result;
}
#endif

View File

@ -25,14 +25,17 @@
/* Routines imported from standard C runtime libraries. */ /* Routines imported from standard C runtime libraries. */
#ifdef __STDC__ #ifdef HAVE_STDLIB_H
#include <stddef.h> #include <stdlib.h>
extern void *malloc (size_t size); /* 4.10.3.3 */ #else
extern void *memset (void *s, int c, size_t n); /* 4.11.6.1 */ extern PTR malloc ();
#else /* !__STDC__ */ #endif
extern char *malloc (); /* Standard memory allocater */
extern char *memset (); #ifdef HAVE_STRING_H
#endif /* __STDC__ */ #include <string.h>
#else
extern PTR memset ();
#endif
#ifndef MAX #ifndef MAX
# define MAX(a,b) ((a) > (b) ? (a) : (b)) # define MAX(a,b) ((a) > (b) ? (a) : (b))

View File

@ -23,14 +23,17 @@
/* Routines imported from standard C runtime libraries. */ /* Routines imported from standard C runtime libraries. */
#ifdef __STDC__ #ifdef HAVE_STDLIB_H
#include <stddef.h> #include <stdlib.h>
extern void *malloc (size_t size); /* 4.10.3.3 */ #else
extern void *memset (void *s, int c, size_t n); /* 4.11.6.1 */ extern PTR malloc ();
#else /* !__STDC__ */ #endif
extern char *malloc (); /* Standard memory allocater */
extern char *memset (); #ifdef HAVE_STRING_H
#endif /* __STDC__ */ #include <string.h>
#else
extern PTR memset ();
#endif
/* Undefine the macro we used to hide the definition of sys_siglist /* Undefine the macro we used to hide the definition of sys_siglist
found in the system header files. */ found in the system header files. */

View File

@ -21,6 +21,9 @@ Boston, MA 02111-1307, USA. */
#include "libiberty.h" #include "libiberty.h"
#include <stdio.h> #include <stdio.h>
#ifdef HAVE_STDLIB_H
#include <stdlib.h>
#endif
/* This variable is set by xatexit if it is called. This way, xmalloc /* This variable is set by xatexit if it is called. This way, xmalloc
doesn't drag xatexit into the link. */ doesn't drag xatexit into the link. */

View File

@ -9,6 +9,9 @@
#include "libiberty.h" #include "libiberty.h"
#include <sys/types.h> /* For size_t. */ #include <sys/types.h> /* For size_t. */
#ifdef HAVE_STRING_H
#include <string.h>
#endif
PTR PTR
xmemdup (input, copy_size, alloc_size) xmemdup (input, copy_size, alloc_size)