[ros-diffs] [hyperion] 34396: modified lib/sdk/crt/crt.rbuild modified lib/sdk/crt/libcntpr.rbuild Add qsort and div to crt and libcntpr modified lib/sdk/crt/include/internal/tls.h modified lib/sdk/crt/stdlib/qsort.c Fixed ineptly-ported DJGPP qsort to not use TLS

hyperion at svn.reactos.org hyperion at svn.reactos.org
Wed Jul 9 20:44:47 CEST 2008


Author: hyperion
Date: Wed Jul  9 13:44:46 2008
New Revision: 34396

URL: http://svn.reactos.org/svn/reactos?rev=34396&view=rev
Log:
modified   lib/sdk/crt/crt.rbuild
modified   lib/sdk/crt/libcntpr.rbuild
   Add qsort and div to crt and libcntpr

modified   lib/sdk/crt/include/internal/tls.h
modified   lib/sdk/crt/stdlib/qsort.c
   Fixed ineptly-ported DJGPP qsort to not use TLS

Modified:
    trunk/reactos/lib/sdk/crt/crt.rbuild
    trunk/reactos/lib/sdk/crt/include/internal/tls.h
    trunk/reactos/lib/sdk/crt/libcntpr.rbuild
    trunk/reactos/lib/sdk/crt/stdlib/qsort.c

Modified: trunk/reactos/lib/sdk/crt/crt.rbuild
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/sdk/crt/crt.rbuild?rev=34396&r1=34395&r2=34396&view=diff
==============================================================================
--- trunk/reactos/lib/sdk/crt/crt.rbuild [iso-8859-1] (original)
+++ trunk/reactos/lib/sdk/crt/crt.rbuild [iso-8859-1] Wed Jul  9 13:44:46 2008
@@ -267,6 +267,7 @@
 		<file>mbstowcs.c</file>
 		<file>obsol.c</file>
 		<file>putenv.c</file>
+		<file>qsort.c</file>
 		<file>rot.c</file>
 		<file>senv.c</file>
 		<file>swab.c</file>

Modified: trunk/reactos/lib/sdk/crt/include/internal/tls.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/sdk/crt/include/internal/tls.h?rev=34396&r1=34395&r2=34396&view=diff
==============================================================================
--- trunk/reactos/lib/sdk/crt/include/internal/tls.h [iso-8859-1] (original)
+++ trunk/reactos/lib/sdk/crt/include/internal/tls.h [iso-8859-1] Wed Jul  9 13:44:46 2008
@@ -27,12 +27,6 @@
 
   int fpecode;                  /* fp exception code */
 
-  /* qsort variables */
-  int (*qcmp)(const void *, const void *);  /* the comparison routine */
-  int qsz;                      /* size of each record */
-  int thresh;                   /* THRESHold in chars */
-  int mthresh;                  /* MTHRESHold in chars */
-
   EXCEPTION_RECORD *exc_record; /* Head of exception record list */
 
 } THREADDATA, *PTHREADDATA;

Modified: trunk/reactos/lib/sdk/crt/libcntpr.rbuild
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/sdk/crt/libcntpr.rbuild?rev=34396&r1=34395&r2=34396&view=diff
==============================================================================
--- trunk/reactos/lib/sdk/crt/libcntpr.rbuild [iso-8859-1] (original)
+++ trunk/reactos/lib/sdk/crt/libcntpr.rbuild [iso-8859-1] Wed Jul  9 13:44:46 2008
@@ -54,6 +54,7 @@
 			</directory>
 		</if>
 		<file>abs.c</file>
+		<file>div.c</file>
 		<file>labs.c</file>
 		<file>rand_nt.c</file>
 	</directory>
@@ -81,6 +82,10 @@
 	<directory name="search">
 		<file>bsearch.c</file>
 		<file>lfind.c</file>
+	</directory>
+
+	<directory name="stdlib">
+		<file>qsort.c</file>
 	</directory>
 
 	<directory name="string">

Modified: trunk/reactos/lib/sdk/crt/stdlib/qsort.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/sdk/crt/stdlib/qsort.c?rev=34396&r1=34395&r2=34396&view=diff
==============================================================================
--- trunk/reactos/lib/sdk/crt/stdlib/qsort.c [iso-8859-1] (original)
+++ trunk/reactos/lib/sdk/crt/stdlib/qsort.c [iso-8859-1] Wed Jul  9 13:44:46 2008
@@ -2,7 +2,6 @@
 
 #include <stdlib.h>
 #include <search.h>
-#include <internal/tls.h>
 
 /*-
  * Copyright (c) 1980, 1983 The Regents of the University of California.
@@ -51,12 +50,17 @@
  */
 
 static void
-qst(PTHREADDATA pThreadData, char *base, char *max)
+qst(size_t size, int (*compar)(const void*, const void*), char *base, char *max)
 {
   char c, *i, *j, *jj;
   int ii;
   char *mid, *tmp;
   int lo, hi;
+  size_t thresh;
+  size_t mthresh;
+
+  thresh = size * THRESH;
+  mthresh = size * MTHRESH;
 
   /*
    * At the top here, lo is the number of characters of elements in the
@@ -69,20 +73,20 @@
    */
   lo = max - base;		/* number of elements as chars */
   do	{
-    mid = i = base + pThreadData->qsz * ((lo / pThreadData->qsz) >> 1);
-    if (lo >= pThreadData->mthresh)
-    {
-      j = (pThreadData->qcmp((jj = base), i) > 0 ? jj : i);
-      if (pThreadData->qcmp(j, (tmp = max - pThreadData->qsz)) > 0)
+    mid = i = base + size * ((lo / size) >> 1);
+    if (lo >= mthresh)
+    {
+      j = (compar((jj = base), i) > 0 ? jj : i);
+      if (compar(j, (tmp = max - size)) > 0)
       {
 	/* switch to first loser */
 	j = (j == jj ? i : jj);
-	if (pThreadData->qcmp(j, tmp) < 0)
+	if (compar(j, tmp) < 0)
 	  j = tmp;
       }
       if (j != i)
       {
-	ii = pThreadData->qsz;
+	ii = size;
 	do	{
 	  c = *i;
 	  *i++ = *j;
@@ -93,18 +97,18 @@
     /*
      * Semi-standard quicksort partitioning/swapping
      */
-    for (i = base, j = max - pThreadData->qsz; ; )
-    {
-      while (i < mid && pThreadData->qcmp(i, mid) <= 0)
-	i += pThreadData->qsz;
+    for (i = base, j = max - size; ; )
+    {
+      while (i < mid && compar(i, mid) <= 0)
+	i += size;
       while (j > mid)
       {
-	if (pThreadData->qcmp(mid, j) <= 0)
+	if (compar(mid, j) <= 0)
 	{
-	  j -= pThreadData->qsz;
+	  j -= size;
 	  continue;
 	}
-	tmp = i + pThreadData->qsz;	/* value of i after swap */
+	tmp = i + size;	/* value of i after swap */
 	if (i == mid)
 	{
 	  /* j <-> mid, new mid is j */
@@ -114,7 +118,7 @@
 	{
 	  /* i <-> j */
 	  jj = j;
-	  j -= pThreadData->qsz;
+	  j -= size;
 	}
 	goto swap;
       }
@@ -127,10 +131,10 @@
 	/* i <-> mid, new mid is i */
 	jj = mid;
 	tmp = mid = i;		/* value of i after swap */
-	j -= pThreadData->qsz;
+	j -= size;
       }
     swap:
-      ii = pThreadData->qsz;
+      ii = size;
       do	{
 	c = *i;
 	*i++ = *jj;
@@ -146,21 +150,21 @@
      * (recursively or by branching) if the partition is
      * of at least size THRESH.
      */
-    i = (j = mid) + pThreadData->qsz;
+    i = (j = mid) + size;
     if ((lo = j - base) <= (hi = max - i))
     {
-      if (lo >= pThreadData->thresh)
-	qst(pThreadData, base, j);
+      if (lo >= thresh)
+	qst(size, compar, base, j);
       base = i;
       lo = hi;
     }
     else
     {
-      if (hi >= pThreadData->thresh)
-	qst(pThreadData, i, max);
+      if (hi >= thresh)
+	qst(size, compar, i, max);
       max = j;
     }
-  } while (lo >= pThreadData->thresh);
+  } while (lo >= thresh);
 }
 
 /*
@@ -174,25 +178,22 @@
 void
 qsort(void *base0, size_t n, size_t size, int (*compar)(const void*, const void*))
 {
-  PTHREADDATA pThreadData;
   char *base = (char *)base0;
   char c, *i, *j, *lo, *hi;
   char *min, *max;
+  size_t thresh;
 
   if (n <= 1)
     return;
 
-  pThreadData = GetThreadData();
-
-  pThreadData->qsz = size;
-  pThreadData->qcmp = compar;
-  pThreadData->thresh = pThreadData->qsz * THRESH;
-  pThreadData->mthresh = pThreadData->qsz * MTHRESH;
-  max = base + n * pThreadData->qsz;
+  size = size;
+  compar = compar;
+  thresh = size * THRESH;
+  max = base + n * size;
   if (n >= THRESH)
   {
-    qst(pThreadData, base, max);
-    hi = base + pThreadData->thresh;
+    qst(size, compar, base, max);
+    hi = base + thresh;
   }
   else
   {
@@ -204,13 +205,13 @@
    * the first THRESH elements (or the first n if n < THRESH), finding
    * the min, and swapping it into the first position.
    */
-  for (j = lo = base; (lo += pThreadData->qsz) < hi; )
-    if (pThreadData->qcmp(j, lo) > 0)
+  for (j = lo = base; (lo += size) < hi; )
+    if (compar(j, lo) > 0)
       j = lo;
   if (j != base)
   {
     /* swap j into place */
-    for (i = base, hi = base + pThreadData->qsz; i < hi; )
+    for (i = base, hi = base + size; i < hi; )
     {
       c = *j;
       *j++ = *i;
@@ -224,15 +225,15 @@
    * Then, do the standard insertion sort shift on a character at a time
    * basis for each element in the frob.
    */
-  for (min = base; (hi = min += pThreadData->qsz) < max; )
-  {
-    while (pThreadData->qcmp(hi -= pThreadData->qsz, min) > 0)
+  for (min = base; (hi = min += size) < max; )
+  {
+    while (compar(hi -= size, min) > 0)
       /* void */;
-    if ((hi += pThreadData->qsz) != min) {
-      for (lo = min + pThreadData->qsz; --lo >= min; )
+    if ((hi += size) != min) {
+      for (lo = min + size; --lo >= min; )
       {
 	c = *lo;
-	for (i = j = lo; (j -= pThreadData->qsz) >= hi; i = j)
+	for (i = j = lo; (j -= size) >= hi; i = j)
 	  *i = *j;
 	*i = c;
       }



More information about the Ros-diffs mailing list