parameters: (self, p, directory, fsclass, create=1)
return_statement: return root._lookup_abs(p, fsclass, create)
docstring: The generic entry point for Node lookup with user-supplied data.
  
          This translates arbitrary input into a canonical Node.FS object
          of the specified fsclass.  The general approach for strings is
          to turn it into a fully normalized absolute path and then call
          the root directory's lookup_abs() method for the heavy lifting.
  
          If the path name begins with '#', it is unconditionally
          interpreted relative to the top-level directory of this FS.  '#'
          is treated as a synonym for the top-level SConstruct directory,
          much like '~' is treated as a synonym for the user's home
          directory in a UNIX shell.  So both '#foo' and '#/foo' refer
          to the 'foo' subdirectory underneath the top-level SConstruct
          directory.
  
          If the path name is relative, then the path is looked up relative
          to the specified directory, or the current directory (self._cwd,
          typically the SConscript directory) if the specified directory
          is None.
docstring_summary: The generic entry point for Node lookup with user-supplied data.
docstring_tokens: The generic entry point for Node lookup with user - supplied data .
function: def _lookup(self, p, directory, fsclass, create=1):
          """
          The generic entry point for Node lookup with user-supplied data.
  
          This translates arbitrary input into a canonical Node.FS object
          of the specified fsclass.  The general approach for strings is
          to turn it into a fully normalized absolute path and then call
          the root directory's lookup_abs() method for the heavy lifting.
  
          If the path name begins with '#', it is unconditionally
          interpreted relative to the top-level directory of this FS.  '#'
          is treated as a synonym for the top-level SConstruct directory,
          much like '~' is treated as a synonym for the user's home
          directory in a UNIX shell.  So both '#foo' and '#/foo' refer
          to the 'foo' subdirectory underneath the top-level SConstruct
          directory.
  
          If the path name is relative, then the path is looked up relative
          to the specified directory, or the current directory (self._cwd,
          typically the SConscript directory) if the specified directory
          is None.
          """
          if isinstance(p, Base):
              # It's already a Node.FS object.  Make sure it's the right
              # class and return.
              p.must_be_same(fsclass)
              return p
          # str(p) in case it's something like a proxy object
          p = str(p)
  
          if not os_sep_is_slash:
              p = p.replace(OS_SEP, '/')
  
          if p[0:1] == '#':
              # There was an initial '#', so we strip it and override
              # whatever directory they may have specified with the
              # top-level SConstruct directory.
              p = p[1:]
              directory = self.Top
  
              # There might be a drive letter following the
              # '#'. Although it is not described in the SCons man page,
              # the regression test suite explicitly tests for that
              # syntax. It seems to mean the following thing:
              #
              #   Assuming the the SCons top dir is in C:/xxx/yyy,
              #   '#X:/toto' means X:/xxx/yyy/toto.
              #
              # i.e. it assumes that the X: drive has a directory
              # structure similar to the one found on drive C:.
              if do_splitdrive:
                  drive, p = _my_splitdrive(p)
                  if drive:
                      root = self.get_root(drive)
                  else:
                      root = directory.root
              else:
                  root = directory.root
  
              # We can only strip trailing after splitting the drive
              # since the drive might the UNC '//' prefix.
              p = p.strip('/')
  
              needs_normpath = needs_normpath_match(p)
  
              # The path is relative to the top-level SCons directory.
              if p in ('', '.'):
                  p = directory.get_labspath()
              else:
                  p = directory.get_labspath() + '/' + p
          else:
              if do_splitdrive:
                  drive, p = _my_splitdrive(p)
                  if drive and not p:
                      # This causes a naked drive letter to be treated
                      # as a synonym for the root directory on that
                      # drive.
                      p = '/'
              else:
                  drive = ''
  
              # We can only strip trailing '/' since the drive might the
              # UNC '//' prefix.
              if p != '/':
                  p = p.rstrip('/')
  
              needs_normpath = needs_normpath_match(p)
  
              if p[0:1] == '/':
                  # Absolute path
                  root = self.get_root(drive)
              else:
                  # This is a relative lookup or to the current directory
                  # (the path name is not absolute).  Add the string to the
                  # appropriate directory lookup path, after which the whole
                  # thing gets normalized.
                  if directory:
                      if not isinstance(directory, Dir):
                          directory = self.Dir(directory)
                  else:
                      directory = self._cwd
  
                  if p in ('', '.'):
                      p = directory.get_labspath()
                  else:
                      p = directory.get_labspath() + '/' + p
  
                  if drive:
                      root = self.get_root(drive)
                  else:
                      root = directory.root
  
          if needs_normpath is not None:
              # Normalize a pathname. Will return the same result for
              # equivalent paths.
              #
              # We take advantage of the fact that we have an absolute
              # path here for sure. In addition, we know that the
              # components of lookup path are separated by slashes at
              # this point. Because of this, this code is about 2X
              # faster than calling os.path.normpath() followed by
              # replacing os.sep with '/' again.
              ins = p.split('/')[1:]
              outs = []
              for d in ins:
                  if d == '..':
                      try:
                          outs.pop()
                      except IndexError:
                          pass
                  elif d not in ('', '.'):
                      outs.append(d)
              p = '/' + '/'.join(outs)
  
          return root._lookup_abs(p, fsclass, create)
function_tokens: def _lookup ( self , p , directory , fsclass , create = 1 ) : if isinstance ( p , Base ) : # It's already a Node.FS object.  Make sure it's the right # class and return. p . must_be_same ( fsclass ) return p # str(p) in case it's something like a proxy object p = str ( p ) if not os_sep_is_slash : p = p . replace ( OS_SEP , '/' ) if p [ 0 : 1 ] == '#' : # There was an initial '#', so we strip it and override # whatever directory they may have specified with the # top-level SConstruct directory. p = p [ 1 : ] directory = self . Top # There might be a drive letter following the # '#'. Although it is not described in the SCons man page, # the regression test suite explicitly tests for that # syntax. It seems to mean the following thing: # #   Assuming the the SCons top dir is in C:/xxx/yyy, #   '#X:/toto' means X:/xxx/yyy/toto. # # i.e. it assumes that the X: drive has a directory # structure similar to the one found on drive C:. if do_splitdrive : drive , p = _my_splitdrive ( p ) if drive : root = self . get_root ( drive ) else : root = directory . root else : root = directory . root # We can only strip trailing after splitting the drive # since the drive might the UNC '//' prefix. p = p . strip ( '/' ) needs_normpath = needs_normpath_match ( p ) # The path is relative to the top-level SCons directory. if p in ( '' , '.' ) : p = directory . get_labspath ( ) else : p = directory . get_labspath ( ) + '/' + p else : if do_splitdrive : drive , p = _my_splitdrive ( p ) if drive and not p : # This causes a naked drive letter to be treated # as a synonym for the root directory on that # drive. p = '/' else : drive = '' # We can only strip trailing '/' since the drive might the # UNC '//' prefix. if p != '/' : p = p . rstrip ( '/' ) needs_normpath = needs_normpath_match ( p ) if p [ 0 : 1 ] == '/' : # Absolute path root = self . get_root ( drive ) else : # This is a relative lookup or to the current directory # (the path name is not absolute).  Add the string to the # appropriate directory lookup path, after which the whole # thing gets normalized. if directory : if not isinstance ( directory , Dir ) : directory = self . Dir ( directory ) else : directory = self . _cwd if p in ( '' , '.' ) : p = directory . get_labspath ( ) else : p = directory . get_labspath ( ) + '/' + p if drive : root = self . get_root ( drive ) else : root = directory . root if needs_normpath is not None : # Normalize a pathname. Will return the same result for # equivalent paths. # # We take advantage of the fact that we have an absolute # path here for sure. In addition, we know that the # components of lookup path are separated by slashes at # this point. Because of this, this code is about 2X # faster than calling os.path.normpath() followed by # replacing os.sep with '/' again. ins = p . split ( '/' ) [ 1 : ] outs = [ ] for d in ins : if d == '..' : try : outs . pop ( ) except IndexError : pass elif d not in ( '' , '.' ) : outs . append ( d ) p = '/' + '/' . join ( outs ) return root . _lookup_abs ( p , fsclass , create )