/* * File: errors.c * Project: DXF to RIB * (c) SPDsoft Tuesday, June 21, 1994, GTIC */ #include #include #include #include #include #include /* tolow */ #define tolow(c) (isupper(c) ? (c)-'A'+'a' : (c)) extern int errno; #include "errors.h" #include "prefs.h" #define EOL "\n" #ifdef _BSD_ extern char *sys_errlist[]; # define raise(s) kill(getpid(),(s)) # define strerror(e) sys_errlist[(e)] #endif 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); va_end(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",strerror(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 ): raise(SIGINT); break; case( ASK_ERR ): return(Ask("%s: Cancel (y/n)[n]: ",g_ProgName)); break; case( END_ERR ): PutString(ErrLevel,"%s: Cancelled"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); va_end(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); va_end(vl); return (tolow(*response) == 'y'); }