logo       
Google Custom Search
    AddThis Social Bookmark Button

r27733 - lxml/trunk/src/lxml: msg#00267

Subject: r27733 - lxml/trunk/src/lxml
Author: scoder
Date: Fri May 26 19:03:04 2006
New Revision: 27733

Modified:
   lxml/trunk/src/lxml/xpath.pxi
Log:
factored out test for absolute paths into evaluator base class method

Modified: lxml/trunk/src/lxml/xpath.pxi
==============================================================================
--- lxml/trunk/src/lxml/xpath.pxi       (original)
+++ lxml/trunk/src/lxml/xpath.pxi       Fri May 26 19:03:04 2006
@@ -58,6 +58,20 @@
         if self._xpathCtxt is not NULL:
             xpath.xmlXPathFreeContext(self._xpathCtxt)
 
+    cdef int _checkAbsolutePath(self, char* path):
+        cdef char c
+        if path is NULL:
+            return 0
+        c = path[0]
+        while c != c'\0':
+            if c == c'/':
+                return 1
+            elif c != c' ' and c != c'\t':
+                break
+            path = path + 1
+            c = path[0]
+        return 0
+
     cdef _raise_parse_error(self):
         if self._xpathCtxt is not NULL and \
                self._xpathCtxt.lastError.message is not NULL:
@@ -133,8 +147,10 @@
         cdef xpath.xmlXPathContext* xpathCtxt
         cdef xpath.xmlXPathObject*  xpathObj
         cdef _Document doc
+        cdef char* c_path
         path = _utf8(_path)
-        if path.lstrip().startswith('/'):
+        c_path = _cstr(path)
+        if self._checkAbsolutePath(c_path):
             raise LxmlSyntaxError, "cannot use absolute path on element"
         xpathCtxt = self._xpathCtxt
         xpathCtxt.node = self._element._c_node
@@ -143,7 +159,7 @@
         self._context.register_context(xpathCtxt, doc)
         try:
             self._context.registerVariables(_variables)
-            xpathObj = xpath.xmlXPathEvalExpression(_cstr(path), xpathCtxt)
+            xpathObj = xpath.xmlXPathEvalExpression(c_path, xpathCtxt)
         finally:
             self._context.unregister_context()
 
@@ -206,16 +222,18 @@
     cdef int _absolute
 
     def __init__(self, path, namespaces=None, extensions=None):
+        cdef char* c_path
         XPathEvaluatorBase.__init__(self, namespaces, extensions, None)
         self._xpath = NULL
         self.path = path
         path = _utf8(path)
+        c_path = _cstr(path)
         self._xpathCtxt = xpath.xmlXPathNewContext(NULL)
         _setupDict(self._xpathCtxt)
-        self._xpath = xpath.xmlXPathCtxtCompile(self._xpathCtxt, _cstr(path))
+        self._xpath = xpath.xmlXPathCtxtCompile(self._xpathCtxt, c_path)
         if self._xpath is NULL:
             self._raise_parse_error()
-        self._absolute = path.lstrip().startswith('/')
+        self._absolute = self._checkAbsolutePath(c_path)
 
     def __call__(self, _etree_or_element, **_variables):
         cdef xpath.xmlXPathContext* xpathCtxt


<Prev in Thread] Current Thread [Next in Thread>