/[guile]/guile/guile-core/libguile/sort.c
ViewVC logotype

Diff of /guile/guile-core/libguile/sort.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.41 by ttn, Thu Mar 14 03:47:43 2002 UTC revision 1.42 by xxhanwen, Sat Jul 20 14:08:34 2002 UTC
# Line 425  SCM_DEFINE (scm_restricted_vector_sort_x Line 425  SCM_DEFINE (scm_restricted_vector_sort_x
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  }  }
# Line 455  SCM_DEFINE (scm_sorted_p, "sorted?", 2, Line 457  SCM_DEFINE (scm_sorted_p, "sorted?", 2,
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    
# Line 529  SCM_DEFINE (scm_merge, "merge", 3, 0, 0, Line 531  SCM_DEFINE (scm_merge, "merge", 3, 0, 0,
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;
# Line 537  SCM_DEFINE (scm_merge, "merge", 3, 0, 0, Line 539  SCM_DEFINE (scm_merge, "merge", 3, 0, 0,
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);
# Line 641  SCM_DEFINE (scm_merge_x, "merge!", 3, 0, Line 643  SCM_DEFINE (scm_merge_x, "merge!", 3, 0,
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),
# Line 719  SCM_DEFINE (scm_sort_x, "sort!", 2, 0, 0 Line 721  SCM_DEFINE (scm_sort_x, "sort!", 2, 0, 0
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))
# Line 752  SCM_DEFINE (scm_sort, "sort", 2, 0, 0, Line 754  SCM_DEFINE (scm_sort, "sort", 2, 0, 0,
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      }      }
# Line 850  SCM_DEFINE (scm_stable_sort_x, "stable-s Line 852  SCM_DEFINE (scm_stable_sort_x, "stable-s
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))
# Line 861  SCM_DEFINE (scm_stable_sort_x, "stable-s Line 863  SCM_DEFINE (scm_stable_sort_x, "stable-s
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),
# Line 889  SCM_DEFINE (scm_stable_sort, "stable-sor Line 898  SCM_DEFINE (scm_stable_sort, "stable-sor
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      }      }
# Line 906  SCM_DEFINE (scm_stable_sort, "stable-sor Line 915  SCM_DEFINE (scm_stable_sort, "stable-sor
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),
# Line 932  SCM_DEFINE (scm_sort_list_x, "sort-list! Line 946  SCM_DEFINE (scm_sort_list_x, "sort-list!
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
# Line 946  SCM_DEFINE (scm_sort_list, "sort-list", Line 960  SCM_DEFINE (scm_sort_list, "sort-list",
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  }  }

Legend:
Removed from v.1.41  
changed lines
  Added in v.1.42

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26