From 8f486613be58ced269db1d437e560c16558604e8 Mon Sep 17 00:00:00 2001 From: becquet Date: Thu, 10 May 2007 18:49:20 +0000 Subject: Création de chuck, le programme du robot 2007. --- i/chuck/src/config/config_data.cc | 148 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 148 insertions(+) create mode 100644 i/chuck/src/config/config_data.cc (limited to 'i/chuck/src/config/config_data.cc') diff --git a/i/chuck/src/config/config_data.cc b/i/chuck/src/config/config_data.cc new file mode 100644 index 0000000..e4dcf75 --- /dev/null +++ b/i/chuck/src/config/config_data.cc @@ -0,0 +1,148 @@ +// config_data.cc +// marvin - programme du robot 2006. {{{ +// +// Copyright (C) 2006 Nicolas Schodet +// +// Robot APB Team/Efrei 2006. +// Web: http://assos.efrei.fr/robot/ +// Email: robot AT efrei DOT fr +// +// 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 program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// +// }}} +#include "config.hh" +#include "config_data.hh" +#include "parser/parser.hh" + +#include + +/// Constructeur. Traite les arguments de la ligne de commande et lit le +/// fichier de configuration. Les arguments traités sont retiré de la +/// ligne de commande. +ConfigData::ConfigData (int &argc, char **&argv) +{ + init (argc, argv, "rc/config"); +} + +/// Constructeur. Fourni en plus un fichier de configuration différent de +/// celui par défaut. +ConfigData::ConfigData (int &argc, char **&argv, const std::string &file) +{ + init (argc, argv, file); +} + +/// Récupère une valeur de configuration. +const any & +ConfigData::get (const std::string &id) const +{ + Data::const_iterator i = data_.find (id); + if (i == data_.end ()) + throw std::runtime_error (id + ": config item not found"); + return i->second; +} + +/// Récupère une valeur de configuration avec une valeur par défaut. Ne +/// renvoye pas d'exception. +const any & +ConfigData::get (const std::string &id, const any &defaut) const +{ + Data::const_iterator i = data_.find (id); + // If not found, return default values + if (i == data_.end ()) + return defaut; + else + return i->second; +} + +/// Ajoute une valeur de configuration. VAL prend l'ancienne valeur ou un any +/// vide. +void +ConfigData::add (const std::string &id, any &val) +{ + any &a = data_[id]; + a.swap (val); +} + +/// Classe dérivé de Parser pour le parsing de conf. +class ConfigParser : public Parser +{ + ConfigData &data_; + public: + /// Constructeur. + ConfigParser (ConfigData &data) : data_ (data) { } + /// Fonction appelée lors d'une affectation. VAL peut être modifié, il est + /// détruit suite à l'appel. + virtual void assign (const std::string &id, any &val) + { + data_.add (id, val); + } +}; + +/// Initialise (lit la ligne de commande et les fichiers de config. +void +ConfigData::init (int &argc, char **&argv, const std::string &file) +{ + std::string configFile (file); + std::string configString; + // Parse la ligne de commande. + for (int i = 1; i < argc; ) + { + int del = 0; + // -F CONFIG_FILE + if (argv[i][0] == '-' && argv[i][1] == 'F') + { + if (argv[i][2] != '\0') + { + del = 1; + configFile = &argv[i][2]; + } + else if (i + 1 < argc) + { + del = 2; + configFile = argv[i + 1]; + } + } + // -C CONFIG_STRING + if (argv[i][0] == '-' && argv[i][1] == 'C') + { + configString += ';'; + if (argv[i][2] != '\0') + { + del = 1; + configString += &argv[i][2]; + } + else if (i + 1 < argc) + { + del = 2; + configString += argv[i + 1]; + } + } + // Supprime ces arguments de la liste. + if (del) + { + for (int j = i; j < argc - del + 1; j++) + argv[j] = argv[j + del]; + argc -= del; + } + else + i++; + } + // Lit le fichier de config. + ConfigParser p (*this); + p.parseFile (configFile); + // Parse les chaînes supplémentaires. + p.parseString (configString); +} + -- cgit v1.2.3