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; |