1 /* 2 This file is part of libXMLRPC - a C library for xml-encoded function calls. 3 4 Author: Dan Libby (dan@libby.com) 5 Epinions.com may be contacted at feedback@epinions-inc.com 6 */ 7 8 /* 9 Copyright 2000 Epinions, Inc. 10 11 Subject to the following 3 conditions, Epinions, Inc. permits you, free 12 of charge, to (a) use, copy, distribute, modify, perform and display this 13 software and associated documentation files (the "Software"), and (b) 14 permit others to whom the Software is furnished to do so as well. 15 16 1) The above copyright notice and this permission notice shall be included 17 without modification in all copies or substantial portions of the 18 Software. 19 20 2) THE SOFTWARE IS PROVIDED "AS IS", WITHOUT ANY WARRANTY OR CONDITION OF 21 ANY KIND, EXPRESS, IMPLIED OR STATUTORY, INCLUDING WITHOUT LIMITATION ANY 22 IMPLIED WARRANTIES OF ACCURACY, MERCHANTABILITY, FITNESS FOR A PARTICULAR 23 PURPOSE OR NONINFRINGEMENT. 24 25 3) IN NO EVENT SHALL EPINIONS, INC. BE LIABLE FOR ANY DIRECT, INDIRECT, 26 SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT 27 OF OR IN CONNECTION WITH THE SOFTWARE (HOWEVER ARISING, INCLUDING 28 NEGLIGENCE), EVEN IF EPINIONS, INC. IS AWARE OF THE POSSIBILITY OF SUCH 29 DAMAGES. 30 31 */ 32 33 #ifndef __XML_ELEMENT_H__ 34 #define __XML_ELEMENT_H__ 35 36 /* includes */ 37 #include <stdio.h> 38 #include "queue.h" 39 #include "simplestring.h" 40 #include "encodings.h" 41 42 #ifdef __cplusplus 43 extern "C" { 44 #endif 45 46 /****d* enum/XML_ELEM_VERBOSITY 47 * NAME 48 * XML_ELEM_VERBOSITY 49 * NOTES 50 * verbosity/readability options for generated xml 51 * SEE ALSO 52 * XML_ELEM_OUTPUT_OPTIONS 53 * SOURCE 54 */ 55 typedef enum _xml_elem_verbosity { 56 xml_elem_no_white_space, /* compact xml with no white space */ 57 xml_elem_newlines_only, /* add newlines for enhanced readability */ 58 xml_elem_pretty /* add newlines and indent accordint to depth */ 59 } XML_ELEM_VERBOSITY; 60 /******/ 61 62 63 /****d* enum/XML_ELEM_ESCAPING 64 * NAME 65 * XML_ELEM_ESCAPING 66 * NOTES 67 * xml escaping options for generated xml 68 * SEE ALSO 69 * XML_ELEM_OUTPUT_OPTIONS 70 * SOURCE 71 */ 72 typedef enum _xml_elem_escaping { 73 xml_elem_no_escaping = 0x000, 74 xml_elem_markup_escaping = 0x002, /* entity escape xml special chars */ 75 xml_elem_non_ascii_escaping = 0x008, /* entity escape chars above 127 */ 76 xml_elem_non_print_escaping = 0x010, /* entity escape non print (illegal) chars */ 77 xml_elem_cdata_escaping = 0x020, /* wrap in cdata section */ 78 } XML_ELEM_ESCAPING; 79 /******/ 80 81 82 /****s* struct/XML_ELEM_OUTPUT_OPTIONS 83 * NAME 84 * XML_ELEM_OUTPUT_OPTIONS 85 * NOTES 86 * defines various output options 87 * SOURCE 88 */ 89 typedef struct _xml_output_options { 90 XML_ELEM_VERBOSITY verbosity; /* length/verbosity of xml */ 91 XML_ELEM_ESCAPING escaping; /* how to escape special chars */ 92 const char* encoding; /* <?xml encoding="<encoding>" ?> */ 93 } STRUCT_XML_ELEM_OUTPUT_OPTIONS, *XML_ELEM_OUTPUT_OPTIONS; 94 /******/ 95 96 /****s* struct/XML_ELEM_INPUT_OPTIONS 97 * NAME 98 * XML_ELEM_INPUT_OPTIONS 99 * NOTES 100 * defines various input options 101 * SOURCE 102 */ 103 typedef struct _xml_input_options { 104 ENCODING_ID encoding; /* which encoding to use. */ 105 } STRUCT_XML_ELEM_INPUT_OPTIONS, *XML_ELEM_INPUT_OPTIONS; 106 /******/ 107 108 /****s* struct/XML_ELEM_ERROR 109 * NAME 110 * XML_ELEM_ERROR 111 * NOTES 112 * defines an xml parser error 113 * SOURCE 114 */ 115 typedef struct _xml_elem_error { 116 int parser_code; 117 const char* parser_error; 118 long line; 119 long column; 120 long byte_index; 121 } STRUCT_XML_ELEM_ERROR, *XML_ELEM_ERROR; 122 /******/ 123 124 125 /*-************************ 126 * begin xml element stuff * 127 **************************/ 128 129 /****s* struct/xml_elem_attr 130 * NAME 131 * xml_elem_attr 132 * NOTES 133 * representation of an xml attribute, foo="bar" 134 * SOURCE 135 */ 136 typedef struct _xml_element_attr { 137 char* key; /* attribute key */ 138 char* val; /* attribute value */ 139 } xml_element_attr; 140 /******/ 141 142 /****s* struct/xml_elem_attr 143 * NAME 144 * xml_elem_attr 145 * NOTES 146 * representation of an xml element, eg <candidate name="Harry Browne" party="Libertarian"/> 147 * SOURCE 148 */ 149 typedef struct _xml_element { 150 const char* name; /* element identifier */ 151 simplestring text; /* text contained between element begin/end pairs */ 152 struct _xml_element* parent; /* element's parent */ 153 154 queue attrs; /* attribute list */ 155 queue children; /* child element list */ 156 } xml_element; 157 /******/ 158 159 void xml_elem_free(xml_element* root); 160 void xml_elem_free_non_recurse(xml_element* root); 161 xml_element* xml_elem_new(void); 162 char* xml_elem_serialize_to_string(xml_element *el, XML_ELEM_OUTPUT_OPTIONS options, int *buf_len); 163 void xml_elem_serialize_to_stream(xml_element *el, FILE *output, XML_ELEM_OUTPUT_OPTIONS options); 164 xml_element* xml_elem_parse_buf(const char* in_buf, int len, XML_ELEM_INPUT_OPTIONS options, XML_ELEM_ERROR error); 165 166 /*-********************** 167 * end xml element stuff * 168 ************************/ 169 170 /*-********************** 171 * Begin xml_element API * 172 ************************/ 173 174 /****d* VALUE/XMLRPC_MACROS 175 * NAME 176 * Some Helpful Macros 177 * NOTES 178 * Some macros for making life easier. Should be self-explanatory. 179 * SEE ALSO 180 * XMLRPC_AddValueToVector () 181 * XMLRPC_VectorGetValueWithID_Case () 182 * XMLRPC_VALUE 183 * SOURCE 184 */ 185 #define xml_elem_next_element(el) ((el) ? (xml_element *)Q_Next(&el->children) : NULL) 186 #define xml_elem_head_element(el) ((el) ? (xml_element *)Q_Head(&el->children) : NULL) 187 #define xml_elem_next_attr(el) ((el) ? (xml_element_attr *)Q_Next(&el->attrs) : NULL) 188 #define xml_elem_head_attr(el) ((el) ? (xml_element_attr *)Q_Head(&el->attrs) : NULL) 189 #define xml_elem_get_name(el) (char *)((el) ? el->name : NULL) 190 #define xml_elem_get_val(el) (char *)((el) ? el->text.str : NULL) 191 /******/ 192 193 194 /*-******************** 195 * End xml_element API * 196 **********************/ 197 198 #ifdef __cplusplus 199 } 200 #endif 201 202 #endif /* __XML_ELEMENT_H__ */ 203