Changeset 0a50f59 in mainline


Ignore:
Timestamp:
2005-09-15T21:19:40Z (19 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
6799505
Parents:
01e48c1
Message:

Remove _qsort() as its concept is fundamentally broken.

Move lib/the.c to proc/the.c.

Location:
src
Files:
2 edited
1 moved

Legend:

Unmodified
Added
Removed
  • src/Makefile

    r01e48c1 r0a50f59  
    99        proc/thread.c \
    1010        proc/task.c \
     11        proc/the.c \
    1112        mm/heap.c \
    1213        mm/frame.c \
     
    1718        lib/list.c \
    1819        lib/memstr.c \
    19         lib/the.c \
    2020        lib/sort.c \
    2121        debug/print.c \
  • src/lib/sort.c

    r01e48c1 r0a50f59  
    3434#define EBUFSIZE        32
    3535
    36 static void _qsort(void * data, count_t n, size_t e_size, int (* cmp) (void * a, void * b), void * pivot, void * tmp);
    37 
    38 /*
    39  * Wrapper method for quicksort algorithm to decrease amount of allocations
    40  */
    41 void qsort(void * data, count_t n, size_t e_size, int (* cmp) (void * a, void * b)) {
     36void qsort(void * data, count_t n, size_t e_size, int (* cmp) (void * a, void * b))
     37{
    4238        __u8 buf_tmp[EBUFSIZE];
    4339        __u8 buf_pivot[EBUFSIZE];
     
    5450        }
    5551
    56         _qsort(data, n, e_size, cmp, pivot, tmp);
     52        if (n > 4) {
     53                int i = 0, j = n - 1;
     54
     55                memcpy(pivot, data, e_size);
     56
     57                while (1) {
     58                        while ((cmp(data + i * e_size, pivot) < 0) && i < n) i++;
     59                        while ((cmp(data + j * e_size, pivot) >=0) && j > 0) j--;
     60                        if (i<j) {
     61                                memcpy(tmp, data + i * e_size, e_size);
     62                                memcpy(data + i * e_size, data + j * e_size, e_size);
     63                                memcpy(data + j * e_size, tmp, e_size);
     64                        } else {
     65                                break;
     66                        }
     67                }
     68
     69                qsort(data, j + 1, e_size, cmp);
     70                qsort(data + (j + 1) * e_size, n - j - 1, e_size, cmp);
     71        } else {
     72                bubblesort(data, n, e_size, cmp);
     73        }
     74
    5775       
    5876        if (e_size > EBUFSIZE) {
     
    6381
    6482
    65 void bubblesort(void * data, count_t n, size_t e_size, int (* cmp) (void * a, void * b)) {
     83void bubblesort(void * data, count_t n, size_t e_size, int (* cmp) (void * a, void * b))
     84{
    6685        __u8 buf_slot[EBUFSIZE];
    6786        bool done = false;
     
    94113}
    95114
    96 static void _qsort(void * data, count_t n, size_t e_size, int (* cmp) (void * a, void * b), void * pivot, void * tmp) {
    97         if (n > 4) {
    98                 int i = 0, j = n - 1;
    99 
    100                 memcpy(pivot, data, e_size);
    101 
    102                 while (1) {
    103                         while ((cmp(data + i * e_size, pivot) < 0) && i < n) i++;
    104                         while ((cmp(data + j * e_size, pivot) >=0) && j > 0) j--;
    105                         if (i<j) {
    106                                 memcpy(tmp, data + i * e_size, e_size);
    107                                 memcpy(data + i * e_size, data + j * e_size, e_size);
    108                                 memcpy(data + j * e_size, tmp, e_size);
    109                         } else {
    110                                 break;
    111                         }
    112                 }
    113 
    114                 qsort(data, j + 1, e_size, cmp);
    115                 qsort(data + (j + 1) * e_size, n - j - 1, e_size, cmp);
    116         } else {
    117                 bubblesort(data, n, e_size, cmp);
    118         }
    119 }
    120 
    121 
    122 
    123115/*
    124116 * Comparator returns 1 if a > b, 0 if a == b, -1 if a < b
    125117 */
    126 int int_cmp(void * a, void * b) {
     118int int_cmp(void * a, void * b)
     119{
    127120        return (* (int *) a > * (int*)b) ? 1 : (*(int *)a < * (int *)b) ? -1 : 0;
    128121}
    129122
    130 int __u8_cmp(void * a, void * b) {
     123int __u8_cmp(void * a, void * b)
     124{
    131125        return (* (__u8 *) a > * (__u8 *)b) ? 1 : (*(__u8 *)a < * (__u8 *)b) ? -1 : 0;
    132126}
    133127
    134 int __u16_cmp(void * a, void * b) {
     128int __u16_cmp(void * a, void * b)
     129{
    135130        return (* (__u16 *) a > * (__u16 *)b) ? 1 : (*(__u16 *)a < * (__u16 *)b) ? -1 : 0;
    136131}
    137132
    138 int __u32_cmp(void * a, void * b) {
     133int __u32_cmp(void * a, void * b)
     134{
    139135        return (* (__u32 *) a > * (__u32 *)b) ? 1 : (*(__u32 *)a < * (__u32 *)b) ? -1 : 0;
    140136}
    141 
Note: See TracChangeset for help on using the changeset viewer.