Beispiel #1
0
/*
 * Compares the given strings.  Returns a positive number if
 * the first precedes the second, a negative number if the second is
 * the preceding one, and zero if they are equal.  This function calls
 * the underlying collate functions, which done the actual comparison.
 */
int
key_coll(struct keys_array *ps1, struct keys_array *ps2, size_t offset)
{
	struct key_value *kv1, *kv2;
	struct sort_mods *sm;
	int res = 0;

	for (size_t i = 0; i < keys_num; ++i) {
		kv1 = get_key_from_keys_array(ps1, i);
		kv2 = get_key_from_keys_array(ps2, i);
		sm = &(keys[i].sm);

		if (sm->rflag)
			res = sm->func(kv2, kv1, offset);
		else
			res = sm->func(kv1, kv2, offset);

		if (res)
			break;

		/* offset applies to only the first key */
		offset = 0;
	}
	return (res);
}
Beispiel #2
0
static inline int
get_wc_index(struct sort_list_item *sli, size_t level)
{
	const struct key_value *kv;
	const struct bwstring *bws;

	kv = get_key_from_keys_array(&sli->ka, 0);
	bws = kv->k;

	if ((BWSLEN(bws) > level))
		return (unsigned char) BWS_GET(bws,level);
	return (-1);
}
Beispiel #3
0
/*
 * Set value of a key in the keys set
 */
void
set_key_on_keys_array(struct keys_array *ka, struct bwstring *s, size_t ind)
{

	if (ka && keys_num > ind) {
		struct key_value *kv;

		kv = get_key_from_keys_array(ka, ind);

		if (kv->k && kv->k != s)
			bwsfree(kv->k);
		kv->k = s;
	}
}
Beispiel #4
0
/*
 * Clean data of keys array
 */
void
clean_keys_array(const struct bwstring *s, struct keys_array *ka)
{

	if (ka) {
		for (size_t i = 0; i < keys_num; ++i) {
			const struct key_value *kv;

			kv = get_key_from_keys_array(ka, i);
			if (kv->k && kv->k != s)
				bwsfree(kv->k);
		}
		memset(ka, 0, keys_array_size());
	}
}
Beispiel #5
0
size_t
sort_list_item_size(struct sort_list_item *si)
{
	size_t ret = 0;

	if (si) {
		ret = sizeof(struct sort_list_item) + keys_array_size();
		if (si->str)
			ret += bws_memsize(si->str);
		for (size_t i = 0; i < keys_num; ++i) {
			const struct key_value *kv;

			kv = get_key_from_keys_array(&si->ka, i);

			if (kv->k != si->str)
				ret += bws_memsize(kv->k);
		}
	}
	return (ret);
}