165 lines · 3.7 KB · Text
RawDownload
(* filename.mlp *) open CharVector; fun check_suffix name suff =  let val name_len = size name      val suff_len = size suff  in    name_len >= suff_len andalso    extract(name, name_len - suff_len, SOME suff_len) = suff  end; fun chop_suffix name suff =  extract(name, 0, SOME (size name - size suff)); #ifdef unixval current_dir_name = "."; fun concat dirname filename =  let val len = size dirname      val x   = if len = 0 then "/" else extract(dirname, len-1, SOME 1)  in    case x of        "/"   => dirname ^ filename      | _     => dirname ^ "/" ^ filename  end; fun is_absolute n =  let val len = size n in     (len >= 1 andalso extract(n, 0, SOME 1) = "/")    orelse     (len >= 2 andalso extract(n, 0, SOME 2) = "./")   orelse     (len >= 3 andalso extract(n, 0, SOME 3) = "../")  end; fun slash_pos s =  let fun pos i =    if i < 0 then NONE else    case extract(s, i, SOME 1) of        "/"  => SOME i      | _    => pos (i - 1)  in pos (size s - 1) end; fun basename name =  case slash_pos name of      SOME p =>         extract(name, p+1, NONE)    | NONE   => name; fun dirname name =  if name = "/" then name else  case slash_pos name of      SOME p  => extract(name, 0, SOME p)    | NONE    => ".";#endif #ifdef macintoshval current_dir_name = ":"; fun is_absolute n =  let val len = size n      fun h i =         if i >= len then false        else if extract(n, i, SOME 1) = ":" then true        else h (i+1)  in h 0 end; fun concat dirname filename =  let val dirname1 =        if is_absolute dirname        then dirname        else ":" ^ dirname      val l = size dirname1 - 1      val dirname2 =        if l < 0 orelse extract(dirname1, l, SOME 1) = ":"        then dirname1        else dirname1 ^ ":"      val len = size filename      val filename2 =        if len > 0 andalso extract(filename, 0, SOME 1) = ":"        then extract(filename, 1, NONE)        else filename   in dirname2 ^ filename2 end; fun colon_pos s =  let fun pos i =    if i < 0 then NONE else    case extract(s, i, SOME 1) of        ":"  => SOME i      | _    => pos (i - 1)  in pos (size s - 1) end; fun basename name =  case colon_pos name of      SOME p =>         extract(name, p+1, NONE)    | NONE   => name; fun dirname name =  if name = ":" then name else  case colon_pos name of      SOME p  => extract(name, 0, SOME p)    | NONE    => ":";#endif #if defined(msdos) || defined(win32)val current_dir_name = "."; fun concat dirname filename =  let val len = size dirname      val x   = if len = 0 then "\\" else extract(dirname, len-1, SOME 1)  in    case x of        "\\"  => dirname ^ filename      | ":"   => dirname ^ filename      | _     => dirname ^ "\\" ^ filename  end; fun is_absolute n =  let val len = size n in    (len >= 2 andalso extract(n, 1, SOME 1) = ":")     orelse     (len >= 1 andalso extract(n, 0, SOME 1) = "\\")    orelse     (len >= 2 andalso extract(n, 0, SOME 2) = ".\\")   orelse     (len >= 3 andalso extract(n, 0, SOME 3) = "..\\")  end; fun sep_pos s =  let fun pos i =    if i < 0 then NONE else    case extract(s, i, SOME 1) of        "/"  => SOME i      | "\\" => SOME i      | ":"  => SOME i      | _    => pos (i - 1)  in pos (size s - 1) end; fun basename name =  case sep_pos name of      SOME p =>         extract(name, p+1, NONE)    | NONE   => name; fun dirname name =  let val len = size name in    if len >= 2 andalso extract(name, 1, SOME 1) = ":" then      extract(name, 0, SOME 2) ^         dirname (extract(name, 2, NONE))    else if name = "/" orelse name = "\\" then      name    else      case sep_pos name of          SOME p => extract(name, 0, SOME p)        | NONE   => "."  end; #endif