@@ -740,10 +740,26 @@ static int compare_time_desc(const void* a, const void* b) {
740740 return ((fossil_pizza_case_t * )b )-> elapsed_ns - ((fossil_pizza_case_t * )a )-> elapsed_ns ;
741741}
742742
743+ static int compare_priority_asc (const void * a , const void * b ) {
744+ return ((fossil_pizza_case_t * )a )-> priority - ((fossil_pizza_case_t * )b )-> priority ;
745+ }
746+
747+ static int compare_priority_desc (const void * a , const void * b ) {
748+ return ((fossil_pizza_case_t * )b )-> priority - ((fossil_pizza_case_t * )a )-> priority ;
749+ }
750+
751+ static int compare_hash_asc (const void * a , const void * b ) {
752+ return memcmp (((fossil_pizza_case_t * )a )-> meta .hash , ((fossil_pizza_case_t * )b )-> meta .hash , FOSSIL_PIZZA_HASH_SIZE );
753+ }
754+
755+ static int compare_hash_desc (const void * a , const void * b ) {
756+ return memcmp (((fossil_pizza_case_t * )b )-> meta .hash , ((fossil_pizza_case_t * )a )-> meta .hash , FOSSIL_PIZZA_HASH_SIZE );
757+ }
758+
743759void fossil_pizza_sort_cases (fossil_pizza_suite_t * suite , const fossil_pizza_engine_t * engine ) {
744760 if (!suite || !suite -> cases || suite -> count <= 1 || !engine ) return ;
745761
746- int (* compare )(const void * , const void * ) = null ;
762+ int (* compare )(const void * , const void * ) = NULL ;
747763
748764 if (engine -> pallet .sort .by ) {
749765 if (pizza_io_cstr_compare (engine -> pallet .sort .by , "name" ) == 0 ) {
@@ -752,20 +768,16 @@ void fossil_pizza_sort_cases(fossil_pizza_suite_t* suite, const fossil_pizza_eng
752768 compare = (pizza_io_cstr_compare (engine -> pallet .sort .order , "desc" ) == 0 ) ? compare_result_desc : compare_result_asc ;
753769 } else if (pizza_io_cstr_compare (engine -> pallet .sort .by , "time" ) == 0 ) {
754770 compare = (pizza_io_cstr_compare (engine -> pallet .sort .order , "desc" ) == 0 ) ? compare_time_desc : compare_time_asc ;
771+ } else if (pizza_io_cstr_compare (engine -> pallet .sort .by , "priority" ) == 0 ) {
772+ compare = (pizza_io_cstr_compare (engine -> pallet .sort .order , "desc" ) == 0 ) ? compare_priority_desc : compare_priority_asc ;
773+ } else if (pizza_io_cstr_compare (engine -> pallet .sort .by , "hash" ) == 0 ) {
774+ compare = (pizza_io_cstr_compare (engine -> pallet .sort .order , "desc" ) == 0 ) ? compare_hash_desc : compare_hash_asc ;
755775 } else {
756776 // Invalid sort criteria
757777 return ;
758778 }
759779 }
760780
761- if (engine -> pallet .sort .order ) {
762- if (pizza_io_cstr_compare (engine -> pallet .sort .order , "desc" ) == 0 ) {
763- compare = (compare == compare_name_asc ) ? compare_name_desc : compare ;
764- } else if (pizza_io_cstr_compare (engine -> pallet .sort .order , "asc" ) == 0 ) {
765- compare = (compare == compare_name_desc ) ? compare_name_asc : compare ;
766- }
767- }
768-
769781 if (compare ) {
770782 qsort (suite -> cases , suite -> count , sizeof (fossil_pizza_case_t ), compare );
771783 }
@@ -801,24 +813,29 @@ void fossil_pizza_shuffle_cases(fossil_pizza_suite_t* suite, const fossil_pizza_
801813
802814 unsigned int seed = (engine && engine -> pallet .shuffle .seed )
803815 ? (unsigned int )atoi (engine -> pallet .shuffle .seed )
804- : (unsigned int )time (null );
816+ : (unsigned int )time (NULL );
805817 srand (seed );
806818
819+ // Fisher-Yates shuffle
807820 for (size_t i = suite -> count - 1 ; i > 0 ; -- i ) {
808821 size_t j = rand () % (i + 1 );
809822 fossil_pizza_case_t temp = suite -> cases [i ];
810823 suite -> cases [i ] = suite -> cases [j ];
811824 suite -> cases [j ] = temp ;
812825 }
813826
827+ // Optional secondary shuffle/sort by field
814828 if (engine && engine -> pallet .shuffle .by ) {
815829 if (pizza_io_cstr_compare (engine -> pallet .shuffle .by , "name" ) == 0 ) {
816- qsort (suite -> cases , suite -> count , sizeof (fossil_pizza_case_t ),
817- (int (* )(const void * , const void * ))pizza_io_cstr_compare );
830+ qsort (suite -> cases , suite -> count , sizeof (fossil_pizza_case_t ), compare_name_asc );
818831 } else if (pizza_io_cstr_compare (engine -> pallet .shuffle .by , "result" ) == 0 ) {
819832 qsort (suite -> cases , suite -> count , sizeof (fossil_pizza_case_t ), compare_result_asc );
820833 } else if (pizza_io_cstr_compare (engine -> pallet .shuffle .by , "time" ) == 0 ) {
821834 qsort (suite -> cases , suite -> count , sizeof (fossil_pizza_case_t ), compare_time_asc );
835+ } else if (pizza_io_cstr_compare (engine -> pallet .shuffle .by , "priority" ) == 0 ) {
836+ qsort (suite -> cases , suite -> count , sizeof (fossil_pizza_case_t ), compare_priority_asc );
837+ } else if (pizza_io_cstr_compare (engine -> pallet .shuffle .by , "hash" ) == 0 ) {
838+ qsort (suite -> cases , suite -> count , sizeof (fossil_pizza_case_t ), compare_hash_asc );
822839 }
823840 }
824841}
0 commit comments