my_error.c
上传用户:jmzj888
上传日期:2007-01-02
资源大小:220k
文件大小:2k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright Abandoned 1996 TCX DataKonsult AB & Monty Program KB & Detron HB
  2.    This file is public domain and comes with NO WARRANTY of any kind */
  3. #include "mysys_priv.h"
  4. #include "mysys_err.h"
  5. #include <m_string.h>
  6. #include <stdarg.h>
  7. #include <m_ctype.h>
  8. /* Define some external variables for error handling */
  9. char ** NEAR errmsg[MAXMAPS]={0,0,0,0},
  10.    NEAR errbuff[NRERRBUFFS][ERRMSGSIZE];
  11. /* Error message to user */
  12. /*VARARGS2*/
  13. int my_error(int nr,myf MyFlags, ...)
  14. {
  15.   va_list ap;
  16.   uint olen, plen;
  17.   reg1 char *tpos, *endpos;
  18.   char * par;
  19.   char ebuff[ERRMSGSIZE+20];
  20.   DBUG_ENTER("my_error");
  21.   va_start(ap,MyFlags);
  22.   DBUG_PRINT("my", ("nr: %d  MyFlags: %d  errno: %d", nr, MyFlags, errno));
  23.   if (nr / ERRMOD == GLOB && errmsg[GLOB] == 0)
  24.     init_glob_errs();
  25.   olen=(uint) strlen(tpos=errmsg[nr / ERRMOD][nr % ERRMOD]);
  26.   endpos=ebuff;
  27.   while (*tpos)
  28.   {
  29.     if (tpos[0] != '%')
  30.     {
  31.       *endpos++= *tpos++; /* Copy ordinary char */
  32.       continue;
  33.     }
  34.     if (*++tpos == '%') /* test if %% */
  35.     {
  36.       olen--;
  37.     }
  38.     else
  39.     {
  40.       /* Skipp if max size is used (to be compatible with printf) */
  41.       while (isdigit(*tpos) || *tpos == '.' || *tpos == '-')
  42. tpos++;
  43.       if (*tpos == 's') /* String parameter */
  44.       {
  45. par = va_arg(ap, char *);
  46. plen = (uint) strlen(par);
  47. if (olen + plen < ERRMSGSIZE+2) /* Replace if possible */
  48. {
  49.   endpos=strmov(endpos,par);
  50.   tpos++;
  51.   olen+=plen-2;
  52.   continue;
  53. }
  54.       }
  55.       else if (*tpos == 'd' || *tpos == 'u') /* Integer parameter */
  56.       {
  57. register int iarg;
  58. iarg = va_arg(ap, int);
  59. plen= (uint) (int2str((long) iarg,endpos,*tpos == 'd'  ? -10 : 10)-
  60.       endpos);
  61. if (olen + plen < ERRMSGSIZE+2) /* Replace parameter if possible */
  62. {
  63.   endpos+=plen;
  64.   tpos++;
  65.   olen+=plen-2;
  66.   continue;
  67. }
  68.       }
  69.     }
  70.     *endpos++='%'; /* % used as % or unknown code */
  71.   }
  72.   *endpos=''; /* End of errmessage */
  73.   va_end(ap);
  74.   DBUG_RETURN((*error_handler_hook)(nr, ebuff, MyFlags));
  75. }
  76. /* Error as printf */
  77. int my_printf_error (uint my_error, const my_string format, myf MyFlags, ...)
  78. {
  79.   va_list args;
  80.   char ebuff[ERRMSGSIZE+20];
  81.   va_start(args,MyFlags);
  82.   (void) vsprintf (ebuff,format,args);
  83.   va_end(args);
  84.   return (*error_handler_hook)(my_error, ebuff, MyFlags);
  85. }
  86. /* Give message using error_handler_hook */
  87. int my_message(uint my_error, const char *str, register myf MyFlags)
  88. {
  89.   return (*error_handler_hook)(my_error, str, MyFlags);
  90. }