diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/kernel/test/file_name_SUITE.erl | 3 | ||||
| -rw-r--r-- | lib/stdlib/src/filelib.erl | 28 | ||||
| -rw-r--r-- | lib/stdlib/src/filename.erl | 28 | ||||
| -rw-r--r-- | lib/stdlib/test/filelib_SUITE.erl | 7 | ||||
| -rw-r--r-- | lib/stdlib/test/filename_SUITE.erl | 315 | 
5 files changed, 363 insertions, 18 deletions
diff --git a/lib/kernel/test/file_name_SUITE.erl b/lib/kernel/test/file_name_SUITE.erl index 8829e93473..fea4df8539 100644 --- a/lib/kernel/test/file_name_SUITE.erl +++ b/lib/kernel/test/file_name_SUITE.erl @@ -507,6 +507,9 @@ check_very_icky(Mod) ->  			       end,  	?line {NumOK,NumNOK} = filelib:fold_files(".",".*",true,fun(_F,{N,M}) when is_list(_F) ->  io:format("~ts~n",[_F]),{N+1,M}; (_F,{N,M}) ->  io:format("~p~n",[_F]),{N,M+1} end,{0,0}),  	?line ok = filelib:fold_files(".",[1076,1089,1072,124,46,42],true,fun(_F,_) -> ok end,false), +	?line SF3 = unicode:characters_to_binary("���subfil3",file:native_name_encoding()), +	?line Sorted = lists:sort([SF3,<<"���subfil2">>]), +	?line Sorted = lists:sort(filelib:wildcard("*",<<"���subdir2">>)),  	ok      catch  	throw:need_unicode_mode -> diff --git a/lib/stdlib/src/filelib.erl b/lib/stdlib/src/filelib.erl index 04147d40d1..c845b61204 100644 --- a/lib/stdlib/src/filelib.erl +++ b/lib/stdlib/src/filelib.erl @@ -47,14 +47,14 @@ wildcard(Pattern) when is_list(Pattern) ->      ?HANDLE_ERROR(do_wildcard(Pattern, file)).  -spec wildcard(file:name(), file:name() | atom()) -> [file:filename()]. -wildcard(Pattern, Cwd) when is_list(Pattern), is_list(Cwd) -> +wildcard(Pattern, Cwd) when is_list(Pattern), (is_list(Cwd) or is_binary(Cwd)) ->      ?HANDLE_ERROR(do_wildcard(Pattern, Cwd, file));  wildcard(Pattern, Mod) when is_list(Pattern), is_atom(Mod) ->      ?HANDLE_ERROR(do_wildcard(Pattern, Mod)).  -spec wildcard(file:name(), file:name(), atom()) -> [file:filename()].  wildcard(Pattern, Cwd, Mod) -  when is_list(Pattern), is_list(Cwd), is_atom(Mod) -> +  when is_list(Pattern), (is_list(Cwd) or is_binary(Cwd)), is_atom(Mod) ->      ?HANDLE_ERROR(do_wildcard(Pattern, Cwd, Mod)).  -spec is_dir(file:name()) -> boolean(). @@ -118,7 +118,7 @@ do_wildcard_comp({compiled_wildcard,{exists,File}}, Mod) ->  do_wildcard_comp({compiled_wildcard,[Base|Rest]}, Mod) ->      do_wildcard_1([Base], Rest, Mod). -do_wildcard(Pattern, Cwd, Mod) when is_list(Pattern), is_list(Cwd) -> +do_wildcard(Pattern, Cwd, Mod) when is_list(Pattern), (is_list(Cwd) or is_binary(Cwd)) ->      do_wildcard_comp(do_compile_wildcard(Pattern), Cwd, Mod).  do_wildcard_comp({compiled_wildcard,{exists,File}}, Cwd, Mod) -> @@ -127,9 +127,18 @@ do_wildcard_comp({compiled_wildcard,{exists,File}}, Cwd, Mod) ->  	_ -> []      end;  do_wildcard_comp({compiled_wildcard,[current|Rest]}, Cwd0, Mod) -> -    Cwd = filename:join([Cwd0]),		%Slash away redundant slashes. -    PrefixLen = length(Cwd)+1, -    [lists:nthtail(PrefixLen, N) || N <- do_wildcard_1([Cwd], Rest, Mod)]; +    {Cwd,PrefixLen} = case filename:join([Cwd0]) of +	      Bin when is_binary(Bin) -> {Bin,byte_size(Bin)+1}; +	      Other -> {Other,length(Other)+1} +	  end,		%Slash away redundant slashes. +    [ +     if  +	 is_binary(N) -> +	     <<_:PrefixLen/binary,Res/binary>> = N, +	     Res; +	 true -> +	     lists:nthtail(PrefixLen, N) +     end || N <- do_wildcard_1([Cwd], Rest, Mod)];  do_wildcard_comp({compiled_wildcard,[Base|Rest]}, _Cwd, Mod) ->      do_wildcard_1([Base], Rest, Mod). @@ -276,6 +285,13 @@ do_wildcard_3(Base, [Pattern|Rest], Result, Mod) ->  do_wildcard_3(Base, [], Result, _Mod) ->      [Base|Result]. +wildcard_4(Pattern, [File|Rest], Base, Result) when is_binary(File) -> +    case wildcard_5(Pattern, binary_to_list(File)) of +	true -> +	    wildcard_4(Pattern, Rest, Base, [join(Base, File)|Result]); +	false -> +	    wildcard_4(Pattern, Rest, Base, Result) +    end;  wildcard_4(Pattern, [File|Rest], Base, Result) ->      case wildcard_5(Pattern, File) of  	true -> diff --git a/lib/stdlib/src/filename.erl b/lib/stdlib/src/filename.erl index 9ca4b808e1..e38b8957f2 100644 --- a/lib/stdlib/src/filename.erl +++ b/lib/stdlib/src/filename.erl @@ -151,10 +151,10 @@ win_basenameb(O) ->      basenameb(O,[<<"/">>,<<"\\">>]).  basenameb(Bin,Sep) ->      Parts = [ X || X <- binary:split(Bin,Sep,[global]), -		   X =:= <<>> ], +		   X =/= <<>> ],      if  	Parts =:= [] -> -	    []; +	    <<>>;  	true ->  	    lists:last(Parts)      end. @@ -201,17 +201,19 @@ basename(Name, Ext) when is_list(Name), is_binary(Ext) ->      basename(filename_string_to_binary(Name),Ext);  basename(Name, Ext) when is_binary(Name), is_binary(Ext) ->      BName = basename(Name), +    LAll = byte_size(Name),      LN = byte_size(BName),      LE = byte_size(Ext),      case LN - LE of  	Neg when Neg < 0 ->  	    BName;  	Pos -> -	    case BName of -		<<Part:Pos/binary,Ext/binary>> -> +	    StartLen = LAll - Pos - LE, +	    case Name of +		<<_:StartLen/binary,Part:Pos/binary,Ext/binary>> ->  		    Part; -		Other -> -		    Other +		_Other -> +		    BName  	    end      end; @@ -447,7 +449,7 @@ join1b(<<UcLetter, $:, Rest/binary>>, RelativeName, [], win32)  when is_integer(UcLetter), UcLetter >= $A, UcLetter =< $Z ->      join1b(Rest, RelativeName, [$:, UcLetter+$a-$A], win32);  join1b(<<$\\,Rest/binary>>, RelativeName, Result, win32) -> -    join1b(<<$/,Rest>>, RelativeName, Result, win32); +    join1b(<<$/,Rest/binary>>, RelativeName, Result, win32);  join1b(<<$/,Rest/binary>>, RelativeName, [$., $/|Result], OsType) ->      join1b(Rest, RelativeName, [$/|Result], OsType);  join1b(<<$/,Rest/binary>>, RelativeName, [$/|Result], OsType) -> @@ -546,6 +548,8 @@ win32_pathtype(_) 		  -> relative.  %%           rootname("/jam.src/foo.erl") -> "/jam.src/foo"  -spec rootname(file:name()) -> file:filename(). +rootname(Name) when is_binary(Name) -> +    list_to_binary(rootname(binary_to_list(Name))); % No need to handle unicode, . is < 128  rootname(Name0) ->      Name = flatten(Name0),      rootname(Name, [], [], major_os_type()). @@ -573,6 +577,12 @@ rootname([], Root, _Ext, _OsType) ->  %%           rootname("/jam.src/foo.erl", ".erl") -> "/jam.src/foo"  -spec rootname(file:name(), file:name()) -> file:filename(). +rootname(Name, Ext) when is_binary(Name), is_binary(Ext) -> +    list_to_binary(rootname(binary_to_list(Name),binary_to_list(Ext))); +rootname(Name, Ext) when is_binary(Name) -> +    rootname(Name,filename_string_to_binary(Ext)); +rootname(Name, Ext) when is_binary(Ext) -> +    rootname(filename_string_to_binary(Name),Ext);  rootname(Name0, Ext0) ->      Name = flatten(Name0),      Ext = flatten(Ext0), @@ -639,7 +649,7 @@ win32_splitb(<<Slash,Rest/binary>>) when ((Slash =:= $\\) orelse (Slash =:= $/))      [<<$/>> | [ X || X <- L, X =/= <<>> ]];  win32_splitb(Name) ->      L = binary:split(Name,[<<"/">>,<<"\\">>],[global]), -    [<<$/>> | [ X || X <- L, X =/= <<>> ]]. +    [ X || X <- L, X =/= <<>> ].  unix_split(Name) -> @@ -900,7 +910,7 @@ do_flatten(Atom, Tail) when is_atom(Atom) ->      atom_to_list(Atom) ++ flatten(Tail).  filename_string_to_binary(List) -> -    case unicode:characters_to_binary(List,unicode,file:native_name_encoding()) of +    case unicode:characters_to_binary(flatten(List),unicode,file:native_name_encoding()) of  	{error,_,_} ->  	    erlang:error(badarg);  	Bin when is_binary(Bin) -> diff --git a/lib/stdlib/test/filelib_SUITE.erl b/lib/stdlib/test/filelib_SUITE.erl index d54741051f..5a279609c6 100644 --- a/lib/stdlib/test/filelib_SUITE.erl +++ b/lib/stdlib/test/filelib_SUITE.erl @@ -53,8 +53,11 @@ wildcard_one(Config) when is_list(Config) ->  wildcard_two(Config) when is_list(Config) ->      ?line Dir = filename:join(?config(priv_dir, Config), "wildcard_two"), +    ?line DirB = unicode:characters_to_binary(Dir, file:native_name_encoding()),      ?line ok = file:make_dir(Dir), -    ?line do_wildcard_1(Dir, fun(Wc) -> filelib:wildcard(Wc, Dir) end), +    ?line do_wildcard_1(Dir, fun(Wc) -> io:format("~p~n",[{Wc,Dir, X = filelib:wildcard(Wc, Dir)}]),X  end), +    ?line do_wildcard_1(Dir, fun(Wc) -> io:format("~p~n",[{Wc,DirB, X = filelib:wildcard(Wc, DirB)}]), +					[unicode:characters_to_list(Y,file:native_name_encoding()) || Y <- X] end),      ?line do_wildcard_1(Dir, fun(Wc) -> filelib:wildcard(Wc, Dir++"/") end),      case os:type() of  	{win32,_} -> @@ -253,5 +256,7 @@ ensure_dir_eexist(Config) when is_list(Config) ->      %% There already is a file with the name of the directory      %% we want to create.      ?line NeedFile = filename:join(Name, "file"), +    ?line NeedFileB = filename:join(Name, <<"file">>),      ?line {error, eexist} = filelib:ensure_dir(NeedFile), +    ?line {error, eexist} = filelib:ensure_dir(NeedFileB),      ok. diff --git a/lib/stdlib/test/filename_SUITE.erl b/lib/stdlib/test/filename_SUITE.erl index ab6521f37b..dbce93600b 100644 --- a/lib/stdlib/test/filename_SUITE.erl +++ b/lib/stdlib/test/filename_SUITE.erl @@ -1,7 +1,7 @@  %%  %% %CopyrightBegin%  %%  -%% Copyright Ericsson AB 1997-2009. All Rights Reserved. +%% Copyright Ericsson AB 1997-2010. All Rights Reserved.  %%   %% The contents of this file are subject to the Erlang Public License,  %% Version 1.1, (the "License"); you may not use this file except in @@ -22,12 +22,19 @@  	 basename_1/1, basename_2/1,  	 dirname/1, extension/1, join/1, t_nativename/1]).  -export([pathtype/1,rootname/1,split/1,find_src/1]). +-export([absname_bin/1, absname_bin_2/1,  +	 basename_bin_1/1, basename_bin_2/1, +	 dirname_bin/1, extension_bin/1, join_bin/1]). +-export([pathtype_bin/1,rootname_bin/1,split_bin/1]).  -include("test_server.hrl").  all(suite) ->      [absname, absname_2, basename_1, basename_2, dirname,       extension, -     join, pathtype, rootname, split, t_nativename, find_src]. +     join, pathtype, rootname, split, t_nativename, find_src, +     absname_bin, absname_bin_2, basename_bin_1, basename_bin_2, dirname_bin, +     extension_bin, +     join_bin, pathtype_bin, rootname_bin, split_bin].  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -457,3 +464,307 @@ find_src(Config) when is_list(Config) ->      %% Try to find the source for a preloaded module.      ?line {error,{preloaded,init}} = filename:find_src(init),      ok. + +%% +%% +%% With binaries +%% +%% + +absname_bin(Config) when is_list(Config) -> +    case os:type() of +	{win32, _} ->  +	    ?line [Drive|_] = ?config(priv_dir, Config), +	    ?line Temp = filename:join([Drive|":/"], "temp"), +	    ?line case file:make_dir(Temp) of +		      ok -> ok; +		      {error,eexist} -> ok +		  end, +	    ?line {ok,Cwd} = file:get_cwd(), +	    ?line ok = file:set_cwd(Temp), +	    ?line <<Drive:8,":/temp/foo">> = filename:absname(<<"foo">>), +	    ?line <<Drive:8,":/temp/../ebin">> = filename:absname(<<"../ebin">>), +	    ?line <<Drive:8,":/erlang">> = filename:absname(<<"/erlang">>), +	    ?line <<Drive:8,":/erlang/src">> = filename:absname(<<"/erlang/src">>), +	    ?line <<Drive:8,":/erlang/src">> = filename:absname(<<"\\erlang\\src">>), +	    ?line <<Drive:8,":/temp/erlang">> = filename:absname(<<Drive:8,":erlang">>), +	    ?line <<Drive:8,":/temp/erlang/src">> = +		filename:absname(<<Drive:8,":erlang/src">>), +	    ?line <<Drive:8,":/temp/erlang/src">> = +		filename:absname(<<Drive:8,":erlang\\src\\">>), +	    ?line <<"a:/erlang">> = filename:absname(<<"a:erlang">>), +	     +	    ?line file:set_cwd(<<Drive:8,":/">>), +	    ?line <<Drive:8,":/foo">> = filename:absname(<<"foo">>), +	    ?line <<Drive:8,":/../ebin">> = filename:absname(<<"../ebin">>), +	    ?line <<Drive:8,":/erlang">> = filename:absname(<<"/erlang">>), +	    ?line <<Drive:8,":/erlang/src">> = filename:absname(<<"/erlang/src">>), +	    ?line <<Drive:8,":/erlang/src">> = filename:absname(<<"\\erlang\\\\src">>), +	    ?line <<Drive:8,":/erlang">> = filename:absname(<<Drive:8,":erlang">>), +	    ?line <<Drive:8,":/erlang/src">> = filename:absname(<<Drive:8,":erlang/src">>), +	    ?line <<"a:/erlang">> = filename:absname(<<"a:erlang">>), +	     +	    ?line file:set_cwd(Cwd), +	    ok; +	{unix, _} ->   +	    ?line ok = file:set_cwd(<<"/usr">>), +	    ?line <<"/usr/foo">> = filename:absname(<<"foo">>), +	    ?line <<"/usr/../ebin">> = filename:absname(<<"../ebin">>), +	     +	    ?line file:set_cwd(<<"/">>), +	    ?line <<"/foo">> = filename:absname(<<"foo">>), +	    ?line <<"/../ebin">> = filename:absname(<<"../ebin">>), +	    ?line <<"/erlang">> = filename:absname(<<"/erlang">>), +	    ?line <<"/erlang/src">> = filename:absname(<<"/erlang/src">>), +	    ?line <<"/erlang/src">> = filename:absname(<<"/erlang///src">>), +	    ok +    end. + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +absname_bin_2(Config) when is_list(Config) -> +    case os:type() of +	{win32, _} -> +	    ?line [Drive|_] = ?config(priv_dir, Config), +	    ?line <<Drive:8,":/temp/foo">> = filename:absname(<<"foo">>, <<Drive:8,":/temp">>), +	    ?line <<Drive:8,":/temp/../ebin">> = filename:absname(<<"../ebin">>, +							      <<Drive:8,":/temp">>), +	    ?line <<Drive:8,":/erlang">> = filename:absname(<<"/erlang">>, <<Drive:8,":/temp">>), +	    ?line <<Drive:8,":/erlang/src">> = filename:absname(<<"/erlang/src">>, +							    <<Drive:8,":/temp">>), +	    ?line <<Drive:8,":/erlang/src">> = filename:absname(<<"\\erlang\\src">>, +							    <<Drive:8,":/temp">>), +	    ?line <<Drive:8,":/temp/erlang">> = filename:absname(<<Drive:8,":erlang">>, +							     <<Drive:8,":/temp">>), +	    ?line <<Drive:8,":/temp/erlang/src">> = filename:absname(<<Drive:8,":erlang/src">>, +								 <<Drive:8,":/temp">>), +	    ?line <<Drive:8,":/temp/erlang/src">> = +		filename:absname(<<Drive:8,":erlang\\src\\">>, <<Drive:8,":/temp">>), +	    ?line <<"a:/erlang">> = filename:absname(<<"a:erlang">>, <<Drive:8,":/temp">>), +	     +	    ?line file:set_cwd(<<Drive:8,":/">>), +	    ?line <<Drive:8,":/foo">> = filename:absname(foo, <<Drive:8,":/">>), +	    ?line <<Drive:8,":/foo">> = filename:absname(<<"foo">>, <<Drive:8,":/">>), +	    ?line <<Drive:8,":/../ebin">> = filename:absname(<<"../ebin">>, <<Drive:8,":/">>), +	    ?line <<Drive:8,":/erlang">> = filename:absname(<<"/erlang">>, <<Drive:8,":/">>), +	    ?line <<Drive:8,":/erlang/src">> = filename:absname(<<"/erlang/src">>, +							    <<Drive:8,":/">>), +	    ?line <<Drive:8,":/erlang/src">> = filename:absname(<<"\\erlang\\\\src">>, +							    <<Drive:8,":/">>), +	    ?line <<Drive:8,":/erlang">> = filename:absname(<<Drive:8,":erlang">>, +							<<Drive:8,":/">>), +	    ?line <<Drive:8,":/erlang/src">> = filename:absname(<<Drive:8,":erlang/src">>, +							    <<Drive:8,":/">>), +	    ?line <<"a:/erlang">> = filename:absname(<<"a:erlang">>, <<Drive:8,":/">>), +	     +	    ok; +	{unix, _} -> +	    ?line <<"/usr/foo">> = filename:absname(<<"foo">>, <<"/usr">>), +	    ?line <<"/usr/../ebin">> = filename:absname(<<"../ebin">>, <<"/usr">>), +	     +	    ?line <<"/foo">> = filename:absname(<<"foo">>, <<"/">>), +	    ?line <<"/../ebin">> = filename:absname(<<"../ebin">>, <<"/">>), +	    ?line <<"/erlang">> = filename:absname(<<"/erlang">>, <<"/">>), +	    ?line <<"/erlang/src">> = filename:absname(<<"/erlang/src">>, <<"/">>), +	    ?line <<"/erlang/src">> = filename:absname(<<"/erlang///src">>, <<"/">>), +	    ok +    end. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +basename_bin_1(Config) when is_list(Config) -> +    ?line Dog = test_server:timetrap(test_server:seconds(10)), +    ?line <<".">> = filename:basename(<<".">>), +    ?line <<"foo">> = filename:basename(<<"foo">>), +    ?line <<"foo">> = filename:basename(<<"/usr/foo">>), +    ?line <<"foo.erl">> = filename:basename(<<"A:usr/foo.erl">>), +    ?line case os:type() of +	      {win32, _} -> +		  ?line <<"foo">> = filename:basename(<<"A:\\usr\\foo">>), +		  ?line <<"foo">> = filename:basename(<<"A:foo">>); +	      {unix, _} -> +		  ?line <<"strange\\but\\true">> = +		      filename:basename(<<"strange\\but\\true">>) +	  end, +    ?line test_server:timetrap_cancel(Dog), +    ok. + +basename_bin_2(Config) when is_list(Config) -> +    ?line Dog = test_server:timetrap(test_server:seconds(10)), +    ?line <<".">> = filename:basename(<<".">>, <<".erl">>), +    ?line <<"foo">> = filename:basename(<<"foo.erl">>, <<".erl">>), +    ?line <<"foo.erl">> = filename:basename(<<"/usr/foo.erl">>, <<".hrl">>), +    ?line <<"foo.erl">> = filename:basename(<<"/usr.hrl/foo.erl">>, <<".hrl">>), +    ?line <<"foo">> = filename:basename(<<"/usr.hrl/foo">>, <<".hrl">>), +    ?line <<"foo">> = filename:basename(<<"usr/foo/">>, <<".erl">>), +    ?line <<"foo.erl">> = filename:basename(<<"usr/foo.erl/">>, <<".erl">>), +    ?line case os:type() of +	      {win32, _} -> +		  ?line <<"foo">> = filename:basename(<<"A:foo">>, <<".erl">>), +		  ?line <<"foo.erl">> = filename:basename(<<"a:\\usr\\foo.erl">>, +						      <<".hrl">>), +		  ?line <<"foo.erl">> = filename:basename(<<"c:\\usr.hrl\\foo.erl">>, +						      <<".hrl">>), +		  ?line <<"foo">> = filename:basename(<<"A:\\usr\\foo">>, <<".hrl">>); +	      {unix, _} -> +		  ?line <<"strange\\but\\true">> = +		      filename:basename(<<"strange\\but\\true.erl">>, <<".erl">>), +		  ?line <<"strange\\but\\true">> = +		      filename:basename(<<"strange\\but\\true">>, <<".erl">>) +	  end, +    ?line test_server:timetrap_cancel(Dog), +    ok. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +dirname_bin(Config) when is_list(Config) -> +    case os:type() of +       {win32,_} -> +	    ?line <<"A:/usr">> = filename:dirname(<<"A:/usr/foo.erl">>), +	    ?line <<"A:usr">> = filename:dirname(<<"A:usr/foo.erl">>), +	    ?line <<"/usr">> = filename:dirname(<<"\\usr\\foo.erl">>), +	    ?line <<"/">> = filename:dirname(<<"\\usr">>), +	    ?line <<"A:">> = filename:dirname(<<"A:">>); +       vxworks -> +	    ?line <<"net:/usr">> = filename:dirname(<<"net:/usr/foo.erl">>), +	    ?line <<"/disk0:/usr">> = filename:dirname(<<"/disk0:/usr/foo.erl">>), +	    ?line <<"/usr">> = filename:dirname(<<"\\usr\\foo.erl">>), +	    ?line <<"/usr">> = filename:dirname(<<"\\usr">>), +	    ?line <<"net:">> = filename:dirname(<<"net:">>); +	_ -> true +    end, +    ?line <<"usr">> = filename:dirname(<<"usr///foo.erl">>), +    ?line <<".">> = filename:dirname(<<"foo.erl">>), +    ?line <<".">> = filename:dirname(<<".">>), +    case os:type() of +	vxworks ->  +	    ?line <<"/">> = filename:dirname(<<"/">>), +	    ?line <<"/usr">> = filename:dirname(<<"/usr">>); +	_ -> +	    ?line <<"/">> = filename:dirname(<<"/">>), +	    ?line <<"/">> = filename:dirname(<<"/usr">>) +    end, +    ok. +     + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +extension_bin(Config) when is_list(Config) -> +    ?line <<".erl">> = filename:extension(<<"A:/usr/foo.erl">>), +    ?line <<".erl">> = filename:extension(<<"A:/usr/foo.nisse.erl">>), +    ?line <<".erl">> = filename:extension(<<"A:/usr.bar/foo.nisse.erl">>), +    ?line <<"">> = filename:extension(<<"A:/usr.bar/foo">>), +    ?line <<"">> = filename:extension(<<"A:/usr/foo">>), +    ?line case os:type() of +	      {win32, _} -> +		  ?line <<"">> = filename:extension(<<"A:\\usr\\foo">>), +		  ?line <<".erl">> = +		      filename:extension(<<"A:/usr.bar/foo.nisse.erl">>), +		  ?line <<"">> = filename:extension(<<"A:/usr.bar/foo">>), +		  ok; +	      vxworks -> +		  ?line <<"">> = filename:extension(<<"/disk0:\\usr\\foo">>), +		  ?line <<".erl">> = +		      filename:extension(<<"net:/usr.bar/foo.nisse.erl">>), +		  ?line <<"">> = filename:extension(<<"net:/usr.bar/foo">>), +		  ok; +	      _ -> ok +	  end. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +     +join_bin(Config) when is_list(Config) -> +    ?line <<"/">> = filename:join([<<"/">>]), +    ?line <<"/">> = filename:join([<<"//">>]), +    ?line <<"usr/foo.erl">> = filename:join(<<"usr">>,<<"foo.erl">>), +    ?line <<"/src/foo.erl">> = filename:join(usr, <<"/src/foo.erl">>), +    ?line <<"/src/foo.erl">> = filename:join([<<"/src/">>,'foo.erl']), +    ?line <<"/src/foo.erl">> = filename:join(<<"usr">>, ["/sr", 'c/foo.erl']), +    ?line <<"/src/foo.erl">> = filename:join(<<"usr">>, <<"/src/foo.erl">>), + +    %% Make sure that redundant slashes work too. +    ?line <<"a/b/c/d/e/f/g">> = filename:join([<<"a//b/c/////d//e/f/g">>]), +    ?line <<"a/b/c/d/e/f/g">> = filename:join([<<"a//b/c/">>, <<"d//e/f/g">>]), +    ?line <<"a/b/c/d/e/f/g">> = filename:join([<<"a//b/c">>, <<"d//e/f/g">>]), +    ?line <<"/d/e/f/g">> = filename:join([<<"a//b/c">>, <<"/d//e/f/g">>]), +    ?line <<"/d/e/f/g">> = filename:join([<<"a//b/c">>, <<"//d//e/f/g">>]), + +    ?line <<"foo/bar">> = filename:join([$f,$o,$o,$/,[]], <<"bar">>), + +    ?line case os:type() of +	      {win32, _} -> +		  ?line <<"d:/">> = filename:join([<<"D:/">>]), +		  ?line <<"d:/">> = filename:join([<<"D:\\">>]), +		  ?line <<"d:/abc">> = filename:join([<<"D:/">>, <<"abc">>]), +		  ?line <<"d:abc">> = filename:join([<<"D:">>, <<"abc">>]), +		  ?line <<"a/b/c/d/e/f/g">> = +		      filename:join([<<"a//b\\c//\\/\\d/\\e/f\\g">>]), +		  ?line <<"a:usr/foo.erl">> = +		      filename:join([<<"A:">>,<<"usr">>,<<"foo.erl">>]), +		  ?line <<"/usr/foo.erl">> = +		      filename:join([<<"A:">>,<<"/usr">>,<<"foo.erl">>]), +		  ?line <<"c:usr">> = filename:join(<<"A:">>,<<"C:usr">>), +		  ?line <<"a:usr">> = filename:join(<<"A:">>,<<"usr">>), +		  ?line <<"c:/usr">> = filename:join(<<"A:">>, <<"C:/usr">>), +		  ?line <<"c:/usr/foo.erl">> = +		      filename:join([<<"A:">>,<<"C:/usr">>,<<"foo.erl">>]), +		  ?line <<"c:usr/foo.erl">> = +		      filename:join([<<"A:">>,<<"C:usr">>,<<"foo.erl">>]), +		  ?line <<"d:/foo">> = filename:join([$D, $:, $/, []], <<"foo">>), +		  ok; +	      {unix, _} -> +		  ok +	  end. + +pathtype_bin(Config) when is_list(Config) -> +    ?line relative = filename:pathtype(<<"..">>), +    ?line relative = filename:pathtype(<<"foo">>), +    ?line relative = filename:pathtype(<<"foo/bar">>), +    ?line relative = filename:pathtype('foo/bar'), +    case os:type() of +	{win32, _} -> +	    ?line volumerelative = filename:pathtype(<<"/usr/local/bin">>), +	    ?line volumerelative = filename:pathtype(<<"A:usr/local/bin">>), +	    ok; +	{unix, _} -> +	    ?line absolute = filename:pathtype(<<"/">>), +	    ?line absolute = filename:pathtype(<<"/usr/local/bin">>), +	    ok +    end. + +rootname_bin(Config) when is_list(Config) -> +    ?line <<"/jam.src/kalle">> = filename:rootname(<<"/jam.src/kalle">>), +    ?line <<"/jam.src/foo">> = filename:rootname(<<"/jam.src/foo.erl">>), +    ?line <<"/jam.src/foo">> = filename:rootname(<<"/jam.src/foo.erl">>, <<".erl">>), +    ?line <<"/jam.src/foo.jam">> = filename:rootname(<<"/jam.src/foo.jam">>, <<".erl">>), +    ?line <<"/jam.src/foo.jam">> = filename:rootname(["/jam.sr",'c/foo.j',"am"],<<".erl">>), +    ?line <<"/jam.src/foo.jam">> = filename:rootname(["/jam.sr",'c/foo.j'|am],<<".erl">>), +    ok. + +split_bin(Config) when is_list(Config) -> +    case os:type() of  +	vxworks -> +	    ?line [<<"/usr">>,<<"local">>,<<"bin">>] = filename:split(<<"/usr/local/bin">>); +	_ -> +	    ?line [<<"/">>,<<"usr">>,<<"local">>,<<"bin">>] = filename:split(<<"/usr/local/bin">>) +    end, +    ?line [<<"foo">>,<<"bar">>]= filename:split(<<"foo/bar">>), +    ?line [<<"foo">>, <<"bar">>, <<"hello">>]= filename:split(<<"foo////bar//hello">>), +    case os:type() of +       {win32,_} -> +	    ?line [<<"a:/">>,<<"msdev">>,<<"include">>] = +		filename:split(<<"a:/msdev/include">>), +	    ?line [<<"a:/">>,<<"msdev">>,<<"include">>] = +		filename:split(<<"A:/msdev/include">>), +	    ?line [<<"msdev">>,<<"include">>] = +		filename:split(<<"msdev\\include">>), +	    ?line [<<"a:/">>,<<"msdev">>,<<"include">>] = +		filename:split(<<"a:\\msdev\\include">>), +	    ?line [<<"a:">>,<<"msdev">>,<<"include">>] = +		filename:split(<<"a:msdev\\include">>), +	    ok; +       _ -> +	    ok +    end. +  | 
