3 * sushivision copyright (C) 2006-2007 Monty <monty@xiph.org>
5 * sushivision is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2, or (at your option)
10 * sushivision is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with sushivision; see the file COPYING. If not, write to the
17 * Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
29 /* a few helpers to make specific libxml2 call patterns more concise */
31 xmlNodePtr
_xmlGetChildSPreserve(xmlNodePtr n
, char *name
,char *prop
, char *val
){
32 xmlNodePtr child
= (n
?n
->xmlChildrenNode
:NULL
);
34 // is this the child we want?
35 if (child
->type
== XML_ELEMENT_NODE
&& !xmlStrcmp(child
->name
, (const xmlChar
*)name
)) {
36 // does the desired attribut match?
37 xmlChar
*test
= (prop
?xmlGetProp(child
, (const xmlChar
*)prop
):NULL
);
39 if (!prop
|| !xmlStrcmp(test
, (const xmlChar
*)val
)) {
55 xmlNodePtr
_xmlGetChildS(xmlNodePtr n
, char *name
,char *prop
, char *val
){
56 xmlNodePtr child
= (n
?_xmlGetChildSPreserve(n
,name
,prop
,val
):NULL
);
58 // this is what we want
59 // remove it from the tree
66 xmlNodePtr
_xmlGetChildI(xmlNodePtr n
, char *name
,char *prop
, int val
){
68 snprintf(buffer
,sizeof(buffer
),"%d",val
);
69 return _xmlGetChildS(n
, name
, prop
, buffer
);
72 xmlNodePtr
_xmlGetChildIPreserve(xmlNodePtr n
, char *name
,char *prop
, int val
){
74 snprintf(buffer
,sizeof(buffer
),"%d",val
);
75 return _xmlGetChildSPreserve(n
, name
, prop
, buffer
);
78 void _xmlNewMapProp(xmlNodePtr n
, char *name
, _sv_propmap_t
**map
, int val
){
79 _sv_propmap_t
*m
= *map
++;
82 xmlNewProp(n
, (xmlChar
*)name
, (xmlChar
*)m
->left
);
89 void _xmlNewPropF(xmlNodePtr n
, char *name
, double val
){
91 snprintf(buffer
,sizeof(buffer
),"%.20g",val
);
92 xmlNewProp(n
, (xmlChar
*) name
, (xmlChar
*)buffer
);
95 void _xmlNewPropI(xmlNodePtr n
, char *name
, int val
){
97 snprintf(buffer
,sizeof(buffer
),"%d",val
);
98 xmlNewProp(n
, (xmlChar
*) name
, (xmlChar
*)buffer
);
101 void _xmlNewPropS(xmlNodePtr n
, char *name
, char *val
){
103 xmlNewProp(n
, (xmlChar
*) name
, (xmlChar
*)val
);
106 void _xmlGetPropS(xmlNodePtr n
, char *name
, char **value
){
107 char *ret
= (char *)(n
?xmlGetProp(n
, (xmlChar
*)name
):NULL
);
111 void _xmlGetPropF(xmlNodePtr n
, char *name
, double *val
){
112 xmlChar
*v
= (n
?xmlGetProp(n
, (xmlChar
*)name
):NULL
);
114 *val
= atof((char *)v
);
119 void _xmlCheckPropS(xmlNodePtr n
, char *prop
, char *val
, char *msg
, int num
, int *warn
){
120 char *testval
= NULL
;
121 _xmlGetPropS(n
, prop
, &testval
);
123 if(strcmp(val
,testval
)){
124 _sv_first_load_warning(warn
);
125 fprintf(stderr
,msg
, num
);
126 fprintf(stderr
,"\n\t(found %s, should be %s).\n", testval
, val
);
130 _sv_first_load_warning(warn
);
131 fprintf(stderr
,msg
, num
);
132 fprintf(stderr
,"\n\t(null found, should be %s).\n", val
);
136 void _xmlCheckMap(xmlNodePtr n
, char *prop
, _sv_propmap_t
**map
, int val
, char *msg
, int num
, int *warn
){
138 char *testname
= NULL
;
139 _xmlGetPropS(n
, prop
, &testname
);
141 // look up our desired value
142 _sv_propmap_t
*m
= *map
++;
153 if(strcmp(name
,testname
)){
154 _sv_first_load_warning(warn
);
155 fprintf(stderr
,msg
, num
);
156 fprintf(stderr
,"\n\t(found %s, should be %s).\n", testname
, name
);
159 _sv_first_load_warning(warn
);
160 fprintf(stderr
,msg
, num
);
161 fprintf(stderr
,"\n\t(found %s, should be null).\n", testname
);
166 _sv_first_load_warning(warn
);
167 fprintf(stderr
,msg
, num
);
168 fprintf(stderr
,"\n\t(null found, should be %s).\n", name
);
173 static void _xmlGetMapVal(xmlNodePtr n
, char *key
, _sv_propmap_t
**map
, int *out
){
174 char *valname
= (char *)(n
?xmlGetProp(n
, (xmlChar
*)key
):NULL
);
177 _sv_propmap_t
*m
= *map
++;
179 if(!strcmp(m
->left
,valname
)){
189 static void _xmlGetChildMap_i(xmlNodePtr in
, char *prop
, char *key
, _sv_propmap_t
**map
, int *out
,
190 char *msg
, int num
, int *warn
, int pres
){
191 xmlNodePtr n
= (pres
?
192 (in
?_xmlGetChildSPreserve(in
, prop
, NULL
, NULL
):NULL
):
193 (in
?_xmlGetChildS(in
, prop
, NULL
, NULL
):NULL
));
196 char *val
= (char *)xmlGetProp(n
, (xmlChar
*)key
);
198 if(!pres
) xmlFreeNode(n
);
203 _xmlGetMapVal(n
,key
,map
,&ret
);
206 _sv_first_load_warning(warn
);
207 fprintf(stderr
,msg
,num
);
208 fprintf(stderr
," (%s).\n", val
);
214 if(!pres
) xmlFreeNode(n
);
217 void _xmlGetChildMap(xmlNodePtr in
, char *prop
, char *key
, _sv_propmap_t
**map
, int *out
,
218 char *msg
, int num
, int *warn
){
219 _xmlGetChildMap_i(in
, prop
, key
, map
, out
, msg
, num
, warn
, 0);
222 void _xmlGetChildMapPreserve(xmlNodePtr in
, char *prop
, char *key
, _sv_propmap_t
**map
, int *out
,
223 char *msg
, int num
, int *warn
){
224 _xmlGetChildMap_i(in
, prop
, key
, map
, out
, msg
, num
, warn
, 1);
227 void _xmlGetChildPropS(xmlNodePtr in
, char *prop
, char *key
, char **out
){
228 xmlNodePtr n
= (in
?_xmlGetChildS(in
, prop
, NULL
, NULL
):NULL
);
230 char *val
= (char *)xmlGetProp(n
, (xmlChar
*)key
);
235 void _xmlGetChildPropSPreserve(xmlNodePtr in
, char *prop
, char *key
, char **out
){
236 xmlNodePtr n
= (in
?_xmlGetChildSPreserve(in
, prop
, NULL
, NULL
):NULL
);
238 char *val
= (char *)xmlGetProp(n
, (xmlChar
*)key
);
242 void _xmlGetChildPropF(xmlNodePtr in
, char *prop
, char *key
, double *out
){
243 xmlNodePtr n
= (in
?_xmlGetChildS(in
, prop
, NULL
, NULL
):NULL
);
245 char *val
= (char *)xmlGetProp(n
, (xmlChar
*)key
);
247 if(val
) *out
= atof(val
);
251 void _xmlGetChildPropFPreserve(xmlNodePtr in
, char *prop
, char *key
, double *out
){
252 xmlNodePtr n
= (in
?_xmlGetChildSPreserve(in
, prop
, NULL
, NULL
):NULL
);
254 char *val
= (char *)xmlGetProp(n
, (xmlChar
*)key
);
255 if(val
) *out
= atof(val
);
259 void _xmlGetChildPropI(xmlNodePtr in
, char *prop
, char *key
, int *out
){
260 xmlNodePtr n
= (in
?_xmlGetChildS(in
, prop
, NULL
, NULL
):NULL
);
262 char *val
= (char *)xmlGetProp(n
, (xmlChar
*)key
);
264 if(val
) *out
= atoi(val
);
268 void _xmlGetChildPropIPreserve(xmlNodePtr in
, char *prop
, char *key
, int *out
){
269 xmlNodePtr n
= (in
?_xmlGetChildSPreserve(in
, prop
, NULL
, NULL
):NULL
);
271 char *val
= (char *)xmlGetProp(n
, (xmlChar
*)key
);
272 if(val
) *out
= atoi(val
);
276 /* convenience helpers for wielding property maps */
277 int _sv_propmap_pos(_sv_propmap_t
**map
, int val
){
279 _sv_propmap_t
*m
= *map
++;
289 int _sv_propmap_last(_sv_propmap_t
**map
){
291 _sv_propmap_t
*m
= *map
++;
299 int _sv_propmap_label_pos(_sv_propmap_t
**map
, char *label
){
301 _sv_propmap_t
*m
= *map
++;
303 if(!strcmp(m
->left
,label
))