diff options
author | Thibaut Mattern <tmattern@users.sourceforge.net> | 2003-07-19 00:22:43 +0000 |
---|---|---|
committer | Thibaut Mattern <tmattern@users.sourceforge.net> | 2003-07-19 00:22:43 +0000 |
commit | 37b4f6ce5b85acebb6b6f70b04cb19e13b694f13 (patch) | |
tree | 68770fcedd76b5157d8fc4ce781b8052803fd2a9 | |
parent | 9eb254f79cb45faa856284ee4e577f6e555fadaa (diff) | |
download | xine-lib-37b4f6ce5b85acebb6b6f70b04cb19e13b694f13.tar.gz xine-lib-37b4f6ce5b85acebb6b6f70b04cb19e13b694f13.tar.bz2 |
Backport cleanups/fixes/improvements from gxine.
Thanks Günter.
CVS patchset: 5182
CVS date: 2003/07/19 00:22:43
-rw-r--r-- | src/xine-utils/xmllexer.c | 35 | ||||
-rw-r--r-- | src/xine-utils/xmllexer.h | 2 | ||||
-rw-r--r-- | src/xine-utils/xmlparser.c | 190 | ||||
-rw-r--r-- | src/xine-utils/xmlparser.h | 15 |
4 files changed, 187 insertions, 55 deletions
diff --git a/src/xine-utils/xmllexer.c b/src/xine-utils/xmllexer.c index 4a150a0b0..8e9f23926 100644 --- a/src/xine-utils/xmllexer.c +++ b/src/xine-utils/xmllexer.c @@ -17,7 +17,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA * - * $Id: xmllexer.c,v 1.1 2002/05/01 19:41:55 guenter Exp $ + * $Id: xmllexer.c,v 1.2 2003/07/19 00:22:43 tmattern Exp $ * */ @@ -39,16 +39,18 @@ */ /* private global variables */ -char * lexbuf; -int lexbuf_size = 0; -int lexbuf_pos = 0; -int lex_mode = NORMAL; +static char * lexbuf; +static int lexbuf_size = 0; +static int lexbuf_pos = 0; +static int lex_mode = NORMAL; +static int in_comment = 0; void lexer_init(char * buf, int size) { - lexbuf = buf; + lexbuf = buf; lexbuf_size = size; - lexbuf_pos = 0; - lex_mode = NORMAL; + lexbuf_pos = 0; + lex_mode = NORMAL; + in_comment = 0; #ifdef LOG printf("xmllexer: buffer length %d\n", size); #endif @@ -63,7 +65,7 @@ int lexer_get_token(char * tok, int tok_size) { while ((tok_pos < tok_size) && (lexbuf_pos < lexbuf_size)) { c = lexbuf[lexbuf_pos]; #ifdef LOG - printf("xmllexer: c=%c, state=%d\n", c, state); + printf("xmllexer: c=%c, state=%d, in_comment=%d\n", c, state, in_comment); #endif if (lex_mode == NORMAL) { /* normal mode */ @@ -98,7 +100,8 @@ int lexer_get_token(char * tok, int tok_size) { break; case '/': - state = 5; + if (!in_comment) + state = 5; tok[tok_pos] = c; tok_pos++; break; @@ -190,7 +193,8 @@ int lexer_get_token(char * tok, int tok_size) { /* T_M_STOP_1 */ case 4: tok[tok_pos] = '\0'; - lex_mode = DATA; + if (!in_comment) + lex_mode = DATA; return T_M_STOP_1; break; @@ -201,7 +205,8 @@ int lexer_get_token(char * tok, int tok_size) { lexbuf_pos++; tok_pos++; /* FIXME */ tok[tok_pos] = '\0'; - lex_mode = DATA; + if (!in_comment) + lex_mode = DATA; return T_M_STOP_2; } else { tok[tok_pos] = '\0'; @@ -237,6 +242,7 @@ int lexer_get_token(char * tok, int tok_size) { tok[tok_pos++] = '-'; /* FIXME */ tok[tok_pos++] = '-'; tok[tok_pos] = '\0'; + in_comment = 1; return T_C_START; } break; @@ -300,6 +306,7 @@ int lexer_get_token(char * tok, int tok_size) { lexbuf_pos -= 3; return T_IDENT; } else { + in_comment = 0; return T_C_STOP; } break; @@ -359,6 +366,10 @@ int lexer_get_token(char * tok, int tok_size) { } } } +#ifdef LOG + printf ("xmllexer: loop done tok_pos = %d, tok_size=%d, lexbuf_pos=%d, lexbuf_size=%d\n", + tok_pos, tok_size, lexbuf_pos, lexbuf_size); +#endif /* pb */ if (tok_pos >= tok_size) { printf("xmllexer: token buffer is too little\n"); diff --git a/src/xine-utils/xmllexer.h b/src/xine-utils/xmllexer.h index e9a382d46..518eb6df6 100644 --- a/src/xine-utils/xmllexer.h +++ b/src/xine-utils/xmllexer.h @@ -17,7 +17,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA * - * $Id: xmllexer.h,v 1.1 2002/05/01 19:41:55 guenter Exp $ + * $Id: xmllexer.h,v 1.2 2003/07/19 00:22:43 tmattern Exp $ * */ diff --git a/src/xine-utils/xmlparser.c b/src/xine-utils/xmlparser.c index 6514db3a2..7fc178947 100644 --- a/src/xine-utils/xmlparser.c +++ b/src/xine-utils/xmlparser.c @@ -1,7 +1,8 @@ /* - * Copyright (C) 2002 the xine project + * Copyright (C) 2002-2003 the xine project * * This file is part of xine, a free video player. + * This file is part of gxine, a free video player. * * xine is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -17,7 +18,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA * - * $Id: xmlparser.c,v 1.3 2002/12/02 22:37:08 f1rmb Exp $ + * $Id: xmlparser.c,v 1.4 2003/07/19 00:22:43 tmattern Exp $ * */ @@ -28,6 +29,7 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <stdarg.h> #include <ctype.h> #include "xmllexer.h" #include "xmlparser.h" @@ -37,14 +39,16 @@ #define DATA_SIZE 4 * 1024 #define MAX_RECURSION 10 -/* #define LOG */ +/* +#define LOG +*/ /* private global variables */ -int xml_parser_mode; +static int xml_parser_mode; /* private functions */ -char * strtoupper(char * str) { +static char * strtoupper(char * str) { int i = 0; while (str[i] != '\0') { @@ -54,7 +58,7 @@ char * strtoupper(char * str) { return str; } -xml_node_t * new_xml_node() { +static xml_node_t * new_xml_node() { xml_node_t * new_node; new_node = (xml_node_t*) malloc(sizeof(xml_node_t)); @@ -66,11 +70,11 @@ xml_node_t * new_xml_node() { return new_node; } -void free_xml_node(xml_node_t * node) { +static void free_xml_node(xml_node_t * node) { free(node); } -xml_property_t * new_xml_property() { +static xml_property_t * new_xml_property() { xml_property_t * new_property; new_property = (xml_property_t*) malloc(sizeof(xml_property_t)); @@ -80,11 +84,12 @@ xml_property_t * new_xml_property() { return new_property; } -void free_xml_property(xml_property_t * property) { +static void free_xml_property(xml_property_t * property) { free(property); } void xml_parser_init(char * buf, int size, int mode) { + lexer_init(buf, size); xml_parser_mode = mode; } @@ -120,11 +125,15 @@ void xml_parser_free_tree(xml_node_t *current_node) { } } -int xml_parser_get_node(xml_node_t *current_node, char *root_name, int rec) { +#define STATE_IDLE 0 +#define STATE_NODE 1 +#define STATE_COMMENT 7 + +int xml_parser_get_node (xml_node_t *current_node, char *root_name, int rec) { char tok[TOKEN_SIZE]; char property_name[TOKEN_SIZE]; char node_name[TOKEN_SIZE]; - int state = 0; + int state = STATE_IDLE; int res = 0; int parse_res; int bypass_get_token = 0; @@ -138,10 +147,10 @@ int xml_parser_get_node(xml_node_t *current_node, char *root_name, int rec) { while ((bypass_get_token) || (res = lexer_get_token(tok, TOKEN_SIZE)) != T_ERROR) { bypass_get_token = 0; #ifdef LOG - printf("xmlparser: info: %d - %d : %s\n", state, res, tok); + printf("xmlparser: info: %d - %d : '%s'\n", state, res, tok); #endif switch (state) { - case 0: + case STATE_IDLE: switch (res) { case (T_EOL): case (T_SEPAR): @@ -151,13 +160,13 @@ int xml_parser_get_node(xml_node_t *current_node, char *root_name, int rec) { return 0; /* normal end */ break; case (T_M_START_1): - state = 1; + state = STATE_NODE; break; case (T_M_START_2): state = 3; break; case (T_C_START): - state = 7; + state = STATE_COMMENT; break; case (T_TI_START): state = 8; @@ -167,8 +176,7 @@ int xml_parser_get_node(xml_node_t *current_node, char *root_name, int rec) { break; case (T_DATA): /* current data */ - current_node->data = (char *)malloc(strlen(tok) + 1); - strcpy(current_node->data, tok); + current_node->data = strdup(tok); #ifdef LOG printf("xmlparser: info: node data : %s\n", current_node->data); #endif @@ -180,7 +188,7 @@ int xml_parser_get_node(xml_node_t *current_node, char *root_name, int rec) { } break; - case 1: + case STATE_NODE: switch (res) { case (T_IDENT): propertys = NULL; @@ -213,20 +221,14 @@ int xml_parser_get_node(xml_node_t *current_node, char *root_name, int rec) { subtree = new_xml_node(); /* set node name */ - subtree->name = malloc(strlen(node_name + 1)); - strcpy(subtree->name, node_name); + subtree->name = strdup(node_name); /* set node propertys */ subtree->props = propertys; #ifdef LOG - printf("xmlparser: info: recursive level: %d\n", rec); - printf("xmlparser: info: new subtree %s\n", node_name); + printf("xmlparser: info: rec %d new subtree %s\n", rec, node_name); #endif parse_res = xml_parser_get_node(subtree, node_name, rec + 1); -#ifdef LOG - printf("xmlparser: info: new subtree result: %d\n", parse_res); - printf("xmlparser: info: recursive level: %d\n", rec); -#endif if (parse_res != 0) { return parse_res; } @@ -237,7 +239,7 @@ int xml_parser_get_node(xml_node_t *current_node, char *root_name, int rec) { current_subtree->next = subtree; current_subtree = subtree; } - state = 0; + state = STATE_IDLE; break; case (T_M_STOP_2): /* new leaf */ @@ -245,20 +247,22 @@ int xml_parser_get_node(xml_node_t *current_node, char *root_name, int rec) { subtree = new_xml_node(); /* set node name */ - subtree->name = malloc(strlen(node_name + 1)); - strcpy(subtree->name, node_name); + subtree->name = strdup (node_name); /* set node propertys */ subtree->props = propertys; +#ifdef LOG + printf("xmlparser: info: rec %d new subtree %s\n", rec, node_name); +#endif if (current_subtree == NULL) { current_node->child = subtree; current_subtree = subtree; } else { current_subtree->next = subtree; - current_subtree = subtree; + current_subtree = subtree; } - state = 0; + state = STATE_IDLE; break; case (T_IDENT): /* save property name */ @@ -335,8 +339,7 @@ int xml_parser_get_node(xml_node_t *current_node, char *root_name, int rec) { current_property->next = new_xml_property(); current_property = current_property->next; } - current_property->name = (char *)malloc(strlen(property_name) + 1); - strcpy(current_property->name, property_name); + current_property->name = strdup (property_name); #ifdef LOG printf("xmlparser: info: new property %s\n", current_property->name); #endif @@ -367,10 +370,8 @@ int xml_parser_get_node(xml_node_t *current_node, char *root_name, int rec) { current_property->next = new_xml_property(); current_property = current_property->next; } - current_property->name = (char *)malloc(strlen(property_name) + 1); - strcpy(current_property->name, property_name); - current_property->value = (char *)malloc(strlen(tok) + 1); - strcpy(current_property->value, tok); + current_property->name = strdup(property_name); + current_property->value = strdup(tok); #ifdef LOG printf("xmlparser: info: new property %s=%s\n", current_property->name, current_property->value); #endif @@ -384,13 +385,13 @@ int xml_parser_get_node(xml_node_t *current_node, char *root_name, int rec) { break; /* --> expected */ - case 7: + case STATE_COMMENT: switch (res) { case (T_C_STOP): - state = 0; + state = STATE_IDLE; break; default: - state = 7; + state = STATE_COMMENT; break; } break; @@ -455,3 +456,112 @@ int xml_parser_build_tree(xml_node_t **root_node) { free(tmp_node); return res; } + +char *xml_parser_get_property (xml_node_t *node, const char *name) { + + xml_property_t *prop; + + prop = node->props; + while (prop) { + +#ifdef LOG + printf ("xmlparser: looking for %s in %s\n", name, prop->name); +#endif + + if (!strcasecmp (prop->name, name)) { +#ifdef LOG + printf ("xmlparser: found it. value=%s\n", prop->value); +#endif + return prop->value; + } + + prop = prop->next; + } + + return NULL; +} + +int xml_parser_get_property_int (xml_node_t *node, const char *name, + int def_value) { + + char *v; + int ret; + + v = xml_parser_get_property (node, name); + + if (!v) + return def_value; + + if (sscanf (v, "%d", &ret) != 1) + return def_value; + else + return ret; +} + +int xml_parser_get_property_bool (xml_node_t *node, const char *name, + int def_value) { + + char *v; + + v = xml_parser_get_property (node, name); + + if (!v) + return def_value; + + if (!strcasecmp (v, "true")) + return 1; + else + return 0; +} + +static void printf_indent (int indent, const char *format, ...) { + + int i ; + va_list argp; + + for (i=0; i<indent; i++) + printf (" "); + + va_start (argp, format); + + vprintf (format, argp); + + va_end (argp); +} + +static void xml_parser_dump_node (xml_node_t *node, int indent) { + + xml_property_t *p; + xml_node_t *n; + int l; + + printf_indent (indent, "<%s ", node->name); + + l = strlen (node->name); + + p = node->props; + while (p) { + printf ("%s='%s'", p->name, p->value); + p = p->next; + if (p) { + printf ("\n"); + printf_indent (indent+2+l, ""); + } + } + printf (">\n"); + + n = node->child; + while (n) { + + xml_parser_dump_node (n, indent+2); + + n = n->next; + } + + printf_indent (indent, "</%s>\n", node->name); +} + +void xml_parser_dump_tree (xml_node_t *node) { + xml_parser_dump_node (node, 0); +} + diff --git a/src/xine-utils/xmlparser.h b/src/xine-utils/xmlparser.h index 18c5a95df..ccf982f66 100644 --- a/src/xine-utils/xmlparser.h +++ b/src/xine-utils/xmlparser.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2002 the xine project + * Copyright (C) 2002-2003 the xine project * * This file is part of xine, a free video player. * @@ -17,7 +17,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA * - * $Id: xmlparser.h,v 1.1 2002/05/01 19:41:55 guenter Exp $ + * $Id: xmlparser.h,v 1.2 2003/07/19 00:22:43 tmattern Exp $ * */ #ifndef XML_PARSER_H @@ -54,5 +54,16 @@ int xml_parser_build_tree(xml_node_t **root_node); void xml_parser_free_tree(xml_node_t *root_node); +char *xml_parser_get_property (xml_node_t *node, const char *name); +int xml_parser_get_property_int (xml_node_t *node, const char *name, + int def_value); +int xml_parser_get_property_bool (xml_node_t *node, const char *name, + int def_value); + +/* for debugging purposes: dump read-in xml tree in a nicely + * indented fashion + */ + +void xml_parser_dump_tree (xml_node_t *node) ; #endif |