/* * BOOL */ int pmix_bfrop_pack_bool(pmix_buffer_t *buffer, const void *src, int32_t num_vals, pmix_data_type_t type) { uint8_t *dst; int32_t i; bool *s = (bool*)src; pmix_output_verbose(20, pmix_globals.debug_output, "pmix_bfrop_pack_bool * %d\n", num_vals); /* check to see if buffer needs extending */ if (NULL == (dst = (uint8_t*)pmix_bfrop_buffer_extend(buffer, num_vals))) { return PMIX_ERR_OUT_OF_RESOURCE; } /* store the data */ for (i=0; i < num_vals; i++) { if (s[i]) { dst[i] = 1; } else { dst[i] = 0; } } /* update buffer pointers */ buffer->pack_ptr += num_vals; buffer->bytes_used += num_vals; return PMIX_SUCCESS; }
/* * INT64 */ int pmix_bfrop_pack_int64(pmix_buffer_t *buffer, const void *src, int32_t num_vals, pmix_data_type_t type) { int32_t i; uint64_t tmp, tmp2; char *dst; size_t bytes_packed = num_vals * sizeof(tmp); pmix_output_verbose(20, pmix_globals.debug_output, "pmix_bfrop_pack_int64 * %d\n", num_vals); /* check to see if buffer needs extending */ if (NULL == (dst = pmix_bfrop_buffer_extend(buffer, bytes_packed))) { return PMIX_ERR_OUT_OF_RESOURCE; } for (i = 0; i < num_vals; ++i) { memcpy(&tmp2, (char *)src+i*sizeof(uint64_t), sizeof(uint64_t)); tmp = pmix_hton64(tmp2); memcpy(dst, &tmp, sizeof(tmp)); dst += sizeof(tmp); } buffer->pack_ptr += bytes_packed; buffer->bytes_used += bytes_packed; return PMIX_SUCCESS; }
pmix_status_t pmix_bfrop_store_data_type(pmix_buffer_t *buffer, pmix_data_type_t type) { uint16_t tmp; char *dst; /* check to see if buffer needs extending */ if (NULL == (dst = pmix_bfrop_buffer_extend(buffer, sizeof(tmp)))) { return PMIX_ERR_OUT_OF_RESOURCE; } tmp = pmix_htons(type); memcpy(dst, &tmp, sizeof(tmp)); buffer->pack_ptr += sizeof(tmp); buffer->bytes_used += sizeof(tmp); return PMIX_SUCCESS; }
/* * BYTE, CHAR, INT8 */ int pmix_bfrop_pack_byte(pmix_buffer_t *buffer, const void *src, int32_t num_vals, pmix_data_type_t type) { char *dst; pmix_output_verbose(20, pmix_globals.debug_output, "pmix_bfrop_pack_byte * %d\n", num_vals); /* check to see if buffer needs extending */ if (NULL == (dst = pmix_bfrop_buffer_extend(buffer, num_vals))) { return PMIX_ERR_OUT_OF_RESOURCE; } /* store the data */ memcpy(dst, src, num_vals); /* update buffer pointers */ buffer->pack_ptr += num_vals; buffer->bytes_used += num_vals; return PMIX_SUCCESS; }
/* * INT32 */ int pmix_bfrop_pack_int32(pmix_buffer_t *buffer, const void *src, int32_t num_vals, pmix_data_type_t type) { int32_t i; uint32_t tmp, *srctmp = (uint32_t*) src; char *dst; pmix_output_verbose(20, pmix_globals.debug_output, "pmix_bfrop_pack_int32 * %d\n", num_vals); /* check to see if buffer needs extending */ if (NULL == (dst = pmix_bfrop_buffer_extend(buffer, num_vals*sizeof(tmp)))) { return PMIX_ERR_OUT_OF_RESOURCE; } for (i = 0; i < num_vals; ++i) { tmp = htonl(srctmp[i]); memcpy(dst, &tmp, sizeof(tmp)); dst += sizeof(tmp); } buffer->pack_ptr += num_vals * sizeof(tmp); buffer->bytes_used += num_vals * sizeof(tmp); return PMIX_SUCCESS; }
int pmix_bfrop_copy_payload(pmix_buffer_t *dest, pmix_buffer_t *src) { size_t to_copy = 0; char *ptr; /* deal with buffer type */ if( NULL == dest->base_ptr ){ /* destination buffer is empty - derive src buffer type */ dest->type = src->type; } else if( dest->type != src->type ){ /* buffer types mismatch */ PMIX_ERROR_LOG(PMIX_ERR_BAD_PARAM); return PMIX_ERR_BAD_PARAM; } to_copy = src->pack_ptr - src->unpack_ptr; if( NULL == (ptr = pmix_bfrop_buffer_extend(dest, to_copy)) ){ PMIX_ERROR_LOG(PMIX_ERR_OUT_OF_RESOURCE); return PMIX_ERR_OUT_OF_RESOURCE; } memcpy(ptr,src->unpack_ptr, to_copy); dest->bytes_used += to_copy; dest->pack_ptr += to_copy; return PMIX_SUCCESS; }