Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


More init checks to allow graceful fail out when VM cannot be created
[palacios.git] / utils / guest_creator / ezxml.h
1 /* ezxml.h
2  *
3  * Copyright 2004-2006 Aaron Voisine <aaron@voisine.org>
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining
6  * a copy of this software and associated documentation files (the
7  * "Software"), to deal in the Software without restriction, including
8  * without limitation the rights to use, copy, modify, merge, publish,
9  * distribute, sublicense, and/or sell copies of the Software, and to
10  * permit persons to whom the Software is furnished to do so, subject to
11  * the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be included
14  * in all copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
19  * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
20  * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
21  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
22  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23  */
24
25 #ifndef _EZXML_H
26 #define _EZXML_H
27
28 #include <stdlib.h>
29 #include <stdio.h>
30 #include <stdarg.h>
31 #include <fcntl.h>
32
33 #ifdef __cplusplus
34 extern "C" {
35 #endif
36
37 #define EZXML_BUFSIZE 1024 // size of internal memory buffers
38 #define EZXML_NAMEM   0x80 // name is malloced
39 #define EZXML_TXTM    0x40 // txt is malloced
40 #define EZXML_DUP     0x20 // attribute name and value are strduped
41
42 typedef struct ezxml *ezxml_t;
43 struct ezxml {
44     char *name;      // tag name
45     char **attr;     // tag attributes { name, value, name, value, ... NULL }
46     char *txt;       // tag character content, empty string if none
47     size_t off;      // tag offset from start of parent tag character content
48     ezxml_t next;    // next tag with same name in this section at this depth
49     ezxml_t sibling; // next tag with different name in same section and depth
50     ezxml_t ordered; // next tag, same section and depth, in original order
51     ezxml_t child;   // head of sub tag list, NULL if none
52     ezxml_t parent;  // parent tag, NULL if current tag is root tag
53     short flags;     // additional information
54 };
55
56 // Given a string of xml data and its length, parses it and creates an ezxml
57 // structure. For efficiency, modifies the data by adding null terminators
58 // and decoding ampersand sequences. If you don't want this, copy the data and
59 // pass in the copy. Returns NULL on failure.
60 ezxml_t ezxml_parse_str(char *s, size_t len);
61
62 // A wrapper for ezxml_parse_str() that accepts a file descriptor. First
63 // attempts to mem map the file. Failing that, reads the file into memory.
64 // Returns NULL on failure.
65 ezxml_t ezxml_parse_fd(int fd);
66
67 // a wrapper for ezxml_parse_fd() that accepts a file name
68 ezxml_t ezxml_parse_file(const char *file);
69     
70 // Wrapper for ezxml_parse_str() that accepts a file stream. Reads the entire
71 // stream into memory and then parses it. For xml files, use ezxml_parse_file()
72 // or ezxml_parse_fd()
73 ezxml_t ezxml_parse_fp(FILE *fp);
74
75 // returns the first child tag (one level deeper) with the given name or NULL
76 // if not found
77 ezxml_t ezxml_child(ezxml_t xml, const char *name);
78
79 // returns the next tag of the same name in the same section and depth or NULL
80 // if not found
81 #define ezxml_next(xml) ((xml) ? xml->next : NULL)
82
83 // Returns the Nth tag with the same name in the same section at the same depth
84 // or NULL if not found. An index of 0 returns the tag given.
85 ezxml_t ezxml_idx(ezxml_t xml, int idx);
86
87 // returns the name of the given tag
88 #define ezxml_name(xml) ((xml) ? xml->name : NULL)
89
90 // returns the given tag's character content or empty string if none
91 #define ezxml_txt(xml) ((xml) ? xml->txt : "")
92
93 // returns the value of the requested tag attribute, or NULL if not found
94 const char *ezxml_attr(ezxml_t xml, const char *attr);
95
96 // Traverses the ezxml sturcture to retrieve a specific subtag. Takes a
97 // variable length list of tag names and indexes. The argument list must be
98 // terminated by either an index of -1 or an empty string tag name. Example: 
99 // title = ezxml_get(library, "shelf", 0, "book", 2, "title", -1);
100 // This retrieves the title of the 3rd book on the 1st shelf of library.
101 // Returns NULL if not found.
102 ezxml_t ezxml_get(ezxml_t xml, ...);
103
104 // Converts an ezxml structure back to xml. Returns a string of xml data that
105 // must be freed.
106 char *ezxml_toxml(ezxml_t xml);
107
108 // returns a NULL terminated array of processing instructions for the given
109 // target
110 const char **ezxml_pi(ezxml_t xml, const char *target);
111
112 // frees the memory allocated for an ezxml structure
113 void ezxml_free(ezxml_t xml);
114     
115 // returns parser error message or empty string if none
116 const char *ezxml_error(ezxml_t xml);
117
118 // returns a new empty ezxml structure with the given root tag name
119 ezxml_t ezxml_new(const char *name);
120
121 // wrapper for ezxml_new() that strdup()s name
122 #define ezxml_new_d(name) ezxml_set_flag(ezxml_new(strdup(name)), EZXML_NAMEM)
123
124 // Adds a child tag. off is the offset of the child tag relative to the start
125 // of the parent tag's character content. Returns the child tag.
126 ezxml_t ezxml_add_child(ezxml_t xml, const char *name, size_t off);
127
128 // wrapper for ezxml_add_child() that strdup()s name
129 #define ezxml_add_child_d(xml, name, off) \
130     ezxml_set_flag(ezxml_add_child(xml, strdup(name), off), EZXML_NAMEM)
131
132 // sets the character content for the given tag and returns the tag
133 ezxml_t ezxml_set_txt(ezxml_t xml, const char *txt);
134
135 // wrapper for ezxml_set_txt() that strdup()s txt
136 #define ezxml_set_txt_d(xml, txt) \
137     ezxml_set_flag(ezxml_set_txt(xml, strdup(txt)), EZXML_TXTM)
138
139 // Sets the given tag attribute or adds a new attribute if not found. A value
140 // of NULL will remove the specified attribute. Returns the tag given.
141 ezxml_t ezxml_set_attr(ezxml_t xml, const char *name, const char *value);
142
143 // Wrapper for ezxml_set_attr() that strdup()s name/value. Value cannot be NULL
144 #define ezxml_set_attr_d(xml, name, value) \
145     ezxml_set_attr(ezxml_set_flag(xml, EZXML_DUP), strdup(name), strdup(value))
146
147 // sets a flag for the given tag and returns the tag
148 ezxml_t ezxml_set_flag(ezxml_t xml, short flag);
149
150 // removes a tag along with its subtags without freeing its memory
151 ezxml_t ezxml_cut(ezxml_t xml);
152
153 // inserts an existing tag into an ezxml structure
154 ezxml_t ezxml_insert(ezxml_t xml, ezxml_t dest, size_t off);
155
156 // Moves an existing tag to become a subtag of dest at the given offset from
157 // the start of dest's character content. Returns the moved tag.
158 #define ezxml_move(xml, dest, off) ezxml_insert(ezxml_cut(xml), dest, off)
159
160 // removes a tag along with all its subtags
161 #define ezxml_remove(xml) ezxml_free(ezxml_cut(xml))
162
163 #ifdef __cplusplus
164 }
165 #endif
166
167 #endif // _EZXML_H