Browse Source

Added xml_open_document API call to read a XML document from file

Squashed commit of the following:

commit 3501a6d4a4
Author: ooxi <85fcd0ef4ec8@f977375cdcd6.anonbox.net>
Date:   Thu Nov 1 16:10:37 2012 +0100

    Open XML document...

commit e4f6335425
Author: ooxi <85fcd0ef4ec8@f977375cdcd6.anonbox.net>
Date:   Thu Nov 1 16:10:04 2012 +0100

    Open XML document...

commit cf9b46c260
Author: ooxi <85fcd0ef4ec8@f977375cdcd6.anonbox.net>
Date:   Thu Nov 1 16:09:56 2012 +0100

    Open XML document...

commit be3baa3d99
Author: ooxi <85fcd0ef4ec8@f977375cdcd6.anonbox.net>
Date:   Thu Nov 1 16:09:48 2012 +0100

    Open XML document...

commit 9be46ba2cf
Author: ooxi <85fcd0ef4ec8@f977375cdcd6.anonbox.net>
Date:   Thu Nov 1 16:07:35 2012 +0100

    Open XML document...

commit 081a599747
Author: ooxi <85fcd0ef4ec8@f977375cdcd6.anonbox.net>
Date:   Thu Nov 1 16:06:58 2012 +0100

    Open XML document...

commit 4af3334803
Author: ooxi <85fcd0ef4ec8@f977375cdcd6.anonbox.net>
Date:   Thu Nov 1 16:05:24 2012 +0100

    Open XML document...

commit f5c3a25541
Author: ooxi <85fcd0ef4ec8@f977375cdcd6.anonbox.net>
Date:   Thu Nov 1 16:04:30 2012 +0100

    Open XML document...

commit 81ee66c39e
Author: ooxi <85fcd0ef4ec8@f977375cdcd6.anonbox.net>
Date:   Thu Nov 1 16:02:53 2012 +0100

    Open XML document...

commit 1448aa1484
Author: ooxi <85fcd0ef4ec8@f977375cdcd6.anonbox.net>
Date:   Thu Nov 1 16:02:03 2012 +0100

    Open XML document...

commit dc767c8d67
Author: ooxi <85fcd0ef4ec8@f977375cdcd6.anonbox.net>
Date:   Thu Nov 1 16:01:14 2012 +0100

    Open XML document...

commit ad23dcc127
Author: ooxi <85fcd0ef4ec8@f977375cdcd6.anonbox.net>
Date:   Thu Nov 1 16:00:25 2012 +0100

    Open XML document...

commit f7c905130d
Author: ooxi <85fcd0ef4ec8@f977375cdcd6.anonbox.net>
Date:   Thu Nov 1 15:59:31 2012 +0100

    Open XML document...

commit 1cce95d462
Author: ooxi <85fcd0ef4ec8@f977375cdcd6.anonbox.net>
Date:   Thu Nov 1 15:57:29 2012 +0100

    Open XML document...

commit 1b3fa5f684
Author: ooxi <85fcd0ef4ec8@f977375cdcd6.anonbox.net>
Date:   Thu Nov 1 15:45:03 2012 +0100

    Open XML document...

commit 0778105ea2
Author: ooxi <85fcd0ef4ec8@f977375cdcd6.anonbox.net>
Date:   Thu Nov 1 15:41:48 2012 +0100

    Open XML document...

commit 64418dcb81
Author: ooxi <85fcd0ef4ec8@f977375cdcd6.anonbox.net>
Date:   Thu Nov 1 15:41:06 2012 +0100

    Open XML document...

commit 54061a0e3b
Author: ooxi <85fcd0ef4ec8@f977375cdcd6.anonbox.net>
Date:   Thu Nov 1 15:40:39 2012 +0100

    Open XML document...

commit e776734fa2
Author: ooxi <85fcd0ef4ec8@f977375cdcd6.anonbox.net>
Date:   Thu Nov 1 15:39:39 2012 +0100

    Open XML document...

commit 81bbf1e0c3
Author: ooxi <85fcd0ef4ec8@f977375cdcd6.anonbox.net>
Date:   Thu Nov 1 15:38:36 2012 +0100

    Open XML document...
master
ooxi 12 years ago
parent
commit
d049d16a6d
5 changed files with 100 additions and 5 deletions
  1. +5
    -1
      CMakeLists.txt
  2. +47
    -2
      src/xml.c
  3. +17
    -2
      src/xml.h
  4. +24
    -0
      test/test-xml.c
  5. +7
    -0
      test/test.xml

+ 5
- 1
CMakeLists.txt View File

@@ -2,7 +2,7 @@
PROJECT(xml)
SET(VERSION_MAJOR "0")
SET(VERSION_MINOR "1")
SET(VERSION_PATCH "3")
SET(VERSION_PATCH "4")
CMAKE_MINIMUM_REQUIRED(VERSION 2.6.0 FATAL_ERROR)
@@ -30,6 +30,10 @@ ADD_EXECUTABLE(test-xml
)
TARGET_LINK_LIBRARIES(test-xml xml)
FILE( COPY ${TEST_SOURCE_DIRECTORY}/test.xml
DESTINATION ${PROJECT_BINARY_DIR}
)
# Building example
ADD_EXECUTABLE(example


+ 47
- 2
src/xml.c View File

@@ -629,8 +629,6 @@ exit_failure:

/**
* [PUBLIC API]
*
*
*/
struct xml_document* xml_parse_document(uint8_t* buffer, size_t length) {

@@ -669,6 +667,53 @@ struct xml_document* xml_parse_document(uint8_t* buffer, size_t length) {



/**
* [PUBLIC API]
*/
struct xml_document* xml_open_document(FILE* source) {

/* Prepare buffer
*/
size_t const read_chunk = 1; // TODO 4096;

size_t document_length = 0;
size_t buffer_size = 1; // TODO 4069
uint8_t* buffer = malloc(buffer_size * sizeof(uint8_t));

/* Read hole file into buffer
*/
while (!feof(source)) {

/* Reallocate buffer
*/
if (buffer_size - document_length < read_chunk) {
buffer = realloc(buffer, buffer_size + 2 * read_chunk);
buffer_size += 2 * read_chunk;
}

size_t read = fread(
&buffer[document_length],
sizeof(uint8_t), read_chunk,
source
);

document_length += read;
}
fclose(source);

/* Try to parse buffer
*/
struct xml_document* document = xml_parse_document(buffer, document_length);

if (!document) {
free(buffer);
return 0;
}
return document;
}



/**
* [PUBLIC API]
*/


+ 17
- 2
src/xml.h View File

@@ -53,14 +53,29 @@ struct xml_string;
*
* @warning `buffer` will be referenced by the document, you may not free it
* until you free the xml_document
* @warning You have to call xml_free after you finished using the document
* @warning You have to call xml_document_free after you finished using the
* document
*
* @return The parsed xml fragment iff `parsing was successful
* @return The parsed xml fragment iff parsing was successful, 0 otherwise
*/
struct xml_document* xml_parse_document(uint8_t* buffer, size_t length);



/**
* Tries to read an XML document from disk
*
* @param source File that will be read into an xml document. Will be closed
*
* @warning You have to call xml_document_free with free_buffer = true after you
* finished using the document
*
* @return The parsed xml fragment iff parsing was successful, 0 otherwise
*/
struct xml_document* xml_open_document(FILE* source);



/**
* Frees all resources associated with the document. All xml_node and xml_string
* references obtained through the document will be invalidated


+ 24
- 0
test/test-xml.c View File

@@ -193,6 +193,29 @@ static void test_xml_parse_document_2() {



/**
* Tests the xml_open_document functionality
*/
static void test_xml_parse_document_3() {
#define FILE_NAME "test.xml"
FILE* handle = fopen(FILE_NAME, "rb");
assert_that(handle, "Cannot open " FILE_NAME);

struct xml_document* document = xml_open_document(handle);
assert_that(document, "Cannot parse " FILE_NAME);

struct xml_node* element = xml_easy_child(
xml_document_root(document), "Element", "With", 0
);
assert_that(element, "Cannot find Document/Element/With");
assert_that(string_equals(xml_node_content(element), "Child"), "Content of Document/Element/With must be `Child'");

xml_document_free(document, true);
#undef FILE_NAME
}





/**
@@ -202,6 +225,7 @@ int main(int argc, char** argv) {
test_xml_parse_document_0();
test_xml_parse_document_1();
test_xml_parse_document_2();
test_xml_parse_document_3();

fprintf(stdout, "All tests passed :-)\n");
exit(EXIT_SUCCESS);


+ 7
- 0
test/test.xml View File

@@ -0,0 +1,7 @@
<Document>
<Prefix></Prefix>
<Element>
<With>Child</With>
</Element>
</Document>


Loading…
Cancel
Save