static int read_rite_section_lineno(mrb_state *mrb, const uint8_t *bin, size_t sirep) { int result; size_t i; uint32_t len; uint16_t nirep; uint16_t n; const struct rite_section_lineno_header *header; len = 0; header = (const struct rite_section_lineno_header*)bin; bin += sizeof(struct rite_section_lineno_header); nirep = bin_to_uint16(header->nirep); //Read Binary Data Section for (n = 0, i = sirep; n < nirep; n++, i++) { result = read_rite_lineno_record(mrb, bin, i, &len); if (result != MRB_DUMP_OK) goto error_exit; bin += len; } result = sirep + bin_to_uint16(header->sirep); error_exit: return result; }
static int32_t read_rite_section_lineno_file(mrb_state *mrb, FILE *fp, size_t sirep) { int32_t result; size_t i; uint16_t nirep; uint16_t n; uint32_t len, buf_size; uint8_t *buf = NULL; const size_t record_header_size = 4; struct rite_section_lineno_header header; if (fread(&header, sizeof(struct rite_section_lineno_header), 1, fp) == 0) { return MRB_DUMP_READ_FAULT; } nirep = bin_to_uint16(header.nirep); buf_size = record_header_size; buf = (uint8_t *)mrb_malloc(mrb, buf_size); //Read Binary Data Section for (n = 0, i = sirep; n < nirep; n++, i++) { if (fread(buf, record_header_size, 1, fp) == 0) { result = MRB_DUMP_READ_FAULT; goto error_exit; } buf_size = bin_to_uint32(&buf[0]); buf = (uint8_t *)mrb_realloc(mrb, buf, buf_size); if (fread(&buf[record_header_size], buf_size - record_header_size, 1, fp) == 0) { result = MRB_DUMP_READ_FAULT; goto error_exit; } result = read_rite_lineno_record(mrb, buf, i, &len); if (result != MRB_DUMP_OK) goto error_exit; } result = sirep + bin_to_uint16(header.sirep); error_exit: mrb_free(mrb, buf); if (result < MRB_DUMP_OK) { irep_free(sirep, mrb); } return result; }
static int32_t read_rite_section_lineno_file(mrb_state *mrb, FILE *fp, size_t sirep) { int32_t result; size_t i; uint16_t nirep; uint16_t n; uint32_t len, buf_size; uint8_t *buf = NULL; const size_t record_header_size = 4; struct rite_section_lineno_header header; if (fread(&header, sizeof(struct rite_section_lineno_header), 1, fp) == 0) { return MRB_DUMP_READ_FAULT; } nirep = bin_to_uint16(header.nirep); buf_size = record_header_size; /* We don't need to check buf_size. As it is enough small. */ buf = (uint8_t *)mrb_malloc(mrb, buf_size); if (!buf) { result = MRB_DUMP_GENERAL_FAILURE; goto error_exit; } //Read Binary Data Section for (n = 0, i = sirep; n < nirep; n++, i++) { void *ptr; if (fread(buf, record_header_size, 1, fp) == 0) { result = MRB_DUMP_READ_FAULT; goto error_exit; } buf_size = bin_to_uint32(&buf[0]); if (SIZE_ERROR(buf_size)) { result = MRB_DUMP_GENERAL_FAILURE; goto error_exit; } ptr = mrb_realloc(mrb, buf, buf_size); if (!ptr) { result = MRB_DUMP_GENERAL_FAILURE; goto error_exit; } buf = (uint8_t *)ptr; if (fread(&buf[record_header_size], buf_size - record_header_size, 1, fp) == 0) { result = MRB_DUMP_READ_FAULT; goto error_exit; } result = read_rite_lineno_record(mrb, buf, i, &len); if (result != MRB_DUMP_OK) goto error_exit; } result = sirep + bin_to_uint16(header.sirep); error_exit: if (buf) { mrb_free(mrb, buf); } if (result < MRB_DUMP_OK) { irep_free(sirep, mrb); } return result; }