Ejemplo n.º 1
0
/* This callback function catches the data passed by libcurl and sends
   it back as a scheme string */
static size_t
write_callback (void *ptr, size_t size, size_t nmemb, void *userdata)
{
  size_t length1, length2;
  SCM data1, data2;
  struct scm_flag *sf;

  sf = (struct scm_flag *) userdata;
  data1 = sf->scm;
#if SCM_MAJOR_VERSION == 2
  if (sf->flag)
    length1 = scm_c_bytevector_length (data1);
  else
    length1 = scm_c_string_length (data1);
#else
  length1 = scm_c_string_length (data1);
#endif

  length2 = size * nmemb;

  /* printf ("In write_callback\n"); */
#if SCM_MAJOR_VERSION == 2
  if (sf->flag)
    {
      data2 = scm_c_make_bytevector (length1 + length2);
      memcpy (SCM_BYTEVECTOR_CONTENTS (data2),
              SCM_BYTEVECTOR_CONTENTS (data1),
              length1);
      memcpy (SCM_BYTEVECTOR_CONTENTS (data2) + length1,
              ptr,
              length2);
    }
  else
    {
      data2 = scm_c_make_string (length1 + length2, SCM_MAKE_CHAR('\0'));
      for (size_t i = 0; i < length1; i ++)
        {
          scm_c_string_set_x (data2, i, scm_c_string_ref (data1, i));
        }
      for (size_t i = 0; i < length2; i ++)
        {
          scm_c_string_set_x (data2, i + length1,
                              SCM_MAKE_CHAR (((char *)ptr)[i]));
        }
    }
#else
  data2 = scm_c_make_string (length1 + length2, SCM_MAKE_CHAR('\0'));
  memcpy (SCM_STRING_CHARS (data2),
          SCM_STRING_CHARS (data1),
          length1);
  memcpy (SCM_STRING_CHARS (data2) + length1,
          ptr,
          length2);
#endif
  sf->scm = data2;

  return length2;
}
Ejemplo n.º 2
0
SCM make_tensor(SCM scm_type, SCM scm_shape, SCM scm_size, SCM scm_source)
{
  SCM retval;
  struct tf_tensor_t *self = (struct tf_tensor_t *)scm_gc_calloc(sizeof(struct tf_tensor_t), "make-tensor");
  SCM_NEWSMOB(retval, tf_tensor_tag, self);
  int type = scm_to_int(scm_type);
  int num_dims = scm_to_int(scm_length(scm_shape));
  int64_t *dims = scm_gc_malloc_pointerless(sizeof(int64_t) * num_dims, "make-tensor");
  int count = 1;
  for (int i=0; i<num_dims; i++) {
    dims[i] = scm_to_int(scm_car(scm_shape));
    count = count * dims[i];
    scm_shape = scm_cdr(scm_shape);
  };
  if (type == TF_STRING) {
    SCM* pointer = scm_to_pointer(scm_source);
    size_t encoded_size = 0;
    for (int i=0; i<count; i++) {
      encoded_size += TF_StringEncodedSize(scm_c_string_length(*pointer)) + 8;
      pointer++;
    };
    self->tensor = TF_AllocateTensor(type, dims, num_dims, encoded_size);
    int64_t *offsets = TF_TensorData(self->tensor);
    int offset = 0;
    void *result = offsets + count;
    pointer = scm_to_pointer(scm_source);
    encoded_size = encoded_size - count * sizeof(int64_t);
    for (int i=0; i<count; i++) {
      char *str = scm_to_locale_string(*pointer);
      int len = TF_StringEncodedSize(scm_c_string_length(*pointer));
      *offsets++ = offset;
      TF_StringEncode(str, scm_c_string_length(*pointer), result, encoded_size, status());
      free(str);
      if (TF_GetCode(_status) != TF_OK)
        scm_misc_error("make-tensor", TF_Message(_status), SCM_EOL);
      offset += len;
      encoded_size -= len;
      result += len;
      pointer++;
    };
  } else {
    self->tensor = TF_AllocateTensor(type, dims, num_dims, scm_to_int(scm_size));
    memcpy(TF_TensorData(self->tensor), scm_to_pointer(scm_source), scm_to_int(scm_size));
  };
  return retval;
}
Ejemplo n.º 3
0
SCM scm_tls_send(SCM tls_smob, SCM msg){
  scm_assert_smob_type(tls_tag, tls_smob);
  BIO *bio = (BIO*)SCM_SMOB_DATA(tls_smob);
  size_t msglen = scm_c_string_length(msg);
  char *buf = alloca(msglen+1);
  size_t buflen = scm_to_locale_stringbuf(msg, buf, msglen);
  buf[buflen] = '\0';
  return scm_from_int(BIO_puts(bio, buf));
}
Ejemplo n.º 4
0
SCM tf_set_attr_string(SCM scm_description, SCM scm_name, SCM scm_value)
{
  struct tf_description_t *self = get_tf_description(scm_description);
  char *name = scm_to_locale_string(scm_name);
  char *value = scm_to_locale_string(scm_value);
  TF_SetAttrString(self->description, name, value, scm_c_string_length(scm_value));
  free(value);
  free(name);
  return SCM_UNDEFINED;
}