domnode.c 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. static const char version[] = "$Id$";
  2. /*
  3. * Copyright 2001-2003, Meiosys (www.meiosys.com). All rights reserved.
  4. *
  5. * See the COPYING file for the terms of usage and distribution.
  6. */
  7. #ifdef HAVE_CONFIG_H
  8. #include "config.h"
  9. #endif
  10. #include <stdlib.h>
  11. #include <string.h>
  12. #include <ctype.h>
  13. #include "malloc.h"
  14. #include "error.h"
  15. #include "domnode.h"
  16. /* TODO: generic format support */
  17. #include "domnode-xml.h"
  18. /******************************************************************************/
  19. static int foreach_delete(sd_domnode_t* a_node, void* unused)
  20. {
  21. sd_domnode_delete(a_node);
  22. return 0;
  23. }
  24. /******************************************************************************/
  25. extern sd_domnode_t* __sd_domnode_new(const char* a_name, const char* a_value,int is_elem)
  26. {
  27. sd_domnode_t* this;
  28. this = sd_calloc(1, sizeof(*this));
  29. this->name = a_name ? sd_strdup(a_name) : 0;
  30. this->value = a_value ? sd_strdup(a_value): 0;
  31. this->children = is_elem ? sd_list_new(10) : 0;
  32. this->attrs = is_elem ? sd_list_new(10) : 0;
  33. return this;
  34. }
  35. /******************************************************************************/
  36. extern sd_domnode_t* sd_domnode_new(const char* a_name, const char* a_value)
  37. {
  38. return __sd_domnode_new(a_name, a_value, 1);
  39. }
  40. /******************************************************************************/
  41. static void domnode_clear(sd_domnode_t* this)
  42. {
  43. free((void*) this->name);
  44. free((void*) this->value);
  45. sd_list_foreach(this->children, (sd_list_func_t) foreach_delete, 0);
  46. sd_list_delete(this->children);
  47. sd_list_foreach(this->attrs, (sd_list_func_t) foreach_delete, 0);
  48. sd_list_delete(this->attrs);
  49. }
  50. /******************************************************************************/
  51. extern void sd_domnode_delete(sd_domnode_t* this)
  52. {
  53. if (!this)
  54. return;
  55. domnode_clear(this);
  56. free(this);
  57. }
  58. /******************************************************************************/
  59. static void domnode_update(sd_domnode_t* this, sd_domnode_t* a_node)
  60. {
  61. domnode_clear(this);
  62. this->name = a_node->name;
  63. this->value = a_node->value;
  64. this->children = a_node->children;
  65. this->attrs = a_node->attrs;
  66. /* Destroy this now empty node ! */
  67. free(a_node);
  68. }
  69. /******************************************************************************/
  70. /*
  71. extern int sd_domnode_fread(sd_domnode_t* this, FILE* a_stream)
  72. {
  73. int ret;
  74. sd_domnode_t* node;
  75. // TODO: generic format support
  76. if (! (ret = __sd_domnode_xml_fread(&node, a_stream)))
  77. domnode_update(this, node);
  78. return ret ? -1 : 0;
  79. }
  80. */
  81. /******************************************************************************/
  82. /*
  83. extern int sd_domnode_read(sd_domnode_t* this, const char* a_buffer,size_t a_size)
  84. {
  85. int ret;
  86. sd_domnode_t* node;
  87. // TODO: generic format support;
  88. if (! (ret = __sd_domnode_xml_read(&node, a_buffer, a_size)))
  89. domnode_update(this, node);
  90. return ret ? -1 : 0;
  91. }
  92. */
  93. /******************************************************************************/
  94. /*
  95. extern int sd_domnode_write(sd_domnode_t* this, char** a_buffer,size_t* a_size)
  96. {
  97. // TODO: generic format support
  98. return __sd_domnode_xml_write(this, a_buffer, a_size);
  99. }
  100. */
  101. /******************************************************************************/
  102. /*
  103. extern int sd_domnode_fwrite(const sd_domnode_t* this, FILE* a_stream)
  104. {
  105. // TODO: generic format support
  106. return __sd_domnode_xml_fwrite(this, a_stream);
  107. }
  108. */
  109. /******************************************************************************/
  110. /*
  111. extern int sd_domnode_load(sd_domnode_t* this, const char* a_filename)
  112. {
  113. FILE* fp;
  114. int ret = 0;
  115. if ( (fp = fopen(a_filename, "r")) == 0)
  116. return -1;
  117. ret = sd_domnode_fread(this, fp);
  118. fclose(fp);
  119. return ret;
  120. }
  121. */
  122. /******************************************************************************/
  123. /*
  124. extern int sd_domnode_store(const sd_domnode_t* this, const char* afilename)
  125. {
  126. FILE* fp;
  127. int ret = 0;
  128. if ( (fp = fopen(afilename, "w")) == 0)
  129. return -1;
  130. ret = sd_domnode_fwrite(this, fp);
  131. fclose(fp);
  132. return ret;
  133. }
  134. */
  135. /*
  136. extern sd_domnode_t* sd_domnode_search(const sd_domnode_t* this,const char* a_name)
  137. {
  138. sd_list_iter_t* i;
  139. for (i = sd_list_begin(this->children); i != sd_list_end(this->children);
  140. i = sd_list_iter_next(i)) {
  141. sd_domnode_t* node = i->data;
  142. if (strcmp(node->name, a_name) == 0)
  143. return node;
  144. }
  145. for (i = sd_list_begin(this->attrs); i != sd_list_end(this->attrs);
  146. i = sd_list_iter_next(i)) {
  147. sd_domnode_t* node = i->data;
  148. if (strcmp(node->name, a_name) == 0)
  149. return node;
  150. }
  151. for (i = sd_list_begin(this->children); i != sd_list_end(this->children);
  152. i = sd_list_iter_next(i)) {
  153. sd_domnode_t* node = i->data;
  154. if ((node = sd_domnode_search(node, a_name)) != 0)
  155. return node;
  156. }
  157. return 0;
  158. }
  159. extern sd_domnode_t* sd_domnode_attrs_put(sd_domnode_t* this,sd_domnode_t* a_attr)
  160. {
  161. sd_list_iter_t* i;
  162. if (!this || !this->attrs || !a_attr || !a_attr->value)
  163. return 0;
  164. if ((i = sd_list_lookadd(this->attrs, a_attr)) == sd_list_end(this->attrs))
  165. return 0;
  166. return i->data;
  167. }
  168. extern sd_domnode_t* sd_domnode_attrs_get(const sd_domnode_t* this, const char* a_name)
  169. {
  170. sd_list_iter_t* i;
  171. if (!this || !this->attrs || !a_name || !*a_name)
  172. return 0;
  173. for (i = sd_list_begin(this->attrs); i != sd_list_end(this->attrs);
  174. i = sd_list_iter_next(i)) {
  175. sd_domnode_t* node = i->data;
  176. if (strcmp(node->name, a_name) == 0)
  177. return node;
  178. }
  179. return 0;
  180. }
  181. extern sd_domnode_t* sd_domnode_attrs_remove(sd_domnode_t* this, const char* a_name)
  182. {
  183. sd_list_iter_t* i;
  184. if (!this || !this->attrs || !a_name || !*a_name)
  185. return 0;
  186. for (i = sd_list_begin(this->attrs); i != sd_list_end(this->attrs);
  187. i = sd_list_iter_next(i)) {
  188. sd_domnode_t* node = i->data;
  189. if (strcmp(node->name, a_name) == 0) {
  190. sd_list_iter_del(i);
  191. return node;
  192. }
  193. }
  194. return 0;
  195. }
  196. */