Commit 2d629511 authored by WindYu's avatar WindYu Committed by Tomasz Zawadzki
Browse files

json: add the spdk_json_write_uint128 function



Add the paired spdk_json_write_named_uint128 function

Change-Id: I222f0c5076efe150ab2861c0d915d18476815e37
Signed-off-by: default avatarGangCao <gang.cao@intel.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/8797


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-by: default avatarTomasz Zawadzki <tomasz.zawadzki@intel.com>
Community-CI: Mellanox Build Bot
parent 585e808e
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -2,6 +2,11 @@

## v21.07: (Upcoming Release)

### json

Added API `spdk_json_write_named_uint128` and `spdk_json_write_uint128` to perform
the uint128 related data.

### accel_fw

Added API `spdk_accel_submit_copy_crc32c` to perform a CRC32C while copying data.
+3 −0
Original line number Diff line number Diff line
@@ -208,6 +208,7 @@ int spdk_json_write_int32(struct spdk_json_write_ctx *w, int32_t val);
int spdk_json_write_uint32(struct spdk_json_write_ctx *w, uint32_t val);
int spdk_json_write_int64(struct spdk_json_write_ctx *w, int64_t val);
int spdk_json_write_uint64(struct spdk_json_write_ctx *w, uint64_t val);
int spdk_json_write_uint128(struct spdk_json_write_ctx *w, uint64_t low_val, uint64_t high_val);
int spdk_json_write_string(struct spdk_json_write_ctx *w, const char *val);
int spdk_json_write_string_raw(struct spdk_json_write_ctx *w, const char *val, size_t len);

@@ -257,6 +258,8 @@ int spdk_json_write_named_bool(struct spdk_json_write_ctx *w, const char *name,
int spdk_json_write_named_int32(struct spdk_json_write_ctx *w, const char *name, int32_t val);
int spdk_json_write_named_uint32(struct spdk_json_write_ctx *w, const char *name, uint32_t val);
int spdk_json_write_named_uint64(struct spdk_json_write_ctx *w, const char *name, uint64_t val);
int spdk_json_write_named_uint128(struct spdk_json_write_ctx *w, const char *name,
				  uint64_t low_val, uint64_t high_val);
int spdk_json_write_named_int64(struct spdk_json_write_ctx *w, const char *name, int64_t val);
int spdk_json_write_named_string(struct spdk_json_write_ctx *w, const char *name, const char *val);
int spdk_json_write_named_string_fmt(struct spdk_json_write_ctx *w, const char *name,
+1 −1
Original line number Diff line number Diff line
@@ -35,7 +35,7 @@ SPDK_ROOT_DIR := $(abspath $(CURDIR)/../..)
include $(SPDK_ROOT_DIR)/mk/spdk.common.mk

SO_VER := 3
SO_MINOR := 0
SO_MINOR := 1

C_SRCS = json_parse.c json_util.c json_write.c
LIBNAME = json
+48 −0
Original line number Diff line number Diff line
@@ -265,6 +265,54 @@ spdk_json_write_uint64(struct spdk_json_write_ctx *w, uint64_t val)
	return emit(w, buf, count);
}

int
spdk_json_write_uint128(struct spdk_json_write_ctx *w, uint64_t low_val, uint64_t high_val)
{
	char buf[128] = {'\0'};
	uint64_t low = low_val, high = high_val;
	int count = 0;

	if (begin_value(w)) { return fail(w); }

	if (high != 0) {
		char temp_buf[128] = {'\0'};
		uint64_t seg;
		unsigned __int128 total = (unsigned __int128)low +
					  ((unsigned __int128)high << 64);

		while (total) {
			seg = total % 10000000000;
			total = total / 10000000000;
			if (total) {
				count = snprintf(temp_buf, 128, "%010" PRIu64 "%s", seg, buf);
			} else {
				count = snprintf(temp_buf, 128, "%" PRIu64 "%s", seg, buf);
			}

			if (count <= 0 || (size_t)count >= sizeof(temp_buf)) {
				return fail(w);
			}

			snprintf(buf, 128, "%s", temp_buf);
		}
	} else {
		count = snprintf(buf, sizeof(buf), "%" PRIu64, low);

		if (count <= 0 || (size_t)count >= sizeof(buf)) { return fail(w); }
	}

	return emit(w, buf, count);
}

int
spdk_json_write_named_uint128(struct spdk_json_write_ctx *w, const char *name,
			      uint64_t low_val, uint64_t high_val)
{
	int rc = spdk_json_write_name(w, name);

	return rc ? rc : spdk_json_write_uint128(w, low_val, high_val);
}

static void
write_hex_4(void *dest, uint16_t val)
{
+2 −0
Original line number Diff line number Diff line
@@ -32,6 +32,7 @@
	spdk_json_write_uint32;
	spdk_json_write_int64;
	spdk_json_write_uint64;
	spdk_json_write_uint128;
	spdk_json_write_string;
	spdk_json_write_string_raw;
	spdk_json_write_string_utf16le;
@@ -53,6 +54,7 @@
	spdk_json_write_named_uint32;
	spdk_json_write_named_uint64;
	spdk_json_write_named_int64;
	spdk_json_write_named_uint128;
	spdk_json_write_named_string;
	spdk_json_write_named_string_fmt;
	spdk_json_write_named_string_fmt_v;
Loading