/* 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; }
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; }
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)); }
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; }