aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rwxr-xr-xlib/diameter/bin/diameterc8
-rw-r--r--lib/diameter/src/compiler/diameter_spec_util.erl18
2 files changed, 20 insertions, 6 deletions
diff --git a/lib/diameter/bin/diameterc b/lib/diameter/bin/diameterc
index c4dbd0060f..8e0eda10dd 100755
--- a/lib/diameter/bin/diameterc
+++ b/lib/diameter/bin/diameterc
@@ -40,8 +40,9 @@ usage() ->
"~n"
" options:~n"
"~n"
- " --name name = set @name~n"
- " --prefix prefix = set @prefix~n"
+ " --name name = set @name~n"
+ " --prefix prefix = set @prefix~n"
+ " --inherits dict|- = set/clear @inherits~n"
"~n"
" -h = print this message~n"
" -v = verbose output~n"
@@ -122,6 +123,9 @@ arg(["--name", Name | Args], #argv{options = Opts} = A) ->
arg(["--prefix", Name | Args], #argv{options = Opts} = A) ->
arg(Args, A#argv{options = [{prefix, Name} | Opts]});
+arg(["--inherits", Dict | Args], #argv{options = Opts} = A) ->
+ arg(Args, A#argv{options = Opts ++ [{inherits, Dict}]});
+
arg(["-E" | Args], #argv{output = Output} = A) ->
arg(Args, A#argv{output = lists:delete(erl, Output)});
diff --git a/lib/diameter/src/compiler/diameter_spec_util.erl b/lib/diameter/src/compiler/diameter_spec_util.erl
index e62ba05427..62536bf06d 100644
--- a/lib/diameter/src/compiler/diameter_spec_util.erl
+++ b/lib/diameter/src/compiler/diameter_spec_util.erl
@@ -38,7 +38,7 @@ parse(Path, Opts) ->
put({?MODULE, verbose}, lists:member(verbose, Opts)),
{ok, B} = file:read_file(Path),
Chunks = chunk(B),
- Spec = reset(make_spec(Chunks), Opts, [name, prefix]),
+ Spec = reset(make_spec(Chunks), Opts, [name, prefix, inherits]),
true = groups_defined(Spec), %% sanity checks
true = customs_defined(Spec), %%
Full = import_enums(import_groups(import_avps(insert_codes(Spec), Opts))),
@@ -47,12 +47,22 @@ parse(Path, Opts) ->
Full.
reset(Spec, Opts, Keys) ->
- lists:foldl(fun(K,S) -> reset(lists:keyfind(K, 1, Opts), S) end,
+ lists:foldl(fun(K,S) ->
+ reset([{A,?ATOM(V)} || {A,V} <- Opts, A == K], S)
+ end,
Spec,
Keys).
-reset({Key, Str}, Spec) ->
- orddict:store(Key, ?ATOM(Str), Spec);
+reset(L, Spec)
+ when is_list(L) ->
+ lists:foldl(fun reset/2, Spec, L);
+
+reset({inherits = Key, '-'}, Spec) ->
+ orddict:erase(Key, Spec);
+reset({inherits = Key, Dict}, Spec) ->
+ orddict:append(Key, Dict, Spec);
+reset({Key, Atom}, Spec) ->
+ orddict:store(Key, Atom, Spec);
reset(_, Spec) ->
Spec.