/* If the user explicitly asks for traversal of a hidden record field, * this function will be called with traverse_hidden set to 1. */ static void traverse_record(int index, int traverse_hidden) { int hidden; traverse_info.parent_index[traverse_info.num_records - 1] = index; if (coda_type_get_record_field_hidden_status(traverse_info.type[traverse_info.current_depth - 1], index, &hidden) != 0) { handle_coda_error(); } if (hidden && !traverse_hidden) { /* skip this field */ return; } if (calc_dim) { int available; /* we do not traverse records that are globally not available * (i.e. not available for every element of our parent array(s)) */ if (coda_type_get_record_field_available_status(traverse_info.type[traverse_info.current_depth - 1], index, &available) != 0) { handle_coda_error(); } if (available == -1) { /* traverse all occurences of this field to check whether at least one is available */ if (!dim_record_field_available()) { return; } } traverse_info.field_available_status[traverse_info.current_depth - 1] = available; } if (coda_type_get_record_field_name(traverse_info.type[traverse_info.current_depth - 1], index, &traverse_info.field_name[traverse_info.num_records - 1]) != 0) { handle_coda_error(); } if (coda_type_get_record_field_type(traverse_info.type[traverse_info.current_depth - 1], index, &traverse_info.type[traverse_info.current_depth]) != 0) { handle_coda_error(); } traverse_data(); }
static void print_data(coda_cursor *cursor, int depth) { coda_type_class type_class; int has_attributes; if (coda_cursor_has_attributes(cursor, &has_attributes) != 0) { handle_coda_error(); } if (has_attributes) { if (coda_cursor_goto_attributes(cursor) != 0) { handle_coda_error(); } fi_printf("{attributes}\n"); INDENT++; print_data(cursor, depth); INDENT--; coda_cursor_goto_parent(cursor); } if (coda_cursor_get_type_class(cursor, &type_class) != 0) { handle_coda_error(); } switch (type_class) { case coda_record_class: { long num_fields; if (coda_cursor_get_num_elements(cursor, &num_fields) != 0) { handle_coda_error(); } if (num_fields > 0) { coda_type *record_type; int is_union; long i; if (coda_cursor_get_type(cursor, &record_type) != 0) { handle_coda_error(); } if (coda_type_get_record_union_status(record_type, &is_union) != 0) { handle_coda_error(); } if (is_union) { const char *field_name; if (coda_cursor_get_available_union_field_index(cursor, &i) != 0) { handle_coda_error(); } if (coda_type_get_record_field_name(record_type, i, &field_name) != 0) { handle_coda_error(); } if (coda_cursor_goto_record_field_by_index(cursor, i) != 0) { handle_coda_error(); } fi_printf("[%s]", field_name); if (print_offsets) { int64_t offset; if (coda_cursor_get_file_bit_offset(cursor, &offset) != 0) { handle_coda_error(); } if (offset >= 0) { char s[21]; coda_str64(offset >> 3, s); ff_printf(":%s", s); if ((offset & 0x7) != 0) { ff_printf(":%d", (int)(offset & 0x7)); } } } ff_printf("\n"); INDENT++; if (max_depth < 0 || depth < max_depth) { print_data(cursor, depth + 1); } else { fi_printf("...\n"); } INDENT--; coda_cursor_goto_parent(cursor); } else { if (coda_cursor_goto_first_record_field(cursor) != 0) { handle_coda_error(); } for (i = 0; i < num_fields; i++) { const char *field_name; if (coda_type_get_record_field_name(record_type, i, &field_name) != 0) { handle_coda_error(); } fi_printf("[%s]", field_name); if (print_offsets) { int64_t offset; if (coda_cursor_get_file_bit_offset(cursor, &offset) != 0) { handle_coda_error(); } if (offset >= 0) { char s[21]; coda_str64(offset >> 3, s); ff_printf(":%s", s); if ((offset & 0x7) != 0) { ff_printf(":%d", (int)(offset & 0x7)); } } } ff_printf("\n"); INDENT++; if (max_depth < 0 || depth < max_depth) { print_data(cursor, depth + 1); } else { fi_printf("...\n"); } INDENT--; if (i < num_fields - 1) { if (coda_cursor_goto_next_record_field(cursor) != 0) { handle_coda_error(); } } } coda_cursor_goto_parent(cursor); }