Annotation of researchv10no/cmd/sml/src/sepcomp/filepaths.sml, revision 1.1

1.1     ! root        1: (* Copyright 1989 by AT&T Bell Laboratories *)
        !             2: (* FILEPATHS: maintain default paths (file prefixes, essentially) when
        !             3:              opening nested imported files. *)
        !             4: 
        !             5: (* Trivial FILEPATHS example:
        !             6: 
        !             7: functor TrivPaths(): FILEPATHS =
        !             8: struct
        !             9:   type Filepath = unit
        !            10:   val defaultPath = ()
        !            11:   exception ImpliedPath
        !            12:   fun impliedPath(_, filename) = {validName=filename, newPath=()}
        !            13: end
        !            14: *)
        !            15: (* UNIX version: Any filename which starts with "/" is assumed to be
        !            16:                 absolute, and implies that entire directory. 
        !            17:                 Any filename which starts with "./" causes a search from
        !            18:                 the current working directory into the subdirectories.
        !            19:                 Any other filename (xxx/yyy/...) is relative to the
        !            20:                 current path.
        !            21:  *)
        !            22: 
        !            23: functor UnixPaths(): FILEPATHS =
        !            24: struct
        !            25: 
        !            26:   val DEBUG = false
        !            27:   val debug = 
        !            28:       if DEBUG then fn str => output std_out ("<" ^ str ^ ">\n")
        !            29:       else fn _ => ()
        !            30: 
        !            31:   type Filepath = string               (* Yes, I know, pretty trivial,
        !            32:                                         but I'd like to keep it abstract,
        !            33:                                         all the same. *)
        !            34:   exception ImpliedPath
        !            35: 
        !            36:   val defaultPath = ""
        !            37: 
        !            38:   (* divideSlash: divide a full filename into path and name. Keep the "/"
        !            39:      on the path. *)
        !            40: 
        !            41:   fun divideSlash filename =
        !            42:       let val revChars = rev(explode filename)
        !            43:          fun stripSlash(nil, name) = (nil, name)
        !            44:            | stripSlash(p as "/" :: rest, name) = (rev p, name)
        !            45:            | stripSlash(ch :: rest, name) = stripSlash(rest, ch :: name)
        !            46:        in stripSlash(revChars, nil)
        !            47:       end
        !            48: 
        !            49:   fun impliedPath(oldPath, oldName) =
        !            50:       let val (pathchs, namechs) = divideSlash oldName
        !            51:          val path = implode pathchs
        !            52:          val name =  implode namechs
        !            53:        in case pathchs
        !            54:            of "/" :: _ => {validName=path^name, newPath=path}
        !            55:             | "." :: "/" :: _ => {validName=path^name, newPath=path}
        !            56:             | _ => {validName=oldPath^path^name, newPath=oldPath^path}
        !            57:       end
        !            58: 
        !            59:   val impliedPath =
        !            60:       if DEBUG then
        !            61:        fn (oldPath, oldName) =>
        !            62:          let val {validName, newPath} = impliedPath(oldPath, oldName)
        !            63:           in debug("impliedPath(oldPath=" ^ oldPath ^ ", oldName=" ^ oldName
        !            64:                    ^ ") -> (" ^ validName ^ ", " ^ newPath ^ ")");
        !            65:              {validName=validName, newPath=newPath}
        !            66:          end
        !            67:       else impliedPath
        !            68: 
        !            69: end (* functor UnixPaths *)

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.