diff --git a/reactos/lib/ntdll/makefile b/reactos/lib/ntdll/makefile index b9d26246e41..80e44132c98 100644 --- a/reactos/lib/ntdll/makefile +++ b/reactos/lib/ntdll/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.88 2003/07/06 23:04:19 hyperion Exp $ +# $Id: makefile,v 1.89 2003/07/11 20:55:43 gvg Exp $ PATH_TO_TOP = ../.. @@ -67,7 +67,7 @@ STDLIB_OBJECTS = stdlib/abs.o stdlib/atoi.o stdlib/atoi64.o stdlib/atol.o \ stdlib/itoa.o stdlib/itow.o stdlib/labs.o stdlib/splitp.o \ stdlib/strtol.o stdlib/strtoul.o stdlib/wcstol.o \ stdlib/wcstoul.o stdlib/wtoi.o stdlib/wtoi64.o stdlib/wtol.o \ - stdlib/mbstowcs.o stdlib/wcstombs.o stdlib/qsort.o + stdlib/mbstowcs.o stdlib/wcstombs.o STRING_OBJECTS = string/ctype.o \ string/memicmp.o\ diff --git a/reactos/lib/ntdll/stdlib/qsort.c b/reactos/lib/ntdll/stdlib/qsort.c deleted file mode 100644 index d1d590de8b1..00000000000 --- a/reactos/lib/ntdll/stdlib/qsort.c +++ /dev/null @@ -1,270 +0,0 @@ -/* $Id: qsort.c,v 1.2 2003/07/11 13:50:23 royce Exp $ - * - * FILE: lib/ntdll/stdlib/qsort.c - * NOTE: Adapted from CygWin newlib 2000-03-12. - */ -/* -FUNCTION -<>---sort an array - -INDEX - qsort - -ANSI_SYNOPSIS - #include - void qsort(void *<[base]>, size_t <[nmemb]>, size_t <[size]>, - int (*<[compar]>)(const void *, const void *) ); - -TRAD_SYNOPSIS - #include - qsort(<[base]>, <[nmemb]>, <[size]>, <[compar]> ) - char *<[base]>; - size_t <[nmemb]>; - size_t <[size]>; - int (*<[compar]>)(); - -DESCRIPTION -<> sorts an array (beginning at <[base]>) of <[nmemb]> objects. -<[size]> describes the size of each element of the array. - -You must supply a pointer to a comparison function, using the argument -shown as <[compar]>. (This permits sorting objects of unknown -properties.) Define the comparison function to accept two arguments, -each a pointer to an element of the array starting at <[base]>. The -result of <<(*<[compar]>)>> must be negative if the first argument is -less than the second, zero if the two arguments match, and positive if -the first argument is greater than the second (where ``less than'' and -``greater than'' refer to whatever arbitrary ordering is appropriate). - -The array is sorted in place; that is, when <> returns, the -array elements beginning at <[base]> have been reordered. - -RETURNS -<> does not return a result. - -PORTABILITY -<> is required by ANSI (without specifying the sorting algorithm). -*/ - -/*- - * Copyright (c) 1992, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef __GNUC__ -#define inline -#endif - -/* FIXME: these types should be from the default includes */ - -typedef int (* _pfunccmp_t) (char *, char *); -typedef int size_t; - -#define min(a,b) ((a)<(b)?(a):(b)) - -/* - * Qsort routine from Bentley & McIlroy's "Engineering a Sort Function". - */ -#define swapcode(TYPE, parmi, parmj, n) { \ - long i = (n) / sizeof (TYPE); \ - register TYPE *pi = (TYPE *) (parmi); \ - register TYPE *pj = (TYPE *) (parmj); \ - do { \ - register TYPE t = *pi; \ - *pi++ = *pj; \ - *pj++ = t; \ - } while (--i > 0); \ -} - -#define SWAPINIT(a, es) swaptype = ((char *)a - (char *)0) % sizeof(long) || \ - es % sizeof(long) ? 2 : es == sizeof(long)? 0 : 1; - -static inline void -swapfunc ( - char * a, - char * b, - int n, - int swaptype - ) -{ - if(swaptype <= 1) - swapcode(long, a, b, n) - else - swapcode(char, a, b, n) -} - -#define swap(a, b) \ - if (swaptype == 0) { \ - long t = *(long *)(a); \ - *(long *)(a) = *(long *)(b); \ - *(long *)(b) = t; \ - } else \ - swapfunc(a, b, es, swaptype) - -#define vecswap(a, b, n) if ((n) > 0) swapfunc(a, b, n, swaptype) - -static inline char * -med3 ( - char * a, - char * b, - char * c, - _pfunccmp_t cmp - ) -{ - return cmp(a, b) < 0 ? - (cmp(b, c) < 0 ? b : (cmp(a, c) < 0 ? c : a )) - :(cmp(b, c) > 0 ? b : (cmp(a, c) < 0 ? a : c )); -} - - -/* - * EXPORTED - * - * @implemented - */ -void -qsort ( - void * a, - size_t n, - size_t es, - _pfunccmp_t cmp - ) -{ - char *pa, *pb, *pc, *pd, *pl, *pm, *pn; - int d, r, swaptype, swap_cnt; - -loop: SWAPINIT(a, es); - swap_cnt = 0; - if (n < 7) - { - for ( pm = (char *) a + es; - pm < (char *) a + n * es; - pm += es - ) - { - for ( pl = pm; - pl > (char *) a && cmp(pl - es, pl) > 0; - pl -= es - ) - { - swap(pl, pl - es); - } - } - return; - } - pm = (char *) a + (n / 2) * es; - if (n > 7) - { - pl = (char *) a; - pn = (char *) a + (n - 1) * es; - if (n > 40) - { - d = (n / 8) * es; - pl = med3(pl, pl + d, pl + 2 * d, cmp); - pm = med3(pm - d, pm, pm + d, cmp); - pn = med3(pn - 2 * d, pn - d, pn, cmp); - } - pm = med3(pl, pm, pn, cmp); - } - swap(a, pm); - pa = pb = (char *) a + es; - - pc = pd = (char *) a + (n - 1) * es; - for (;;) - { - while (pb <= pc && (r = cmp(pb, a)) <= 0) - { - if (r == 0) - { - swap_cnt = 1; - swap(pa, pb); - pa += es; - } - pb += es; - } - while (pb <= pc && (r = cmp(pc, a)) >= 0) - { - if (r == 0) - { - swap_cnt = 1; - swap(pc, pd); - pd -= es; - } - pc -= es; - } - if (pb > pc) - { - break; - } - swap(pb, pc); - swap_cnt = 1; - pb += es; - pc -= es; - } - if (swap_cnt == 0) /* Switch to insertion sort */ - { - for ( pm = (char *) a + es; - pm < (char *) a + n * es; - pm += es - ) - { - for ( pl = pm; - pl > (char *) a && cmp(pl - es, pl) > 0; - pl -= es - ) - { - swap(pl, pl - es); - } - } - return; - } - - pn = (char *) a + n * es; - r = min(pa - (char *)a, pb - pa); - vecswap(a, pb - r, r); - r = min(pd - pc, pn - pd - es); - vecswap(pb, pn - r, r); - if ((r = pb - pa) > es) - { - qsort(a, r / es, es, cmp); - } - if ((r = pd - pc) > es) - { - /* Iterate rather than recurse to save stack space */ - a = pn - r; - n = r / es; - goto loop; - } -/* qsort(pn - r, r / es, es, cmp);*/ -} - - -/* EOF */ diff --git a/reactos/lib/rosrtl/makefile b/reactos/lib/rosrtl/makefile index f5f8055218a..388963bd755 100644 --- a/reactos/lib/rosrtl/makefile +++ b/reactos/lib/rosrtl/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.2 2003/05/29 00:36:41 hyperion Exp $ +# $Id: makefile,v 1.3 2003/07/11 20:55:43 gvg Exp $ PATH_TO_TOP = ../.. @@ -11,7 +11,10 @@ THREAD_OBJECTS = \ thread/create.o \ thread/stack.o -TARGET_OBJECTS = $(THREAD_OBJECTS) +MISC_OBJECTS = \ + misc/qsort.o + +TARGET_OBJECTS = $(THREAD_OBJECTS) $(MISC_OBJECTS) DEP_OBJECTS = $(TARGET_OBJECTS) diff --git a/reactos/ntoskrnl/rtl/qsort.c b/reactos/lib/rosrtl/misc/qsort.c similarity index 98% rename from reactos/ntoskrnl/rtl/qsort.c rename to reactos/lib/rosrtl/misc/qsort.c index 3ee4638df6b..2255af45fe4 100644 --- a/reactos/ntoskrnl/rtl/qsort.c +++ b/reactos/lib/rosrtl/misc/qsort.c @@ -1,4 +1,4 @@ -/* $Id: qsort.c,v 1.2 2003/07/11 01:23:15 royce Exp $ +/* $Id: qsort.c,v 1.1 2003/07/11 20:55:43 gvg Exp $ * * FILE: ntoskrnl/rtl/qsort.c * NOTE: Adapted from CygWin newlib 2000-03-12. @@ -145,10 +145,7 @@ med3 ( } -/* EXPORTED - * - * @implemented - */ +/* EXPORTED */ void qsort ( void * a, diff --git a/reactos/ntoskrnl/Makefile b/reactos/ntoskrnl/Makefile index 6ba3c50c881..423c62d6134 100644 --- a/reactos/ntoskrnl/Makefile +++ b/reactos/ntoskrnl/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.99 2003/06/11 12:29:49 ekohl Exp $ +# $Id: Makefile,v 1.100 2003/07/11 20:55:43 gvg Exp $ # # ReactOS Operating System # @@ -93,7 +93,6 @@ OBJECTS_RTL = \ rtl/message.o \ rtl/nls.o \ rtl/purecall.o \ - rtl/qsort.o \ rtl/random.o \ rtl/regio.o \ rtl/sprintf.o \ @@ -494,7 +493,7 @@ OBJECTS := \ $(OBJECTS_RESOURCE) -$(TARGETNAME).nostrip.exe: $(TARGETNAME).o $(IE_DATA) $(SDK_PATH_LIB)/string.a +$(TARGETNAME).nostrip.exe: $(TARGETNAME).o $(IE_DATA) $(SDK_PATH_LIB)/string.a $(SDK_PATH_LIB)/rosrtl.a $(CC) \ -Wl,-T,ntoskrnl.lnk \ -nostartfiles \ @@ -509,6 +508,7 @@ $(TARGETNAME).nostrip.exe: $(TARGETNAME).o $(IE_DATA) $(SDK_PATH_LIB)/string.a -Wl,--base-file,base.tmp \ $(TARGETNAME).o -lgcc \ $(SDK_PATH_LIB)/string.a \ + $(SDK_PATH_LIB)/rosrtl.a \ $(DDK_PATH_LIB)/hal.a - $(RM) junk.tmp $(DLLTOOL) \ @@ -532,10 +532,11 @@ $(TARGETNAME).nostrip.exe: $(TARGETNAME).o $(IE_DATA) $(SDK_PATH_LIB)/string.a -Wl,temp.exp \ $(TARGETNAME).o -lgcc \ $(SDK_PATH_LIB)/string.a \ + $(SDK_PATH_LIB)/rosrtl.a \ $(DDK_PATH_LIB)/hal.a - $(RM) temp.exp -$(TARGETNAME).exe: $(TARGETNAME).o $(LINKER_SCRIPT) $(DDK_PATH_LIB)/hal.a $(SDK_PATH_LIB)/string.a +$(TARGETNAME).exe: $(TARGETNAME).o $(LINKER_SCRIPT) $(DDK_PATH_LIB)/hal.a $(SDK_PATH_LIB)/string.a $(SDK_PATH_LIB)/rosrtl.a - $(CC) \ -Wl,-T,$(LINKER_SCRIPT) \ -nostartfiles \ @@ -550,6 +551,7 @@ $(TARGETNAME).exe: $(TARGETNAME).o $(LINKER_SCRIPT) $(DDK_PATH_LIB)/hal.a $(SDK_ -Wl,--base-file,base.tmp \ $(TARGETNAME).o -lgcc \ $(SDK_PATH_LIB)/string.a \ + $(SDK_PATH_LIB)/rosrtl.a \ $(DDK_PATH_LIB)/hal.a - $(RM) junk.tmp $(DLLTOOL) \ @@ -573,13 +575,14 @@ $(TARGETNAME).exe: $(TARGETNAME).o $(LINKER_SCRIPT) $(DDK_PATH_LIB)/hal.a $(SDK_ -Wl,temp.exp \ $(TARGETNAME).o -lgcc \ $(SDK_PATH_LIB)/string.a \ + $(SDK_PATH_LIB)/rosrtl.a \ $(DDK_PATH_LIB)/hal.a - $(RM) temp.exp $(TARGETNAME).dbg.o: $(TARGETNAME).o $(STRIP) --strip-debug -o $(TARGETNAME).dbg.o $(TARGETNAME).o -$(TARGETNAME).dbg: $(TARGETNAME).dbg.o $(TARGETNAME).a $(TARGETNAME).dbg.lnk $(DDK_PATH_LIB)/hal.a $(SDK_PATH_LIB)/string.a +$(TARGETNAME).dbg: $(TARGETNAME).dbg.o $(TARGETNAME).a $(TARGETNAME).dbg.lnk $(DDK_PATH_LIB)/hal.a $(SDK_PATH_LIB)/string.a $(SDK_PATH_LIB)/rosrtl.a $(CC) \ -Wl,-T,$(TARGETNAME).dbg.lnk \ -nostartfiles \ @@ -594,6 +597,7 @@ $(TARGETNAME).dbg: $(TARGETNAME).dbg.o $(TARGETNAME).a $(TARGETNAME).dbg.lnk $(D -Wl,--base-file,base.tmp \ $(TARGETNAME).dbg.o -lgcc \ $(SDK_PATH_LIB)/string.a \ + $(SDK_PATH_LIB)/rosrtl.a \ $(DDK_PATH_LIB)/hal.a - $(RM) junk.tmp $(DLLTOOL) \ @@ -617,6 +621,7 @@ $(TARGETNAME).dbg: $(TARGETNAME).dbg.o $(TARGETNAME).a $(TARGETNAME).dbg.lnk $(D -Wl,temp.exp \ $(TARGETNAME).dbg.o -lgcc \ $(SDK_PATH_LIB)/string.a \ + $(SDK_PATH_LIB)/rosrtl.a \ $(DDK_PATH_LIB)/hal.a - $(RM) temp.exp