/* * call-seq: * top_doc.to_s(field = :id) -> string * * Returns a string representation of the top_doc in readable format. */ static VALUE frb_td_to_s(int argc, VALUE *argv, VALUE self) { int i; VALUE rhits = rb_funcall(self, id_hits, 0); Searcher *sea = (Searcher *)DATA_PTR(rb_funcall(self, id_searcher, 0)); const int len = RARRAY_LEN(rhits); int capa = len * 64 + 100; int p = 0; char *str = ALLOC_N(char, len * 64 + 100); Symbol field = fsym_id; VALUE rstr; if (argc) { field = frb_field(argv[0]); } sprintf(str, "TopDocs: total_hits = %ld, max_score = %lf [\n", FIX2LONG(rb_funcall(self, id_total_hits, 0)), NUM2DBL(rb_funcall(self, id_max_score, 0))); p = (int)strlen(str); for (i = 0; i < len; i++) { VALUE rhit = RARRAY_PTR(rhits)[i]; int doc_id = FIX2INT(rb_funcall(rhit, id_doc, 0)); char *value = ""; size_t value_len = 0; LazyDoc *lzd = sea->get_lazy_doc(sea, doc_id); LazyDocField *lzdf = lazy_doc_get(lzd, field); if (NULL != lzdf) { value = lazy_df_get_data(lzdf, 0); value_len = strlen(value); } if (p + value_len + 64 > capa) { capa += (value_len + 64) * (len - i); REALLOC_N(str, char, capa); } sprintf(str + p, "\t%d \"%s\": %0.5f\n", doc_id, value, NUM2DBL(rb_funcall(rhit, id_score, 0))); p += strlen(str + p); lazy_doc_close(lzd); } sprintf(str + p, "]\n"); rstr = rb_str_new2(str); free(str); return rstr; }