static void read_value_internal(const std::shared_ptr<type_t>& type, const symbols_t& symbols, reflectable& reflectable) { // read sub-type values if (VAL* base_type_index = get_base_type_index_opt(*type).get()) { VAL& base_type = get_type(*base_type_index); read_value_internal(base_type, symbols, reflectable); } // read current type values VAL& field_vector = get_field_vector(*type); VAR symbols_iter = std::begin(symbols); VAL symbols_end = std::end(symbols); for (VAL& field_kvp : field_vector) { if (symbols_iter != symbols_end) { VAL& field = field_kvp.second; VAL& field_symbol = *symbols_iter; VAL& field_type_index = get_type_index(*field); VAL& field_type_descriptor = get_type_descriptor(field_type_index); VAL& field_ptr = static_cast<char*>(static_cast<void*>(&reflectable)) + get_value_offset(*field); read_value(*field_type_descriptor, field_symbol, field_ptr); ++symbols_iter; } } }
void write_value(const reflectable& source_reflectable, symbol& target_symbol) { VAL& type = get_type(source_reflectable); VAL& type_index = get_type_index(*type); VAL& type_descriptor = get_type_descriptor(type_index); write_value(*type_descriptor, static_cast<const void*>(&source_reflectable), target_symbol); }
int readelf_main(int argc, char *argv[]) { FILE *fp; if (argc < 2) { printf("Usage: readelf elf_file \n"); return -1; } fp = fopen(argv[1], "rb"); if (fp == NULL) { printf("file <%s> open error\n", argv[1]); return -1; } // verify that fp1 not NULL assert(fp); char buf[HSIZE]; int n; n = fread(buf, HSIZE, 1, fp); printf("n = %d\n", n); printf("HSIZE = %d\n", HSIZE); if (n != 1) { printf("file <%s> read error\n", argv[1]); return -1; } fclose(fp); Elf32_Ehdr * p; p = (Elf32_Ehdr *)buf; printf("type = %d\n", p->e_type); printf("Type: %s\n", s[get_type_index(p->e_type)].string); return 0; }
void write_value_internal(const std::shared_ptr<type_t>& type, const reflectable& reflectable, symbols_t& symbols) { // write sub-type values if (VAL* base_type_index = get_base_type_index_opt(*type).get()) { VAL& base_type = get_type(*base_type_index); write_value_internal(base_type, reflectable, symbols); } // write current type values VAL& field_vector = get_field_vector(*type); for (VAL& field_kvp : field_vector) { symbol field_symbol_mvb{}; VAL& field = field_kvp.second; VAL& field_type_index = get_type_index(*field); VAL& field_type_descriptor = get_type_descriptor(field_type_index); VAL& field_ptr = static_cast<const char*>(static_cast<const void*>(&reflectable)) + get_value_offset(*field); write_value(*field_type_descriptor, field_ptr, field_symbol_mvb); symbols.emplace_back(std::move(field_symbol_mvb)); } }