aboutsummaryrefslogtreecommitdiffstats
path: root/lib/snmp/src/compile/snmpc_misc.erl
diff options
context:
space:
mode:
Diffstat (limited to 'lib/snmp/src/compile/snmpc_misc.erl')
-rw-r--r--lib/snmp/src/compile/snmpc_misc.erl173
1 files changed, 173 insertions, 0 deletions
diff --git a/lib/snmp/src/compile/snmpc_misc.erl b/lib/snmp/src/compile/snmpc_misc.erl
new file mode 100644
index 0000000000..557f3e0f6b
--- /dev/null
+++ b/lib/snmp/src/compile/snmpc_misc.erl
@@ -0,0 +1,173 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2003-2009. 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
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+
+-module(snmpc_misc).
+
+%% need definition of mib record
+-include("snmp_types.hrl").
+-include("snmpc_misc.hrl").
+
+
+-export([assq/2,
+ bits_to_int/2,
+ ensure_trailing_dir_delimiter/1,
+ foreach/3,
+ is_string/1,
+ read_mib/1,
+ read_noexit/2,
+ strip_extension_from_filename/2,
+ to_upper/1]).
+
+
+%%--------------------------------------------------
+%% Not a real assq, but what the heck, it's useful.
+%%--------------------------------------------------
+assq(Key, List) ->
+ case lists:keysearch(Key, 1, List) of
+ {value, {Key, Val}} -> {value, Val};
+ _ -> false
+ end.
+
+
+%%----------------------------------------------------------------------
+%% Converts a list of named bits to the integer value.
+%% Returns: integer()|error
+%%----------------------------------------------------------------------
+bits_to_int(Val,Kibbles) ->
+ bits_to_int(Val,Kibbles,0).
+
+bits_to_int([],_Kibbles,Res) -> Res;
+bits_to_int([Kibble|Ks],Kibbles,Res) ->
+ case snmp_misc:assq(Kibble,Kibbles) of
+ {value,V} ->
+ bits_to_int(Ks,Kibbles,Res + round(math:pow(2,V)));
+ _ ->
+ error
+ end.
+
+
+ensure_trailing_dir_delimiter([]) -> "/";
+ensure_trailing_dir_delimiter(DirSuggestion) ->
+ case lists:last(DirSuggestion) of
+ $/ -> DirSuggestion;
+ _ -> lists:append(DirSuggestion,"/")
+ end.
+
+
+strip_extension_from_filename(FileName, Ext) when is_atom(FileName) ->
+ strip_extension_from_filename(atom_to_list(FileName), Ext);
+
+strip_extension_from_filename(FileName, Ext) when is_list(FileName) ->
+ case lists:suffix(Ext, FileName) of
+ true -> lists:sublist(FileName, 1, length(FileName) - length(Ext));
+ false -> FileName
+ end.
+
+
+to_upper([C|Cs]) when (C >= $a) andalso (C =< $z) -> [C-($a-$A)|to_upper(Cs)];
+to_upper([C|Cs]) -> [C|to_upper(Cs)];
+to_upper([]) -> [].
+
+
+is_string([]) -> true;
+is_string([Tkn | Str])
+ when is_integer(Tkn) andalso (Tkn >= 0) andalso (Tkn =< 255) ->
+ is_string(Str);
+is_string(_) -> false.
+
+
+foreach(Function, ExtraArgs, [H | T]) ->
+ apply(Function, [H | ExtraArgs]),
+ foreach(Function, ExtraArgs, T);
+foreach(_Function, _ExtraArgs, []) ->
+ true.
+
+
+
+%%----------------------------------------------------------------------
+%% Returns: {ok, Mib}|{error, Reason}
+%% The reason for having the function if this module is:
+%% The compiler package and the agent package are separated, this is
+%% the only common module.
+%%----------------------------------------------------------------------
+read_mib(FileName) ->
+ (catch do_read_mib(FileName)).
+
+do_read_mib(FileName) ->
+ ?read_mib(FileName).
+
+
+%% Ret. {ok, Res} | {error, Line, Error} | {error, open_file}
+read_noexit(File, CheckFunc) ->
+ case file:open(File, [read]) of
+ {ok, Fd} ->
+ case loop(Fd, [], CheckFunc, 1, File) of
+ {error, Line, R} ->
+ file:close(Fd),
+ {error, Line, R};
+ Res ->
+ file:close(Fd),
+ {ok, Res}
+ end;
+ _Error ->
+ {error, open_file}
+ end.
+
+
+%%-----------------------------------------------------------------
+%% Ret: {error, Line, Reason} | Row
+%%-----------------------------------------------------------------
+loop(Fd, Res, Func, StartLine, File) ->
+ case read(Fd, "", StartLine) of
+ {ok, Row, EndLine} ->
+ case (catch apply(Func, [Row])) of
+ {ok, NewRow} ->
+ loop(Fd, [NewRow | Res], Func, EndLine, File);
+ true ->
+ loop(Fd, [Row | Res], Func, EndLine, File);
+ Error ->
+ {error, EndLine, Error}
+ end;
+ {error, EndLine, Error} ->
+ {error, EndLine, Error};
+ eof ->
+ Res
+ end.
+
+
+%%-----------------------------------------------------------------
+%% io:read modified to give us line numbers.
+%%-----------------------------------------------------------------
+read(Io, Prompt, StartLine) ->
+ case io:request(Io, {get_until, Prompt, erl_scan, tokens, [StartLine]}) of
+ {ok, Toks, EndLine} ->
+ case erl_parse:parse_term(Toks) of
+ {ok, Term} ->
+ {ok, Term, EndLine};
+ {error, {Line, erl_parse, Error}} ->
+ {error, Line, {parse_error, Error}}
+ end;
+ {error, E, EndLine} ->
+ {error, EndLine, E};
+ {eof, _EndLine} ->
+ eof;
+ Other ->
+ Other
+ end.
+