home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 January / Chip_2001-01_cd1.bin / tema / mysql / mysql-3.23.28g-win-source.exe / mysys / my_error.c < prev    next >
C/C++ Source or Header  |  2000-08-31  |  3KB  |  123 lines

  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.  
  18. #include "mysys_priv.h"
  19. #include "mysys_err.h"
  20. #include <m_string.h>
  21. #include <stdarg.h>
  22. #include <m_ctype.h>
  23.  
  24. /* Define some external variables for error handling */
  25.  
  26. const char ** NEAR errmsg[MAXMAPS]={0,0,0,0};
  27. char NEAR errbuff[NRERRBUFFS][ERRMSGSIZE];
  28.  
  29. /* Error message to user */
  30. /*VARARGS2*/
  31.  
  32. int my_error(int nr,myf MyFlags, ...)
  33. {
  34.   va_list    ap;
  35.   uint        olen, plen;
  36.   reg1 const char *tpos;
  37.   reg2 char    *endpos;
  38.   char        * par;
  39.   char        ebuff[ERRMSGSIZE+20];
  40.   DBUG_ENTER("my_error");
  41.  
  42.   va_start(ap,MyFlags);
  43.   DBUG_PRINT("my", ("nr: %d  MyFlags: %d  errno: %d", nr, MyFlags, errno));
  44.  
  45.   if (nr / ERRMOD == GLOB && errmsg[GLOB] == 0)
  46.     init_glob_errs();
  47.  
  48.   olen=(uint) strlen(tpos=errmsg[nr / ERRMOD][nr % ERRMOD]);
  49.   endpos=ebuff;
  50.  
  51.   while (*tpos)
  52.   {
  53.     if (tpos[0] != '%')
  54.     {
  55.       *endpos++= *tpos++;    /* Copy ordinary char */
  56.       olen++;
  57.       continue;
  58.     }
  59.     if (*++tpos == '%')        /* test if %% */
  60.     {
  61.       olen--;
  62.     }
  63.     else
  64.     {
  65.       /* Skipp if max size is used (to be compatible with printf) */
  66.       while (isdigit(*tpos) || *tpos == '.' || *tpos == '-')
  67.     tpos++;
  68.       if (*tpos == 's')                /* String parameter */
  69.       {
  70.     par = va_arg(ap, char *);
  71.     plen = (uint) strlen(par);
  72.     if (olen + plen < ERRMSGSIZE+2)        /* Replace if possible */
  73.     {
  74.       endpos=strmov(endpos,par);
  75.       tpos++;
  76.       olen+=plen-2;
  77.       continue;
  78.     }
  79.       }
  80.       else if (*tpos == 'd' || *tpos == 'u')    /* Integer parameter */
  81.       {
  82.     register int iarg;
  83.     iarg = va_arg(ap, int);
  84.     if (*tpos == 'd')
  85.       plen= (uint) (int2str((long) iarg,endpos, -10) - endpos);
  86.     else
  87.       plen= (uint) (int2str((long) (uint) iarg,endpos,10)- endpos);
  88.     if (olen + plen < ERRMSGSIZE+2) /* Replace parameter if possible */
  89.     {
  90.       endpos+=plen;
  91.       tpos++;
  92.       olen+=plen-2;
  93.       continue;
  94.     }
  95.       }
  96.     }
  97.     *endpos++='%';        /* % used as % or unknown code */
  98.   }
  99.   *endpos='\0';            /* End of errmessage */
  100.   va_end(ap);
  101.   DBUG_RETURN((*error_handler_hook)(nr, ebuff, MyFlags));
  102. }
  103.  
  104.     /* Error as printf */
  105.  
  106. int my_printf_error (uint error, const char *format, myf MyFlags, ...)
  107. {
  108.   va_list args;
  109.   char ebuff[ERRMSGSIZE+20];
  110.  
  111.   va_start(args,MyFlags);
  112.   (void) vsprintf (ebuff,format,args);
  113.   va_end(args);
  114.   return (*error_handler_hook)(error, ebuff, MyFlags);
  115. }
  116.  
  117.     /* Give message using error_handler_hook */
  118.  
  119. int my_message(uint error, const char *str, register myf MyFlags)
  120. {
  121.   return (*error_handler_hook)(error, str, MyFlags);
  122. }
  123.