Kouhei Sutou
kou****@cozmi*****
2008年 8月 18日 (月) 15:46:28 JST
須藤です。
sen_table_sort_optarg.comparは比較するテーブルの要素とテーブル自身を
受けとりますが、テーブルの要素のサイズは受けとりません。
SEN_TYPE_FIXED_SIZEのときは要素のサイズは利用者が既知としてもよ
いと思いますが、SEN_TYPE_VARIABLE_SIZEのときは受け取った要素毎
にサイズが異なると思うので、要素のサイズも渡してもらえると嬉しいです。
--- senna.h (revision 1032)
+++ senna.h (working copy)
@@ -668,7 +668,9 @@
struct _sen_table_sort_optarg {
int flags;
- int (*compar)(sen_obj *, void *, sen_obj *, void *, void *);
+ int (*compar)(sen_obj *table1, void *target1, unsigned int target1_size,
+ sen_obj *table2, void *target2, unsigned int target2_size,
+ void *compare_arg);
void *compar_arg;
int offset;
};
Index: lib/hash.c
===================================================================
--- lib/hash.c (revision 1032)
+++ lib/hash.c (working copy)
@@ -941,8 +941,8 @@
#define COMPARE_VAL_(ap,as,bp,bs)\
(arg->compar\
- ? arg->compar((sen_obj *)hash, (void *)(ap),\
- (sen_obj *)hash, (void *)(bp), arg->compar_arg) \
+ ? arg->compar((sen_obj *)hash, (void *)(ap), as,\
+ (sen_obj *)hash, (void *)(bp), bs, arg->compar_arg)\
: ((arg->flags & SEN_TABLE_SORT_AS_NUMBER)\
? ((arg->flags & SEN_TABLE_SORT_AS_UNSIGNED)\
? ((arg->flags & SEN_TABLE_SORT_AS_INT64)\
@@ -1091,8 +1091,9 @@
#define COMPARE_VAL32_(ap,bp) \
(arg->compar\
- ? arg->compar((sen_obj *)hash, (void *)&(ap)->v,\
- (sen_obj *)hash, (void *)&(bp)->v, arg->compar_arg)\
+ ? arg->compar((sen_obj *)hash, (void *)&(ap)->v, sizeof(uint32_t),\
+ (sen_obj *)hash, (void *)&(bp)->v, sizeof(uint32_t),\
+ arg->compar_arg)\
: ((arg->flags & SEN_TABLE_SORT_AS_NUMBER)\
? ((arg->flags & SEN_TABLE_SORT_AS_UNSIGNED)\
? *((uint32_t *)&(ap)->v) > *((uint32_t *)&(bp)->v)\