Sha256: 87a0167405599681a3d4250207e8822f8101f5f9eba9f92b4a4cf1ce994e8113

Contents?: true

Size: 1.29 KB

Versions: 3

Compression:

Stored size: 1.29 KB

Contents

#include <string.h>

#include "zip.h"
#include "zipint.h"
#include "zipruby_zip_source_proc.h"
#include "ruby.h"

static ssize_t read_proc(void *state, void *data, size_t len, enum zip_source_cmd cmd) {
  struct read_proc *z;
  VALUE src;
  char *buf;
  size_t n;

  z = (struct read_proc *) state;
  buf = (char *) data;

  switch (cmd) {
  case ZIP_SOURCE_OPEN:
    return 0;

  case ZIP_SOURCE_READ:
    src = rb_funcall(z->proc, rb_intern("call"), 1, ULONG2NUM(len));

    if (NIL_P(src)) {
      return 0;
    }

    src = rb_check_convert_type(src, T_STRING, "String", "to_s");
    n = RSTRING(src)->len;

    if (n > 0) {
      n = (n > len) ? len : n;
      memcpy(buf, StringValuePtr(src), n);
    }

    return n;

  case ZIP_SOURCE_CLOSE:
    return 0;

  case ZIP_SOURCE_STAT:
    {
      struct zip_stat *st = (struct zip_stat *)data;
      zip_stat_init(st);
      st->mtime = NUM2LONG(rb_funcall(z->mtime, rb_intern("tv_sec"), 0));
      return sizeof(*st);
    }

  case ZIP_SOURCE_ERROR:
    return 0;

  case ZIP_SOURCE_FREE:
    free(z);
    return 0;
  }

  return -1;
}

struct zip_source *zip_source_proc(struct zip *za, struct read_proc *z) {
  struct zip_source *zs;
  zs = zip_source_function(za, read_proc, z);
  return zs;
}

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
zipruby-0.2.4 ext/zipruby_zip_source_proc.c
zipruby-0.2.5 ext/zipruby_zip_source_proc.c
zipruby-0.2.6 ext/zipruby_zip_source_proc.c