10 static data_unset
*data_string_copy(const data_unset
*s
) {
11 data_string
*src
= (data_string
*)s
;
12 data_string
*ds
= data_string_init();
14 buffer_copy_buffer(ds
->key
, src
->key
);
15 buffer_copy_buffer(ds
->value
, src
->value
);
16 ds
->is_index_key
= src
->is_index_key
;
17 return (data_unset
*)ds
;
20 static void data_string_free(data_unset
*d
) {
21 data_string
*ds
= (data_string
*)d
;
24 buffer_free(ds
->value
);
29 static void data_string_reset(data_unset
*d
) {
30 data_string
*ds
= (data_string
*)d
;
32 /* reused array elements */
33 buffer_reset(ds
->key
);
34 buffer_reset(ds
->value
);
37 static int data_string_insert_dup(data_unset
*dst
, data_unset
*src
) {
38 data_string
*ds_dst
= (data_string
*)dst
;
39 data_string
*ds_src
= (data_string
*)src
;
41 if (!buffer_is_empty(ds_dst
->value
)) {
42 buffer_append_string_len(ds_dst
->value
, CONST_STR_LEN(", "));
43 buffer_append_string_buffer(ds_dst
->value
, ds_src
->value
);
45 buffer_copy_buffer(ds_dst
->value
, ds_src
->value
);
53 static int data_response_insert_dup(data_unset
*dst
, data_unset
*src
) {
54 data_string
*ds_dst
= (data_string
*)dst
;
55 data_string
*ds_src
= (data_string
*)src
;
57 if (!buffer_is_empty(ds_dst
->value
)) {
58 buffer_append_string_len(ds_dst
->value
, CONST_STR_LEN("\r\n"));
59 buffer_append_string_buffer(ds_dst
->value
, ds_dst
->key
);
60 buffer_append_string_len(ds_dst
->value
, CONST_STR_LEN(": "));
61 buffer_append_string_buffer(ds_dst
->value
, ds_src
->value
);
63 buffer_copy_buffer(ds_dst
->value
, ds_src
->value
);
72 static void data_string_print(const data_unset
*d
, int depth
) {
73 data_string
*ds
= (data_string
*)d
;
77 /* empty and uninitialized strings */
78 if (buffer_string_is_empty(ds
->value
)) {
79 fputs("\"\"", stdout
);
83 /* print out the string as is, except prepend " with backslash */
85 len
= buffer_string_length(ds
->value
);
86 for (i
= 0; i
< len
; i
++) {
87 unsigned char c
= ds
->value
->ptr
[i
];
89 fputs("\\\"", stdout
);
98 data_string
*data_string_init(void) {
101 ds
= calloc(1, sizeof(*ds
));
102 force_assert(NULL
!= ds
);
104 ds
->key
= buffer_init();
105 ds
->value
= buffer_init();
107 ds
->copy
= data_string_copy
;
108 ds
->free
= data_string_free
;
109 ds
->reset
= data_string_reset
;
110 ds
->insert_dup
= data_string_insert_dup
;
111 ds
->print
= data_string_print
;
112 ds
->type
= TYPE_STRING
;
117 data_string
*data_response_init(void) {
120 ds
= data_string_init();
121 ds
->insert_dup
= data_response_insert_dup
;