/*****************************************************************************\
*                                                                             *
*  Name   : merge_inis                                                        *
*  Author : Chris Koeritz                                                     *
*                                                                             *
*  Purpose:                                                                   *
*                                                                             *
*    Takes an ini file with new content and merges it into an existing file.  *
*                                                                             *
*******************************************************************************
* Copyright (c) 2007-$now By Author.  This program is free software; you can  *
* redistribute it and/or modify it under the terms of the GNU General Public  *
* License as published by the Free Software Foundation; either version 2 of   *
* the License or (at your option) any later version.  This is online at:      *
*     http://www.fsf.org/copyleft/gpl.html                                    *
* Please send any updates to: fred@gruntose.com                               *
\*****************************************************************************/

#include <basis/function.h>
#include <basis/string_array.h>
#include <data_struct/static_memory_gremlin.h>
#include <data_struct/string_table.h>
#include <loggers/console_logger.h>
#include <opsystem/ini_config.h>

HOOPLE_STARTUP_CODE;

#define LOG(to_print) program_wide_logger().log(to_print)

int main(int argc, char *argv[])
{
  SET_DEFAULT_CONSOLE_LOGGER;
  if (argc < 4) {
    LOG(
"The first parameter must be the name of an existing ini file with important\n"
"contents.  The second parameter must be the name of a new ini file with\n"
"updates to the original file.  The third parameter (and others if present)\n"
"is the section name to be merged.  The contents of the sections specified\n"
"will be copied from the second ini file into the existing ini file.");
    return 37;  // error.
  }

  istring main_ini_file = argv[1];
  istring second_ini = argv[2];
  string_array sections;
  for (int i = 3; i < argc; i++)
    sections += argv[i];

  ini_configurator ini(main_ini_file, ini_configurator::RETURN_ONLY);
  ini_configurator new_ini(second_ini, ini_configurator::RETURN_ONLY);

  for (int s = 0; s < sections.length(); s++) {
    istring section = sections[s];
    string_table found;
    new_ini.get_section(section, found);
LOG(istring("working on section: ") + section);
    if (!found.symbols())
      LOG(istring("No symbols were found in the section named ") + section);

    for (int i = 0; i < found.symbols(); i++) {
      istring name = found.name(i);
      istring value = found.get(i);
      ini.store(section, name, value);
LOG(istring("writing name=") + name + " value=" + value);
    }
  }
  return 0;
}

#ifdef __BUILD_STATIC_APPLICATION__
  // static dependencies found by buildor_gen_deps.sh:
  #include <basis/array.cpp>
  #include <basis/byte_array.cpp>
  #include <basis/callstack_tracker.cpp>
  #include <basis/chaos.cpp>
  #include <basis/convert_utf.cpp>
  #include <basis/definitions.cpp>
  #include <basis/earth_time.cpp>
  #include <basis/guards.cpp>
  #include <basis/istring.cpp>
  #include <basis/log_base.cpp>
  #include <basis/memory_checker.cpp>
  #include <basis/mutex.cpp>
  #include <basis/object_base.cpp>
  #include <basis/outcome.cpp>
  #include <basis/packable.cpp>
  #include <basis/portable.cpp>
  #include <basis/sequence.cpp>
  #include <basis/set.cpp>
  #include <basis/utility.cpp>
  #include <basis/version_record.cpp>
  #include <data_struct/amorph.cpp>
  #include <data_struct/bit_vector.cpp>
  #include <data_struct/byte_hasher.cpp>
  #include <data_struct/configurator.cpp>
  #include <data_struct/hash_table.cpp>
  #include <data_struct/pointer_hash.cpp>
  #include <data_struct/stack.cpp>
  #include <data_struct/static_memory_gremlin.cpp>
  #include <data_struct/string_hash.cpp>
  #include <data_struct/string_hasher.cpp>
  #include <data_struct/string_table.cpp>
  #include <data_struct/symbol_table.cpp>
  #include <data_struct/table_configurator.cpp>
  #include <loggers/console_logger.cpp>
  #include <loggers/file_logger.cpp>
  #include <loggers/locked_logger.cpp>
  #include <loggers/null_logger.cpp>
  #include <loggers/program_wide_logger.cpp>
  #include <opsystem/byte_filer.cpp>
  #include <opsystem/command_line.cpp>
  #include <opsystem/critical_events.cpp>
  #include <opsystem/directory.cpp>
  #include <opsystem/filename.cpp>
  #include <opsystem/ini_config.cpp>
  #include <opsystem/ini_parser.cpp>
  #include <opsystem/path_configuration.cpp>
  #include <opsystem/rendezvous.cpp>
  #include <textual/byte_format.cpp>
  #include <textual/parser_bits.cpp>
  #include <textual/string_manipulation.cpp>
  #include <textual/tokenizer.cpp>
#endif // __BUILD_STATIC_APPLICATION__

