Exemplo n.º 1
0
Arquivo: load.c Projeto: Ancurio/mruby
static mrb_irep*
read_irep_record_file(mrb_state *mrb, FILE *fp)
{
  uint8_t header[1 + 4];
  const size_t record_header_size = sizeof(header);
  size_t buf_size, i;
  size_t len;
  mrb_irep *irep = NULL;
  void *ptr;
  uint8_t *buf;

  if (fread(header, record_header_size, 1, fp) == 0) {
    return NULL;
  }
  buf_size = (size_t)bin_to_uint32(&header[0]);
  if (SIZE_ERROR(buf_size)) {
    return NULL;
  }
  ptr = mrb_malloc(mrb, buf_size);
  buf = (uint8_t *)ptr;
  memcpy(buf, header, record_header_size);
  if (fread(&buf[record_header_size], buf_size - record_header_size, 1, fp) == 0) {
    return NULL;
  }
  irep = read_irep_record_1(mrb, buf, &len, TRUE);
  mrb_free(mrb, ptr);
  if (!irep) return NULL;
  for (i=0; i<irep->rlen; i++) {
    irep->reps[i] = read_irep_record_file(mrb, fp);
    if (!irep->reps[i]) return NULL;
  }
  return irep;
}
Exemplo n.º 2
0
Arquivo: load.c Projeto: Ancurio/mruby
static mrb_irep*
read_irep_record(mrb_state *mrb, const uint8_t *bin, size_t *len, mrb_bool alloc)
{
  mrb_irep *irep = read_irep_record_1(mrb, bin, len, alloc);
  size_t i;

  bin += *len;
  for (i=0; i<irep->rlen; i++) {
    size_t rlen;

    irep->reps[i] = read_irep_record(mrb, bin, &rlen, alloc);
    bin += rlen;
    *len += rlen;
  }
  return irep;
}
Exemplo n.º 3
0
static mrb_irep*
read_irep_record(mrb_state *mrb, const uint8_t *bin, size_t *len, uint8_t flags)
{
  mrb_irep *irep = read_irep_record_1(mrb, bin, len, flags);
  int i;

  if (irep == NULL) {
    return NULL;
  }

  bin += *len;
  for (i=0; i<irep->rlen; i++) {
    size_t rlen;

    irep->reps[i] = read_irep_record(mrb, bin, &rlen, flags);
    if (irep->reps[i] == NULL) {
      return NULL;
    }
    bin += rlen;
    *len += rlen;
  }
  return irep;
}