27 #include "sixtp-stack.h"
35 for (lp = sf->data_from_children; lp; lp = lp->next)
39 g_slist_free(sf->data_from_children);
40 sf->data_from_children = NULL;
46 sixtp_stack_frame_new(
sixtp* next_parser,
char *tag)
51 new_frame->parser = next_parser;
53 new_frame->data_for_children = NULL;
54 new_frame->data_from_children = NULL;
55 new_frame->frame_data = NULL;
56 new_frame->line = new_frame->col = -1;
64 gchar *is = g_strnfill(indent,
' ');
66 fprintf(f,
"%s(stack-frame %p\n", is, sf);
67 fprintf(f,
"%s (line %d) (col %d)\n", is, sf->line, sf->col );
68 fprintf(f,
"%s (parser %p)\n", is, sf->parser);
69 fprintf(f,
"%s (tag %s)\n", is, sf->tag ? sf->tag :
"(null)");
70 fprintf(f,
"%s (data-for-children %p)\n", is,
71 sf->data_for_children);
75 fprintf(f,
"%s (data-from-children", is);
76 for (lp = sf->data_from_children; lp; lp = lp->next)
84 fprintf(f,
"%s (frame-data %p))\n", is, sf->frame_data);
90 sixtp_pop_and_destroy_frame(GSList *frame_stack)
95 result = g_slist_next(frame_stack);
96 sixtp_stack_frame_destroy(dead_frame);
97 g_slist_free_1(frame_stack);
102 sixtp_print_frame_stack(GSList *stack, FILE *f)
105 GSList *printcopy = g_slist_reverse(g_slist_copy(stack));
109 for (lp = printcopy; lp; lp = lp->next)
112 sixtp_stack_frame_print(frame, indent, f);
121 sixtp_context_new(
sixtp *initial_parser, gpointer global_data,
122 gpointer top_level_data)
128 ret->handler.startElement = sixtp_sax_start_handler;
129 ret->handler.endElement = sixtp_sax_end_handler;
130 ret->handler.characters = sixtp_sax_characters_handler;
131 ret->handler.getEntity = sixtp_sax_get_entity_handler;
133 ret->data.parsing_ok = TRUE;
134 ret->data.stack = NULL;
135 ret->data.global_data = global_data;
137 ret->top_frame = sixtp_stack_frame_new(initial_parser, NULL);
139 ret->top_frame_data = top_level_data;
141 ret->data.stack = g_slist_prepend(ret->data.stack,
142 (gpointer) ret->top_frame);
144 if (initial_parser->start_handler)
146 if (!initial_parser->start_handler(NULL,
147 &ret->top_frame_data,
148 &ret->data.global_data,
149 &ret->top_frame->data_for_children,
150 &ret->top_frame->frame_data,
153 sixtp_handle_catastrophe(&ret->data);
154 sixtp_context_destroy(ret);
165 if (ctxt->top_frame->parser->end_handler)
167 ctxt->data.parsing_ok &=
168 ctxt->top_frame->parser->end_handler(
169 ctxt->top_frame->data_for_children,
170 ctxt->top_frame->data_from_children,
172 ctxt->top_frame_data,
173 ctxt->data.global_data,
174 &ctxt->top_frame->frame_data,
182 sixtp_stack_frame_destroy(context->top_frame);
183 g_slist_free(context->data.stack);
184 context->data.saxParserCtxt->userData = NULL;
185 context->data.saxParserCtxt->sax = NULL;
186 xmlFreeParserCtxt(context->data.saxParserCtxt);
187 context->data.saxParserCtxt = NULL;