You are viewing a plain text version of this content. The canonical link for it is here.
Posted to axis-cvs@ws.apache.org by sa...@apache.org on 2005/10/01 03:55:42 UTC
svn commit: r292897 - in
/webservices/axis2/trunk/c/modules/xml/guththila/src:
guththila_xml_stream_writer.c guththila_xml_stream_writer.h
Author: samisa
Date: Fri Sep 30 18:55:30 2005
New Revision: 292897
URL: http://svn.apache.org/viewcvs?rev=292897&view=rev
Log:
Initial implementation of XML stream writer API
Added:
webservices/axis2/trunk/c/modules/xml/guththila/src/guththila_xml_stream_writer.c
webservices/axis2/trunk/c/modules/xml/guththila/src/guththila_xml_stream_writer.h
Added: webservices/axis2/trunk/c/modules/xml/guththila/src/guththila_xml_stream_writer.c
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/c/modules/xml/guththila/src/guththila_xml_stream_writer.c?rev=292897&view=auto
==============================================================================
--- webservices/axis2/trunk/c/modules/xml/guththila/src/guththila_xml_stream_writer.c (added)
+++ webservices/axis2/trunk/c/modules/xml/guththila/src/guththila_xml_stream_writer.c Fri Sep 30 18:55:30 2005
@@ -0,0 +1,644 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include "guththila_xml_stream_writer.h"
+
+#include <apr_strings.h>
+
+ guththila_xml_stream_writer_t* guththila_create_xml_stream_writer(FILE* writer, char* encoding, int prefix_defaulting)
+{
+ guththila_xml_stream_writer_t *stream_writer = (guththila_xml_stream_writer_t*) malloc (sizeof (guththila_xml_stream_writer_t));
+ stream_writer->writer = writer;
+ stream_writer->encoding = encoding;
+ stream_writer->prefix_defaulting = prefix_defaulting;
+
+ //initialize APR pool, we ned this pool to allocate memory to hash map and stack
+
+ apr_status_t status;
+
+ if (!guththila_apr_pool)
+ {
+ status = apr_pool_create(&guththila_apr_pool, NULL);
+ }
+
+ stream_writer->element_stack = apr_array_make(guththila_apr_pool, 64, sizeof(char**));
+ stream_writer->namespace_hash = apr_hash_make(guththila_apr_pool);
+ stream_writer->prefix_hash = apr_hash_make(guththila_apr_pool);
+ stream_writer->in_start_element = 0;
+ stream_writer->empty_element = 0;
+
+ return stream_writer;
+}
+
+ int guththila_xml_stream_writer_end_start_element(guththila_xml_stream_writer_t* stream_writer)
+{
+ if (!stream_writer)
+ return GUTHTHILA_STREAM_WRITER_ERROR_STREAM_STRUCT_NULL;
+ if (!stream_writer->in_start_element)
+ return GUTHTHILA_STREAM_WRITER_ERROR_NOT_IN_START_ELEMENT;
+ if (stream_writer->empty_element)
+ {
+ if (fputs("/", stream_writer->writer) == EOF)
+ {
+ return GUTHTHILA_STREAM_WRITER_ERROR_WRITING_TO_STREAM;
+ }
+
+ //pop last element and delete that elelemt
+ char** del_element = (char**) apr_array_pop( stream_writer->element_stack );
+ if (del_element)
+ {
+ if (del_element[0])
+ free(del_element[0]);
+ if (del_element[1])
+ free(del_element[1]);
+ free(del_element);
+ }
+ del_element = 0;
+ //end pop element
+
+ stream_writer->empty_element = 0;
+ }
+ fputs(">", stream_writer->writer);
+ stream_writer->in_start_element = 0;
+
+ return GUTHTHILA_SUCCESS;
+}
+
+ int guththila_xml_stream_writer_write_start_element(guththila_xml_stream_writer_t* stream_writer, char* local_name)
+{
+ if (!stream_writer)
+ return GUTHTHILA_STREAM_WRITER_ERROR_STREAM_STRUCT_NULL;
+ if (!local_name)
+ return GUTHTHILA_STREAM_WRITER_ERROR_LOCAL_NAME_NULL;
+ guththila_xml_stream_writer_end_start_element(stream_writer);
+ //namespaces.pushContext();
+ fputs("<", stream_writer->writer);
+ fputs(local_name, stream_writer->writer);
+
+ //push element to stack
+ char** new_element = (char**)apr_array_push(stream_writer->element_stack);
+ new_element = (char**) malloc( sizeof(char**) * 2 );
+ new_element[0] = 0;
+ new_element[1] = strdup(local_name);
+ //end push element
+
+ stream_writer->in_start_element = 1;
+
+ return GUTHTHILA_SUCCESS;
+}
+
+
+ int guththila_xml_stream_writer_write_start_element_with_namespace(guththila_xml_stream_writer_t* stream_writer, char* local_name, char* namespace_uri)
+{
+ if (!stream_writer)
+ return GUTHTHILA_STREAM_WRITER_ERROR_STREAM_STRUCT_NULL;
+ if (!local_name)
+ return GUTHTHILA_STREAM_WRITER_ERROR_LOCAL_NAME_NULL;
+ if (!namespace_uri)
+ return GUTHTHILA_STREAM_WRITER_ERROR_NAMESPACE_NULL;
+
+ guththila_xml_stream_writer_end_start_element(stream_writer);
+
+ char* prefix = guththila_xml_stream_writer_get_prefix(stream_writer, namespace_uri);
+
+ int is_declared = (prefix != 0);
+
+ if (!is_declared)
+ {
+ if (stream_writer->prefix_defaulting)
+ prefix = GUTHTHILA_DEFAULT_NS_PREFIX;
+ else
+ return GUTHTHILA_STREAM_WRITER_ERROR_NAMESPACE_NOT_DECLARED;
+ }
+
+ fputs("<", stream_writer->writer);
+
+ if (prefix && strlen(prefix) != 0)
+ {
+ fputs(prefix, stream_writer->writer);
+ fputs(":", stream_writer->writer);
+ }
+
+ fputs(local_name, stream_writer->writer);
+
+ if (stream_writer->prefix_defaulting && !is_declared)
+ {
+ if (prefix)
+ guththila_xml_stream_writer_write_namespace(stream_writer, prefix, namespace_uri);
+ }
+ //push element to stack
+ char** new_element = (char**)apr_array_push(stream_writer->element_stack);
+ new_element = (char**) malloc( sizeof(char**) * 2 );
+ if(prefix)
+ new_element[0] = strdup(prefix);
+ else
+ new_element[0] = 0;
+ new_element[1] = strdup(local_name);
+ //end push element
+
+ stream_writer->in_start_element = 1;
+
+ return GUTHTHILA_SUCCESS;
+}
+
+ int guththila_xml_stream_writer_write_start_element_with_namespace_prefix(guththila_xml_stream_writer_t* stream_writer, char* local_name, char* namespace_uri, char* prefix)
+{
+ if (!stream_writer)
+ return GUTHTHILA_STREAM_WRITER_ERROR_STREAM_STRUCT_NULL;
+ if (!local_name)
+ return GUTHTHILA_STREAM_WRITER_ERROR_LOCAL_NAME_NULL;
+ if (!namespace_uri)
+ return GUTHTHILA_STREAM_WRITER_ERROR_NAMESPACE_NULL;
+ if (!prefix)
+ return GUTHTHILA_STREAM_WRITER_ERROR_PREFIX_NULL;
+
+ guththila_xml_stream_writer_end_start_element(stream_writer);
+
+ char* current_prefix = guththila_xml_stream_writer_get_prefix(stream_writer, namespace_uri);
+ int is_current = ( strcmp(prefix, current_prefix) != 0 );
+ fputs("<", stream_writer->writer);
+
+ if (prefix && strlen(prefix) != 0)
+ {
+ fputs(prefix, stream_writer->writer);
+ fputs(":", stream_writer->writer);
+ }
+
+ fputs(local_name, stream_writer->writer);
+
+ if (stream_writer->prefix_defaulting && !is_current)
+ {
+ if (prefix)
+ guththila_xml_stream_writer_write_namespace(stream_writer, prefix, namespace_uri);
+ }
+
+ //push element to stack
+ char** new_element = (char**)apr_array_push(stream_writer->element_stack);
+ new_element = (char**) malloc( sizeof(char**) * 2 );
+ if(prefix)
+ new_element[0] = strdup(prefix);
+ else
+ new_element[0] = 0;
+ new_element[1] = strdup(local_name);
+ //end push element
+
+ stream_writer->in_start_element = 1;
+
+ return GUTHTHILA_SUCCESS;
+ }
+
+
+ int guththila_xml_stream_writer_write_empty_element(guththila_xml_stream_writer_t* stream_writer, char* local_name)
+ {
+ int ret = guththila_xml_stream_writer_write_start_element(stream_writer, local_name);
+
+ if (ret != GUTHTHILA_SUCCESS)
+ return ret;
+
+ stream_writer->empty_element = 1;
+
+ return GUTHTHILA_SUCCESS;
+ }
+
+ int guththila_xml_stream_writer_write_empty_element_with_namespace(guththila_xml_stream_writer_t* stream_writer, char* local_name, char* namespace_uri)
+ {
+ int ret = guththila_xml_stream_writer_write_start_element_with_namespace(stream_writer, local_name, namespace_uri);
+
+ if (ret != GUTHTHILA_SUCCESS)
+ return ret;
+
+ stream_writer->empty_element = 1;
+
+ return GUTHTHILA_SUCCESS;
+ }
+
+ int guththila_xml_stream_writer_write_empty_element_with_namespace_prefix(guththila_xml_stream_writer_t* stream_writer, char* local_name, char* namespace_uri, char* prefix)
+ {
+ int ret = guththila_xml_stream_writer_write_start_element_with_namespace_prefix(stream_writer, local_name, namespace_uri, prefix);
+
+ if (ret != GUTHTHILA_SUCCESS)
+ return ret;
+
+ stream_writer->empty_element = 1;
+
+ return GUTHTHILA_SUCCESS;
+ }
+
+ int guththila_xml_stream_writer_write_end_element(guththila_xml_stream_writer_t* stream_writer)
+ {
+ guththila_xml_stream_writer_end_start_element(stream_writer);
+
+ // pop element stack
+ char** element_data = (char**) apr_array_pop(stream_writer->element_stack);
+ if (!element_data )
+ return GUTHTHILA_STREAM_WRITER_ERROR_ELEMENT_STACK_EMPTY;
+ if(element_data[0])
+ free( element_data[0]);
+ if(element_data[1])
+ free( element_data[1]);
+ element_data = 0;
+ //end pop element stack
+
+ fputs("</", stream_writer->writer);
+
+ if (element_data[0] && strlen(element_data[0]) > 0 )
+ {
+ fputs(element_data[0], stream_writer->writer);
+ fputs(":", stream_writer->writer);
+ }
+ fputs(element_data[1], stream_writer->writer);
+ fputs(">", stream_writer->writer);
+ return GUTHTHILA_SUCCESS;
+ }
+
+
+ int guththila_xml_stream_writer_write_end_document(guththila_xml_stream_writer_t* stream_writer)
+
+ {
+ while (!apr_is_empty_array(stream_writer->element_stack))
+ {
+ int ret = guththila_xml_stream_writer_write_end_element (stream_writer);
+ if (ret != GUTHTHILA_SUCCESS)
+ return ret;
+
+ }
+ return GUTHTHILA_SUCCESS;
+ }
+
+
+ int guththila_xml_stream_writer_write_attribute(guththila_xml_stream_writer_t* stream_writer, char* local_name, char* value)
+ {
+ if (!stream_writer->in_start_element)
+ return GUTHTHILA_STREAM_WRITER_ERROR_ILLEGAL_STATE;
+
+ fputs(" ", stream_writer->writer);
+ fputs(local_name, stream_writer->writer);
+ fputs("=\"", stream_writer->writer);
+ guththila_xml_stream_writer_write_encoded(stream_writer, value, 1);
+ fputs("\"", stream_writer->writer);
+
+ return GUTHTHILA_SUCCESS;
+ }
+
+
+ int guththila_xml_stream_writer_write_attribute_with_namespace(guththila_xml_stream_writer_t* stream_writer, char* local_name, char* value, char* namespace_uri)
+ {
+ if (!stream_writer->in_start_element)
+ return GUTHTHILA_STREAM_WRITER_ERROR_ILLEGAL_STATE;
+
+ char* prefix = guththila_xml_stream_writer_get_prefix(stream_writer, namespace_uri);
+ if (!prefix)
+ {
+ if (stream_writer->prefix_defaulting)
+ {
+ prefix = GUTHTHILA_DEFAULT_NS_PREFIX;
+ guththila_xml_stream_writer_write_namespace(stream_writer, prefix, namespace_uri);
+ }
+ else
+ return GUTHTHILA_STREAM_WRITER_ERROR_NAMESPACE_NOT_DECLARED;
+ }
+
+ fputs(" ", stream_writer->writer);
+
+ if (prefix && strlen(prefix) > 0)
+ {
+ fputs(prefix, stream_writer->writer);
+ fputs(":", stream_writer->writer);
+ }
+ fputs(local_name, stream_writer->writer);
+ fputs("=\"", stream_writer->writer);
+ guththila_xml_stream_writer_write_encoded(stream_writer, value, 1);
+ fputs("\"", stream_writer->writer);
+
+ return GUTHTHILA_SUCCESS;
+ }
+
+ int guththila_xml_stream_writer_write_attribute_with_namespace_prefix(guththila_xml_stream_writer_t* stream_writer, char* local_name, char* value, char* namespace_uri, char* prefix)
+ {
+ if (!stream_writer->in_start_element)
+ return GUTHTHILA_STREAM_WRITER_ERROR_ILLEGAL_STATE;
+
+ char* current_prefix = guththila_xml_stream_writer_get_prefix(stream_writer, namespace_uri);
+ if (!current_prefix)
+ {
+ if (stream_writer->prefix_defaulting)
+ guththila_xml_stream_writer_write_namespace(stream_writer, prefix, namespace_uri);
+ else
+ return GUTHTHILA_STREAM_WRITER_ERROR_NAMESPACE_NOT_DECLARED;
+ }
+ else if (strcmp(current_prefix, prefix) != 0 )
+ return GUTHTHILA_STREAM_WRITER_ERROR_NAMESPACE_NOT_DECLARED;
+
+ fputs(" ", stream_writer->writer);
+
+ if (prefix && strlen(prefix) > 0)
+ {
+ fputs(prefix, stream_writer->writer);
+ fputs(":", stream_writer->writer);
+ }
+ fputs(local_name, stream_writer->writer);
+ fputs("=\"", stream_writer->writer);
+ guththila_xml_stream_writer_write_encoded(stream_writer, value, 1);
+ fputs("\"", stream_writer->writer);
+
+ return GUTHTHILA_SUCCESS;
+ }
+
+ int guththila_xml_stream_writer_write_namespace(guththila_xml_stream_writer_t* stream_writer, char* prefix, char* namespace_uri)
+ {
+ if (!stream_writer->in_start_element)
+ return GUTHTHILA_STREAM_WRITER_ERROR_ILLEGAL_STATE;
+
+ if (!prefix)
+ prefix = GUTHTHILA_DEFAULT_NS_PREFIX;
+
+ guththila_xml_stream_writer_set_prefix(stream_writer, prefix, namespace_uri);
+
+ fputs(" ", stream_writer->writer);
+ fputs("xmlns", stream_writer->writer);
+
+ if (strcmp(GUTHTHILA_DEFAULT_NS_PREFIX, prefix) != 0)
+ {
+ fputs(":", stream_writer->writer);
+ fputs(prefix, stream_writer->writer);
+ }
+ fputs("=\"", stream_writer->writer);
+ fputs(namespace_uri, stream_writer->writer);
+ fputs("\"", stream_writer->writer);
+ return GUTHTHILA_SUCCESS;
+ }
+
+ int guththila_xml_stream_writer_write_default_namespace(guththila_xml_stream_writer_t* stream_writer, char* namespace_uri)
+ {
+ int ret = guththila_xml_stream_writer_write_namespace(stream_writer, GUTHTHILA_DEFAULT_NS_PREFIX, namespace_uri);
+ return ret;
+ }
+
+
+ int guththila_xml_stream_writer_write_comment(guththila_xml_stream_writer_t* stream_writer, char* data)
+ {
+ guththila_xml_stream_writer_end_start_element(stream_writer);
+
+ if (!data)
+ return GUTHTHILA_STREAM_WRITER_ERROR_COMMENT_NULL;
+
+ char* ptr = data;
+ while (*ptr)
+ {
+ if (*ptr++ == '-')
+ if (*ptr == '-')
+ return GUTHTHILA_STREAM_WRITER_ERROR_ILLEGAL_COMMENT;
+ }
+
+ fputs("<!--", stream_writer->writer);
+
+ fputs(data, stream_writer->writer);
+ fputs("-->", stream_writer->writer);
+ return GUTHTHILA_SUCCESS;
+ }
+
+
+ int guththila_xml_stream_writer_write_processing_instruction(guththila_xml_stream_writer_t* stream_writer, char* target)
+ {
+ int ret = guththila_xml_stream_writer_write_processing_instruction_data(stream_writer, target, 0);
+ return ret;
+ }
+
+ int guththila_xml_stream_writer_write_processing_instruction_data(guththila_xml_stream_writer_t* stream_writer, char* target, char* data)
+ {
+ if (!target)
+ return GUTHTHILA_STREAM_WRITER_ERROR_PROCESSING_INSTRUCTION_TARGET_NULL;
+
+ guththila_xml_stream_writer_end_start_element(stream_writer);
+
+ fputs("<?", stream_writer->writer);
+ fputs(target, stream_writer->writer);
+
+ if (data)
+ {
+ fputs(" ", stream_writer->writer);
+ fputs(data, stream_writer->writer);
+ }
+
+ fputs("?>", stream_writer->writer);
+
+ return GUTHTHILA_SUCCESS;
+ }
+
+
+ int guththila_xml_stream_writer_write_cdata(guththila_xml_stream_writer_t* stream_writer, char* data)
+ {
+ if (!data)
+ return GUTHTHILA_STREAM_WRITER_ERROR_CDATA_NULL;
+
+ guththila_xml_stream_writer_end_start_element(stream_writer);
+
+ char* ptr = data;
+ while (*ptr)
+ {
+ if (*ptr++ == ']')
+ if (*ptr == ']')
+ return GUTHTHILA_STREAM_WRITER_ERROR_ILLEGAL_CDATA;
+ }
+
+ fputs("<![CDATA[", stream_writer->writer);
+ fputs(data, stream_writer->writer);
+ fputs("]]>", stream_writer->writer);
+
+ return GUTHTHILA_SUCCESS;
+ }
+
+
+ int guththila_xml_stream_writer_write_dtd(guththila_xml_stream_writer_t* stream_writer, char* dtd)
+ {
+ if (!dtd)
+ return GUTHTHILA_STREAM_WRITER_ERROR_DTD_NULL;
+
+ fputs( "<!DOCTYPE ", stream_writer->writer);
+ fputs(dtd, stream_writer->writer);
+ fputs(">", stream_writer->writer);
+
+ return GUTHTHILA_SUCCESS;
+ }
+
+
+ int guththila_xml_stream_writer_write_entity_ref(guththila_xml_stream_writer_t* stream_writer, char* name)
+ {
+ if (!name)
+ return GUTHTHILA_STREAM_WRITER_ERROR_ENTITY_REF_NULL;
+
+ guththila_xml_stream_writer_end_start_element(stream_writer);
+
+ fputs( "&", stream_writer->writer);
+ fputs(name, stream_writer->writer);
+ fputs(";", stream_writer->writer);
+
+ return GUTHTHILA_SUCCESS;
+ }
+
+
+ int guththila_xml_stream_writer_write_start_document(guththila_xml_stream_writer_t* stream_writer)
+ {
+ int ret = guththila_xml_stream_writer_write_start_document_with_version_encoding(stream_writer, 0, 0);
+ return ret;
+ }
+
+
+ int guththila_xml_stream_writer_write_start_document_with_version(guththila_xml_stream_writer_t* stream_writer, char* version)
+ {
+ int ret = guththila_xml_stream_writer_write_start_document_with_version_encoding(stream_writer, 0, version);
+ return ret;
+
+ }
+
+
+ int guththila_xml_stream_writer_write_start_document_with_version_encoding(guththila_xml_stream_writer_t* stream_writer, char* encoding, char* version)
+ {
+ if (!version)
+ version = "1.0";
+
+ encoding = "UTF-8"; // The parameter is ignored
+
+ if ( (strcmp("1.0", version) != 0) && (strcmp("1.1", version) != 0 ) )
+ return GUTHTHILA_STREAM_WRITER_ERROR_ILLEGAL_XML_VERSION;
+
+ fputs( "<?xml version=\"", stream_writer->writer);
+ fputs( version, stream_writer->writer);
+ fputs( "\" encoding=\"", stream_writer->writer);
+ fputs( encoding, stream_writer->writer);
+ fputs( "\"?>", stream_writer->writer);
+ fputs( "\r\n", stream_writer->writer);
+
+ return GUTHTHILA_SUCCESS;
+ }
+
+ int guththila_xml_stream_writer_write_characters(guththila_xml_stream_writer_t* stream_writer, char* text)
+ {
+ if (!text)
+ return GUTHTHILA_STREAM_WRITER_ERROR_TEXT_NULL;
+
+ guththila_xml_stream_writer_end_start_element(stream_writer);
+
+ if (text)
+ guththila_xml_stream_writer_write_encoded(stream_writer, text, 0);
+
+ return GUTHTHILA_SUCCESS;
+ }
+
+ char* guththila_xml_stream_writer_get_prefix(guththila_xml_stream_writer_t* stream_writer, char* uri)
+ {
+ if (!uri)
+ return 0;
+
+ char* prefix = apr_hash_get(stream_writer->namespace_hash, uri, APR_HASH_KEY_STRING );
+ return prefix;
+ }
+
+ int guththila_xml_stream_writer_set_prefix(guththila_xml_stream_writer_t* stream_writer, char* prefix, char* uri)
+ {
+ if (!prefix)
+ return GUTHTHILA_STREAM_WRITER_ERROR_PREFIX_NULL;
+
+ if (!uri)
+ return GUTHTHILA_STREAM_WRITER_ERROR_NAMESPACE_NULL;
+
+ if ( strcmp(prefix, "xml") == 0 || strcmp (prefix, "xmlns") == 0)
+ return GUTHTHILA_STREAM_WRITER_ERROR_ILLEGAL_PREFIX;
+
+ apr_hash_set(stream_writer->namespace_hash, uri, APR_HASH_KEY_STRING, prefix);
+ apr_hash_set(stream_writer->prefix_hash, prefix, APR_HASH_KEY_STRING, uri); //over write another prefix
+ return GUTHTHILA_SUCCESS;
+ }
+
+
+ int guththila_xml_stream_writer_set_default_prefix(guththila_xml_stream_writer_t* stream_writer, char* uri){
+ return guththila_xml_stream_writer_set_prefix(stream_writer, GUTHTHILA_DEFAULT_NS_PREFIX, uri);
+
+ }
+
+ int guththila_xml_stream_writer_write_encoded(guththila_xml_stream_writer_t* stream_writer, char* text, int in_attr)
+ {
+ if (!text)
+ return GUTHTHILA_STREAM_WRITER_ERROR_TEXT_NULL;
+
+ char* start = text;
+ char* ptr = text;
+
+ for (ptr = text; *ptr; ptr++)
+ {
+ char c = *ptr;
+ if (c == '<' || c == '>' || c == '&')
+ {
+ char* to_write = apr_pstrndup(guththila_apr_pool, start, (apr_size_t)(ptr - start));
+ if (to_write)
+ {
+ fputs( to_write, stream_writer->writer);
+
+ free (to_write);
+ }
+ else
+ return GUTHTHILA_STREAM_WRITER_ERROR_OUT_OF_MEMORY;
+
+ if (c == '<')
+ fputs( "<", stream_writer->writer);
+
+ else if (c == '>')
+ fputs( ">", stream_writer->writer);
+ else
+ fputs( "&", stream_writer->writer);
+
+ start = ptr + 1;
+ }
+ else if (in_attr && (c == '"' || c == '\''))
+ {
+ char* to_write = apr_pstrndup(guththila_apr_pool, start, (apr_size_t)(ptr - start));
+ if (to_write)
+ {
+ fputs( to_write, stream_writer->writer);
+
+ free (to_write);
+ }
+ else
+ return GUTHTHILA_STREAM_WRITER_ERROR_OUT_OF_MEMORY;
+
+
+
+ if (c == '"')
+ fputs( """, stream_writer->writer);
+ else
+ fputs( "'", stream_writer->writer);
+ start = ptr + 1;
+
+ }
+ }
+
+ if (ptr - start)
+ {
+ char* to_write = apr_pstrndup(guththila_apr_pool, start, (apr_size_t)(ptr - start));
+ if (to_write)
+ {
+ fputs( to_write, stream_writer->writer);
+
+ free (to_write);
+ }
+ else
+ return GUTHTHILA_STREAM_WRITER_ERROR_OUT_OF_MEMORY;
+ }
+
+ return GUTHTHILA_SUCCESS;
+ }
+
Added: webservices/axis2/trunk/c/modules/xml/guththila/src/guththila_xml_stream_writer.h
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/c/modules/xml/guththila/src/guththila_xml_stream_writer.h?rev=292897&view=auto
==============================================================================
--- webservices/axis2/trunk/c/modules/xml/guththila/src/guththila_xml_stream_writer.h (added)
+++ webservices/axis2/trunk/c/modules/xml/guththila/src/guththila_xml_stream_writer.h Fri Sep 30 18:55:30 2005
@@ -0,0 +1,134 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef GUTHTHILA_XML_STREAM_WRITER_H
+#define GUTHTHILA_XML_STREAM_WRITER_H
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <apr.h>
+#include <apr_pools.h>
+#include <apr_hash.h>
+#include <apr_tables.h>
+
+#include "guththila_errno.h"
+
+#define GUTHTHILA_DEFAULT_NS_PREFIX ""
+
+static apr_pool_t *guththila_apr_pool; // a memory pool to be used for this module
+
+
+/**
+ * guththila_xml_stream_writer_t - Stream Writer Structure
+ */
+
+typedef struct
+{
+ FILE* writer;
+ char* encoding;
+ int prefix_defaulting;
+ apr_array_header_t *element_stack; //stack of element names (apr array is FILO)
+ apr_hash_t* namespace_hash; //hash map with key:namespace and value:prefix
+ apr_hash_t* prefix_hash; //hash map with key:prefix and value:namespace
+ int in_start_element;
+ int empty_element;
+} guththila_xml_stream_writer_t;
+
+guththila_xml_stream_writer_t* guththila_create_xml_stream_writer(FILE* writer, char* encoding, int is_prefix_defaulting);
+
+ int guththila_xml_stream_writer_end_start_element(guththila_xml_stream_writer_t* stream_writer);
+
+
+ int guththila_xml_stream_writer_write_start_element(guththila_xml_stream_writer_t* stream_writer, char* local_name);
+
+
+ int guththila_xml_stream_writer_write_start_element_with_namespace(guththila_xml_stream_writer_t* stream_writer, char* local_name, char* namespace_uri);
+
+
+ int guththila_xml_stream_writer_write_start_element_with_namespace_prefix(guththila_xml_stream_writer_t* stream_writer, char* local_name, char* namespace_uri, char* prefix);
+
+
+ int guththila_xml_stream_writer_write_empty_element(guththila_xml_stream_writer_t* stream_writer, char* local_name);
+
+
+ int guththila_xml_stream_writer_write_empty_element_with_namespace(guththila_xml_stream_writer_t* stream_writer, char* local_name, char* namespace_uri);
+
+
+
+ int guththila_xml_stream_writer_write_empty_element_with_namespace_prefix(guththila_xml_stream_writer_t* stream_writer, char* local_name, char* namespace_uri, char* prefix);
+
+
+ int guththila_xml_stream_writer_write_end_element(guththila_xml_stream_writer_t* stream_writer);
+
+ int guththila_xml_stream_writer_write_end_document(guththila_xml_stream_writer_t* stream_writer);
+
+
+ int guththila_xml_stream_writer_write_attribute(guththila_xml_stream_writer_t* stream_writer, char* local_name, char* value);
+
+
+ int guththila_xml_stream_writer_write_attribute_with_namespace(guththila_xml_stream_writer_t* stream_writer, char* local_name, char* value, char* namespace_uri);
+
+
+ int guththila_xml_stream_writer_write_attribute_with_namespace_prefix(guththila_xml_stream_writer_t* stream_writer, char* local_name, char* value, char* namespace_uri, char* prefix);
+
+
+ int guththila_xml_stream_writer_write_namespace(guththila_xml_stream_writer_t* stream_writer, char* prefix, char* namespace_uri);
+
+
+ int guththila_xml_stream_writer_write_default_namespace(guththila_xml_stream_writer_t* stream_writer, char* namespace_uri);
+
+
+ int guththila_xml_stream_writer_write_comment(guththila_xml_stream_writer_t* stream_writer, char* data);
+
+ int guththila_xml_stream_writer_write_processing_instruction(guththila_xml_stream_writer_t* stream_writer, char* target);
+
+
+ int guththila_xml_stream_writer_write_processing_instruction_data(guththila_xml_stream_writer_t* stream_writer, char* target, char* data);
+
+
+ int guththila_xml_stream_writer_write_cdata(guththila_xml_stream_writer_t* stream_writer, char* data);
+
+
+ int guththila_xml_stream_writer_write_dtd(guththila_xml_stream_writer_t* stream_writer, char* dtd);
+
+ int guththila_xml_stream_writer_write_entity_ref(guththila_xml_stream_writer_t* stream_writer, char* name);
+
+ int guththila_xml_stream_writer_write_start_document(guththila_xml_stream_writer_t* stream_writer);
+
+ int guththila_xml_stream_writer_write_start_document_with_version(guththila_xml_stream_writer_t* stream_writer, char* version);
+
+
+ int guththila_xml_stream_writer_write_start_document_with_version_encoding(guththila_xml_stream_writer_t* stream_writer, char* encoding, char* version);
+
+
+ int guththila_xml_stream_writer_write_characters(guththila_xml_stream_writer_t* stream_writer, char* text);
+
+
+ char* guththila_xml_stream_writer_get_prefix(guththila_xml_stream_writer_t* stream_writer, char* uri);
+
+ int guththila_xml_stream_writer_set_prefix(guththila_xml_stream_writer_t* stream_writer, char* prefix, char* uri);
+
+
+ int guththila_xml_stream_writer_set_default_prefix(guththila_xml_stream_writer_t* stream_writer, char* uri);
+
+
+ int guththila_xml_stream_writer_write_encoded(guththila_xml_stream_writer_t* stream_writer, char* text, int in_attr);
+
+
+#endif //GUTHTHILA_XML_STREAM_WRITER_H
+