forked from erlware-deprecated/sinan
-
Notifications
You must be signed in to change notification settings - Fork 1
/
sin_config_parser.erl
89 lines (80 loc) · 3.31 KB
/
sin_config_parser.erl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
%% -*- mode: Erlang; fill-column: 132; comment-column: 118; -*-
%%%-------------------------------------------------------------------
%%% Copyright (c) 2007-2010 Erlware
%%%
%%% Permission is hereby granted, free of charge, to any
%%% person obtaining a copy of this software and associated
%%% documentation files (the "Software"), to deal in the
%%% Software without restriction, including without limitation
%%% the rights to use, copy, modify, merge, publish, distribute,
%%% sublicense, and/or sell copies of the Software, and to permit
%%% persons to whom the Software is furnished to do so, subject to
%%% the following conditions:
%%%
%%% The above copyright notice and this permission notice shall
%%% be included in all copies or substantial portions of the Software.
%%%
%%% THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
%%% EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
%%% OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
%%% NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
%%% HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
%%% WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
%%% OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
%%% OTHER DEALINGS IN THE SOFTWARE.
%%%---------------------------------------------------------------------------
%%% @author Eric Merritt <ericbmerritt@gmail.com>
%%% @doc
%%% Parses a config file returning data formatted in config compatible form.
%%% @end
%%% @copyright (C) 2007-2010 Erlware
%%%----------------------------------------------------------------------------
-module(sin_config_parser).
-include("eunit.hrl").
-export([parse_config_file/1]).
%%====================================================================
%% API
%%====================================================================
%%--------------------------------------------------------------------
%% @doc
%% Read in the correct config file. Root specifies server root and
%% env specifies the runtime environment.
%% @spec (BuildFile) -> ParsedConfig
%% @end
%%--------------------------------------------------------------------
parse_config_file(BuildFile) ->
case file:read_file(BuildFile) of
{ok, FileBin} ->
parse_config(binary_to_list(FileBin), 0, 0);
Else ->
Else
end.
%%--------------------------------------------------------------------
%% @doc
%% Parse the config file into a usable format.
%% @spec parse_config(Stream, Newlines, Chars) -> ParsedConfig
%% @end
%% @private
%%--------------------------------------------------------------------
parse_config([$\s | T], NewLines, Chars) ->
parse_config(T, NewLines, Chars + 1);
parse_config([$\t | T], NewLines, Chars) ->
parse_config(T, NewLines, Chars + 1);
parse_config([$\n | T], NewLines, _Chars) ->
parse_config(T, NewLines + 1, 0);
parse_config([$\r | T], NewLines, _Chars) ->
parse_config(T, NewLines + 1, 0);
parse_config(All = [${ | _], NewLines, Chars) ->
case ktj_decode:decode(All, NewLines, Chars) of
Error = {error, _} ->
Error;
{Value, _, _} ->
Value
end;
parse_config(All, NewLines, Chars) ->
case ktj_decode:decode([${ | All] ++ [$}], NewLines, Chars) of
Error = {error, _} ->
Error;
{Value, _, _} ->
Value
end.