1#include "array.h" 2 3#include <string.h> 4#include <stdio.h> 5#include <stdlib.h> 6 7static data_unset *data_config_copy(const data_unset *s) { 8 data_config *src = (data_config *)s; 9 data_config *ds = data_config_init(); 10 11 buffer_copy_buffer(ds->key, src->key); 12 buffer_copy_buffer(ds->comp_key, src->comp_key); 13 array_free(ds->value); 14 ds->value = array_init_array(src->value); 15 return (data_unset *)ds; 16} 17 18static void data_config_free(data_unset *d) { 19 data_config *ds = (data_config *)d; 20 21 buffer_free(ds->key); 22 buffer_free(ds->op); 23 buffer_free(ds->comp_key); 24 25 array_free(ds->value); 26 array_free(ds->childs); 27 28 if (ds->string) buffer_free(ds->string); 29#ifdef HAVE_PCRE_H 30 if (ds->regex) pcre_free(ds->regex); 31 if (ds->regex_study) pcre_free(ds->regex_study); 32#endif 33 34 free(d); 35} 36 37static void data_config_reset(data_unset *d) { 38 data_config *ds = (data_config *)d; 39 40 /* reused array elements */ 41 buffer_reset(ds->key); 42 buffer_reset(ds->comp_key); 43 array_reset(ds->value); 44} 45 46static int data_config_insert_dup(data_unset *dst, data_unset *src) { 47 UNUSED(dst); 48 49 src->free(src); 50 51 return 0; 52} 53 54static void data_config_print(const data_unset *d, int depth) { 55 data_config *ds = (data_config *)d; 56 array *a = (array *)ds->value; 57 size_t i; 58 size_t maxlen; 59 60 if (0 == ds->context_ndx) { 61 fprintf(stdout, "config {\n"); 62 } 63 else { 64 fprintf(stdout, "$%s %s \"%s\" {\n", 65 ds->comp_key->ptr, ds->op->ptr, ds->string->ptr); 66 array_print_indent(depth + 1); 67 fprintf(stdout, "# block %d\n", ds->context_ndx); 68 } 69 depth ++; 70 71 maxlen = array_get_max_key_length(a); 72 for (i = 0; i < a->used; i ++) { 73 data_unset *du = a->data[i]; 74 size_t len = strlen(du->key->ptr); 75 size_t j; 76 77 array_print_indent(depth); 78 fprintf(stdout, "%s", du->key->ptr); 79 for (j = maxlen - len; j > 0; j --) { 80 fprintf(stdout, " "); 81 } 82 fprintf(stdout, " = "); 83 du->print(du, depth); 84 fprintf(stdout, "\n"); 85 } 86 87 if (ds->childs) { 88 fprintf(stdout, "\n"); 89 for (i = 0; i < ds->childs->used; i ++) { 90 data_unset *du = ds->childs->data[i]; 91 92 /* only the 1st block of chaining */ 93 if (NULL == ((data_config *)du)->prev) { 94 fprintf(stdout, "\n"); 95 array_print_indent(depth); 96 du->print(du, depth); 97 fprintf(stdout, "\n"); 98 } 99 } 100 } 101 102 depth --; 103 array_print_indent(depth); 104 fprintf(stdout, "}"); 105 if (0 != ds->context_ndx) { 106 fprintf(stdout, " # end of $%s %s \"%s\"", 107 ds->comp_key->ptr, ds->op->ptr, ds->string->ptr); 108 } 109 110 if (ds->next) { 111 fprintf(stdout, "\n"); 112 array_print_indent(depth); 113 fprintf(stdout, "else "); 114 ds->next->print((data_unset *)ds->next, depth); 115 } 116} 117 118data_config *data_config_init(void) { 119 data_config *ds; 120 121 ds = calloc(1, sizeof(*ds)); 122 123 ds->key = buffer_init(); 124 ds->op = buffer_init(); 125 ds->comp_key = buffer_init(); 126 ds->value = array_init(); 127 ds->childs = array_init(); 128 ds->childs->is_weakref = 1; 129 130 ds->copy = data_config_copy; 131 ds->free = data_config_free; 132 ds->reset = data_config_reset; 133 ds->insert_dup = data_config_insert_dup; 134 ds->print = data_config_print; 135 ds->type = TYPE_CONFIG; 136 137 return ds; 138} 139