1*76404edcSAsim Jamshed #include "array.h"
2*76404edcSAsim Jamshed 
3*76404edcSAsim Jamshed #include <string.h>
4*76404edcSAsim Jamshed #include <stdio.h>
5*76404edcSAsim Jamshed #include <stdlib.h>
6*76404edcSAsim Jamshed #include <assert.h>
7*76404edcSAsim Jamshed 
data_string_copy(const data_unset * s)8*76404edcSAsim Jamshed static data_unset *data_string_copy(const data_unset *s) {
9*76404edcSAsim Jamshed 	data_string *src = (data_string *)s;
10*76404edcSAsim Jamshed 	data_string *ds = data_string_init();
11*76404edcSAsim Jamshed 
12*76404edcSAsim Jamshed 	buffer_copy_string_buffer(ds->key, src->key);
13*76404edcSAsim Jamshed 	buffer_copy_string_buffer(ds->value, src->value);
14*76404edcSAsim Jamshed 	ds->is_index_key = src->is_index_key;
15*76404edcSAsim Jamshed 	return (data_unset *)ds;
16*76404edcSAsim Jamshed }
17*76404edcSAsim Jamshed 
data_string_free(data_unset * d)18*76404edcSAsim Jamshed static void data_string_free(data_unset *d) {
19*76404edcSAsim Jamshed 	data_string *ds = (data_string *)d;
20*76404edcSAsim Jamshed 
21*76404edcSAsim Jamshed 	buffer_free(ds->key);
22*76404edcSAsim Jamshed 	buffer_free(ds->value);
23*76404edcSAsim Jamshed 
24*76404edcSAsim Jamshed 	free(d);
25*76404edcSAsim Jamshed }
26*76404edcSAsim Jamshed 
data_string_reset(data_unset * d)27*76404edcSAsim Jamshed static void data_string_reset(data_unset *d) {
28*76404edcSAsim Jamshed 	data_string *ds = (data_string *)d;
29*76404edcSAsim Jamshed 
30*76404edcSAsim Jamshed 	/* reused array elements */
31*76404edcSAsim Jamshed 	buffer_reset(ds->key);
32*76404edcSAsim Jamshed 	buffer_reset(ds->value);
33*76404edcSAsim Jamshed }
34*76404edcSAsim Jamshed 
data_string_insert_dup(data_unset * dst,data_unset * src)35*76404edcSAsim Jamshed static int data_string_insert_dup(data_unset *dst, data_unset *src) {
36*76404edcSAsim Jamshed 	data_string *ds_dst = (data_string *)dst;
37*76404edcSAsim Jamshed 	data_string *ds_src = (data_string *)src;
38*76404edcSAsim Jamshed 
39*76404edcSAsim Jamshed 	if (ds_dst->value->used) {
40*76404edcSAsim Jamshed 		buffer_append_string_len(ds_dst->value, CONST_STR_LEN(", "));
41*76404edcSAsim Jamshed 		buffer_append_string_buffer(ds_dst->value, ds_src->value);
42*76404edcSAsim Jamshed 	} else {
43*76404edcSAsim Jamshed 		buffer_copy_string_buffer(ds_dst->value, ds_src->value);
44*76404edcSAsim Jamshed 	}
45*76404edcSAsim Jamshed 
46*76404edcSAsim Jamshed 	src->free(src);
47*76404edcSAsim Jamshed 
48*76404edcSAsim Jamshed 	return 0;
49*76404edcSAsim Jamshed }
50*76404edcSAsim Jamshed 
data_response_insert_dup(data_unset * dst,data_unset * src)51*76404edcSAsim Jamshed static int data_response_insert_dup(data_unset *dst, data_unset *src) {
52*76404edcSAsim Jamshed 	data_string *ds_dst = (data_string *)dst;
53*76404edcSAsim Jamshed 	data_string *ds_src = (data_string *)src;
54*76404edcSAsim Jamshed 
55*76404edcSAsim Jamshed 	if (ds_dst->value->used) {
56*76404edcSAsim Jamshed 		buffer_append_string_len(ds_dst->value, CONST_STR_LEN("\r\n"));
57*76404edcSAsim Jamshed 		buffer_append_string_buffer(ds_dst->value, ds_dst->key);
58*76404edcSAsim Jamshed 		buffer_append_string_len(ds_dst->value, CONST_STR_LEN(": "));
59*76404edcSAsim Jamshed 		buffer_append_string_buffer(ds_dst->value, ds_src->value);
60*76404edcSAsim Jamshed 	} else {
61*76404edcSAsim Jamshed 		buffer_copy_string_buffer(ds_dst->value, ds_src->value);
62*76404edcSAsim Jamshed 	}
63*76404edcSAsim Jamshed 
64*76404edcSAsim Jamshed 	src->free(src);
65*76404edcSAsim Jamshed 
66*76404edcSAsim Jamshed 	return 0;
67*76404edcSAsim Jamshed }
68*76404edcSAsim Jamshed 
69*76404edcSAsim Jamshed 
data_string_print(const data_unset * d,int depth)70*76404edcSAsim Jamshed static void data_string_print(const data_unset *d, int depth) {
71*76404edcSAsim Jamshed 	data_string *ds = (data_string *)d;
72*76404edcSAsim Jamshed 	unsigned int i;
73*76404edcSAsim Jamshed 	UNUSED(depth);
74*76404edcSAsim Jamshed 
75*76404edcSAsim Jamshed 	/* empty and uninitialized strings */
76*76404edcSAsim Jamshed 	if (ds->value->used < 1) {
77*76404edcSAsim Jamshed 		fputs("\"\"", stdout);
78*76404edcSAsim Jamshed 		return;
79*76404edcSAsim Jamshed 	}
80*76404edcSAsim Jamshed 
81*76404edcSAsim Jamshed 	/* print out the string as is, except prepend " with backslash */
82*76404edcSAsim Jamshed 	putc('"', stdout);
83*76404edcSAsim Jamshed 	for (i = 0; i < ds->value->used - 1; i++) {
84*76404edcSAsim Jamshed 		unsigned char c = ds->value->ptr[i];
85*76404edcSAsim Jamshed 		if (c == '"') {
86*76404edcSAsim Jamshed 			fputs("\\\"", stdout);
87*76404edcSAsim Jamshed 		} else {
88*76404edcSAsim Jamshed 			putc(c, stdout);
89*76404edcSAsim Jamshed 		}
90*76404edcSAsim Jamshed 	}
91*76404edcSAsim Jamshed 	putc('"', stdout);
92*76404edcSAsim Jamshed }
93*76404edcSAsim Jamshed 
94*76404edcSAsim Jamshed 
data_string_init(void)95*76404edcSAsim Jamshed data_string *data_string_init(void) {
96*76404edcSAsim Jamshed 	data_string *ds;
97*76404edcSAsim Jamshed 
98*76404edcSAsim Jamshed 	ds = calloc(1, sizeof(*ds));
99*76404edcSAsim Jamshed 	assert(ds);
100*76404edcSAsim Jamshed 
101*76404edcSAsim Jamshed 	ds->key = buffer_init();
102*76404edcSAsim Jamshed 	ds->value = buffer_init();
103*76404edcSAsim Jamshed 
104*76404edcSAsim Jamshed 	ds->copy = data_string_copy;
105*76404edcSAsim Jamshed 	ds->free = data_string_free;
106*76404edcSAsim Jamshed 	ds->reset = data_string_reset;
107*76404edcSAsim Jamshed 	ds->insert_dup = data_string_insert_dup;
108*76404edcSAsim Jamshed 	ds->print = data_string_print;
109*76404edcSAsim Jamshed 	ds->type = TYPE_STRING;
110*76404edcSAsim Jamshed 
111*76404edcSAsim Jamshed 	return ds;
112*76404edcSAsim Jamshed }
113*76404edcSAsim Jamshed 
data_response_init(void)114*76404edcSAsim Jamshed data_string *data_response_init(void) {
115*76404edcSAsim Jamshed 	data_string *ds;
116*76404edcSAsim Jamshed 
117*76404edcSAsim Jamshed 	ds = data_string_init();
118*76404edcSAsim Jamshed 	ds->insert_dup = data_response_insert_dup;
119*76404edcSAsim Jamshed 
120*76404edcSAsim Jamshed 	return ds;
121*76404edcSAsim Jamshed }
122