/**
 * @file oprof_start_config.cpp
 * GUI startup config management
 *
 * @remark Copyright 2002 OProfile authors
 * @remark Read the file COPYING
 *
 * @author John Levon
 * @author Philippe Elie
 */

#include <stdio.h>

#include <sstream>
#include <fstream>
#include <iomanip>
#include <sys/utsname.h>

#include "string_manip.h"
#include "oprof_start_config.h"
#include "op_config.h"

using namespace std;

event_setting::event_setting()
	:
	count(0),
	umask(0),
	os_ring_count(0),
	user_ring_count(0)
{
}


config_setting::config_setting()
	:
	buffer_size(OP_DEFAULT_BUF_SIZE),
	note_table_size(0),
	no_kernel(false),
	verbose(false),
	separate_lib(false),
	separate_kernel(false),
	separate_cpu(false),
	separate_thread(false),
	callgraph_depth(0),
	buffer_watershed(0),
	cpu_buffer_size(0)
{
	struct utsname info;

	/* Guess path to vmlinux based on kernel currently running. */
	if (uname(&info)) {
		perror("oprof_start: Unable to determine OS release.");
	} else {
		string const version(info.release);
		string const vmlinux_path("/lib/modules/" + version
					 + "/build/vmlinux");
		kernel_filename = vmlinux_path;
	}
}


void config_setting::load(istream & in)
{
	string str;

	while (getline(in, str)) {
		string val = split(str, '=');
		if (str == "BUF_SIZE") {
			buffer_size = op_lexical_cast<unsigned int>(val);
			if (buffer_size < OP_DEFAULT_BUF_SIZE)
				buffer_size = OP_DEFAULT_BUF_SIZE;
		} else if (str == "VMLINUX") {
			if (val == "none") {
				kernel_filename = "";
				no_kernel = true;
			} else if (!val.empty()) {
				no_kernel = false;
				kernel_filename = val;
			}
		} else if (str == "SEPARATE_LIB") {
			separate_lib = op_lexical_cast<bool>(val);
		} else if (str == "SEPARATE_KERNEL") {
			separate_kernel = op_lexical_cast<bool>(val);
		} else if (str == "SEPARATE_CPU") {
			separate_cpu = op_lexical_cast<bool>(val);
		} else if (str == "SEPARATE_THREAD") {
			separate_thread = op_lexical_cast<bool>(val);
		} else if (str == "CALLGRAPH") {
			callgraph_depth = op_lexical_cast<unsigned int>(val);
		} else if (str == "BUF_WATERSHED") {
			buffer_watershed = op_lexical_cast<unsigned int>(val);
		} else if (str == "CPU_BUF_SIZE") {
			cpu_buffer_size = op_lexical_cast<unsigned int>(val);
		}
	}
}


istream & operator>>(istream & in, config_setting & object)
{
	object.load(in);
	return in;
}
