00001
00011 #ifndef ERRORCLASS_H
00012 #define ERRORCLASS_H
00013 #include<stdarg.h>
00014 #include<stdio.h>
00015 #include<string.h>
00016
00017
00021 class Error
00022 {
00023 protected:
00024 char errmsg[128];
00025 public:
00026 Error() {}
00030 Error(const char *msg,...)
00031 {
00032 va_list args;
00033 va_start(args,msg);
00034 vsnprintf(errmsg,128,msg,args);
00035 va_end(args);
00036 }
00040 const char *what() { return errmsg; }
00041 };
00042
00046 class Systemerror: public Error
00047 {
00048 int errnr;
00049 const char *icall;
00050 public:
00051 Systemerror() {}
00059 Systemerror(int err,char *pcall,char *msg,...)
00060 {
00061 va_list args;
00062 va_start(args,msg);
00063 init(err,pcall,msg,args);
00064 va_end(args);
00065 }
00066
00067
00075 void init(int err,char *pcall,char *msg,va_list args)
00076 {
00077 icall = pcall;
00078 char format_sp[128];
00079 char *format=msg;
00080 char *pm=strstr(msg,"%m");
00081 register int l = pm-format;
00082 if(pm!=NULL && l<120)
00083 {
00084 char *pq,*pz;
00085 strncpy(format_sp,msg,l);
00086 pq = strerror(err);
00087 pz=format_sp+l;
00088 while(pz-format_sp < 128 && *pq != '\0') *pz++=*pq++;
00089 pq=pm+2;
00090 while(pz-format_sp < 128 && *pq != '\0') *pz++=*pq++;
00091 *pz='\0';
00092 format = format_sp;
00093 }
00094 vsnprintf(errmsg,128,format,args);
00095 }
00099 int errornr() { return errnr; }
00103 const char *call() { return icall; }
00104 };
00105
00110 class Syntaxerror: public Error
00111 {
00112 public:
00113 Syntaxerror(const char *m,...):Error()
00114 {
00115 va_list args;
00116 va_start(args,m);
00117 vsnprintf(errmsg,128,m,args);
00118 va_end(args);
00119 };
00120 };
00121
00125 class Databaseerror: public Error
00126 {
00127 long icode;
00128 public:
00129 Databaseerror(const char *m):Error(m){};
00130 Databaseerror(const char *dbname,long code,const char *m,...):Error()
00131 {
00132 char format[128];
00133 va_list args;
00134 va_start(args,m);
00135 snprintf(format,128,"%s-CODE %ld: %s",dbname,code,m);
00136 vsnprintf(errmsg,128,format,args);
00137 va_end(args);
00138 icode=code;
00139 }
00140 long code() const { return icode; }
00141 };
00142 #endif