#include #include #include #include #include "rc.h" #include "field_type.h" #include "buffers.h" #include "ui_interface.h" int field_dissect_from_buffer(struct types_s *type, buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent) { int length = 0; char cbuf[50]; char *cpy = NULL; struct types_s *type_child; char array_info[50]; int indent_child; DISPLAY_PARSE_INFO("field", type->name, offset, parent_offset); CHECK_FCT(buffer_has_enouch_data(buffer, parent_offset + offset, type->size / 8)); if (type->bits == -1) { if (type->child != NULL) { /* Ignore TYPEDEF children */ for (type_child = type->child; type_child != NULL && type_child->type == TYPE_TYPEDEF; type_child = type_child->child) { } if (type_child->type == TYPE_ARRAY) { struct types_s *type_array_child; /* Ignore TYPEDEF children */ for (type_array_child = type_child->child; type_array_child != NULL && type_array_child->type == TYPE_TYPEDEF; type_array_child = type_array_child->child) { } sprintf (array_info, "[%d]", type_child->size / type_array_child->size); } else { array_info[0] = '\0'; } DISPLAY_TYPE("Fld"); INDENTED_STRING(cbuf, indent, sprintf(cbuf, ".%s%s = ", type->name ? type->name : "Field", array_info)); length = strlen (cbuf); cpy = malloc (sizeof(char) * length); memcpy (cpy, cbuf, length); ui_interface.ui_signal_set_text (cpy, length); if (cpy) free (cpy); indent_child = indent; if (type_child->type == TYPE_ARRAY || type_child->type == TYPE_STRUCT || type_child->type == TYPE_UNION) { DISPLAY_BRACE(ui_interface.ui_signal_set_text ("{", 1);) ui_interface.ui_signal_set_text ("\n", 1); indent_child += 4; } if (type_child->type == TYPE_FUNDAMENTAL || type_child->type == TYPE_POINTER) { indent_child = 0; } CHECK_FCT( type->child->type_dissect_from_buffer( type->child, buffer, parent_offset, offset + type->offset, indent_child)); DISPLAY_BRACE( if (type_child->type == TYPE_ARRAY || type_child->type == TYPE_STRUCT || type_child->type == TYPE_UNION) { DISPLAY_TYPE("Fld"); INDENTED_STRING(cbuf, indent, sprintf(cbuf, "};\n")); length = strlen (cbuf); cpy = malloc (sizeof(char) * length); memcpy (cpy, cbuf, length); ui_interface.ui_signal_set_text (cpy, length); if (cpy) free (cpy); }); } } else { /* The field is only composed of bits */ uint32_t value = 0; CHECK_FCT(buffer_fetch_bits(buffer, offset + type->offset + parent_offset, type->bits, &value)); DISPLAY_TYPE("Fld"); INDENTED_STRING( cbuf, indent, sprintf(cbuf, ".%s:%d = (0x%0*x) %d;\n", type->name ? type->name : "Field", type->bits, (type->bits + 3) / 4, value, value)); length = strlen (cbuf); cpy = malloc (sizeof(char) * length); memcpy (cpy, cbuf, length); ui_interface.ui_signal_set_text (cpy, length); if (cpy) free (cpy); } return 0; } int field_type_file_print(struct types_s *type, int indent, FILE *file) { if (type == NULL) return -1; INDENTED(file, indent, fprintf(file, "\n")); INDENTED(file, indent+4, fprintf(file, "Id .........: %d\n", type->id)); INDENTED(file, indent+4, fprintf(file, "Name .......: %s\n", type->name)); INDENTED(file, indent+4, fprintf(file, "Bits .......: %d\n", type->bits)); INDENTED(file, indent+4, fprintf(file, "Type .......: %d\n", type->type_xml)); INDENTED(file, indent+4, fprintf(file, "Offset .....: %d\n", type->offset)); INDENTED(file, indent+4, fprintf(file, "Context ....: %d\n", type->context)); INDENTED(file, indent+4, fprintf(file, "File .......: %s\n", type->file)); INDENTED(file, indent+4, fprintf(file, "Line .......: %d\n", type->line)); if (type->file_ref != NULL) type->file_ref->type_file_print (type->file_ref, indent + 4, file); if (type->child != NULL) type->child->type_file_print (type->child, indent + 4, file); INDENTED(file, indent, fprintf(file, "\n")); return 0; } int field_type_hr_display(struct types_s *type, int indent) { if (type == NULL) return -1; INDENTED(stdout, indent, printf("\n")); INDENTED(stdout, indent+4, printf("Id .........: %d\n", type->id)); INDENTED(stdout, indent+4, printf("Name .......: %s\n", type->name)); INDENTED(stdout, indent+4, printf("Bits .......: %d\n", type->bits)); INDENTED(stdout, indent+4, printf("Type .......: %d\n", type->type_xml)); INDENTED(stdout, indent+4, printf("Offset .....: %d\n", type->offset)); INDENTED(stdout, indent+4, printf("Context ....: %d\n", type->context)); INDENTED(stdout, indent+4, printf("File .......: %s\n", type->file)); INDENTED(stdout, indent+4, printf("Line .......: %d\n", type->line)); if (type->file_ref != NULL) type->file_ref->type_hr_display (type->file_ref, indent + 4); if (type->child != NULL) type->child->type_hr_display (type->child, indent + 4); INDENTED(stdout, indent, printf("\n")); return 0; }