my_error.c
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:5k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2000 MySQL AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. #include "mysys_priv.h"
  14. #include "mysys_err.h"
  15. #include <m_string.h>
  16. #include <stdarg.h>
  17. #include <m_ctype.h>
  18. /* Define some external variables for error handling */
  19. const char ** NEAR my_errmsg[MAXMAPS]={0,0,0,0};
  20. char NEAR errbuff[NRERRBUFFS][ERRMSGSIZE];
  21. /*
  22.    Error message to user
  23.    SYNOPSIS
  24.      my_error()
  25.        nr Errno
  26.        MyFlags Flags
  27.        ... variable list
  28.    NOTE
  29.     The following subset of printf format is supported:
  30.     "%[0-9.-]*l?[sdu]", where all length flags are parsed but ignored.
  31.     Additionally "%.*s" is supported and "%.*[ud]" is correctly parsed but
  32.     the length value is ignored.
  33. */
  34. int my_error(int nr,myf MyFlags, ...)
  35. {
  36.   va_list ap;
  37.   uint olen, plen;
  38.   reg1 const char *tpos;
  39.   reg2 char *endpos;
  40.   char * par;
  41.   char ebuff[ERRMSGSIZE+20];
  42.   int           prec_chars; /* output precision */
  43.   my_bool       prec_supplied;
  44.   DBUG_ENTER("my_error");
  45.   LINT_INIT(prec_chars); /* protected by prec_supplied */
  46.   va_start(ap,MyFlags);
  47.   DBUG_PRINT("my", ("nr: %d  MyFlags: %d  errno: %d", nr, MyFlags, errno));
  48.   if (nr / ERRMOD == GLOB && my_errmsg[GLOB] == 0)
  49.     init_glob_errs();
  50.   olen=(uint) strlen(tpos=my_errmsg[nr / ERRMOD][nr % ERRMOD]);
  51.   endpos=ebuff;
  52.   while (*tpos)
  53.   {
  54.     if (tpos[0] != '%')
  55.     {
  56.       *endpos++= *tpos++; /* Copy ordinary char */
  57.       continue;
  58.     }
  59.     if (*++tpos == '%') /* test if %% */
  60.     {
  61.       olen--;
  62.     }
  63.     else
  64.     {
  65.       /*
  66.         Skip size/precision flags to be compatible with printf.
  67.         The only size/precision flag supported is "%.*s".
  68.         If "%.*u" or "%.*d" are encountered, the precision number is read
  69.         from the variable argument list but its value is ignored.
  70.       */
  71.       prec_supplied= 0;
  72.       if (*tpos== '.')
  73.       {
  74.         tpos++;
  75.         olen--;
  76.         if (*tpos == '*')
  77.         {
  78.           tpos++;
  79.           olen--;
  80.           prec_chars= va_arg(ap, int); /* get length parameter */
  81.           prec_supplied= 1;
  82.         }
  83.       }
  84.       if (!prec_supplied)
  85.       {
  86.         while (my_isdigit(&my_charset_latin1, *tpos) || *tpos == '.' ||
  87.                *tpos == '-')
  88.   tpos++;
  89.         if (*tpos == 'l') /* Skip 'l' argument */
  90.   tpos++;
  91.       }
  92.       if (*tpos == 's') /* String parameter */
  93.       {
  94. par= va_arg(ap, char *);
  95. plen= (uint) strlen(par);
  96.         if (prec_supplied && prec_chars > 0)
  97.           plen= min((uint)prec_chars, plen);
  98. if (olen + plen < ERRMSGSIZE+2) /* Replace if possible */
  99. {
  100.           strmake(endpos, par, plen);
  101.           endpos+= plen;
  102.           tpos++;
  103.           olen+= plen-2;
  104.           continue;
  105. }
  106.       }
  107.       else if (*tpos == 'd' || *tpos == 'u') /* Integer parameter */
  108.       {
  109. register int iarg;
  110. iarg= va_arg(ap, int);
  111. if (*tpos == 'd')
  112.   plen= (uint) (int10_to_str((long) iarg, endpos, -10) - endpos);
  113. else
  114.   plen= (uint) (int10_to_str((long) (uint) iarg, endpos, 10) - endpos);
  115. if (olen + plen < ERRMSGSIZE+2) /* Replace parameter if possible */
  116. {
  117.   endpos+= plen;
  118.   tpos++;
  119.   olen+= plen-2;
  120.   continue;
  121. }
  122.       }
  123.     }
  124.     *endpos++= '%'; /* % used as % or unknown code */
  125.   }
  126.   *endpos= ''; /* End of errmessage */
  127.   va_end(ap);
  128.   DBUG_RETURN((*error_handler_hook)(nr, ebuff, MyFlags));
  129. }
  130. /*
  131.   Error as printf
  132.   SYNOPSIS
  133.     my_printf_error()
  134.       error Errno
  135.       format Format string
  136.       MyFlags Flags
  137.       ... variable list
  138. */
  139. int my_printf_error(uint error, const char *format, myf MyFlags, ...)
  140. {
  141.   va_list args;
  142.   char ebuff[ERRMSGSIZE+20];
  143.   va_start(args,MyFlags);
  144.   (void) vsprintf (ebuff,format,args);
  145.   va_end(args);
  146.   return (*error_handler_hook)(error, ebuff, MyFlags);
  147. }
  148. /*
  149.   Give message using error_handler_hook
  150.   SYNOPSIS
  151.     my_message()
  152.       error Errno
  153.       str Error message
  154.       MyFlags Flags
  155. */
  156. int my_message(uint error, const char *str, register myf MyFlags)
  157. {
  158.   return (*error_handler_hook)(error, str, MyFlags);
  159. }