static int read_lineno_record_file(mrb_state *mrb, FILE *fp, mrb_irep *irep) { uint8_t header[4]; const size_t record_header_size = sizeof(header); int result; size_t i, buf_size; size_t len; void *ptr; uint8_t *buf; if (fread(header, record_header_size, 1, fp) == 0) { return MRB_DUMP_READ_FAULT; } buf_size = (size_t)bin_to_uint32(&header[0]); if (SIZE_ERROR(buf_size)) { return MRB_DUMP_GENERAL_FAILURE; } ptr = mrb_malloc(mrb, buf_size); buf = (uint8_t *)ptr; if (fread(&buf[record_header_size], buf_size - record_header_size, 1, fp) == 0) { return MRB_DUMP_READ_FAULT; } result = read_lineno_record_1(mrb, buf, irep, &len); mrb_free(mrb, ptr); if (result != MRB_DUMP_OK) return result; for (i = 0; i < irep->rlen; i++) { result = read_lineno_record_file(mrb, fp, irep->reps[i]); if (result != MRB_DUMP_OK) break; } return result; }
static int read_lineno_record(mrb_state *mrb, const uint8_t *bin, mrb_irep *irep, size_t *lenp) { int result = read_lineno_record_1(mrb, bin, irep, lenp); int i; if (result != MRB_DUMP_OK) return result; for (i = 0; i < irep->rlen; i++) { size_t len; result = read_lineno_record(mrb, bin, irep->reps[i], &len); if (result != MRB_DUMP_OK) break; bin += len; *lenp += len; } return result; }