425 |
size_t vlen, spos, len, size = sizeof (SCM); |
size_t vlen, spos, len, size = sizeof (SCM); |
426 |
SCM *vp; |
SCM *vp; |
427 |
|
|
428 |
SCM_VALIDATE_VECTOR (1,vec); |
SCM_VALIDATE_VECTOR (1, vec); |
429 |
SCM_VALIDATE_NIM (2,less); |
SCM_VALIDATE_NIM (2, less); |
430 |
|
|
431 |
vp = SCM_VELTS (vec); /* vector pointer */ |
vp = SCM_WRITABLE_VELTS (vec); /* vector pointer */ |
432 |
vlen = SCM_VECTOR_LENGTH (vec); |
vlen = SCM_VECTOR_LENGTH (vec); |
433 |
|
|
434 |
SCM_VALIDATE_INUM_MIN_COPY (3, startpos, 0, spos); |
SCM_VALIDATE_INUM_MIN_COPY (3, startpos, 0, spos); |
435 |
SCM_ASSERT_RANGE (3,startpos, spos <= vlen); |
SCM_ASSERT_RANGE (3, startpos, spos <= vlen); |
436 |
SCM_VALIDATE_INUM_RANGE (4,endpos,0,vlen+1); |
SCM_VALIDATE_INUM_RANGE (4, endpos,0, vlen+1); |
437 |
len = SCM_INUM (endpos) - spos; |
len = SCM_INUM (endpos) - spos; |
438 |
|
|
439 |
quicksort (&vp[spos], len, size, scm_cmp_function (less), less); |
quicksort (&vp[spos], len, size, scm_cmp_function (less), less); |
440 |
|
SCM_GC_FLAG_OBJECT_WRITE(vec); |
441 |
|
|
442 |
return SCM_UNSPECIFIED; |
return SCM_UNSPECIFIED; |
443 |
/* return vec; */ |
/* return vec; */ |
444 |
} |
} |
457 |
{ |
{ |
458 |
long len, j; /* list/vector length, temp j */ |
long len, j; /* list/vector length, temp j */ |
459 |
SCM item, rest; /* rest of items loop variable */ |
SCM item, rest; /* rest of items loop variable */ |
460 |
SCM *vp; |
SCM const *vp; |
461 |
cmp_fun_t cmp = scm_cmp_function (less); |
cmp_fun_t cmp = scm_cmp_function (less); |
462 |
|
|
463 |
if (SCM_NULL_OR_NIL_P (items)) |
if (SCM_NULL_OR_NIL_P (items)) |
464 |
return SCM_BOOL_T; |
return SCM_BOOL_T; |
465 |
|
|
466 |
SCM_VALIDATE_NIM (2,less); |
SCM_VALIDATE_NIM (2, less); |
467 |
|
|
468 |
if (SCM_CONSP (items)) |
if (SCM_CONSP (items)) |
469 |
{ |
{ |
470 |
len = scm_ilength (items); /* also checks that it's a pure list */ |
len = scm_ilength (items); /* also checks that it's a pure list */ |
471 |
SCM_ASSERT_RANGE (1,items,len >= 0); |
SCM_ASSERT_RANGE (1, items, len >= 0); |
472 |
if (len <= 1) |
if (len <= 1) |
473 |
return SCM_BOOL_T; |
return SCM_BOOL_T; |
474 |
|
|
531 |
long alen, blen; /* list lengths */ |
long alen, blen; /* list lengths */ |
532 |
SCM build, last; |
SCM build, last; |
533 |
cmp_fun_t cmp = scm_cmp_function (less); |
cmp_fun_t cmp = scm_cmp_function (less); |
534 |
SCM_VALIDATE_NIM (3,less); |
SCM_VALIDATE_NIM (3, less); |
535 |
|
|
536 |
if (SCM_NULL_OR_NIL_P (alist)) |
if (SCM_NULL_OR_NIL_P (alist)) |
537 |
return blist; |
return blist; |
539 |
return alist; |
return alist; |
540 |
else |
else |
541 |
{ |
{ |
542 |
SCM_VALIDATE_NONEMPTYLIST_COPYLEN (1,alist,alen); |
SCM_VALIDATE_NONEMPTYLIST_COPYLEN (1, alist, alen); |
543 |
SCM_VALIDATE_NONEMPTYLIST_COPYLEN (2,blist,blen); |
SCM_VALIDATE_NONEMPTYLIST_COPYLEN (2, blist, blen); |
544 |
if ((*cmp) (less, SCM_CARLOC (blist), SCM_CARLOC (alist))) |
if ((*cmp) (less, SCM_CARLOC (blist), SCM_CARLOC (alist))) |
545 |
{ |
{ |
546 |
build = scm_cons (SCM_CAR (blist), SCM_EOL); |
build = scm_cons (SCM_CAR (blist), SCM_EOL); |
643 |
{ |
{ |
644 |
long alen, blen; /* list lengths */ |
long alen, blen; /* list lengths */ |
645 |
|
|
646 |
SCM_VALIDATE_NIM (3,less); |
SCM_VALIDATE_NIM (3, less); |
647 |
if (SCM_NULL_OR_NIL_P (alist)) |
if (SCM_NULL_OR_NIL_P (alist)) |
648 |
return blist; |
return blist; |
649 |
else if (SCM_NULL_OR_NIL_P (blist)) |
else if (SCM_NULL_OR_NIL_P (blist)) |
650 |
return alist; |
return alist; |
651 |
else |
else |
652 |
{ |
{ |
653 |
SCM_VALIDATE_NONEMPTYLIST_COPYLEN (1,alist,alen); |
SCM_VALIDATE_NONEMPTYLIST_COPYLEN (1, alist, alen); |
654 |
SCM_VALIDATE_NONEMPTYLIST_COPYLEN (2,blist,blen); |
SCM_VALIDATE_NONEMPTYLIST_COPYLEN (2, blist, blen); |
655 |
return scm_merge_list_x (alist, blist, |
return scm_merge_list_x (alist, blist, |
656 |
alen, blen, |
alen, blen, |
657 |
scm_cmp_function (less), |
scm_cmp_function (less), |
721 |
if (SCM_NULL_OR_NIL_P (items)) |
if (SCM_NULL_OR_NIL_P (items)) |
722 |
return items; |
return items; |
723 |
|
|
724 |
SCM_VALIDATE_NIM (2,less); |
SCM_VALIDATE_NIM (2, less); |
725 |
|
|
726 |
if (SCM_CONSP (items)) |
if (SCM_CONSP (items)) |
727 |
{ |
{ |
728 |
SCM_VALIDATE_LIST_COPYLEN (1,items,len); |
SCM_VALIDATE_LIST_COPYLEN (1, items, len); |
729 |
return scm_merge_list_step (&items, scm_cmp_function (less), less, len); |
return scm_merge_list_step (&items, scm_cmp_function (less), less, len); |
730 |
} |
} |
731 |
else if (SCM_VECTORP (items)) |
else if (SCM_VECTORP (items)) |
754 |
if (SCM_NULL_OR_NIL_P (items)) |
if (SCM_NULL_OR_NIL_P (items)) |
755 |
return items; |
return items; |
756 |
|
|
757 |
SCM_VALIDATE_NIM (2,less); |
SCM_VALIDATE_NIM (2, less); |
758 |
if (SCM_CONSP (items)) |
if (SCM_CONSP (items)) |
759 |
{ |
{ |
760 |
long len; |
long len; |
761 |
|
|
762 |
SCM_VALIDATE_LIST_COPYLEN (1,items,len); |
SCM_VALIDATE_LIST_COPYLEN (1, items, len); |
763 |
items = scm_list_copy (items); |
items = scm_list_copy (items); |
764 |
return scm_merge_list_step (&items, scm_cmp_function (less), less, len); |
return scm_merge_list_step (&items, scm_cmp_function (less), less, len); |
765 |
} |
} |
852 |
if (SCM_NULL_OR_NIL_P (items)) |
if (SCM_NULL_OR_NIL_P (items)) |
853 |
return items; |
return items; |
854 |
|
|
855 |
SCM_VALIDATE_NIM (2,less); |
SCM_VALIDATE_NIM (2, less); |
856 |
if (SCM_CONSP (items)) |
if (SCM_CONSP (items)) |
857 |
{ |
{ |
858 |
SCM_VALIDATE_LIST_COPYLEN (1,items,len); |
SCM_VALIDATE_LIST_COPYLEN (1, items, len); |
859 |
return scm_merge_list_step (&items, scm_cmp_function (less), less, len); |
return scm_merge_list_step (&items, scm_cmp_function (less), less, len); |
860 |
} |
} |
861 |
else if (SCM_VECTORP (items)) |
else if (SCM_VECTORP (items)) |
863 |
SCM *temp, *vp; |
SCM *temp, *vp; |
864 |
len = SCM_VECTOR_LENGTH (items); |
len = SCM_VECTOR_LENGTH (items); |
865 |
temp = malloc (len * sizeof(SCM)); |
temp = malloc (len * sizeof(SCM)); |
866 |
vp = SCM_VELTS (items); |
|
867 |
|
|
868 |
|
vp = SCM_WRITABLE_VELTS (items); |
869 |
|
/* |
870 |
|
This routine modifies VP |
871 |
|
*/ |
872 |
|
|
873 |
|
SCM_GC_FLAG_OBJECT_WRITE(items); |
874 |
scm_merge_vector_step (vp, |
scm_merge_vector_step (vp, |
875 |
temp, |
temp, |
876 |
scm_cmp_function (less), |
scm_cmp_function (less), |
898 |
if (SCM_NULL_OR_NIL_P (items)) |
if (SCM_NULL_OR_NIL_P (items)) |
899 |
return items; |
return items; |
900 |
|
|
901 |
SCM_VALIDATE_NIM (2,less); |
SCM_VALIDATE_NIM (2, less); |
902 |
if (SCM_CONSP (items)) |
if (SCM_CONSP (items)) |
903 |
{ |
{ |
904 |
SCM_VALIDATE_LIST_COPYLEN (1,items,len); |
SCM_VALIDATE_LIST_COPYLEN (1, items, len); |
905 |
items = scm_list_copy (items); |
items = scm_list_copy (items); |
906 |
return scm_merge_list_step (&items, scm_cmp_function (less), less, len); |
return scm_merge_list_step (&items, scm_cmp_function (less), less, len); |
907 |
} |
} |
915 |
retvec = scm_make_uve (len, scm_array_prototype (items)); |
retvec = scm_make_uve (len, scm_array_prototype (items)); |
916 |
scm_array_copy_x (items, retvec); |
scm_array_copy_x (items, retvec); |
917 |
temp = malloc (len * sizeof (SCM)); |
temp = malloc (len * sizeof (SCM)); |
918 |
vp = SCM_VELTS (retvec); |
|
919 |
|
/* |
920 |
|
don't worry about write barrier: retvec is new anyway. |
921 |
|
*/ |
922 |
|
vp = SCM_WRITABLE_VELTS (retvec); |
923 |
|
|
924 |
scm_merge_vector_step (vp, |
scm_merge_vector_step (vp, |
925 |
temp, |
temp, |
926 |
scm_cmp_function (less), |
scm_cmp_function (less), |
946 |
#define FUNC_NAME s_scm_sort_list_x |
#define FUNC_NAME s_scm_sort_list_x |
947 |
{ |
{ |
948 |
long len; |
long len; |
949 |
SCM_VALIDATE_LIST_COPYLEN (1,items,len); |
SCM_VALIDATE_LIST_COPYLEN (1, items, len); |
950 |
SCM_VALIDATE_NIM (2,less); |
SCM_VALIDATE_NIM (2, less); |
951 |
return scm_merge_list_step (&items, scm_cmp_function (less), less, len); |
return scm_merge_list_step (&items, scm_cmp_function (less), less, len); |
952 |
} |
} |
953 |
#undef FUNC_NAME |
#undef FUNC_NAME |
960 |
#define FUNC_NAME s_scm_sort_list |
#define FUNC_NAME s_scm_sort_list |
961 |
{ |
{ |
962 |
long len; |
long len; |
963 |
SCM_VALIDATE_LIST_COPYLEN (1,items,len); |
SCM_VALIDATE_LIST_COPYLEN (1, items, len); |
964 |
SCM_VALIDATE_NIM (2,less); |
SCM_VALIDATE_NIM (2, less); |
965 |
items = scm_list_copy (items); |
items = scm_list_copy (items); |
966 |
return scm_merge_list_step (&items, scm_cmp_function (less), less, len); |
return scm_merge_list_step (&items, scm_cmp_function (less), less, len); |
967 |
} |
} |