src/Pure/General/path.ML
changeset 21858 05f57309170c
parent 19482 9f11af8f7ef9
child 23672 3fd7770f6795
equal deleted inserted replaced
21857:f9d085c2625c 21858:05f57309170c
    19   val is_absolute: T -> bool
    19   val is_absolute: T -> bool
    20   val is_basic: T -> bool
    20   val is_basic: T -> bool
    21   val append: T -> T -> T
    21   val append: T -> T -> T
    22   val appends: T list -> T
    22   val appends: T list -> T
    23   val make: string list -> T
    23   val make: string list -> T
    24   val pack: T -> string
    24   val implode: T -> string
    25   val unpack: string -> T
    25   val explode: string -> T
    26   val dir: T -> T
    26   val dir: T -> T
    27   val base: T -> T
    27   val base: T -> T
    28   val ext: string -> T -> T
    28   val ext: string -> T -> T
    29   val split_ext: T -> T * string
    29   val split_ext: T -> T * string
    30   val expand: T -> T
    30   val expand: T -> T
    93 fun appends paths = Library.foldl (uncurry append) (current, paths);
    93 fun appends paths = Library.foldl (uncurry append) (current, paths);
    94 val make = appends o map basic;
    94 val make = appends o map basic;
    95 fun norm path = rev_app [] path;
    95 fun norm path = rev_app [] path;
    96 
    96 
    97 
    97 
    98 (* pack *)
    98 (* implode *)
    99 
    99 
   100 fun pack_elem Root = ""
   100 fun implode_elem Root = ""
   101   | pack_elem Parent = ".."
   101   | implode_elem Parent = ".."
   102   | pack_elem (Basic s) = s
   102   | implode_elem (Basic s) = s
   103   | pack_elem (Variable s) = "$" ^ s;
   103   | implode_elem (Variable s) = "$" ^ s;
   104 
   104 
   105 fun pack (Path []) = "."
   105 fun implode_path (Path []) = "."
   106   | pack (Path (Root :: xs)) = "/" ^ space_implode "/" (map pack_elem xs)
   106   | implode_path (Path (Root :: xs)) = "/" ^ space_implode "/" (map implode_elem xs)
   107   | pack (Path xs) = space_implode "/" (map pack_elem xs);
   107   | implode_path (Path xs) = space_implode "/" (map implode_elem xs);
   108 
   108 
   109 
   109 
   110 (* unpack *)
   110 (* explode *)
   111 
   111 
   112 fun unpack_elem "" = Root
   112 fun explode_elem "" = Root
   113   | unpack_elem ".." = Parent
   113   | explode_elem ".." = Parent
   114   | unpack_elem "~" = Variable "HOME"
   114   | explode_elem "~" = Variable "HOME"
   115   | unpack_elem "~~" = Variable "ISABELLE_HOME"
   115   | explode_elem "~~" = Variable "ISABELLE_HOME"
   116   | unpack_elem s =
   116   | explode_elem s =
   117       (case explode s of
   117       (case explode s of
   118         "$" :: cs => variable_elem cs
   118         "$" :: cs => variable_elem cs
   119       | cs => basic_elem cs);
   119       | cs => basic_elem cs);
   120 
   120 
   121 val unpack_elems = map unpack_elem o filter_out (fn c => c = "" orelse c = ".");
   121 val explode_elems = map explode_elem o filter_out (fn c => c = "" orelse c = ".");
   122 
   122 
   123 fun unpack str = Path (norm
   123 fun explode_path str = Path (norm
   124   (case space_explode "/" str of
   124   (case space_explode "/" str of
   125     "" :: ss => Root :: unpack_elems ss
   125     "" :: ss => Root :: explode_elems ss
   126   | ss => unpack_elems ss));
   126   | ss => explode_elems ss));
   127 
   127 
   128 
   128 
   129 (* base element *)
   129 (* base element *)
   130 
   130 
   131 fun split_path f (path as Path xs) =
   131 fun split_path f (path as Path xs) =
   132   (case try split_last xs of
   132   (case try split_last xs of
   133     SOME (prfx, Basic s) => f (prfx, s)
   133     SOME (prfx, Basic s) => f (prfx, s)
   134   | _ => error ("Cannot split path into dir/base: " ^ quote (pack path)));
   134   | _ => error ("Cannot split path into dir/base: " ^ quote (implode_path path)));
   135 
   135 
   136 val dir = split_path (fn (prfx, _) => Path prfx);
   136 val dir = split_path (fn (prfx, _) => Path prfx);
   137 val base = split_path (fn (_, s) => Path [Basic s]);
   137 val base = split_path (fn (_, s) => Path [Basic s]);
   138 
   138 
   139 fun ext "" path = path
   139 fun ext "" path = path
   148 (* expand variables *)
   148 (* expand variables *)
   149 
   149 
   150 fun eval (Variable s) =
   150 fun eval (Variable s) =
   151     (case getenv s of
   151     (case getenv s of
   152       "" => error ("Undefined Isabelle environment variable: " ^ quote s)
   152       "" => error ("Undefined Isabelle environment variable: " ^ quote s)
   153     | path => rep (unpack path))
   153     | path => rep (explode_path path))
   154   | eval x = [x];
   154   | eval x = [x];
   155 
   155 
   156 val expand = rep #> maps eval #> norm #> Path;
   156 val expand = rep #> maps eval #> norm #> Path;
   157 val position = expand #> pack #> quote #> Position.line_name 1;
   157 val position = expand #> implode_path #> quote #> Position.line_name 1;
       
   158 
       
   159 
       
   160 (*final declarations of this structure!*)
       
   161 val implode = implode_path;
       
   162 val explode = explode_path;
   158 
   163 
   159 end;
   164 end;