1.1 --- a/core/smn_sorting.cpp Sun Mar 02 23:58:33 2008 +0000
1.2 +++ b/core/smn_sorting.cpp Mon Mar 03 06:28:41 2008 +0000
1.3 @@ -86,8 +86,26 @@
1.4 {
1.5 Sort_Ascending = 0,
1.6 Sort_Descending = 1,
1.7 + Sort_Random = 2,
1.8 };
1.9
1.10 +void sort_random(cell_t *array, cell_t size)
1.11 +{
1.12 + srand((unsigned int)time(NULL));
1.13 +
1.14 + for (int i = size-1; i > 0; i--)
1.15 + {
1.16 + int n = (rand() % i) + 1;
1.17 +
1.18 + if (array[i] != array[n])
1.19 + {
1.20 + array[i] ^= array[n];
1.21 + array[n] ^= array[i];
1.22 + array[i] ^= array[n];
1.23 + }
1.24 + }
1.25 +}
1.26 +
1.27 int sort_ints_asc(const void *int1, const void *int2)
1.28 {
1.29 return (*(int *)int1) - (*(int *)int2);
1.30 @@ -109,9 +127,15 @@
1.31 if (type == Sort_Ascending)
1.32 {
1.33 qsort(array, array_size, sizeof(cell_t), sort_ints_asc);
1.34 - } else {
1.35 + }
1.36 + else if (type == Sort_Descending)
1.37 + {
1.38 qsort(array, array_size, sizeof(cell_t), sort_ints_desc);
1.39 }
1.40 + else
1.41 + {
1.42 + sort_random(array, array_size);
1.43 + }
1.44
1.45 return 1;
1.46 }
1.47 @@ -157,9 +181,15 @@
1.48 if (type == Sort_Ascending)
1.49 {
1.50 qsort(array, array_size, sizeof(cell_t), sort_floats_asc);
1.51 - } else {
1.52 + }
1.53 + else if (type == Sort_Descending)
1.54 + {
1.55 qsort(array, array_size, sizeof(cell_t), sort_floats_desc);
1.56 }
1.57 + else
1.58 + {
1.59 + sort_random(array, array_size);
1.60 + }
1.61
1.62 return 1;
1.63 }
1.64 @@ -217,9 +247,15 @@
1.65 if (type == Sort_Ascending)
1.66 {
1.67 qsort(array, array_size, sizeof(cell_t), sort_strings_asc);
1.68 - } else {
1.69 + }
1.70 + else if (type == Sort_Descending)
1.71 + {
1.72 qsort(array, array_size, sizeof(cell_t), sort_strings_desc);
1.73 }
1.74 + else
1.75 + {
1.76 + sort_random(array, array_size);
1.77 + }
1.78
1.79 /* END HACKHACK - restore what we damaged so Pawn doesn't throw up.
1.80 * We'll browse through each index of the array and patch up the distance.
1.81 @@ -392,6 +428,20 @@
1.82 return strcmp((char *) str2, (char *) str1);
1.83 }
1.84
1.85 +void sort_adt_random(CellArray *cArray)
1.86 +{
1.87 + size_t arraysize = cArray->size();
1.88 +
1.89 + srand((unsigned int)time(NULL));
1.90 +
1.91 + for (int i = arraysize-1; i > 0; i--)
1.92 + {
1.93 + int n = (rand() % i) + 1;
1.94 +
1.95 + cArray->swap(i, n);
1.96 + }
1.97 +}
1.98 +
1.99 static cell_t sm_SortADTArray(IPluginContext *pContext, const cell_t *params)
1.100 {
1.101 CellArray *cArray;
1.102 @@ -405,6 +455,14 @@
1.103 }
1.104
1.105 cell_t order = params[2];
1.106 +
1.107 + if (order == Sort_Random)
1.108 + {
1.109 + sort_adt_random(cArray);
1.110 +
1.111 + return 1;
1.112 + }
1.113 +
1.114 cell_t type = params[3];
1.115 size_t arraysize = cArray->size();
1.116 size_t blocksize = cArray->blocksize();