static int pdf_name_tree_insert(fz_context *ctx, pdf_document *doc, pdf_obj *tree, pdf_obj *key, pdf_obj *val) { find_data data; pdf_obj *names, *limits, *limit0, *limit1; data.key = key; data.found = NULL; data.found_index = 0; data.last = NULL; data.last_index = 0; data.entry = 0; pdf_name_tree_map(ctx, tree, find_position, &data); if (!data.found) { data.found = data.last; data.found_index = data.last_index; } if (!data.found) { /* Completely empty name tree! */ pdf_dict_put_drop(ctx, tree, PDF_NAME_Names, pdf_new_array(ctx, doc, 2)); pdf_dict_put_drop(ctx, tree, PDF_NAME_Limits, pdf_new_array(ctx, doc, 2)); data.found = tree; data.found_index = 0; } names = pdf_dict_get(ctx, data.found, PDF_NAME_Names); if (names == NULL) pdf_dict_put_drop(ctx, data.found, PDF_NAME_Names, (names = pdf_new_array(ctx, doc, 2))); pdf_array_insert(ctx, names, key, 2*data.found_index); pdf_array_insert(ctx, names, val, 2*data.found_index+1); limits = pdf_dict_get(ctx, data.found, PDF_NAME_Limits); if (limits == NULL) pdf_dict_put_drop(ctx, data.found, PDF_NAME_Limits, (limits = pdf_new_array(ctx, doc, 2))); limit0 = pdf_array_get(ctx, limits, 0); limit1 = pdf_array_get(ctx, limits, 1); if (!pdf_is_string(ctx, limit0) || data.found_index == 0) pdf_array_put(ctx, limits, 0, key); if (!pdf_is_string(ctx, limit1) || 2 * (data.found_index+1) == pdf_array_len(ctx, limits)) pdf_array_put(ctx, limits, 1, key); return data.entry; }
void pdf_array_put_drop(fz_context *ctx, pdf_obj *obj, int i, pdf_obj *item) { fz_try(ctx) pdf_array_put(ctx, obj, i, item); fz_always(ctx) pdf_drop_obj(ctx, item); fz_catch(ctx) fz_rethrow(ctx); }
void pdf_array_put_drop(fz_context *ctx, pdf_obj *obj, int i, pdf_obj *item) { pdf_array_put(ctx, obj, i, item); pdf_drop_obj(ctx, item); }