From a52d7f6a6dfe8c55b65eef0996b848873db39fe7 Mon Sep 17 00:00:00 2001 From: Mathieu Desnoyers Date: Sun, 3 Oct 2010 10:58:49 -0400 Subject: [PATCH] String type: complete migration to bitwise position Signed-off-by: Mathieu Desnoyers --- formats/ctf/ctf.c | 3 +++ formats/ctf/types/string.c | 42 ++++++++++++++++++++++++++++++++-- include/babeltrace/ctf/types.h | 5 ++++ include/babeltrace/format.h | 5 ++++ types/string.c | 6 ++++- 5 files changed, 58 insertions(+), 3 deletions(-) diff --git a/formats/ctf/ctf.c b/formats/ctf/ctf.c index 017d0e05..9a0e003a 100644 --- a/formats/ctf/ctf.c +++ b/formats/ctf/ctf.c @@ -38,6 +38,9 @@ static const struct format ctf_format = { .double_write = ctf_double_write, .float_copy = ctf_float_copy, .string_copy = ctf_string_copy, + .string_read = ctf_string_read, + .string_write = ctf_string_write, + .string_free_temp = ctf_string_free_temp, .enum_read = ctf_enum_read, .enum_write = ctf_enum_write, }; diff --git a/formats/ctf/types/string.c b/formats/ctf/types/string.c index 5cd09d95..53a9692f 100644 --- a/formats/ctf/types/string.c +++ b/formats/ctf/types/string.c @@ -33,12 +33,50 @@ void ctf_string_copy(struct stream_pos *dest, struct stream_pos *src, align_pos(src, string_class->p.alignment); srcaddr = get_pos_addr(src); len = strlen(srcaddr) + 1; - if (!dest) + if (dest->dummy) goto end; align_pos(dest, string_class->p.alignment); destaddr = get_pos_addr(dest); - strcpy(dest, src); + strcpy(destaddr, srcaddr); +end: move_pos(dest, len); + move_pos(src, len); +} + +void ctf_string_read(unsigned char **dest, struct stream_pos *src, + const struct type_class_string *string_class) +{ + size_t len; + unsigned char *srcaddr; + + align_pos(src, string_class->p.alignment); + srcaddr = get_pos_addr(src); + len = strlen(srcaddr) + 1; + if (dest->dummy) + goto end; + *dest = g_realloc(*dest, len); + strcpy(dest, srcaddr); end: move_pos(src, len); } + +void ctf_string_write(struct stream_pos *dest, const unsigned char *src, + const struct type_class_string *string_class) +{ + size_t len; + unsigned char *destaddr; + + align_pos(dest, string_class->p.alignment); + len = strlen(src) + 1; + if (dest->dummy) + goto end; + destaddr = get_pos_addr(dest); + strcpy(destaddr, src); +end: + move_pos(dest, len); +} + +void ctf_string_free_temp(unsigned char *string) +{ + g_free(string); +} diff --git a/include/babeltrace/ctf/types.h b/include/babeltrace/ctf/types.h index 473bbff9..40b89847 100644 --- a/include/babeltrace/ctf/types.h +++ b/include/babeltrace/ctf/types.h @@ -72,6 +72,11 @@ void ctf_float_copy(struct stream_pos *destp, const struct type_class_float *des void ctf_string_copy(struct stream_pos *dest, struct stream_pos *src, const struct type_class_string *string_class); +void ctf_string_read(unsigned char **dest, struct stream_pos *src, + const struct type_class_string *string_class); +void ctf_string_write(struct stream_pos *dest, const unsigned char *src, + const struct type_class_string *string_class); +void ctf_string_free_temp(unsigned char *string); GQuark ctf_enum_read(struct stream_pos *pos, const struct type_class_enum *src); diff --git a/include/babeltrace/format.h b/include/babeltrace/format.h index 1a847846..43b38eed 100644 --- a/include/babeltrace/format.h +++ b/include/babeltrace/format.h @@ -63,6 +63,11 @@ struct format { void (*string_copy)(struct stream_pos *dest, struct stream_pos *src, const struct type_class_string *string_class); + void (*string_read)(unsigned char **dest, struct stream_pos *src, + const struct type_class_string *string_class); + void (*string_write)(struct stream_pos *dest, const unsigned char *src, + const struct type_class_string *string_class); + void (*string_free_temp)(unsigned char *string); GQuark (*enum_read)(struct stream_pos *pos, const struct type_class_enum *src); diff --git a/types/string.c b/types/string.c index df9bacac..3f9c1787 100644 --- a/types/string.c +++ b/types/string.c @@ -32,7 +32,11 @@ void string_copy(struct stream_pos *dest, const struct format *fdest, if (fsrc->string_copy == fdest->string_copy) { fsrc->string_copy(dest, src, string_class); } else { - /* TODO */ + unsigned char *tmp = NULL; + + fsrc->string_read(&tmp, src, string_class); + fdest->string_write(dest, tmp, string_class); + fsrc->string_free_temp(tmp); } } -- 2.34.1