qsort in NTOSKRNL and some STDCALL declarations.
authorEmanuele Aliberti <ea@iol.it>
Sat, 18 Mar 2000 15:12:19 +0000 (15:12 +0000)
committerEmanuele Aliberti <ea@iol.it>
Sat, 18 Mar 2000 15:12:19 +0000 (15:12 +0000)
svn path=/trunk/; revision=1078

reactos/include/internal/ldr.h
reactos/ntoskrnl/ldr/rtl.c
reactos/ntoskrnl/makefile_rex
reactos/ntoskrnl/ntoskrnl.def
reactos/ntoskrnl/ntoskrnl.edf
reactos/ntoskrnl/rtl/qsort.c [new file with mode: 0644]

index d384732..51af6cf 100644 (file)
 
 #include <pe.h>
 
-NTSTATUS LdrLoadDriver(PUNICODE_STRING Filename);
-NTSTATUS LdrLoadInitialProcess(VOID);
-VOID LdrLoadAutoConfigDrivers(VOID);
-VOID LdrInitModuleManagement(VOID);
-NTSTATUS LdrProcessDriver(PVOID ModuleLoadBase);
-NTSTATUS LdrpMapSystemDll(HANDLE ProcessHandle,
-                         PVOID* LdrStartupAddress);
-PVOID LdrpGetSystemDllEntryPoint(VOID);
-NTSTATUS LdrpMapImage(HANDLE ProcessHandle, 
-                     HANDLE SectionHandle,
-                     PVOID* ImageBase);
-
+NTSTATUS
+LdrLoadDriver (
+       IN      PUNICODE_STRING Filename
+       );
+NTSTATUS
+LdrLoadInitialProcess (
+       VOID
+       );
+VOID
+LdrLoadAutoConfigDrivers (
+       VOID
+       );
+VOID
+LdrInitModuleManagement (
+       VOID
+       );
+NTSTATUS
+LdrProcessDriver (
+       IN      PVOID   ModuleLoadBase
+       );
+NTSTATUS
+LdrpMapSystemDll (
+       HANDLE  ProcessHandle,
+       PVOID   * LdrStartupAddress
+       );
+PIMAGE_NT_HEADERS
+STDCALL
+RtlImageNtHeader (
+       IN      PVOID   BaseAddress
+       );
+PVOID
+LdrpGetSystemDllEntryPoint (
+       VOID
+       );
+NTSTATUS
+LdrpMapImage (
+       HANDLE  ProcessHandle, 
+       HANDLE  SectionHandle,
+       PVOID   * ImageBase
+       );
 
 #endif /* __INCLUDE_INTERNAL_LDR_H */
index a960808..b01cf0c 100644 (file)
@@ -1,4 +1,5 @@
-/*
+/* $Id: rtl.c,v 1.5 2000/03/18 15:12:18 ea Exp $
+ *
  * COPYRIGHT:       See COPYING in the top level directory
  * PROJECT:         ReactOS kernel
  * FILE:            ntoskrnl/ldr/loader.c
@@ -28,7 +29,7 @@
 
 PIMAGE_NT_HEADERS
 STDCALL
-RtlImageNtHeader(PVOID BaseAddress)
+RtlImageNtHeader (IN PVOID BaseAddress)
 {
    PIMAGE_DOS_HEADER DosHeader;
    PIMAGE_NT_HEADERS NTHeaders;
@@ -46,3 +47,6 @@ RtlImageNtHeader(PVOID BaseAddress)
      }
    return(NTHeaders);
 }
+
+
+/* EOF */
index e4bf68f..cec8d01 100644 (file)
@@ -1,4 +1,4 @@
-# $Id: makefile_rex,v 1.60 2000/03/11 00:51:36 ea Exp $
+# $Id: makefile_rex,v 1.61 2000/03/18 15:12:18 ea Exp $
 #
 # ReactOS Operating System
 #
@@ -24,7 +24,7 @@ RTL_OBJECTS = rtl/ctype.o rtl/interlck.o rtl/largeint.o  rtl/list.o \
               rtl/memmove.o rtl/memset.o  rtl/nls.o rtl/regio.o \
               rtl/return.o rtl/slist.o rtl/sprintf.o rtl/swprintf.o \
               rtl/stdlib.o rtl/string.o rtl/time.o rtl/unalign.o \
-              rtl/unicode.o rtl/wstring.o rtl/bitmap.o
+              rtl/unicode.o rtl/wstring.o rtl/bitmap.o rtl/qsort.o
 
 KE_OBJECTS = ke/head.o ke/main.o ke/timer.o ke/error.o ke/catch.o \
              ke/dpc.o ke/wait.o ke/kqueue.o ke/dispatch.o \
index 508b852..c795fd3 100644 (file)
@@ -1,4 +1,4 @@
-; $Id: ntoskrnl.def,v 1.59 2000/03/18 14:02:01 ekohl Exp $
+; $Id: ntoskrnl.def,v 1.60 2000/03/18 15:12:18 ea Exp $
 ;
 ; reactos/ntoskrnl/ntoskrnl.def
 ;
@@ -611,7 +611,7 @@ memchr
 memcpy
 memmove
 memset
-;qsort
+qsort
 rand
 sprintf
 srand
index d84df71..08b57c0 100644 (file)
@@ -1,4 +1,4 @@
-; $Id: ntoskrnl.edf,v 1.46 2000/03/18 14:02:01 ekohl Exp $
+; $Id: ntoskrnl.edf,v 1.47 2000/03/18 15:12:18 ea Exp $
 ;
 ; reactos/ntoskrnl/ntoskrnl.def
 ;
@@ -538,7 +538,7 @@ memchr
 memcpy
 memmove
 memset
-;qsort
+qsort
 rand
 sprintf
 srand
diff --git a/reactos/ntoskrnl/rtl/qsort.c b/reactos/ntoskrnl/rtl/qsort.c
new file mode 100644 (file)
index 0000000..4e5eef5
--- /dev/null
@@ -0,0 +1,266 @@
+/* $Id: qsort.c,v 1.1 2000/03/18 15:12:19 ea Exp $
+ * 
+ * FILE: ntoskrnl/rtl/qsort.c
+ * NOTE: Adapted from CygWin newlib 2000-03-12.
+ */
+/*
+FUNCTION
+<<qsort>>---sort an array
+
+INDEX
+       qsort
+
+ANSI_SYNOPSIS
+       #include <stdlib.h>
+       void qsort(void *<[base]>, size_t <[nmemb]>, size_t <[size]>,
+                  int (*<[compar]>)(const void *, const void *) );
+
+TRAD_SYNOPSIS
+       #include <stdlib.h>
+       qsort(<[base]>, <[nmemb]>, <[size]>, <[compar]> )
+       char *<[base]>;
+       size_t <[nmemb]>;
+       size_t <[size]>;
+       int (*<[compar]>)();
+
+DESCRIPTION
+<<qsort>> 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 <<qsort>> returns, the
+array elements beginning at <[base]> have been reordered.
+
+RETURNS
+<<qsort>> does not return a result.
+
+PORTABILITY
+<<qsort>> 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 */
+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 */