null+****@clear*****
null+****@clear*****
2010年 7月 22日 (木) 12:07:11 JST
Kouhei Sutou 2010-07-22 03:07:11 +0000 (Thu, 22 Jul 2010) New Revision: fec100cf6f063ee1a43b176adaff8d2471f99a45 Log: inspect pat nodes. Modified files: lib/pat.c lib/pat.h lib/util.c Modified: lib/pat.c (+48 -0) =================================================================== --- lib/pat.c 2010-07-21 09:45:42 +0000 (86c10fd) +++ lib/pat.c 2010-07-22 03:07:11 +0000 (fddf52e) @@ -19,6 +19,7 @@ #include <limits.h> #include "pat.h" #include "output.h" +#include "util.h" #define GRN_PAT_DELETED (GRN_ID_MAX + 1) @@ -2186,3 +2187,50 @@ grn_pat_check(grn_ctx *ctx, grn_pat *pat) GRN_OUTPUT_INT64(h->n_garbages); GRN_OUTPUT_ARRAY_CLOSE(); } + +static void +grn_pat_inspect_node(grn_ctx *ctx, grn_pat *pat, grn_id id, int check, + grn_obj *key_buf, grn_obj *buf) +{ + pat_node *node = NULL; + int key_size; + + grn_text_lltoa(ctx, buf, id); + PAT_AT(pat, id, node); + key_size = PAT_LEN(node); + if (key_size > 1) { + GRN_BULK_REWIND(key_buf); + grn_bulk_space(ctx, key_buf, key_size); + grn_pat_get_key(ctx, pat, id, GRN_BULK_HEAD(key_buf), key_size); + GRN_TEXT_PUTS(ctx, buf, "("); + grn_inspect(ctx, buf, key_buf); + GRN_TEXT_PUTS(ctx, buf, ")"); + } + GRN_TEXT_PUTS(ctx, buf, "["); + if (PAT_CHK(node) > check) { + int i; + for (i = 0; i < 2; i++) { + if (node->lr[i]) { + grn_pat_inspect_node(ctx, pat, node->lr[i], PAT_CHK(node), key_buf, buf); + } else { + GRN_TEXT_PUTS(ctx, buf, "nil"); + } + if (i == 0) { + GRN_TEXT_PUTS(ctx, buf, ", "); + } + } + } + GRN_TEXT_PUTS(ctx, buf, "]"); +} + +void +grn_pat_inspect_nodes(grn_ctx *ctx, grn_pat *pat, grn_obj *buf) +{ + pat_node *node; + grn_obj key_buf; + + GRN_OBJ_INIT(&key_buf, GRN_BULK, 0, pat->obj.header.domain); + PAT_AT(pat, GRN_ID_NIL, node); + grn_pat_inspect_node(ctx, pat, node->lr[1], -1, &key_buf, buf); + GRN_OBJ_FIN(ctx, &key_buf); +} Modified: lib/pat.h (+1 -0) =================================================================== --- lib/pat.h 2010-07-21 09:45:42 +0000 (3390755) +++ lib/pat.h 2010-07-22 03:07:11 +0000 (b98507b) @@ -96,6 +96,7 @@ grn_id grn_pat_next(grn_ctx *ctx, grn_pat *pat, grn_id id); const char *grn_pat_get_value_(grn_ctx *ctx, grn_pat *pat, grn_id id, uint32_t *size); grn_id grn_pat_at(grn_ctx *ctx, grn_pat *pat, grn_id id); void grn_pat_check(grn_ctx *ctx, grn_pat *pat); +void grn_pat_inspect_nodes(grn_ctx *ctx, grn_pat *pat, grn_obj *buf); #ifdef __cplusplus } Modified: lib/util.c (+6 -0) =================================================================== --- lib/util.c 2010-07-21 09:45:42 +0000 (70ecd70) +++ lib/util.c 2010-07-22 03:07:11 +0000 (5c35f17) @@ -18,6 +18,7 @@ #include <string.h> #include <stdio.h> #include "db.h" +#include "pat.h" #include "util.h" grn_rc @@ -377,6 +378,11 @@ grn_table_inspect(grn_ctx *ctx, grn_obj *buf, grn_obj *obj) GRN_TEXT_PUTS(ctx, buf, "]"); } + if (obj->header.type == GRN_TABLE_PAT_KEY) { + GRN_TEXT_PUTS(ctx, buf, " nodes:"); + grn_pat_inspect_nodes(ctx, obj, buf); + } + GRN_TEXT_PUTS(ctx, buf, ">"); return GRN_SUCCESS;