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