Here is the filesystem pathname translation algorithm
discussed in class 2003-11-11 (all sections):

/*
    p:  a pathname string
    pi:  ith component (left-to-right) of p
    d:  an i-number
    
    output:  i-number of the file denoted by p

    restrictions:  doesn't work for symbolic-links

    error conditions:  no error-checking performed, must be added
*/
	
Translate(p)
  {
    d := i-number of root directory;
    for i := 1 to num_components(p)
      {
        get_inode(d);
        get_directory_entries(d);
        d := lookup( d, pi );
      }
    return(d);
  }

The enhancement of the algorithm to support symbolic links
requires the addition of code at two points in the above:
1) to handle symbolic links found in the middle of a pathname
2) to handle a leaf-node symbolic link


/*
    p:  a pathname string
    pi: ith component (left-to-right) of p
    d:  an i-number
    l:  a symbolic-link string  (contents of the symbolic-link file)
    
    output:  i-number of the file denoted by p

    error conditions:  no error-checking performed, must be added

    note:  This version uses an "if" test for the symbolic link.  The
           version presented in one of the sections used a while-loop,
           but after discussion it was decided that "if" was sufficient. 
*/
	
Translate(p)
  {
    d := i-number of root directory;
    for i := 1 to num_components(p)
      {
        get_inode(d);
        if is_sym_link(d)
          {
            l := get_symlink_data(d);
            d := translate( l );
          }
        get_directory_entries(d);
        d := lookup( d, pi );
      }
    if is_sym_link(d)
      {
        l := get_symlink_data(d);
        d := translate( l );
      }
    return(d);
  }