diff options
Diffstat (limited to 'libxsde')
-rw-r--r-- | libxsde/xsde/c/genx/genx.c | 80 | ||||
-rw-r--r-- | libxsde/xsde/c/genx/genx.h | 10 | ||||
-rw-r--r-- | libxsde/xsde/cxx/serializer/genx/document.cxx | 22 | ||||
-rw-r--r-- | libxsde/xsde/cxx/serializer/genx/document.hxx | 22 | ||||
-rw-r--r-- | libxsde/xsde/cxx/serializer/genx/document.ixx | 5 |
5 files changed, 119 insertions, 20 deletions
diff --git a/libxsde/xsde/c/genx/genx.c b/libxsde/xsde/c/genx/genx.c index 1ce0527..f838f42 100644 --- a/libxsde/xsde/c/genx/genx.c +++ b/libxsde/xsde/c/genx/genx.c @@ -126,6 +126,11 @@ struct genxWriter_rec char * etext[100]; void * (* alloc)(void * userData, int bytes); void (* dealloc)(void * userData, void * data); + + /* Pretty-printing state */ + int ppIndent; + int ppDepth; + Boolean ppSimple; }; /******************************* @@ -590,6 +595,8 @@ genxWriter genxNew(void * (* alloc)(void * userData, int bytes), xml->declCount = 1; xml->declaration = xml->defaultDecl; + w->ppIndent = 0; /* Pretty-printing is disabled by default. */ + return w; } @@ -630,6 +637,24 @@ void * genxGetUserData(genxWriter w) } /* + * get/set pretty-printing + */ +genxStatus genxSetPrettyPrint(genxWriter w, int ind) +{ + if (w->sequence == SEQUENCE_NO_DOC) + w->ppIndent = ind; + else + w->status = GENX_SEQUENCE_ERROR; + + return w->status; +} + +int genxGetPrettyPrint(genxWriter w) +{ + return w->ppIndent; +} + +/* * get/set allocator */ void genxSetAlloc(genxWriter w, void * (* alloc)(void * userData, int bytes)) @@ -1142,6 +1167,13 @@ genxStatus genxStartDocFile(genxWriter w, FILE * file) w->sequence = SEQUENCE_PRE_DOC; w->file = file; w->sender = NULL; + + if (w->ppIndent) + { + w->ppSimple = True; + w->ppDepth = 0; + } + return GENX_SUCCESS; } @@ -1153,10 +1185,32 @@ genxStatus genxStartDocSender(genxWriter w, genxSender * sender) w->sequence = SEQUENCE_PRE_DOC; w->file = NULL; w->sender = sender; + + if (w->ppIndent) + { + w->ppSimple = True; + w->ppDepth = 0; + } + return GENX_SUCCESS; } /* + * Output new line and indentation. + */ +static genxStatus writeIndentation(genxWriter w) +{ + int i, n; + SendCheck(w, "\n"); + n = w->ppDepth * w->ppIndent; + + for (i = 0; i < n; i++) + SendCheck(w, " "); + + return w->status; +} + +/* * Write out the attributes we've been gathering up for an element. We save * them until we've gathered them all so they can be writen in canonical * order. @@ -1167,7 +1221,7 @@ genxStatus genxStartDocSender(genxWriter w, genxSender * sender) */ static genxStatus writeStartTag(genxWriter w) { - int i; + int i, n; genxAttribute * aa = (genxAttribute *) w->attributes.pointers; genxElement e = w->nowStarting; @@ -1181,6 +1235,16 @@ static genxStatus writeStartTag(genxWriter w) unsetDefaultNamespace(w); w->status = GENX_SUCCESS; + if (w->ppIndent) + { + if (w->ppDepth) + if (writeIndentation (w) != GENX_SUCCESS) + return w->status; + + w->ppDepth++; + w->ppSimple = True; + } + SendCheck(w, "<"); if (e->ns && (e->ns->declaration != w->xmlnsEquals)) { @@ -1596,7 +1660,7 @@ genxStatus genxEndAttribute(genxWriter w) genxStatus genxEndElement(genxWriter w) { genxElement e; - int i; + int i, n; switch (w->sequence) { @@ -1624,6 +1688,17 @@ genxStatus genxEndElement(genxWriter w) ; e = (genxElement) w->stack.pointers[--i]; + if (w->ppIndent) + { + w->ppDepth--; + + if (!w->ppSimple) + if (writeIndentation (w) != GENX_SUCCESS) + return w->status; + + w->ppSimple = False; + } + SendCheck(w, "</"); if (e->ns && e->ns->declaration != w->xmlnsEquals) { @@ -2115,4 +2190,3 @@ char * genxGetVersion() { return GENX_VERSION; } - diff --git a/libxsde/xsde/c/genx/genx.h b/libxsde/xsde/c/genx/genx.h index da9f9b7..1a1ea22 100644 --- a/libxsde/xsde/c/genx/genx.h +++ b/libxsde/xsde/c/genx/genx.h @@ -1,4 +1,3 @@ - /* * genx - C-callable library for generating XML documents */ @@ -105,6 +104,13 @@ void genxSetUserData(genxWriter w, void * userData); void * genxGetUserData(genxWriter w); /* + * Set/get pretty-printing. If indentation is set to 0, then no pretty- + * printing is performed. + */ +genxStatus genxSetPrettyPrint(genxWriter w, int indentation); +int genxGetPrettyPrint(genxWriter w); + +/* * User-provided memory allocator, if desired. For example, if you were * in an Apache module, you could arrange for genx to use ap_palloc by * making the pool accessible via the userData call. @@ -235,7 +241,7 @@ genxStatus genxEndAttribute(genxWriter w); /* * add a namespace declaration */ -genxStatus genxAddNamespaceLiteral(genxWriter w, +genxStatus genxAddNamespaceLiteral(genxWriter w, constUtf8 uri, constUtf8 prefix); /* diff --git a/libxsde/xsde/cxx/serializer/genx/document.cxx b/libxsde/xsde/cxx/serializer/genx/document.cxx index bba4b26..d30a106 100644 --- a/libxsde/xsde/cxx/serializer/genx/document.cxx +++ b/libxsde/xsde/cxx/serializer/genx/document.cxx @@ -64,6 +64,7 @@ namespace xsde // document_simpl // + const document_simpl::flags document_simpl::pretty_print = 0x01; document_simpl:: ~document_simpl () @@ -304,9 +305,9 @@ namespace xsde #endif void document_simpl:: - serialize (std::ostream& os) + serialize (std::ostream& os, flags f) { - serialize (&ostream_write, &ostream_flush, &os); + serialize (&ostream_write, &ostream_flush, &os, f); } #endif // XSDE_IOSTREAM @@ -351,9 +352,9 @@ namespace xsde #endif void document_simpl:: - serialize (writer& w) + serialize (writer& w, flags f) { - serialize (&write_thunk, &write_bound_thunk, &flush_thunk, &w); + serialize (&write_thunk, &write_bound_thunk, &flush_thunk, &w, f); } // Genx write functions. @@ -427,8 +428,8 @@ namespace xsde } void document_simpl:: - serialize (write_func w, write_bound_func wb, flush_func f, - void* user_data) + serialize (write_func wf, write_bound_func wbf, flush_func ff, + void* user_data, flags f) { if (xml_serializer_ == 0) { @@ -447,12 +448,15 @@ namespace xsde writer_info wi; wi.user_data = user_data; - wi.write = w; - wi.write_bound = wb; - wi.flush = f; + wi.write = wf; + wi.write_bound = wbf; + wi.flush = ff; genxSetUserData (xml_serializer_, &wi); + if (f & pretty_print) + genxSetPrettyPrint (xml_serializer_, 2); + genxSender sender; sender.send = &genx_write; sender.sendBounded = &genx_write_bound; diff --git a/libxsde/xsde/cxx/serializer/genx/document.hxx b/libxsde/xsde/cxx/serializer/genx/document.hxx index 19117d6..ee06795 100644 --- a/libxsde/xsde/cxx/serializer/genx/document.hxx +++ b/libxsde/xsde/cxx/serializer/genx/document.hxx @@ -189,6 +189,13 @@ namespace xsde void reset (); + public: + // Serialization flags. + // + typedef unsigned short flags; + + static const flags pretty_print; + #ifdef XSDE_IOSTREAM public: // Serialize to std::ostream. The std::ios_base::failure @@ -197,7 +204,7 @@ namespace xsde // used. // void - serialize (std::ostream&); + serialize (std::ostream&, flags = 0); #endif public: @@ -205,7 +212,7 @@ namespace xsde // output XML. // void - serialize (writer&); + serialize (writer&, flags = 0); // Serialize by calling the write and flush functions. If the // unbounded write function is not provided, the bounded version @@ -226,10 +233,17 @@ namespace xsde #endif void - serialize (write_bound_func, flush_func, void* user_data); + serialize (write_bound_func, + flush_func, + void* user_data, + flags = 0); void - serialize (write_func, write_bound_func, flush_func, void* user_data); + serialize (write_func, + write_bound_func, + flush_func, + void* user_data, + flags = 0); public: // Low-level, genx-specific serialization. With this method diff --git a/libxsde/xsde/cxx/serializer/genx/document.ixx b/libxsde/xsde/cxx/serializer/genx/document.ixx index 7269fa6..7001ece 100644 --- a/libxsde/xsde/cxx/serializer/genx/document.ixx +++ b/libxsde/xsde/cxx/serializer/genx/document.ixx @@ -66,9 +66,10 @@ namespace xsde #endif inline void document_simpl:: - serialize (write_bound_func wb, flush_func f, void* user_data) + serialize (write_bound_func wbf, flush_func ff, + void* user_data, flags f) { - serialize (0, wb, f, user_data); + serialize (0, wbf, ff, user_data, f); } #ifndef XSDE_EXCEPTIONS |