source: trunk/gsdl/src/colservr/expat_document.cpp@ 9743

Last change on this file since 9743 was 9743, checked in by davidb, 19 years ago

conflict over 'const char*' being passed to function (appendcarr) that
requires 'char*'. Type cast added.

  • Property svn:keywords set to Author Date Id Revision
File size: 2.5 KB
Line 
1
2#include <stdio.h>
3#include <string.h>
4#include <expat.h>
5
6#if defined(GSDL_USE_OBJECTSPACE)
7# include <ospace\std\iostream>
8#elif defined(GSDL_USE_IOS_H)
9# include <iostream.h>
10#else
11# include <iostream>
12using namespace std;
13#endif
14
15#include "queryinfo.h"
16
17#include "expat_document.h"
18
19#include "text_t.h"
20#include "fileutil.h"
21#include "expat_resultset.h"
22
23struct resultpack {
24 text_t *current_text;
25 text_t *section_num;
26 text_t *section_level;
27 bool store_text;
28};
29
30static void XMLCALL
31startElement(void *userData, const char *name, const char **attributes)
32{
33 resultpack * rpack_ptr = (resultpack*)userData;
34 text_t element_name = (char*)name;
35 if (element_name == *(rpack_ptr->section_level)) {
36 text_t id_att = (char *)get_attribute(attributes,"gs2:id");
37 if (id_att == *(rpack_ptr->section_num)) {
38 rpack_ptr->store_text = true;
39 }
40
41 }
42}
43
44static void XMLCALL
45endElement(void *userData, const char *name)
46{
47 resultpack * rpack_ptr = (resultpack*)userData;
48 text_t element_name = (char*)name;
49 if (element_name == *(rpack_ptr->section_level)) {
50 if (rpack_ptr->store_text == true) {
51 // we have finished now, can we quit this??
52 rpack_ptr->store_text = false;
53 }
54 }
55
56}
57
58static void XMLCALL
59characterData(void *userData, const char * text, int len) {
60 resultpack * rpack_ptr = (resultpack*)userData;
61 if (rpack_ptr->store_text) {
62 rpack_ptr->current_text->appendcarr((char*)text, len);
63 }
64}
65int expat_document(const text_t &filename, const text_t &sec_level, const text_t &sec_num, text_t & doc_content){
66
67 text_t current_text;
68 current_text.clear();
69 text_t section_num = sec_num;
70 text_t section_level = sec_level;
71
72
73 resultpack rpack = { &current_text, &section_num, &section_level, false};
74 //cerr << "sec num = "<<sec_num<<", sec level="<<sec_level<<", filename="<<filename<<endl;
75 text_t doc_text;
76 read_file(filename, doc_text);
77
78
79 char * c_doc_text = doc_text.getcstr();
80 XML_Parser parser = XML_ParserCreate(NULL);
81
82 XML_SetUserData(parser, &rpack);
83 XML_SetElementHandler(parser, startElement, endElement);
84 XML_SetCharacterDataHandler(parser, characterData);
85 int return_status = 0;
86 const int parse_status
87 = XML_Parse(parser, c_doc_text, strlen(c_doc_text), XML_TRUE);
88
89 if (parse_status == XML_STATUS_ERROR) {
90 fprintf(stderr,
91 "%s at line %d\n",
92 XML_ErrorString(XML_GetErrorCode(parser)),
93 XML_GetCurrentLineNumber(parser));
94 return_status = 1;
95 }
96
97 XML_ParserFree(parser);
98 free(c_doc_text);
99 doc_content.clear();
100 doc_content.append(current_text);
101 return return_status;
102}
103
104
Note: See TracBrowser for help on using the repository browser.