mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			625 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			625 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			C
		
	
	
	
| /* xmlj_xpath.c -
 | |
|    Copyright (C) 2004 Free Software Foundation, Inc.
 | |
| 
 | |
| This file is part of GNU Classpath.
 | |
| 
 | |
| GNU Classpath is free software; you can redistribute it and/or modify
 | |
| it under the terms of the GNU General Public License as published by
 | |
| the Free Software Foundation; either version 2, or (at your option)
 | |
| any later version.
 | |
|  
 | |
| GNU Classpath is distributed in the hope that it will be useful, but
 | |
| WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | |
| General Public License for more details.
 | |
| 
 | |
| You should have received a copy of the GNU General Public License
 | |
| along with GNU Classpath; see the file COPYING.  If not, write to the
 | |
| Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 | |
| 02110-1301 USA.
 | |
| 
 | |
| Linking this library statically or dynamically with other modules is
 | |
| making a combined work based on this library.  Thus, the terms and
 | |
| conditions of the GNU General Public License cover the whole
 | |
| combination.
 | |
| 
 | |
| As a special exception, the copyright holders of this library give you
 | |
| permission to link this library with independent modules to produce an
 | |
| executable, regardless of the license terms of these independent
 | |
| modules, and to copy and distribute the resulting executable under
 | |
| terms of your choice, provided that you also meet, for each linked
 | |
| independent module, the terms and conditions of the license of that
 | |
| module.  An independent module is a module which is not derived from
 | |
| or based on this library.  If you modify this library, you may extend
 | |
| this exception to your version of the library, but you are not
 | |
| obligated to do so.  If you do not wish to do so, delete this
 | |
| exception statement from your version. */
 | |
| 
 | |
| #include "gnu_xml_libxmlj_dom_GnomeDocument.h"
 | |
| #include "gnu_xml_libxmlj_dom_GnomeElement.h"
 | |
| #include "gnu_xml_libxmlj_dom_GnomeXPathExpression.h"
 | |
| #include "gnu_xml_libxmlj_dom_GnomeXPathNodeList.h"
 | |
| #include "gnu_xml_libxmlj_dom_GnomeXPathResult.h"
 | |
| #include "xmlj_node.h"
 | |
| #include "xmlj_util.h"
 | |
| #include <libxml/xpath.h>
 | |
| 
 | |
| /* Local function prototypes */
 | |
| 
 | |
| xmlXPathContextPtr
 | |
| xmljCreateXPathContextPtr (xmlNodePtr node);
 | |
| 
 | |
| jobject
 | |
| xmljGetXPathResult (JNIEnv *env, xmlXPathObjectPtr obj);
 | |
| 
 | |
| jobject
 | |
| xmljGetXPathNodeList (JNIEnv *env, xmlXPathObjectPtr obj);
 | |
| 
 | |
| xmlXPathObjectPtr
 | |
| xmljGetXPathObjectID (JNIEnv *env, jobject obj);
 | |
| 
 | |
| /**
 | |
|  * Creates an XPath context for the given node.
 | |
|  */
 | |
| xmlXPathContextPtr
 | |
| xmljCreateXPathContextPtr (xmlNodePtr node)
 | |
| {
 | |
|   xmlXPathContextPtr ctx;
 | |
| 
 | |
|   ctx = xmlXPathNewContext (node->doc);
 | |
|   ctx->node = node;
 | |
|   return ctx;
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Converts an xmlXPathObjectPtr to a Java XPathResult.
 | |
|  */
 | |
| jobject
 | |
| xmljGetXPathResult (JNIEnv *env, xmlXPathObjectPtr obj)
 | |
| {
 | |
|   jclass cls;
 | |
|   jmethodID method;
 | |
|   jobject ret;
 | |
|   jobject val;
 | |
|   
 | |
|   if (obj == NULL)
 | |
|     {
 | |
|       return NULL;
 | |
|     }
 | |
|   cls = (*env)->FindClass (env, "gnu/xml/libxmlj/dom/GnomeXPathResult");
 | |
|   if (cls == NULL)
 | |
|     {
 | |
|       return NULL;
 | |
|     }
 | |
|   method = (*env)->GetMethodID (env, cls, "<init>", "(Ljava/lang/Object;)V");
 | |
|   if (method == NULL)
 | |
|     {
 | |
|       return NULL;
 | |
|     }
 | |
|   val = xmljAsField (env, obj);
 | |
|   ret = (*env)->NewObject (env, cls, method, val);
 | |
|   
 | |
|   return ret;
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Converts an xmlXPathObjectPtr to a Java XPathNodeList.
 | |
|  */
 | |
| jobject
 | |
| xmljGetXPathNodeList (JNIEnv *env, xmlXPathObjectPtr obj)
 | |
| {
 | |
|   jclass cls;
 | |
|   jmethodID method;
 | |
|   jobject ret;
 | |
|   jobject val;
 | |
|   
 | |
|   if (obj == NULL)
 | |
|     {
 | |
|       return NULL;
 | |
|     }
 | |
|   cls = (*env)->FindClass (env, "gnu/xml/libxmlj/dom/GnomeXPathNodeList");
 | |
|   if (cls == NULL)
 | |
|     {
 | |
|       return NULL;
 | |
|     }
 | |
|   method = (*env)->GetMethodID (env, cls, "<init>", "(Ljava/lang/Object;)V");
 | |
|   if (method == NULL)
 | |
|     {
 | |
|       return NULL;
 | |
|     }
 | |
|   val = xmljAsField (env, obj);
 | |
|   ret = (*env)->NewObject (env, cls, method, val);
 | |
|   
 | |
|   return ret;
 | |
| }
 | |
| 
 | |
| xmlXPathObjectPtr
 | |
| xmljGetXPathObjectID (JNIEnv *env, jobject obj)
 | |
| {
 | |
|   jclass cls;
 | |
|   jfieldID field;
 | |
|   jobject val;
 | |
|   xmlXPathObjectPtr ret;
 | |
| 
 | |
|   cls = (*env)->GetObjectClass (env, obj);
 | |
|   if (cls == NULL)
 | |
|     {
 | |
|       return NULL;
 | |
|     }
 | |
|   field = (*env)->GetFieldID (env, cls, "obj", "Ljava/lang/Object;");
 | |
|   if (field == NULL)
 | |
|     {
 | |
|       return NULL;
 | |
|     }
 | |
|   val = (*env)->GetObjectField (env, obj, field);
 | |
|   ret = (xmlXPathObjectPtr) xmljAsPointer (env, val);
 | |
| 
 | |
|   return ret;
 | |
| }
 | |
| 
 | |
| JNIEXPORT jobject JNICALL
 | |
| Java_gnu_xml_libxmlj_dom_GnomeDocument_evaluate (JNIEnv *env,
 | |
|                                                  jobject self
 | |
| 						 __attribute__((__unused__)),
 | |
|                                                  jstring expression,
 | |
|                                                  jobject contextNode,
 | |
|                                                  jobject resolver,
 | |
|                                                  jshort type,
 | |
|                                                  jobject result)
 | |
| {
 | |
|   const xmlChar *str;
 | |
|   xmlNodePtr node;
 | |
|   xmlXPathContextPtr ctx;
 | |
|   xmlXPathObjectPtr eval = NULL;
 | |
|   
 | |
|   str = xmljGetStringChars (env, expression);
 | |
|   node = xmljGetNodeID (env, contextNode);
 | |
|   if (node == NULL)
 | |
|     {
 | |
|       return NULL;
 | |
|     }
 | |
|   ctx = xmljCreateXPathContextPtr (node);
 | |
|   if (ctx != NULL)
 | |
|     {
 | |
|       eval = xmlXPathEval (str, ctx);
 | |
|       xmlXPathFreeContext (ctx);
 | |
|     }
 | |
|   xmlFree ((xmlChar *) str);
 | |
|   return xmljGetXPathResult (env, eval);
 | |
| }
 | |
| 
 | |
| JNIEXPORT jobject JNICALL
 | |
| Java_gnu_xml_libxmlj_dom_GnomeXPathExpression_init (JNIEnv *env,
 | |
|                                                     jobject self
 | |
| 						    __attribute__((__unused__)),
 | |
|                                                     jstring expression)
 | |
| {
 | |
|   const xmlChar *str;
 | |
|   xmlXPathCompExprPtr ptr;
 | |
| 
 | |
|   str = xmljGetStringChars (env, expression);
 | |
|   ptr = xmlXPathCompile (str);
 | |
|   xmlFree ((xmlChar *) str);
 | |
|   return xmljAsField (env, ptr);
 | |
| }
 | |
| 
 | |
| JNIEXPORT void JNICALL
 | |
| Java_gnu_xml_libxmlj_dom_GnomeXPathExpression_free (JNIEnv *env,
 | |
|                                                     jobject self
 | |
| 						    __attribute__((__unused__)),
 | |
|                                                     jobject ptr)
 | |
| {
 | |
|   xmlXPathCompExprPtr expr;
 | |
| 
 | |
|   expr = (xmlXPathCompExprPtr) xmljAsPointer (env, ptr);
 | |
|   xmlXPathFreeCompExpr (expr);
 | |
| }
 | |
| 
 | |
| JNIEXPORT jobject JNICALL
 | |
| Java_gnu_xml_libxmlj_dom_GnomeXPathExpression_doEvaluate (JNIEnv *env,
 | |
|                                                           jobject self
 | |
| 							  __attribute__((__unused__)),
 | |
|                                                           jobject ptr,
 | |
|                                                           jobject contextNode,
 | |
|                                                           jshort type,
 | |
|                                                           jobject result)
 | |
| {
 | |
|   xmlXPathCompExprPtr expr;
 | |
|   xmlNodePtr node;
 | |
|   xmlXPathContextPtr ctx;
 | |
|   xmlXPathObjectPtr eval = NULL;
 | |
| 
 | |
|   expr = (xmlXPathCompExprPtr) xmljAsPointer (env, ptr);
 | |
|   node = xmljGetNodeID (env, contextNode);
 | |
|   if (node == NULL)
 | |
|     {
 | |
|       return NULL;
 | |
|     }
 | |
|   ctx = xmljCreateXPathContextPtr (node);
 | |
|   if (ctx != NULL)
 | |
|     {
 | |
|       eval = xmlXPathCompiledEval (expr, ctx);
 | |
|       xmlXPathFreeContext (ctx);
 | |
|     }
 | |
|   return xmljGetXPathResult (env, eval);
 | |
| }
 | |
| 
 | |
| JNIEXPORT void JNICALL
 | |
| Java_gnu_xml_libxmlj_dom_GnomeXPathResult_free (JNIEnv *env,
 | |
|                                                 jobject self
 | |
| 						__attribute__((__unused__)),
 | |
|                                                 jobject obj)
 | |
| {
 | |
|   xmlXPathFreeObject ((xmlXPathObjectPtr) xmljAsPointer (env, obj));
 | |
| }
 | |
| 
 | |
| JNIEXPORT jshort JNICALL
 | |
| Java_gnu_xml_libxmlj_dom_GnomeXPathResult_getResultType (JNIEnv *env,
 | |
|                                                          jobject self)
 | |
| {
 | |
|   xmlXPathObjectPtr obj;
 | |
|   
 | |
|   obj = xmljGetXPathObjectID (env, self);
 | |
|   switch (obj->type)
 | |
|     {
 | |
|     case XPATH_UNDEFINED:
 | |
|       return 0; /* ANY_TYPE */
 | |
|     case XPATH_NUMBER:
 | |
|       return 1; /* NUMBER_TYPE */
 | |
|     case XPATH_STRING:
 | |
|       return 2; /* STRING_TYPE */
 | |
|     case XPATH_BOOLEAN:
 | |
|       return 3; /* BOOLEAN_TYPE */
 | |
|     case XPATH_NODESET:
 | |
|       return 6; /* UNORDERED_NODE_SNAPSHOT_TYPE */
 | |
|     case XPATH_POINT:
 | |
|     case XPATH_RANGE:
 | |
|     case XPATH_LOCATIONSET:
 | |
|     case XPATH_USERS:
 | |
|     case XPATH_XSLT_TREE:
 | |
|       /* TODO */
 | |
|     default:
 | |
|       return -1; /* TODO */
 | |
|     }
 | |
| }
 | |
| 
 | |
| JNIEXPORT jdouble JNICALL
 | |
| Java_gnu_xml_libxmlj_dom_GnomeXPathResult_getNumberValue (JNIEnv *env,
 | |
|                                                           jobject self)
 | |
| {
 | |
|   xmlXPathObjectPtr obj;
 | |
|   
 | |
|   obj = xmljGetXPathObjectID (env, self);
 | |
|   if (obj == NULL)
 | |
|     {
 | |
|       return 0.0;
 | |
|     }
 | |
|   return obj->floatval;
 | |
| }
 | |
| 
 | |
| JNIEXPORT jstring JNICALL
 | |
| Java_gnu_xml_libxmlj_dom_GnomeXPathResult_getStringValue (JNIEnv *env,
 | |
|                                                           jobject self)
 | |
| {
 | |
|   xmlXPathObjectPtr obj;
 | |
|   
 | |
|   obj = xmljGetXPathObjectID (env, self);
 | |
|   if (obj == NULL)
 | |
|     {
 | |
|       return NULL;
 | |
|     }
 | |
|   return xmljNewString (env, obj->stringval);
 | |
| }
 | |
| 
 | |
| JNIEXPORT jboolean JNICALL
 | |
| Java_gnu_xml_libxmlj_dom_GnomeXPathResult_getBooleanValue (JNIEnv *env,
 | |
|                                                            jobject self)
 | |
| {
 | |
|   xmlXPathObjectPtr obj;
 | |
|   
 | |
|   obj = xmljGetXPathObjectID (env, self);
 | |
|   return obj->boolval;
 | |
| }
 | |
| 
 | |
| JNIEXPORT jobject JNICALL
 | |
| Java_gnu_xml_libxmlj_dom_GnomeXPathResult_getSingleNodeValue (JNIEnv *env,
 | |
|                                                               jobject self)
 | |
| {
 | |
|   xmlXPathObjectPtr obj;
 | |
|   
 | |
|   obj = xmljGetXPathObjectID (env, self);
 | |
|   if (obj == NULL)
 | |
|     {
 | |
|       return NULL;
 | |
|     }
 | |
|   if (obj->nodesetval == NULL)
 | |
|     {
 | |
|       return NULL;
 | |
|     }
 | |
|   if (obj->nodesetval->nodeNr > 0)
 | |
|     {
 | |
|       return xmljGetNodeInstance (env, obj->nodesetval->nodeTab[0]);
 | |
|     }
 | |
|   else
 | |
|     {
 | |
|       return NULL;
 | |
|     }
 | |
| }
 | |
| 
 | |
| JNIEXPORT jboolean JNICALL
 | |
| Java_gnu_xml_libxmlj_dom_GnomeXPathResult_getInvalidIteratorState (JNIEnv *env,
 | |
|                                                                    jobject self)
 | |
| {
 | |
|   xmlXPathObjectPtr obj;
 | |
|   
 | |
|   obj = xmljGetXPathObjectID (env, self);
 | |
|   return 0; /* TODO */
 | |
| }
 | |
| 
 | |
| JNIEXPORT jint JNICALL
 | |
| Java_gnu_xml_libxmlj_dom_GnomeXPathResult_getSnapshotLength (JNIEnv *env,
 | |
|                                                              jobject self)
 | |
| {
 | |
|   xmlXPathObjectPtr obj;
 | |
|   
 | |
|   obj = xmljGetXPathObjectID (env, self);
 | |
|   if (obj == NULL)
 | |
|     {
 | |
|       return -1;
 | |
|     }
 | |
|   if (obj->nodesetval == NULL)
 | |
|     {
 | |
|       return -1;
 | |
|     }
 | |
|   return obj->nodesetval->nodeNr;
 | |
| }
 | |
| 
 | |
| JNIEXPORT jobject JNICALL
 | |
| Java_gnu_xml_libxmlj_dom_GnomeXPathResult_iterateNext (JNIEnv *env,
 | |
|                                                        jobject self)
 | |
| {
 | |
|   xmlXPathObjectPtr obj;
 | |
|   
 | |
|   obj = xmljGetXPathObjectID (env, self);
 | |
|   return NULL; /* TODO */
 | |
| }
 | |
| 
 | |
| JNIEXPORT jobject JNICALL
 | |
| Java_gnu_xml_libxmlj_dom_GnomeXPathResult_snapshotItem (JNIEnv *env,
 | |
|                                                         jobject self,
 | |
|                                                         jint index)
 | |
| {
 | |
|   xmlXPathObjectPtr obj;
 | |
|   
 | |
|   obj = xmljGetXPathObjectID (env, self);
 | |
|   if (obj == NULL)
 | |
|     {
 | |
|       return NULL;
 | |
|     }
 | |
|   if (obj->nodesetval == NULL)
 | |
|     {
 | |
|       return NULL;
 | |
|     }
 | |
|   if (obj->nodesetval->nodeNr > 0)
 | |
|     {
 | |
|       return xmljGetNodeInstance (env, obj->nodesetval->nodeTab[index]);
 | |
|     }
 | |
|   else
 | |
|     {
 | |
|       return NULL;
 | |
|     }
 | |
| }
 | |
| 
 | |
| /* -- GnomeXPathNodeList -- */
 | |
| 
 | |
| JNIEXPORT jobject JNICALL
 | |
| Java_gnu_xml_libxmlj_dom_GnomeDocument_getElementsByTagName (JNIEnv *env,
 | |
|                                                              jobject self,
 | |
|                                                              jstring name)
 | |
| {
 | |
|   return Java_gnu_xml_libxmlj_dom_GnomeElement_getElementsByTagName (env,
 | |
|                                                                      self,
 | |
|                                                                      name);
 | |
| }
 | |
| 
 | |
| JNIEXPORT jobject JNICALL
 | |
| Java_gnu_xml_libxmlj_dom_GnomeElement_getElementsByTagName (JNIEnv *env,
 | |
|                                                              jobject self,
 | |
|                                                              jstring name)
 | |
| {
 | |
|   const xmlChar *s_name;
 | |
|   const xmlChar *format;
 | |
|   xmlChar expr[256];
 | |
|   xmlNodePtr node;
 | |
|   xmlXPathContextPtr ctx;
 | |
|   xmlXPathObjectPtr eval = NULL;
 | |
|   
 | |
|   node = xmljGetNodeID (env, self);
 | |
|   if (node == NULL)
 | |
|     {
 | |
|       return NULL;
 | |
|     }
 | |
|   s_name = xmljGetStringChars (env, name);
 | |
|   if (xmlStrEqual (s_name, BAD_CAST "*"))
 | |
|     {
 | |
|       format = xmlCharStrdup ("descendant-or-self::*[node-type()=1]");
 | |
|       if (xmlStrPrintf (expr, 256, format) == -1)
 | |
|         {
 | |
|           return NULL;
 | |
|         }
 | |
|     }
 | |
|   else
 | |
|     {
 | |
|       format = xmlCharStrdup ("descendant-or-self::*[name()='%s']");
 | |
|       if (xmlStrPrintf (expr, 256, format, s_name) == -1)
 | |
|         {
 | |
|           return NULL;
 | |
|         }
 | |
|     }
 | |
|   xmlFree ((xmlChar *) s_name);
 | |
|   ctx = xmljCreateXPathContextPtr (node);
 | |
|   if (ctx != NULL)
 | |
|     {
 | |
|       eval = xmlXPathEval (expr, ctx);
 | |
|       xmlXPathFreeContext (ctx);
 | |
|     }
 | |
|   return xmljGetXPathNodeList (env, eval);
 | |
| }
 | |
| 
 | |
| JNIEXPORT jobject JNICALL
 | |
| Java_gnu_xml_libxmlj_dom_GnomeDocument_getElementsByTagNameNS (JNIEnv *env,
 | |
|                                                                jobject self,
 | |
|                                                                jstring uri,
 | |
|                                                                jstring localName)
 | |
| {
 | |
|   return Java_gnu_xml_libxmlj_dom_GnomeElement_getElementsByTagNameNS (env,
 | |
|                                                                        self,
 | |
|                                                                        uri,
 | |
|                                                                        localName);
 | |
| }
 | |
| 
 | |
| JNIEXPORT jobject JNICALL
 | |
| Java_gnu_xml_libxmlj_dom_GnomeElement_getElementsByTagNameNS (JNIEnv *env,
 | |
|                                                                jobject self,
 | |
|                                                                jstring uri,
 | |
|                                                                jstring localName)
 | |
| {
 | |
|   const xmlChar *s_uri;
 | |
|   const xmlChar *s_localName;
 | |
|   const xmlChar *format;
 | |
|   xmlChar expr[256];
 | |
|   xmlNodePtr node;
 | |
|   xmlXPathContextPtr ctx;
 | |
|   xmlXPathObjectPtr eval = NULL;
 | |
|   
 | |
|   node = xmljGetNodeID (env, self);
 | |
|   if (node == NULL)
 | |
|     {
 | |
|       return NULL;
 | |
|     }
 | |
|   s_uri = xmljGetStringChars (env, uri);
 | |
|   s_localName = xmljGetStringChars (env, localName);
 | |
|   if (uri == NULL)
 | |
|     {
 | |
|       /* namespace URI is empty */
 | |
|       if (xmlStrEqual (s_localName, BAD_CAST "*"))
 | |
|         {
 | |
|           format = xmlCharStrdup ("descendant-or-self::*[namespace-uri()='' and node-type()=1]");
 | |
|           if (xmlStrPrintf (expr, 256, format) == -1)
 | |
|             {
 | |
|               return NULL;
 | |
|             }
 | |
|         }
 | |
|       else
 | |
|         {
 | |
|           format = xmlCharStrdup ("descendant-or-self::*[namespace-uri()='' and local-name()='%s']");
 | |
|           if (xmlStrPrintf (expr, 256, format, s_localName) == -1)
 | |
|             {
 | |
|               return NULL;
 | |
|             }
 | |
|         }
 | |
|     }
 | |
|   else if (xmlStrEqual (s_uri, BAD_CAST "*"))
 | |
|     {
 | |
|       /* matches all namespaces */
 | |
|       if (xmlStrEqual (s_localName, BAD_CAST "*"))
 | |
|         {
 | |
|           format = xmlCharStrdup ("descendant-or-self::*[node-type()=1]");
 | |
|           if (xmlStrPrintf (expr, 256, format) == -1)
 | |
|             {
 | |
|               return NULL;
 | |
|             }
 | |
|         }
 | |
|       else
 | |
|         {
 | |
|           format = xmlCharStrdup ("descendant-or-self::*[local-name()='%s']");
 | |
|           if (xmlStrPrintf (expr, 256, format, s_localName) == -1)
 | |
|             {
 | |
|               return NULL;
 | |
|             }
 | |
|         }
 | |
|     }
 | |
|   else
 | |
|     {
 | |
|       if (xmlStrEqual (s_localName, BAD_CAST "*"))
 | |
|         {
 | |
|           format = xmlCharStrdup ("descendant-or-self::*[namespace-uri()='%s' and node-type()=1]");
 | |
|           if (xmlStrPrintf (expr, 256, format, s_uri) == -1)
 | |
|             {
 | |
|               return NULL;
 | |
|             }
 | |
|         }
 | |
|       else
 | |
|         {
 | |
|           format = xmlCharStrdup ("descendant-or-self::*[namespace-uri()='%s' and local-name()='%s']");
 | |
|           if (xmlStrPrintf (expr, 256, format, s_uri, s_localName) == -1)
 | |
|             {
 | |
|               return NULL;
 | |
|             }
 | |
|         }
 | |
|     }
 | |
|   xmlFree ((xmlChar *) s_uri);
 | |
|   xmlFree ((xmlChar *) s_localName);
 | |
|   ctx = xmljCreateXPathContextPtr (node);
 | |
|   if (ctx != NULL)
 | |
|     {
 | |
|       eval = xmlXPathEval (expr, ctx);
 | |
|       xmlXPathFreeContext (ctx);
 | |
|     }
 | |
|   return xmljGetXPathNodeList (env, eval);
 | |
| }
 | |
| 
 | |
| JNIEXPORT void JNICALL
 | |
| Java_gnu_xml_libxmlj_dom_GnomeXPathNodeList_free (JNIEnv *env,
 | |
|                                                   jobject self
 | |
| 						  __attribute__((__unused__)),
 | |
|                                                   jobject obj)
 | |
| {
 | |
|   xmlXPathFreeObject ((xmlXPathObjectPtr) xmljAsPointer (env, obj));
 | |
| }
 | |
| 
 | |
| JNIEXPORT jint JNICALL
 | |
| Java_gnu_xml_libxmlj_dom_GnomeXPathNodeList_getLength (JNIEnv *env,
 | |
|                                                        jobject self)
 | |
| {
 | |
|   xmlXPathObjectPtr obj;
 | |
|   
 | |
|   obj = xmljGetXPathObjectID (env, self);
 | |
|   if (obj == NULL)
 | |
|     {
 | |
|       return 0;
 | |
|     }
 | |
|   if (obj->nodesetval == NULL)
 | |
|     {
 | |
|       return 0;
 | |
|     }
 | |
|   return obj->nodesetval->nodeNr;
 | |
| }
 | |
| 
 | |
| JNIEXPORT jobject JNICALL
 | |
| Java_gnu_xml_libxmlj_dom_GnomeXPathNodeList_item (JNIEnv *env,
 | |
|                                                   jobject self,
 | |
|                                                   jint index)
 | |
| {
 | |
|   xmlXPathObjectPtr obj;
 | |
|   
 | |
|   obj = xmljGetXPathObjectID (env, self);
 | |
|   if (obj == NULL)
 | |
|     {
 | |
|       return NULL;
 | |
|     }
 | |
|   if (obj->nodesetval == NULL)
 | |
|     {
 | |
|       return NULL;
 | |
|     }
 | |
|   if (obj->nodesetval->nodeNr > 0)
 | |
|     {
 | |
|       return xmljGetNodeInstance (env, obj->nodesetval->nodeTab[index]);
 | |
|     }
 | |
|   else
 | |
|     {
 | |
|       return NULL;
 | |
|     }
 | |
| }
 | |
| 
 |