function [y,b] = istree(tr,ij)

% I=istree(X) returns I=1 if X is a tree (e.g, as created by the 
%     function TREE); otherwise it returns I=0.
%
% [I,B]=ISTREE(X,PATH) returns I=1 if both X is a tree and PATH is
%     a valid PATH in the tree X; otherwise it returns I=0.  If the
%     optional output argument B is present, then B returns the value
%     of the branch specified by PATH, provided X is a tree and PATH
%     is a valid path in X. 
%


% R. Y. Chiang & M. G. Safonov 10/01/90	
% Copyright (c) 1990 by the MathWorks, Inc.
% All Rights Reserved.
% ---------------------------------------------------------------------------

%  This function uses essentially the same code as BRANCH with only
%  minor modification at beginning and end of code, and the replacement
%  of ERROR with RETURN throughout

nin=nargin-1;
nout=nargout;
y=0;
b=[];
magic1 = 29816; % Every tree vector TR includes these two "magic numbers"
magic2 = 18341; % in postions TR(2) and TR(3) for identification purposes.

if nin==-1, error('No input argument'),end

%  Check that TR is a tree
msg='first input argument must be a TREE';
%  Check that TR is a vector and has length at least 5
if max(size(tr))<6 | min(size(tr))~=1,
  % error(msg);
  return
end
% If TR is a row vector, transpose it
tr=tr(:);  
% Check magic numbers to ensure that TR is a tree
if tr(2)~=magic1 |tr(3)~=magic2
  % error(msg);
  return
end
if nin==0, y=1; return, end

% Now check whether IJ is a valid branch of TR

j=1;

% Start of part that is same as BRANCH.M, execept RETURN's replacing ERROR's
%--------------------------------------------------------------------------
   [rj,cj]=size(ij);
   if rj~=1| cj==0,
        % error('invalid path or index')
        return
   end
   if isstr(ij),           % case of string-name path IJ=PATHJ
      flag=1;
      ij=[ij '/'];           % append extra '/' to string ij
      if ij(1)~='/',ij=['/' ij];end  %if missing add leading '/'
      pptrj=find(ij=='/');   % PPTRJ = pointers to /'s in PATH IJ
      lj=max(size(pptrj))-1; % path length (number of names)
   else                      % case of numeric path INDEX IJ
      flag=0;             
      lj=max(size(ij));      % path length (number of indices)
   end
   x = tr; 
   % Now descend tree X one branch at a time, recursively
   % overwriting X with root branch having index IJ(K)
   for k=1:lj, 
     % Check to make sure X is a TREE 
     if max(size(x))<6 | min(size(x))~=1,
       % error('Invalid path or branch');
       return
     end
     if x(2)~=magic1 |x(3)~=magic2
        % error('Invalid path or branch');
        return
     end

     [rx1,cx1]=size(x);
     if flag ==1,
        nm = branch(x,0);
        nm=[',' nm ','];  % nm = ',name1,name2,..,namen,'

        % Now get k-th name in pathj
        if pptrj(k+1)-pptrj(k)>1,
            nmjk = ij(pptrj(k)+1:pptrj(k+1)-1);
        else
            % error('empty string encountered in path')
            return
        end

        if max(nmjk)<='9' & min(nmjk)>=0,  % If NMJK contains a string
           [rnmjk,cnmjk]=size(nmjk);       % representation of an 
           njk=0;                          % integer, set NJK equal
           for jjj=1:cnmjk,                % to that integer
               njk=nmjk(jjj)-'0'+10*njk;
           end
        else                               % otherwise...
           % compare NMJK with names in NM and set 
           % NJK = (position in nm of name matching NMJK); if no
           % match found then set fflag = 0 and announce error
           nmptr=find(nm==',');
           nnm = max(size(nmptr))-1; % number branch names in nm
           fflag=0;
           iter=0;
           while fflag==0 & iter<nnm
              temp=nm(nmptr(iter+1)+1:nmptr(iter+2)-1);
              if size(nmjk)==size(temp),    % if match found
                 if nmjk==temp,             % set NJK=ITER+1
                   njk=iter+1;              % and exit while 
                   fflag=1;                 % loop 
                 end                       
              end                           
              iter=iter+1;
           end
           if fflag==0,
              % error(['branch ' ij(1:pptrj(k+1)-1) ' not present']);
              return
           end
        end
     else
        njk = ij(k);
     end      
     msg=['branch B' num2str(j) ' index out of range'];
     if njk>x(1)| njk<0 | njk+6>rx1,
        % error(msg),
        return
     end
     ptr1 = x(njk+6);   % points to start of njk-th subfield of DAT
     if ptr1~=1,
         rx = x(ptr1);  % rows of branch
     else                   
         rx=0;          % empty matrix is indicated by ptr1=1
     end     
     if rx<0,     % RX is negative if the branch contains string data 
          rx = abs(x(ptr1)); 
          sflag=1;
     else
          sflag=0;
     end
     if rx1>=ptr1+1,
        cx = x(ptr1+1);   % cols of x
     else
        % error('Invalid path or branch')
        return
     end
     lx = rx*cx;       % length of x
     if lx>0 & ptr1+lx+1<=rx1,  % if new X empty and old X is big enough
        xcol = x(ptr1+2:ptr1+lx+1); % Store new X data into XCOL
        x = zeros(rx,cx);      % Create a new X matrix of correct dimension
        x(:) = xcol(:);        % Now fill in new X with XCOL data
     elseif lx==0,
        x=[];
     else
        % error('invalid path or index')
        return
     end
   end
   if sflag==1,
      x=setstr(x);  %set string bit
   end
% ------------End of part that is same as BRANCH.M  -----------------

   b=x;
   y=1;
% ------ End of  ISTREE.M --- RYC/MGS 10/25/90 %
