let subst conf extra_subst str =
  let substitutions = Hashtbl.create (Hashtbl.length metaconf) in
  let () =
    (* Fill the substitutions table. *)
    Hashtbl.iter
      (fun name metadata ->
         Hashtbl.add substitutions name (metadata.get_print conf))
      metaconf;
    List.iter (fun (k, v) -> Hashtbl.add substitutions k v) extra_subst
  in
  let buff = Buffer.create (String.length str) in
    Buffer.add_substitute buff
      (fun var ->
         try
           Hashtbl.find substitutions var
         with Not_found ->
           failwithf "Unknown substitution variable %S in %S." var str)
      str;
    Buffer.contents buff