my_error.c
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:3k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
  2.    
  3.    This library is free software; you can redistribute it and/or
  4.    modify it under the terms of the GNU Library General Public
  5.    License as published by the Free Software Foundation; either
  6.    version 2 of the License, or (at your option) any later version.
  7.    
  8.    This library is distributed in the hope that it will be useful,
  9.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  11.    Library General Public License for more details.
  12.    
  13.    You should have received a copy of the GNU Library General Public
  14.    License along with this library; if not, write to the Free
  15.    Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
  16.    MA 02111-1307, USA */
  17. #include "mysys_priv.h"
  18. #include "mysys_err.h"
  19. #include <m_string.h>
  20. #include <stdarg.h>
  21. #include <m_ctype.h>
  22. /* Define some external variables for error handling */
  23. const char ** NEAR my_errmsg[MAXMAPS]={0,0,0,0};
  24. char NEAR errbuff[NRERRBUFFS][ERRMSGSIZE];
  25. /* Error message to user */
  26. /*VARARGS2*/
  27. int my_error(int nr,myf MyFlags, ...)
  28. {
  29.   va_list ap;
  30.   uint olen, plen;
  31.   reg1 const char *tpos;
  32.   reg2 char *endpos;
  33.   char * par;
  34.   char ebuff[ERRMSGSIZE+20];
  35.   DBUG_ENTER("my_error");
  36.   va_start(ap,MyFlags);
  37.   DBUG_PRINT("my", ("nr: %d  MyFlags: %d  errno: %d", nr, MyFlags, errno));
  38.   if (nr / ERRMOD == GLOB && my_errmsg[GLOB] == 0)
  39.     init_glob_errs();
  40.   olen=(uint) strlen(tpos=my_errmsg[nr / ERRMOD][nr % ERRMOD]);
  41.   endpos=ebuff;
  42.   while (*tpos)
  43.   {
  44.     if (tpos[0] != '%')
  45.     {
  46.       *endpos++= *tpos++; /* Copy ordinary char */
  47.       olen++;
  48.       continue;
  49.     }
  50.     if (*++tpos == '%') /* test if %% */
  51.     {
  52.       olen--;
  53.     }
  54.     else
  55.     {
  56.       /* Skipp if max size is used (to be compatible with printf) */
  57.       while (isdigit(*tpos) || *tpos == '.' || *tpos == '-')
  58. tpos++;
  59.       if (*tpos == 'l') /* Skipp 'l' argument */
  60. *tpos++;
  61.       if (*tpos == 's') /* String parameter */
  62.       {
  63. par = va_arg(ap, char *);
  64. plen = (uint) strlen(par);
  65. if (olen + plen < ERRMSGSIZE+2) /* Replace if possible */
  66. {
  67.   endpos=strmov(endpos,par);
  68.   tpos++;
  69.   olen+=plen-2;
  70.   continue;
  71. }
  72.       }
  73.       else if (*tpos == 'd' || *tpos == 'u') /* Integer parameter */
  74.       {
  75. register int iarg;
  76. iarg = va_arg(ap, int);
  77. if (*tpos == 'd')
  78.   plen= (uint) (int2str((long) iarg,endpos, -10) - endpos);
  79. else
  80.   plen= (uint) (int2str((long) (uint) iarg,endpos,10)- endpos);
  81. if (olen + plen < ERRMSGSIZE+2) /* Replace parameter if possible */
  82. {
  83.   endpos+=plen;
  84.   tpos++;
  85.   olen+=plen-2;
  86.   continue;
  87. }
  88.       }
  89.     }
  90.     *endpos++='%'; /* % used as % or unknown code */
  91.   }
  92.   *endpos=''; /* End of errmessage */
  93.   va_end(ap);
  94.   DBUG_RETURN((*error_handler_hook)(nr, ebuff, MyFlags));
  95. }
  96. /* Error as printf */
  97. int my_printf_error (uint error, const char *format, myf MyFlags, ...)
  98. {
  99.   va_list args;
  100.   char ebuff[ERRMSGSIZE+20];
  101.   va_start(args,MyFlags);
  102.   (void) vsprintf (ebuff,format,args);
  103.   va_end(args);
  104.   return (*error_handler_hook)(error, ebuff, MyFlags);
  105. }
  106. /* Give message using error_handler_hook */
  107. int my_message(uint error, const char *str, register myf MyFlags)
  108. {
  109.   return (*error_handler_hook)(error, str, MyFlags);
  110. }