Main Page | Namespace List | Data Structures | File List | Namespace Members | Data Fields | Globals | Related Pages

erreur.h

Go to the documentation of this file.
00001 /*  Implémentation Linux de la bibliotheque XADLL de Sidena
00002  *  Copyright (C) 2005 ENSTAR
00003  *
00004  *  This program is free software; you can redistribute it and/or modify
00005  *  it under the terms of the GNU General Public License as published by
00006  *  the Free Software Foundation; either version 2 of the License, or
00007  *  (at your option) any later version.
00008  *
00009  *  This program is distributed in the hope that it will be useful,
00010  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00011  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00012  *  GNU General Public License for more details.
00013  *
00014  *  You should have received a copy of the GNU General Public License
00015  *  along with this program; if not, write to the Free Software
00016  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00017  *
00018  *  You can contact us:
00019  *    Association ENSTAR
00020  *    Ecole Nationale Superieure de Techniques Avancees
00021  *    32 boulevard Victor
00022  *    75739 Paris Cedex 15
00023  *    FRANCE
00024  *
00025  *    enstar@ensta.fr
00026  */
00027 
00028 /* $Id: erreur.h 49 2006-03-14 11:01:24Z francois $ */
00029 
00030 /** @file    erreur.h
00031  *  @brief   Module de gestion des messages de log/erreur
00032  *  @author  Francois Fevotte <francois.fevotte@ensta.org>
00033  *  $Revision: 49 $
00034  *  $Date: 2006-03-14 12:01:24 +0100 (Tue, 14 Mar 2006) $
00035  *
00036  *  Ce module permet de gérer l'affichage de messages sur le flux d'erreur standard et dans un fichier de log.
00037  *  Il utilise un certain nombre de macros qui doivent être redéfinies dans le fichier appelant
00038  *  (@ref LOGFILE, @ref LOG_LEVEL, @ref SCREEN_LEVEL, @ref SOURCE_ERREUR).
00039  *
00040  *  Les fonctions d'affichage des messages sont décrites dans l'espace de noms @link erreur::generique erreur@endlink.
00041  *
00042  *  Exemple d'inclusion des fonctions de gestion d'erreur :
00043  *
00044  *  fich1.c :
00045  *  @code
00046  *    #define SOURCE_ERREUR "fich1.c"
00047  *    #include "erreur.h"
00048  *    
00049  *    //...
00050  *    
00051  *    erreur::warning( "attention" );
00052  *  @endcode
00053  *
00054  *  fich2.c :
00055  *  @code
00056  *    #define SOURCE_ERREUR "fich2.c"
00057  *    #include "erreur.h"
00058  *
00059  *    //...
00060  *
00061  *    erreur::fatale( "crash" );
00062  *  @endcode
00063  */
00064 
00065 #ifndef ERREUR_C
00066 #define ERREUR_C
00067 
00068 
00069 /* Gestion des mots clés 'extern' : seul le fichier xalib.c définira réellement le fichier de log */
00070 #ifdef XALIB_C
00071 #define EXTERN
00072 #else
00073 #define EXTERN extern
00074 #endif
00075 
00076 /** @brief Emplacement du fichier de log des erreurs
00077  */
00078 EXTERN FILE* logfile;
00079 
00080 
00081 /** @brief Fichier de log des erreurs 
00082  *  
00083  *  Chemin relatif vers le fichier de log dans lequel seront stockés les messages.
00084  *  Le fichier doit pouvoir être ouvert en écriture ou créé le cas échéant
00085  */
00086 #ifndef LOGFILE
00087 #define LOGFILE "./xa.log"
00088 #endif
00089 
00090 /** @brief Niveau de priorité maximum des messages affichés à l'écran
00091  *
00092  *  Seuls les messages de priorité inférieure ou égale à ce niveau seront affichés sur le flux d'erreur.
00093  */
00094 #ifndef SCREEN_LEVEL
00095 #define SCREEN_LEVEL 3
00096 #endif
00097 
00098 /** @brief Niveau de priorité maximum des messages ajoutés au log 
00099  *
00100  *  Seuls les messages de priorité inférieure ou égale à ce niveau seront ajoutés au fichier de log.
00101  */
00102 #ifndef LOG_LEVEL
00103 #define LOG_LEVEL 2
00104 #endif
00105 
00106 /** @brief Fichier source déclenchant l'erreur
00107  *
00108  *  Cette macro doit contenir le nom du fichier source qui déclenche l'erreur.
00109  *  C'est le nom de fichier qui apparaitra en début de ligne lors de l'affichage du message.
00110  */
00111 #ifndef SOURCE_ERREUR
00112 #define SOURCE_ERREUR "inconnu"
00113 #endif
00114 
00115 #include <stdlib.h>
00116 #include <time.h>
00117 #include <stdio.h>
00118 
00119 
00120 /** @namespace erreur
00121  *  @brief Module de gestion des messages de log/erreur
00122  *
00123  *  L'utilisation de ce module est détaillée dans la documentation du fichier erreur.h
00124  *
00125  *  @see erreur.h
00126  */
00127 namespace erreur
00128 {
00129   void openlog();
00130   void log(char *message, int prio);
00131   void screen(char *message, int prio);
00132   void fatale(char *message);
00133   void warning(char *message);
00134   void debug(char *message);
00135   void generique(char *message, int prio);
00136   void closelog();
00137 }
00138 
00139 /** @brief Ouverture du fichier de log
00140  *
00141  *  Ouvre le fichier de log designe par la macro LOGFILE
00142  *  dans la variable globale logfile
00143  */
00144 inline void erreur::openlog()
00145 {
00146   logfile=fopen(LOGFILE,"a");
00147   if( logfile==NULL )
00148     {
00149       perror( "erreur::openlog " );
00150       exit(EXIT_FAILURE);
00151     }
00152 }
00153 
00154 /** @brief Fermeture du fichier de log
00155  */
00156 inline void erreur::closelog()
00157 {
00158   fclose(logfile);
00159 }
00160 
00161 /** @brief Ajout d'un message au log
00162  *
00163  *  Ajoute le message d'erreur à la fin du fichier de log défini par la macro LOGFILE
00164  *  selon le format :
00165  *    @verbatim priorité [source]    aaaa/mm/jj hh:mm:ss    message @endverbatim
00166  *
00167  *  @param message le message d'erreur
00168  *  @param prio la priorié du message:
00169  *           @li 1 erreur fatale
00170  *           @li 2 warning
00171  *           @li 3 message de déboguage
00172  */
00173 inline void erreur::log(char *message, int prio)
00174 {
00175   time_t tmp;
00176   struct tm *tmp2;
00177   
00178   time(&tmp);
00179   tmp2 = localtime(&tmp);
00180 
00181   fprintf( logfile, "<niveau%d> [%s]\t%4d/%02d/%02d %02d:%02d:%02d\t%s\t</niveau%d>\n",
00182            prio,SOURCE_ERREUR,
00183            tmp2->tm_year+1900,tmp2->tm_mon,tmp2->tm_mday,
00184            tmp2->tm_hour,tmp2->tm_min,tmp2->tm_sec,
00185            message, prio);
00186 }
00187 
00188 
00189 /** @brief Affichage d'un message à l'écran
00190  *  
00191  *  Affiche le message sur la sortie d'erreur standard selon le format :
00192  *    @verbatim priorité [source]    message @endverbatim
00193  *
00194  *  @param message le message d'erreur
00195  *  @param prio la priorié du message:
00196  *           @li 1 erreur fatale
00197  *           @li 2 warning
00198  *           @li 3 message de déboguage
00199  */
00200 inline void erreur::screen(char *message, int prio)
00201 {
00202   fprintf( stderr, "<niveau%d> [%s]\t%s\t</niveau%d>\n", prio, SOURCE_ERREUR, message, prio);
00203   fflush( stderr );
00204 }
00205 
00206 
00207 /** @brief Message d'erreur fatale
00208  *
00209  *  Traite un message de priorité 1 (erreur fatale) selon le mode de erreur::generique()
00210  *
00211  *  @param message le message d'erreur
00212  */
00213 inline void erreur::fatale(char *message)
00214 {
00215 #if LOG_LEVEL>0
00216   log(message,1);
00217 #endif
00218 
00219 #if SCREEN_LEVEL>0
00220   screen(message,1);
00221 #endif
00222 }
00223 
00224 
00225 /** @brief Message de warning
00226  *
00227  *  Traite un message de priorité 2 (warning) selon le mode de erreur::generique()
00228  *
00229  *  @param message le message de warning
00230  */
00231 inline void erreur::warning(char *message)
00232 {
00233 #if LOG_LEVEL>1
00234   log(message,2);
00235 #endif
00236 
00237 #if SCREEN_LEVEL>1
00238   screen(message,2);
00239 #endif
00240 }
00241 
00242 /** @brief Message de déboguage
00243  *
00244  *  Traite un message de priorité 3 (déboguage) selon le mode de erreur::generique()
00245  *
00246  *  @param message le message de déboguage
00247  */
00248 inline void erreur::debug(char *message)
00249 {
00250 #if LOG_LEVEL>2
00251   log(message,3);
00252 #endif
00253 
00254 #if SCREEN_LEVEL>2
00255   screen(message,3);
00256 #endif
00257 }
00258 
00259 
00260 /** @brief Message d'erreur
00261  *
00262  *  Traite un message d'erreur de priorité donnée :
00263  *    @li si la priorité du message est inférieure à LOG_LEVEL,
00264  *           le message est ajouté au log (Cf. log() )
00265  *    @li si la priorité du message est inférieure à SCREEN_LEVEL,
00266  *           le message est affiché sur le flux d'erreurs (Cf. screen() )
00267  *
00268  *  @param message le message d'erreur
00269  *  @param prio la priorité du message
00270  */
00271 inline void erreur::generique(char *message, int prio=4)
00272 {
00273   if( prio<LOG_LEVEL )
00274     log(message,prio);
00275   
00276   if( prio<SCREEN_LEVEL )
00277     screen(message,prio);
00278 }
00279 
00280 #undef LOGFILE
00281 #undef SCREEN_LEVEL
00282 #undef LOG_LEVEL
00283 #undef SOURCE_ERREUR
00284 
00285 #endif

Project hosted on SourceForge.net
Documentation generated on Mon Apr 2 14:52:55 2007 for libXA by doxygen 1.4.4