#ifndef config_h #define config_h // config.h - Lecture de fichiers de configuration. // nono - programme du robot 2004. {{{ // // Copyright (C) 2004 Nicolas Schodet // // Robot APB Team/Efrei 2004. // 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 #include class ConfigError : public std::runtime_error { const char *m_file; const char *m_id; const char *m_descr; public: ConfigError (const char *file, const char *id, const char *descr) { m_file = file; m_id = id; m_descr = descr; } ConfigError (const char *file, const char *descr) { m_file = file; m_id = 0; m_descr = descr; } virtual const char *what () const throw (); }; class Config { std::string m_filename; int m_type; public: // Constructeur, prend l'identificateur de configuration en paramètre (nom // de fichier). Config (const char *filename); // Destructeur. ~Config (void); // Attend un token, sinon, jette une exception. int getNum (void); Config &operator>> (int &num) { num = getNum (); return *this; } const char *getId (void); void getId (std::string &s); bool getBool (void); Config &operator>> (bool &b) { b = getBool (); return *this; } double getFloat (void); Config &operator>> (double &fl) { fl = getFloat (); return *this; } void getString (std::string &s); Config &operator>> (std::string &s) { getString (s); return *this; } void getEof (void); // Vérifie si le prochain token est... bool isId (const char *s); bool isId (void); /// Récupère la valeur associée à un identificateur \a id. Retourne \c /// false si l'identificateur ne correspond pas, lance une exception si il /// n'y a pas d'identificateur. template bool get (const char *id, T &v); // Retourne true si à la fin du fichier. bool eof (void); // Lance une erreur, on a pas trouvé ce qu'on voulais. void noId (void); void throwError (const char *msg); private: // Appellé par le lexer pour changer de fichier. static bool wrap_handler (void *p); bool wrap (void); }; /// Récupère la valeur associée à un identificateur \a id. Retourne \c /// false si l'identificateur ne correspond pas, lance une exception si il /// n'y a pas d'identificateur. template bool Config::get (const char *id, T &v) { if (isId (id)) { getId (); *this >> v; return true; } return false; } #endif // config_h