code: public int getPreviousSibling(int nodeHandle)
    {
      if (nodeHandle == DTM.NULL)
        return DTM.NULL;
      
      if (m_prevsib != null)
        return makeNodeHandle(_prevsib(makeNodeIdentity(nodeHandle)));
      else
      {
        // If the previous sibling array is not built, we get at
        // the previous sibling using the parent, firstch and 
        // nextsib arrays. 
        int nodeID = makeNodeIdentity(nodeHandle);
        int parent = _parent(nodeID);
        int node = _firstch(parent);
        int result = DTM.NULL;
        while (node != nodeID)
        {
          result = node;
          node = _nextsib(node);
        }
        return makeNodeHandle(result);
      }
    }
docs: Given a node handle, find its preceeding sibling.
  WARNING: DTM is asymmetric; this operation is resolved by search, and is
  relatively expensive.
  
  @param nodeHandle the id of the node.
  @return int Node-number of the previous sib,
  or DTM.NULL to indicate none exists.