anchor.diff:  find_default_out_dir({_Mod, _S}) -> ".";
   find_default_out_dir(File) -> filename:dirname(File).
   
  -%% @spec proto_defs(Mod, Defs) -> CompRet
   %% @equiv proto_defs(Mod, Defs, [])
  +-spec proto_defs(module(), gpb_parse:defs()) -> comp_ret().
   proto_defs(Mod, Defs) ->
       proto_defs(Mod, Defs, []).
   
  -%% @spec proto_defs(Mod, Defs, Opts) -> CompRet
  -%%            Mod  = atom()
  -%%            Defs = [Def]
  -%%            Def = {{enum, EnumName}, Enums} |
  -%%                  {{msg, MsgName}, MsgFields}
  -%%            EnumName = atom()
  -%%            Enums = [{Name, integer()}]
  -%%            Name = atom()
  -%%            MsgName = atom()
  -%%            MsgFields = [#field{}]
  -%%
   %% @doc
   %% Compile a list of pre-parsed definitions to file or to a binary.
   %% See {@link file/2} for information on options and return values.
  +-spec proto_defs(module(), gpb_parse:defs(), opts()) -> comp_ret().
   proto_defs(Mod, Defs, Opts) ->
       do_proto_defs_aux1(Mod, Defs, normalize_opts(Opts)).
   
  
positive.code: 
  %% Opts are expected to be on same format as accepted by file/2.
  %% passed by parse_opts_and_args/2.
  c(Opts, Args) ->
      case determine_cmdline_op(Opts, Args) of
          error  ->
  
negative.code: show_arg({OptDef, _, _, OptDoc}) ->
      io:format("   -~s ~s", [OptDef, OptDoc]).
  
  -spec show_args() -> _. % side effect is to print valid opts/args
  show_args() ->
      io:format(
        "Recognized gpb-opts: (see the edoc for ~p for further details)~n",
        [?MODULE]),
      lists:foreach(fun show_arg/1, opt_specs()).
  
  -spec show_version() -> _. % side effect is to print version
  show_version() ->
      io:format("gpb version ~s~n", [gpb:version_as_string()]).
  
  