building
[libxsql.git] / www / xsqlconf.erl
blob199ac06606ea8acc5c93af5c536bd43263d1faa1
1 -module(xsqlconf).
2 -export([load/1]).
4 get_dir(dir_home) ->
5 case os:getenv("HOME") of
6 false -> undefined;
7 Dir -> Dir
8 end;
9 get_dir(dir_home_config) ->
10 case get_dir(dir_home) of
11 undefined -> undefined;
12 Dir -> filename:absname_join(Dir, ".config")
13 end;
14 get_dir(dir_config) -> "/etc";
15 get_dir(dir_current) ->
16 case file:get_cwd() of
17 {ok, Dir} -> Dir;
18 _ -> undefined
19 end;
20 get_dir(_) -> undefined.
22 load_conf_spec(DirId, FileName, Prefix, D) ->
23 case get_dir(DirId) of
24 undefined -> D;
25 Dir -> load_conf_spec(filename:absname_join(Dir, [Prefix|FileName]), D)
26 end.
27 load_conf_spec(FileName, D) ->
28 case file:open(FileName, [read]) of
29 {ok, Fd} -> load_conf_file(Fd, D);
30 _ -> D
31 end.
33 trim(S) -> re:replace(S, "\\s+", "", [global,{return,list}]).
35 load_conf_file(Fd, D) ->
36 case file:read_line(Fd) of
37 {ok, Line} -> load_conf_file(Fd, Line, D);
38 _ -> file:close(Fd), D
39 end.
40 load_conf_file(Fd, Line, D) ->
41 case list_to_tuple(re:split(Line, "=", [{return, list}])) of
42 {Key, Value} ->
43 load_conf_file(Fd, dict:store(trim(Key), trim(Value), D));
44 _ -> load_conf_file(Fd, D)
45 end.
47 load(FileName) ->
48 load([{dir_config,[]}, {dir_home_config,[]}, {dir_home,"."}, {dir_current,"."}], FileName, dict:new()).
50 load([{DirId,Prefix}|T], FileName, D) ->
51 load(T, FileName, load_conf_spec(DirId, FileName, Prefix, D));
52 load([], _, D) -> D.