Patchwork [libjava] Use accessor functions to manipulate xmlOutputBuffer

login
register
mail settings
Submitter Dodji Seketeli
Date Aug. 8, 2012, 10:08 p.m.
Message ID <m3txwdvxyj.fsf@redhat.com>
Download mbox | patch
Permalink /patch/175966/
State New
Headers show

Comments

Dodji Seketeli - Aug. 8, 2012, 10:08 p.m.
Hello,

This is a fix to prepare the xmlj_io.c file of gnu classpath to a coming
API change in libxml2.

Basically, we were previously accessing fields inside the
xmlOutputBuffer struct of libxml2.  In a coming version of libxml2,
that won't be possible anymore.  Client code will have to use accessor
functions instead.  For the gory details, there is an interestin note
of Daniel Veillard (author of libxml2) at
https://mail.gnome.org/archives/desktop-devel-list/2012-August/msg00007.html.

This patch defines too accessor macros that, depending on the version
of libxml2 we are using will either access the fields of
xmlOutputBuffer directly, or use the new accessor function.

Bootstrapped and tested on x86_64-unknown-linux-gnu against trunk.

OK to commit?

libjava/classpath/

	* native/jni/xmlj/xmlj_io.c (GET_XML_OUTPUT_BUFFER_CONTENT)
	(GET_XML_OUTPUT_BUFFER_SIZE): New macros.
	(xmljOutputWriteCallback): Use them.
---
 libjava/classpath/native/jni/xmlj/xmlj_io.c |   20 +++++++++++++++++---
 1 files changed, 17 insertions(+), 3 deletions(-)
Daniel Veillard - Aug. 9, 2012, 12:16 a.m.
On Thu, Aug 09, 2012 at 12:08:20AM +0200, Dodji Seketeli wrote:
> Hello,
> 
> This is a fix to prepare the xmlj_io.c file of gnu classpath to a coming
> API change in libxml2.
> 
> Basically, we were previously accessing fields inside the
> xmlOutputBuffer struct of libxml2.  In a coming version of libxml2,
> that won't be possible anymore.  Client code will have to use accessor
> functions instead.  For the gory details, there is an interestin note
> of Daniel Veillard (author of libxml2) at
> https://mail.gnome.org/archives/desktop-devel-list/2012-August/msg00007.html.
> 
> This patch defines too accessor macros that, depending on the version
> of libxml2 we are using will either access the fields of
> xmlOutputBuffer directly, or use the new accessor function.
> 
> Bootstrapped and tested on x86_64-unknown-linux-gnu against trunk.
> 
> OK to commit?

  For the record, I rewieved the patch and it looks fine to me,

    thanks Dodji !

Daniel
Andrew Haley - June 21, 2013, 11:13 a.m.
On 08/08/2012 11:08 PM, Dodji Seketeli wrote:
> OK to commit?

Looks good, but what sets LIBXML2_NEW_BUFFER ?

Andrew.
Daniel Veillard - June 21, 2013, 11:19 a.m.
On Fri, Jun 21, 2013 at 12:13:35PM +0100, Andrew Haley wrote:
> On 08/08/2012 11:08 PM, Dodji Seketeli wrote:
> > OK to commit?
> 
> Looks good, but what sets LIBXML2_NEW_BUFFER ?

  I lack context but I think I can answer that one :)

LIBXML2_NEW_BUFFER is a libxml2 public macro from <libxml/tree.h>

/*
 * LIBXML2_NEW_BUFFER:
 *
 * Macro used to express that the API use the new buffers for
 * xmlParserInputBuffer and xmlOutputBuffer. The change was
 * introduced in 2.9.0.
 */

http://xmlsoft.org/html/libxml-tree.html#LIBXML2_NEW_BUFFER

Daniel
Andrew Haley - June 21, 2013, 12:03 p.m.
On 06/21/2013 12:19 PM, Daniel Veillard wrote:
> On Fri, Jun 21, 2013 at 12:13:35PM +0100, Andrew Haley wrote:
>> On 08/08/2012 11:08 PM, Dodji Seketeli wrote:
>>> OK to commit?
>>
>> Looks good, but what sets LIBXML2_NEW_BUFFER ?
> 
>   I lack context but I think I can answer that one :)
> 
> LIBXML2_NEW_BUFFER is a libxml2 public macro from <libxml/tree.h>
> 
> /*
>  * LIBXML2_NEW_BUFFER:
>  *
>  * Macro used to express that the API use the new buffers for
>  * xmlParserInputBuffer and xmlOutputBuffer. The change was
>  * introduced in 2.9.0.
>  */
> 
> http://xmlsoft.org/html/libxml-tree.html#LIBXML2_NEW_BUFFER

Sure, but there's no point adding it to libgcj if it's not set by
anything.  It needs an autoconf macro or somesuch.

Andrew.
Dodji Seketeli - June 24, 2013, 8:13 a.m.
Hello Andrew,

Andrew Haley <aph@redhat.com> writes:

> On 08/08/2012 11:08 PM, Dodji Seketeli wrote:
>> OK to commit?
>
> Looks good,

Thanks.

Just for the record, you acked this patch a year or so ago, but now I
realize it was by private email.  I am attaching the email I received
(as I see there is nothing really private in it) below.

So the patch has been added to gnu classpath, thanks to a commit from
Andrew Hughes that followed your ACK and my committing (inadvertently)
to the copy of gnu classpath in the gcc tree:

http://git.savannah.gnu.org/cgit/classpath.git/commit/?id=4d4db712cf4df4feb4d7b98bb1b5b448218500b3

The email thread is at http://gcc.gnu.org/ml/gcc-patches/2012-08/msg00564.html.

> but what sets LIBXML2_NEW_BUFFER ?

Daniel Veillard <veillard@redhat.com> writes:

> LIBXML2_NEW_BUFFER is a libxml2 public macro from <libxml/tree.h>

Andrew Haley <aph@redhat.com> writes:

>> LIBXML2_NEW_BUFFER is a libxml2 public macro from <libxml/tree.h>

> Sure, but there's no point adding it to libgcj if it's not set by
> anything.  It needs an autoconf macro or somesuch.

Just to make sure I understand what you are saying; do you mean that the
accessor macro GET_XML_OUTPUT_BUFFER_SIZE (that depends on
LIBXML2_NEW_BUFFER) shouldn't be defined in
libjava/classpath/native/jni/xmlj/xmlj_io.c but somewhere else by an
autoconf macro?  If so, maybe you should elaborate more on what you have
in mind exactly as I am not really well acquainted with (the configury
of) gnu classpath.  I did this thing quickly so that the build doesn't
break on newer versions of libxml2.

Cheers.
From: Andrew Haley <aph@redhat.com>
Subject: Re: [PATCH, libjava] Use accessor functions to manipulate xmlOutputBuffer
To: Dodji Seketeli <dodji@redhat.com>
Date: Thu, 09 Aug 2012 10:06:13 +0100 (45 weeks, 3 days, 22 hours ago)
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:14.0) Gecko/20120717 Thunderbird/14.0

On 08/08/2012 11:08 PM, Dodji Seketeli wrote:
> Hello,
> 
> This is a fix to prepare the xmlj_io.c file of gnu classpath to a coming
> API change in libxml2.
> 
> Basically, we were previously accessing fields inside the
> xmlOutputBuffer struct of libxml2.  In a coming version of libxml2,
> that won't be possible anymore.  Client code will have to use accessor
> functions instead.  For the gory details, there is an interestin note
> of Daniel Veillard (author of libxml2) at
> https://mail.gnome.org/archives/desktop-devel-list/2012-August/msg00007.html.
> 
> This patch defines too accessor macros that, depending on the version
> of libxml2 we are using will either access the fields of
> xmlOutputBuffer directly, or use the new accessor function.
> 
> Bootstrapped and tested on x86_64-unknown-linux-gnu against trunk.
> 
> OK to commit?

OK.

Thanks,
Andrew.


> libjava/classpath/
> 
> 	* native/jni/xmlj/xmlj_io.c (GET_XML_OUTPUT_BUFFER_CONTENT)
> 	(GET_XML_OUTPUT_BUFFER_SIZE): New macros.
> 	(xmljOutputWriteCallback): Use them.
> ---
>  libjava/classpath/native/jni/xmlj/xmlj_io.c |   20 +++++++++++++++++---
>  1 files changed, 17 insertions(+), 3 deletions(-)
> 
> diff --git a/libjava/classpath/native/jni/xmlj/xmlj_io.c b/libjava/classpath/native/jni/xmlj/xmlj_io.c
> index aa2964d..a55e48d 100644
> --- a/libjava/classpath/native/jni/xmlj/xmlj_io.c
> +++ b/libjava/classpath/native/jni/xmlj/xmlj_io.c
> @@ -102,6 +102,19 @@ xmljFreeOutputStreamContext (OutputStreamContext * outContext);
>  xmlCharEncoding
>  xmljDetectCharEncoding (JNIEnv * env, jbyteArray buffer);
>  
> +
> +#ifdef LIBXML2_NEW_BUFFER
> +#define GET_XML_OUTPUT_BUFFER_CONTENT(buf) (gchar *) \
> +  (char *) xmlOutputBufferGetContent(buf)
> +#define GET_XML_OUTPUT_BUFFER_SIZE(buf) \
> +  xmlOutputBufferGetSize(buf)
> +#else
> +#define GET_XML_OUTPUT_BUFFER_CONTENT(buf) \
> + (buf)->buffer->content
> +#define GET_XML_OUTPUT_BUFFER_SIZE(buf) \
> +  (buf)->buffer->use
> +#endif
> +
>  int
>  xmljOutputWriteCallback (void *context, const char *buffer, int len)
>  {
> @@ -752,9 +765,10 @@ xmljLoadExternalEntity (const char *URL, const char *ID,
>        inputStream->directory = NULL;
>        inputStream->buf = inputBuffer;
>  
> -      inputStream->base = inputStream->buf->buffer->content;
> -      inputStream->cur = inputStream->buf->buffer->content;
> -      inputStream->end = &inputStream->base[inputStream->buf->buffer->use];
> +      inputStream->base = GET_XML_OUTPUT_BUFFER_CONTENT (inputStream->buf);
> +      inputStream->cur = GET_XML_OUTPUT_BUFFER_CONTENT (inputStream->buf);
> +      inputStream->end =
> +      &inputStream->base[GET_XML_OUTPUT_BUFFER_SIZE (inputStream->buf)];
>        if ((ctxt->directory == NULL) && (inputStream->directory != NULL))
>          ctxt->directory =
>            (char *) xmlStrdup ((const xmlChar *) inputStream->directory);
>
Andrew Haley - June 24, 2013, 8:16 a.m.
On 06/24/2013 09:13 AM, Dodji Seketeli wrote:
> Just to make sure I understand what you are saying; do you mean that the
> accessor macro GET_XML_OUTPUT_BUFFER_SIZE (that depends on
> LIBXML2_NEW_BUFFER) shouldn't be defined in
> libjava/classpath/native/jni/xmlj/xmlj_io.c but somewhere else by an
> autoconf macro?  If so, maybe you should elaborate more on what you have
> in mind exactly as I am not really well acquainted with (the configury
> of) gnu classpath.  I did this thing quickly so that the build doesn't
> break on newer versions of libxml2.

OK, I get it now, thanks.

Andrew.

Patch

diff --git a/libjava/classpath/native/jni/xmlj/xmlj_io.c b/libjava/classpath/native/jni/xmlj/xmlj_io.c
index aa2964d..a55e48d 100644
--- a/libjava/classpath/native/jni/xmlj/xmlj_io.c
+++ b/libjava/classpath/native/jni/xmlj/xmlj_io.c
@@ -102,6 +102,19 @@  xmljFreeOutputStreamContext (OutputStreamContext * outContext);
 xmlCharEncoding
 xmljDetectCharEncoding (JNIEnv * env, jbyteArray buffer);
 
+
+#ifdef LIBXML2_NEW_BUFFER
+#define GET_XML_OUTPUT_BUFFER_CONTENT(buf) (gchar *) \
+  (char *) xmlOutputBufferGetContent(buf)
+#define GET_XML_OUTPUT_BUFFER_SIZE(buf) \
+  xmlOutputBufferGetSize(buf)
+#else
+#define GET_XML_OUTPUT_BUFFER_CONTENT(buf) \
+ (buf)->buffer->content
+#define GET_XML_OUTPUT_BUFFER_SIZE(buf) \
+  (buf)->buffer->use
+#endif
+
 int
 xmljOutputWriteCallback (void *context, const char *buffer, int len)
 {
@@ -752,9 +765,10 @@  xmljLoadExternalEntity (const char *URL, const char *ID,
       inputStream->directory = NULL;
       inputStream->buf = inputBuffer;
 
-      inputStream->base = inputStream->buf->buffer->content;
-      inputStream->cur = inputStream->buf->buffer->content;
-      inputStream->end = &inputStream->base[inputStream->buf->buffer->use];
+      inputStream->base = GET_XML_OUTPUT_BUFFER_CONTENT (inputStream->buf);
+      inputStream->cur = GET_XML_OUTPUT_BUFFER_CONTENT (inputStream->buf);
+      inputStream->end =
+      &inputStream->base[GET_XML_OUTPUT_BUFFER_SIZE (inputStream->buf)];
       if ((ctxt->directory == NULL) && (inputStream->directory != NULL))
         ctxt->directory =
           (char *) xmlStrdup ((const xmlChar *) inputStream->directory);