#include #include #include #include #include #include /* tolow */ #define tolow(c) (isupper(c) ? (c)-'A'+'a' : (c)) extern int errno; extern char *sys_errlist[]; #include "errors.h" #include "prefs.h" #define EOL "\n" extern char* g_ProgName; char StrTmp[256]; static void PutString(int theLevel,const char *fmt, ...); static int Ask(const char *fmt, ...); int DoError( int ErrType, int ErrLevel,const char *fmt, ...) { va_list vl; va_start(vl,fmt); vsprintf(StrTmp, fmt, vl); switch(ErrType) { case( SYS_ERR ): if(strlen(StrTmp)!=0) PutString(ErrLevel,"%s: %s" EOL,g_ProgName,StrTmp); PutString(ErrLevel,"%s: error %d",g_ProgName,errno); PutString(ErrLevel,": %s",sys_errlist[errno]); PutString(ErrLevel,EOL ); break; case(PROG_ERR): PutString(ErrLevel,"%s: Te jodes, error del programador"EOL, g_ProgName); PutString(ErrLevel,"%s: %s"EOL, g_ProgName, StrTmp); break; case(INPUT_ERR): PutString(ErrLevel,"%s: Input error"EOL, g_ProgName); PutString(ErrLevel,"%s: %s"EOL, g_ProgName, StrTmp); break; case(NO_ERR): PutString(ErrLevel,"%s: %s"EOL, g_ProgName, StrTmp); break; default: PutString(255,"%s: What's up? (%d)"EOL, g_ProgName,ErrType); break; } switch(ErrLevel) { case( ABORT_ERR ): PutString(ErrLevel,"%s: Aborting"EOL,g_ProgName); exit(errno==0?1:errno); break; case( QUIT_ERR ): kill(getpid(),SIGINT); /* raise(SIGINT);*/ break; case( ASK_ERR ): return(Ask("%s: Cancel (y/n)[n]: ",g_ProgName)); break; case( END_ERR ): PutString(ErrLevel,"%s: Canceled"EOL,g_ProgName); return(1); break; default: return(0); break; } exit(-1); } static void PutString(int theLevel,const char *fmt, ...) { va_list vl; va_start(vl,fmt); if (g_VerboseLevel<=theLevel) vfprintf(stderr,fmt,vl); } static int Ask(const char *fmt, ...) { char response[80]; va_list vl; va_start(vl,fmt); strcpy(response,"n"); vfprintf(stderr,fmt,vl); fflush(stderr); fgets(response, sizeof(response)-1, stdin); return (tolow(response[0]) == 'y'); }