/***********************************************************************1* *2* This software is part of the ast package *3* Copyright (c) 2003-2011 AT&T Intellectual Property *4* and is licensed under the *5* Eclipse Public License, Version 1.0 *6* by AT&T Intellectual Property *7* *8* A copy of the License is available at *9* http://www.eclipse.org/org/documents/epl-v10.html *10* (with md5 checksum b35adb5213ca9657e911e9befb180842) *11* *12* Information and Software Systems Research *13* AT&T Research *14* Florham Park NJ *15* *16* Phong Vo <[email protected]> *17* *18***********************************************************************/19#include "vchdr.h"2021/* Counting bucket sort.22** Return the number of distinct bytes. The bckt[] argument returns23** the cumulative counts of all bytes. Thus, bckt[0] is the count24** of byte 0, bckt[1] is the cumulative count of 0 and 1, and so on.25**26** Written by Kiem-Phong Vo.27*/2829#if __STD_C30ssize_t vcbcktsort(ssize_t* indx, ssize_t* list, ssize_t n, Vcchar_t* data, ssize_t* bckt)31#else32ssize_t vcbcktsort(indx, list, n, data, bckt)33ssize_t* indx; /* output sorted indxes */34ssize_t* list; /* indices to be sorted */35ssize_t n; /* # of indices */36Vcchar_t* data; /* data used to sort */37ssize_t* bckt; /* [256] buckets */38#endif39{40ssize_t i, p, c;41ssize_t distinct = 0;4243/* count byte frequencies */44memset(bckt, 0, 256*sizeof(ssize_t));45if(list) /* sort using secondary predictor */46{ for(p = 0; p < n; ++p)47bckt[data[list[p]]] += 1;48}49else /* unsorted permutation was the identity */50{ for(p = 0; p < n; ++p)51bckt[data[p]] += 1;52}5354for(p = 0, i = 0; i < 256; ++i) /* starting positions */55{ if((c = bckt[i]) > 0)56distinct += 1;57bckt[i] = p;58p += c;59}6061if(list) /* sorting a sublist of indices */62{ for(p = 0; p < n; ++p)63indx[bckt[data[list[p]]]++] = list[p];64}65else /* sorting all indices */66{ for(p = 0; p < n; ++p)67indx[bckt[data[p]]++] = p;68}6970return distinct;71}727374#if 075/* some intermediate versions of Vcodex used this implementation and became76** incompatible with earlier version of Vctable. So this is saved here in case77** we ever need to deal with data compressed with such versions.78*/79#if __STD_C80ssize_t vcbcktsort(ssize_t* sort, ssize_t* list, ssize_t n, Vcchar_t* data, ssize_t* bckt)81#else82ssize_t vcbcktsort(sort, list, n, data, bckt)83ssize_t* sort; /* to output sorted elements */84ssize_t* list; /* != NULL: list to be sorted */85/* == NULL: sorting 0,1,...n-1 */86ssize_t n; /* # of elements to be sorted */87Vcchar_t* data; /* data identifying elements */88ssize_t* bckt; /* temp space of [256] buckets */89#endif90{91ssize_t p, i, c, minc, maxc;92ssize_t distinct = 0;9394/* count byte frequencies */95memset(bckt, 0, 256*sizeof(ssize_t));96minc = 256; maxc = -1;97for(p = 0; p < n; ++p)98{ c = data[list ? list[p] : p];99minc = c < minc ? c : minc;100maxc = c > maxc ? c : maxc;101bckt[c] += 1;102}103104/* set starting positions for each bucket */105for(p = 0, c = minc; c <= maxc; ++c)106{ if((i = bckt[c]) <= 0)107continue;108distinct += 1; /* count distinct letters */109bckt[c] = p; p += i;110}111112/* now sort them into place */113for(p = 0; p < n; ++p)114{ i = list ? list[p] : p;115sort[bckt[data[i]]++] = i;116}117118return distinct;119}120#endif121122123