3
--- totem-pl-parser-2.28.1.orig/plparse/xmllexer.h
4
+++ totem-pl-parser-2.28.1/plparse/xmllexer.h
6
#define T_CDATA_STOP 19 /* ]]> */
9
+/* public structures */
12
+ const char * lexbuf;
25
/* public functions */
26
-void lexer_init(const char * buf, int size) XINE_PROTECTED;
27
-int lexer_get_token(char * tok, int tok_size) XINE_PROTECTED;
28
+struct lexer *lexer_init(const char * buf, int size) XINE_PROTECTED;
29
+void lexer_finalize(struct lexer * lexer) XINE_PROTECTED;
30
+int lexer_get_token(struct lexer * lexer, char * tok, int tok_size) XINE_PROTECTED;
31
char *lexer_decode_entities (const char *tok) XINE_PROTECTED;
36
--- totem-pl-parser-2.28.1.orig/plparse/xmlparser.c
37
+++ totem-pl-parser-2.28.1/plparse/xmlparser.c
39
#define DATA_SIZE 64 * 1024
40
#define MAX_RECURSION 23
42
-/* private global variables */
43
-static int xml_parser_mode;
45
/* private functions */
47
static char * strtoupper(char * str) {
52
-void xml_parser_init(const char * buf, int size, int mode) {
53
+xml_parser_t *xml_parser_init(const char * buf, int size, int mode) {
54
+ xml_parser_t *xml_parser = malloc(sizeof(xml_parser_t));
55
+ xml_parser->lexer = lexer_init(buf, size);
56
+ xml_parser->mode = mode;
60
- lexer_init(buf, size);
61
- xml_parser_mode = mode;
62
+void xml_parser_finalize(xml_parser_t *xml_parser)
64
+ lexer_finalize(xml_parser->lexer);
68
static void xml_parser_free_props(xml_property_t *current_property) {
71
#define Q_STATE(CURRENT,NEW) (STATE_##NEW + state - STATE_##CURRENT)
73
-static int xml_parser_get_node_internal (xml_node_t *current_node, char *root_names[], int rec, int flags)
74
+static int xml_parser_get_node_internal (xml_parser_t *xml_parser, xml_node_t *current_node, char *root_names[], int rec, int flags)
77
char property_name[TOKEN_SIZE];
80
memset (tok, 0, TOKEN_SIZE);
82
- while ((bypass_get_token) || (res = lexer_get_token(tok, TOKEN_SIZE)) != T_ERROR) {
83
+ while ((bypass_get_token) || (res = lexer_get_token(xml_parser->lexer, tok, TOKEN_SIZE)) != T_ERROR) {
85
lprintf("info: %d - %d : '%s'\n", state, res, tok);
88
current_property = NULL;
91
- if (xml_parser_mode == XML_PARSER_CASE_INSENSITIVE) {
92
+ if (xml_parser->mode == XML_PARSER_CASE_INSENSITIVE) {
95
if (state == STATE_Q_NODE) {
97
subtree->props = properties;
98
lprintf("info: rec %d new subtree %s\n", rec, node_name);
99
root_names[rec + 1] = node_name;
100
- parse_res = xml_parser_get_node_internal(subtree, root_names, rec + 1, flags);
101
+ parse_res = xml_parser_get_node_internal(xml_parser, subtree, root_names, rec + 1, flags);
102
if (parse_res == -1 || parse_res > 0) {
107
/* save property name */
109
- if (xml_parser_mode == XML_PARSER_CASE_INSENSITIVE) {
110
+ if (xml_parser->mode == XML_PARSER_CASE_INSENSITIVE) {
113
strcpy(property_name, tok);
117
/* must be equal to root_name */
118
- if (xml_parser_mode == XML_PARSER_CASE_INSENSITIVE) {
119
+ if (xml_parser->mode == XML_PARSER_CASE_INSENSITIVE) {
122
if (strcmp(tok, root_names[rec]) == 0) {
123
@@ -621,19 +625,19 @@
127
-static int xml_parser_get_node (xml_node_t *current_node, int flags)
128
+static int xml_parser_get_node (xml_parser_t *xml_parser, xml_node_t *current_node, int flags)
130
char *root_names[MAX_RECURSION + 1];
132
- return xml_parser_get_node_internal (current_node, root_names, 0, flags);
133
+ return xml_parser_get_node_internal (xml_parser, current_node, root_names, 0, flags);
136
-int xml_parser_build_tree_with_options(xml_node_t **root_node, int flags) {
137
+int xml_parser_build_tree_with_options(xml_parser_t *xml_parser, xml_node_t **root_node, int flags) {
138
xml_node_t *tmp_node, *pri_node, *q_node;
141
tmp_node = new_xml_node();
142
- res = xml_parser_get_node(tmp_node, flags);
143
+ res = xml_parser_get_node(xml_parser, tmp_node, flags);
145
/* delete any top-level [CDATA] nodes */;
146
pri_node = tmp_node->child;
151
-int xml_parser_build_tree(xml_node_t **root_node) {
152
- return xml_parser_build_tree_with_options (root_node, 0);
153
+int xml_parser_build_tree(xml_parser_t *xml_parser, xml_node_t **root_node) {
154
+ return xml_parser_build_tree_with_options (xml_parser, root_node, 0);
157
const char *xml_parser_get_property (const xml_node_t *node, const char *name) {
160
--- totem-pl-parser-2.28.1.orig/plparse/totem-pl-parser.c
161
+++ totem-pl-parser-2.28.1/plparse/totem-pl-parser.c
162
@@ -1676,11 +1676,16 @@
163
xml_node_t* doc, *node;
164
char *encoding, *new_contents;
166
+ xml_parser_t *xml_parser;
168
totem_pl_parser_cleanup_xml (contents);
169
- xml_parser_init (contents, size, XML_PARSER_CASE_INSENSITIVE);
170
- if (xml_parser_build_tree_with_options (&doc, XML_PARSER_RELAXED | XML_PARSER_MULTI_TEXT) < 0)
171
+ xml_parser = xml_parser_init (contents, size, XML_PARSER_CASE_INSENSITIVE);
172
+ if (xml_parser_build_tree_with_options (xml_parser, &doc, XML_PARSER_RELAXED | XML_PARSER_MULTI_TEXT) < 0) {
173
+ xml_parser_finalize (xml_parser);
177
+ xml_parser_finalize (xml_parser);
180
for (node = doc; node != NULL; node = node->next) {
181
@@ -1705,12 +1710,14 @@
185
- xml_parser_init (new_contents, new_size, XML_PARSER_CASE_INSENSITIVE);
186
- if (xml_parser_build_tree_with_options (&doc, XML_PARSER_RELAXED | XML_PARSER_MULTI_TEXT) < 0) {
187
+ xml_parser = xml_parser_init (new_contents, new_size, XML_PARSER_CASE_INSENSITIVE);
188
+ if (xml_parser_build_tree_with_options (xml_parser, &doc, XML_PARSER_RELAXED | XML_PARSER_MULTI_TEXT) < 0) {
189
+ xml_parser_finalize (xml_parser);
190
g_free (new_contents);
194
+ xml_parser_finalize (xml_parser);
195
g_free (new_contents);
200
--- totem-pl-parser-2.28.1.orig/plparse/xmlparser.h
201
+++ totem-pl-parser-2.28.1/plparse/xmlparser.h
203
struct xml_node_s *next;
206
-void xml_parser_init(const char * buf, int size, int mode) XINE_PROTECTED;
207
+typedef struct xml_parser_s {
208
+ struct lexer *lexer;
212
-int xml_parser_build_tree(xml_node_t **root_node) XINE_PROTECTED;
213
-int xml_parser_build_tree_with_options(xml_node_t **root_node, int flags) XINE_PROTECTED;
214
+xml_parser_t *xml_parser_init(const char * buf, int size, int mode) XINE_PROTECTED;
215
+void xml_parser_finalize(xml_parser_t *xml_parser) XINE_PROTECTED;
217
+int xml_parser_build_tree(xml_parser_t *xml_parser, xml_node_t **root_node) XINE_PROTECTED;
218
+int xml_parser_build_tree_with_options(xml_parser_t *xml_parser, xml_node_t **root_node, int flags) XINE_PROTECTED;
220
void xml_parser_free_tree(xml_node_t *root_node) XINE_PROTECTED;
224
--- totem-pl-parser-2.28.1.orig/plparse/xmllexer.c
225
+++ totem-pl-parser-2.28.1/plparse/xmllexer.c
228
/* private constants*/
230
-/* private global variables */
231
-static const char * lexbuf;
232
-static int lexbuf_size = 0;
233
-static int lexbuf_pos = 0;
234
-static int in_comment = 0;
235
-static char *lex_malloc = NULL;
237
enum utf { UTF32BE, UTF32LE, UTF16BE, UTF16LE };
239
-static void lex_convert (const char * buf, int size, enum utf utf)
240
+static void lex_convert (struct lexer * lexer, const char * buf, int size, enum utf utf)
242
char *utf8 = malloc (size * (utf >= UTF16BE ? 3 : 6) + 1);
248
- lexbuf_size = bp - utf8;
249
- lexbuf = lex_malloc = realloc (utf8, lexbuf_size + 1);
250
+ lexer->lexbuf_size = bp - utf8;
251
+ lexer->lexbuf = lexer->lex_malloc = realloc (utf8, lexer->lexbuf_size + 1);
258
-} lex_mode = NORMAL;
260
-void lexer_init(const char * buf, int size) {
261
+struct lexer *lexer_init(const char * buf, int size) {
262
static const char boms[] = { 0xFF, 0xFE, 0, 0, 0xFE, 0xFF },
263
bom_utf8[] = { 0xEF, 0xBB, 0xBF };
264
+ struct lexer * lexer = calloc (1, sizeof (*lexer));
270
- lexbuf_size = size;
271
+ lexer->lexbuf = buf;
272
+ lexer->lexbuf_size = size;
274
if (size >= 4 && !memcmp (buf, boms + 2, 4))
275
- lex_convert (buf + 4, size - 4, UTF32BE);
276
+ lex_convert (lexer, buf + 4, size - 4, UTF32BE);
277
else if (size >= 4 && !memcmp (buf, boms, 4))
278
- lex_convert (buf + 4, size - 4, UTF32LE);
279
+ lex_convert (lexer, buf + 4, size - 4, UTF32LE);
280
else if (size >= 3 && !memcmp (buf, bom_utf8, 3))
284
+ lexer->lexbuf += 3;
285
+ lexer->lexbuf_size -= 3;
287
else if (size >= 2 && !memcmp (buf, boms + 4, 2))
288
- lex_convert (buf + 2, size - 2, UTF16BE);
289
+ lex_convert (lexer, buf + 2, size - 2, UTF16BE);
290
else if (size >= 2 && !memcmp (buf, boms, 2))
291
- lex_convert (buf + 2, size - 2, UTF16LE);
292
+ lex_convert (lexer, buf + 2, size - 2, UTF16LE);
297
+ lexer->lexbuf_pos = 0;
298
+ lexer->lex_mode = NORMAL;
299
+ lexer->in_comment = 0;
301
lprintf("buffer length %d\n", size);
305
+void lexer_finalize(struct lexer * lexer)
307
+ free (lexer->lex_malloc);
312
@@ -144,17 +136,17 @@
313
STATE_IDENT /* must be last */
316
-int lexer_get_token(char * tok, int tok_size) {
317
+int lexer_get_token(struct lexer * lexer, char * tok, int tok_size) {
319
lexer_state_t state = STATE_IDLE;
323
- while ((tok_pos < tok_size) && (lexbuf_pos < lexbuf_size)) {
324
- c = lexbuf[lexbuf_pos];
325
- lprintf("c=%c, state=%d, lex_mode=%d, in_comment=%d\n", c, state, lex_mode, in_comment);
326
+ while ((tok_pos < tok_size) && (lexer->lexbuf_pos < lexer->lexbuf_size)) {
327
+ c = lexer->lexbuf[lexer->lexbuf_pos];
328
+ lprintf("c=%c, state=%d, lex_mode=%d, lexer->in_comment=%d\n", c, state, lexer->lex_mode, lexer->in_comment);
330
- switch (lex_mode) {
331
+ switch (lexer->lex_mode) {
340
+ if (!lexer->in_comment)
341
state = STATE_T_M_STOP_2;
349
+ if (!lexer->in_comment)
350
state = STATE_T_TI_STOP;
353
@@ -226,14 +218,14 @@
358
+ lexer->lexbuf_pos++;
363
if (c == '\n' || (c == '\r')) {
366
+ lexer->lexbuf_pos++;
372
if (c == ' ' || (c == '\t')) {
375
+ lexer->lexbuf_pos++;
379
@@ -258,20 +250,20 @@
384
+ lexer->lexbuf_pos++;
385
tok_pos++; /* FIXME */
392
+ lexer->lexbuf_pos++;
394
state = STATE_T_COMMENT;
399
+ lexer->lexbuf_pos++;
400
tok_pos++; /* FIXME */
405
case STATE_T_M_STOP_1:
409
+ if (!lexer->in_comment)
410
+ lexer->lex_mode = DATA;
414
@@ -294,11 +286,11 @@
415
case STATE_T_M_STOP_2:
419
+ lexer->lexbuf_pos++;
420
tok_pos++; /* FIXME */
424
+ if (!lexer->in_comment)
425
+ lexer->lex_mode = DATA;
431
case STATE_T_STRING_DOUBLE:
434
+ lexer->lexbuf_pos++;
435
if (c == '\"') { /* " */
436
tok[tok_pos] = '\0'; /* FIXME */
438
@@ -327,33 +319,33 @@
439
case STATE_T_COMMENT:
443
- if (lexbuf[lexbuf_pos] == '-')
444
+ lexer->lexbuf_pos++;
445
+ if (lexer->lexbuf[lexer->lexbuf_pos] == '-')
448
+ lexer->lexbuf_pos++;
449
tok[tok_pos++] = '-'; /* FIXME */
450
tok[tok_pos++] = '-';
453
+ lexer->in_comment = 1;
459
- if (strncmp(lexbuf + lexbuf_pos, "OCTYPE", 6) == 0) {
460
+ lexer->lexbuf_pos++;
461
+ if (strncmp(lexer->lexbuf + lexer->lexbuf_pos, "OCTYPE", 6) == 0) {
462
strncpy(tok + tok_pos, "DOCTYPE", 7); /* FIXME */
464
+ lexer->lexbuf_pos += 6;
465
return T_DOCTYPE_START;
472
- if (strncmp(lexbuf + lexbuf_pos, "CDATA[", 6) == 0) {
473
+ lexer->lexbuf_pos++;
474
+ if (strncmp(lexer->lexbuf + lexer->lexbuf_pos, "CDATA[", 6) == 0) {
475
strncpy (tok + tok_pos, "[CDATA[", 7); /* FIXME */
478
+ lexer->lexbuf_pos += 6;
479
+ lexer->lex_mode = CDATA;
480
return T_CDATA_START;
483
@@ -369,11 +361,11 @@
484
case STATE_T_TI_STOP:
488
+ lexer->lexbuf_pos++;
489
tok_pos++; /* FIXME */
493
+ if (!lexer->in_comment)
494
+ lexer->lex_mode = DATA;
498
@@ -387,13 +379,13 @@
503
+ lexer->lexbuf_pos++;
504
state = STATE_T_C_STOP;
510
+ lexer->lexbuf_pos++;
514
@@ -404,21 +396,21 @@
519
+ lexer->lexbuf_pos++;
520
tok[tok_pos] = '\0'; /* FIX ME */
521
if (strlen(tok) != 3) {
522
tok[tok_pos - 3] = '\0';
524
+ lexer->lexbuf_pos -= 3;
528
+ lexer->in_comment = 0;
536
+ lexer->lexbuf_pos++;
541
/* T_STRING (single quotes) */
542
case STATE_T_STRING_SINGLE:
545
+ lexer->lexbuf_pos++;
546
if (c == '\'') { /* " */
547
tok[tok_pos] = '\0'; /* FIXME */
549
@@ -453,19 +445,19 @@
554
+ lexer->lexbuf_pos++;
555
state = STATE_T_TI_STOP;
561
+ lexer->lexbuf_pos++;
562
state = STATE_T_DASHDASH;
568
+ lexer->lexbuf_pos++;
572
@@ -479,12 +471,12 @@
577
+ lexer->lex_mode = NORMAL;
583
+ lexer->lexbuf_pos++;
587
@@ -492,32 +484,32 @@
591
- if (strncmp(lexbuf + lexbuf_pos, "]]>", 3) == 0) {
594
+ if (strncmp(lexer->lexbuf + lexer->lexbuf_pos, "]]>", 3) == 0) {
595
+ lexer->lexbuf_pos += 3;
596
+ lexer->lex_mode = DATA;
602
+ lexer->lexbuf_pos++;
609
+ lexer->lexbuf_pos++;
614
lprintf ("loop done tok_pos = %d, tok_size=%d, lexbuf_pos=%d, lexbuf_size=%d\n",
615
- tok_pos, tok_size, lexbuf_pos, lexbuf_size);
616
+ tok_pos, tok_size, lexer->lexbuf_pos, lexer->lexbuf_size);
619
if (tok_pos >= tok_size) {
620
lprintf("token buffer is too little\n");
622
- if (lexbuf_pos >= lexbuf_size) {
623
+ if (lexer->lexbuf_pos >= lexer->lexbuf_size) {
624
/* Terminate the current token */