mirror of
				https://github.com/MariaDB/server.git
				synced 2025-10-30 04:26:45 +03:00 
			
		
		
		
	(Found during build process) extra/comp_err.c: Remove compiler warnings extra/perror.c: Remove compiler warnings innobase/dict/dict0dict.c: Remove compiler warnings innobase/dict/dict0load.c: Remove compiler warnings innobase/pars/pars0sym.c: Remove compiler warnings innobase/row/row0row.c: Remove compiler warnings innobase/row/row0sel.c: Remove compiler warnings libmysqld/lib_sql.cc: Remove not used variables myisam/mi_key.c: Remove compiler warnings regex/engine.c: Added comment sql/derror.cc: Remove not used variables sql/examples/ha_archive.cc: Fixed bug in blob handling Removed not used variable sql/field.cc: Remove compiler warnings Remove not used variables sql/filesort.cc: Remove compiler warnings sql/ha_heap.cc: Remove not used variable sql/ha_innodb.cc: Remove not used variables Remove compiler warnings sql/handler.cc: Remove compiler warnings and remove not used variables sql/item.cc: Remove compiler warnings and remove not used variables sql/item_subselect.cc: Remove compiler warnings sql/item_sum.cc: Remove compiler warnings sql/item_sum.h: Remove compiler warnings and remove not used variables sql/log.cc: Remove compiler warnings and remove not used variables sql/log_event.cc: Remove compiler warnings sql/mysqld.cc: Remove compiler warnings and remove not used variables sql/opt_range.cc: Remove compiler warnings and remove not used variables sql/slave.cc: Remove compiler warnings and remove not used variables sql/sp_pcontext.cc: Remove compiler warnings and remove not used variables sql/sql_acl.cc: Remove compiler warnings and remove not used variables sql/sql_analyse.cc: Remove compiler warnings and remove not used variables sql/sql_base.cc: Remove compiler warnings and remove not used variables sql/sql_db.cc: Remove compiler warnings and remove not used variables sql/sql_help.cc: Remove compiler warnings and remove not used variables sql/sql_insert.cc: Remove compiler warnings and remove not used variables sql/sql_load.cc: Remove compiler warnings and remove not used variables sql/sql_parse.cc: Remove compiler warnings and remove not used variables sql/sql_prepare.cc: Remove compiler warnings and remove not used variables sql/sql_select.cc: Remove compiler warnings and remove not used variables sql/sql_show.cc: Remove compiler warnings and remove not used variables sql/sql_table.cc: Remove compiler warnings sql/sql_union.cc: Remove compiler warnings sql/sql_update.cc: Remove compiler warnings and remove not used variables sql/sql_yacc.yy: Remove compiler warnings and remove not used variables sql/strfunc.cc: Remove compiler warnings and remove not used variables strings/ctype-ucs2.c: Remove compiler warnings tests/mysql_client_test.c: Remove compiler warnings and remove not used variables tools/mysqlmanager.c: Remove compiler warnings and remove not used variables
		
			
				
	
	
		
			238 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			238 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /* Copyright (C) 2003 MySQL AB
 | |
| 
 | |
|    This program is free software; you can redistribute it and/or modify
 | |
|    it under the terms of the GNU General Public License as published by
 | |
|    the Free Software Foundation; either version 2 of the License, or
 | |
|    (at your option) any later version.
 | |
| 
 | |
|    This program is distributed in the hope that it will be useful,
 | |
|    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
|    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | |
|    GNU General Public License for more details.
 | |
| 
 | |
|    You should have received a copy of the GNU General Public License
 | |
|    along with this program; if not, write to the Free Software
 | |
|    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
 | |
| 
 | |
| /* Some useful string utility functions used by the MySQL server */
 | |
| 
 | |
| #include "mysql_priv.h"
 | |
| 
 | |
| /*
 | |
|   Return bitmap for strings used in a set
 | |
| 
 | |
|   SYNOPSIS
 | |
|   find_set()
 | |
|   lib			Strings in set
 | |
|   str			Strings of set-strings separated by ','
 | |
|   err_pos		If error, set to point to start of wrong set string
 | |
|   err_len		If error, set to the length of wrong set string
 | |
|   set_warning		Set to 1 if some string in set couldn't be used
 | |
| 
 | |
|   NOTE
 | |
|     We delete all end space from str before comparison
 | |
| 
 | |
|   RETURN
 | |
|     bitmap of all sets found in x.
 | |
|     set_warning is set to 1 if there was any sets that couldn't be set
 | |
| */
 | |
| 
 | |
| static const char field_separator=',';
 | |
| 
 | |
| ulonglong find_set(TYPELIB *lib, const char *str, uint length, CHARSET_INFO *cs,
 | |
|                    char **err_pos, uint *err_len, bool *set_warning)
 | |
| {
 | |
|   CHARSET_INFO *strip= cs ? cs : &my_charset_latin1;
 | |
|   const char *end= str + strip->cset->lengthsp(strip, str, length);
 | |
|   ulonglong found= 0;
 | |
|   *err_pos= 0;                  // No error yet
 | |
|   if (str != end)
 | |
|   {
 | |
|     const char *start= str;    
 | |
|     for (;;)
 | |
|     {
 | |
|       const char *pos= start;
 | |
|       uint var_len;
 | |
|       int mblen= 1;
 | |
| 
 | |
|       if (cs && cs->mbminlen > 1)
 | |
|       {
 | |
|         for ( ; pos < end; pos+= mblen)
 | |
|         {
 | |
|           my_wc_t wc;
 | |
|           if ((mblen= cs->cset->mb_wc(cs, &wc, (const uchar *) pos, 
 | |
|                                                (const uchar *) end)) < 1)
 | |
|             mblen= 1; // Not to hang on a wrong multibyte sequence
 | |
|           if (wc == (my_wc_t) field_separator)
 | |
|             break;
 | |
|         }
 | |
|       }
 | |
|       else
 | |
|         for (; pos != end && *pos != field_separator; pos++) ;
 | |
|       var_len= (uint) (pos - start);
 | |
|       uint find= cs ? find_type2(lib, start, var_len, cs) :
 | |
|                       find_type(lib, start, var_len, (bool) 0);
 | |
|       if (!find)
 | |
|       {
 | |
|         *err_pos= (char*) start;
 | |
|         *err_len= var_len;
 | |
|         *set_warning= 1;
 | |
|       }
 | |
|       else
 | |
|         found|= ((longlong) 1 << (find - 1));
 | |
|       if (pos >= end)
 | |
|         break;
 | |
|       start= pos + mblen;
 | |
|     }
 | |
|   }
 | |
|   return found;
 | |
| }
 | |
| 
 | |
| 
 | |
| /*
 | |
|   Function to find a string in a TYPELIB
 | |
|   (Same format as mysys/typelib.c)
 | |
| 
 | |
|   SYNOPSIS
 | |
|    find_type()
 | |
|    lib			TYPELIB (struct of pointer to values + count)
 | |
|    find			String to find
 | |
|    length		Length of string to find
 | |
|    part_match		Allow part matching of value
 | |
| 
 | |
|  RETURN
 | |
|   0 error
 | |
|   > 0 position in TYPELIB->type_names +1
 | |
| */
 | |
| 
 | |
| uint find_type(TYPELIB *lib, const char *find, uint length, bool part_match)
 | |
| {
 | |
|   uint found_count=0, found_pos=0;
 | |
|   const char *end= find+length;
 | |
|   const char *i;
 | |
|   const char *j;
 | |
|   for (uint pos=0 ; (j=lib->type_names[pos++]) ; )
 | |
|   {
 | |
|     for (i=find ; i != end && 
 | |
| 	   my_toupper(system_charset_info,*i) == 
 | |
| 	   my_toupper(system_charset_info,*j) ; i++, j++) ;
 | |
|     if (i == end)
 | |
|     {
 | |
|       if (! *j)
 | |
| 	return(pos);
 | |
|       found_count++;
 | |
|       found_pos= pos;
 | |
|     }
 | |
|   }
 | |
|   return(found_count == 1 && part_match ? found_pos : 0);
 | |
| }
 | |
| 
 | |
| 
 | |
| /*
 | |
|   Find a string in a list of strings according to collation
 | |
| 
 | |
|   SYNOPSIS
 | |
|    find_type2()
 | |
|    lib			TYPELIB (struct of pointer to values + count)
 | |
|    x			String to find
 | |
|    length               String length
 | |
|    cs			Character set + collation to use for comparison
 | |
| 
 | |
|   NOTES
 | |
| 
 | |
|   RETURN
 | |
|     0	No matching value
 | |
|     >0  Offset+1 in typelib for matched string
 | |
| */
 | |
| 
 | |
| uint find_type2(TYPELIB *typelib, const char *x, uint length, CHARSET_INFO *cs)
 | |
| {
 | |
|   int pos;
 | |
|   const char *j;
 | |
|   DBUG_ENTER("find_type2");
 | |
|   DBUG_PRINT("enter",("x: '%.*s'  lib: 0x%lx", length, x, typelib));
 | |
| 
 | |
|   if (!typelib->count)
 | |
|   {
 | |
|     DBUG_PRINT("exit",("no count"));
 | |
|     DBUG_RETURN(0);
 | |
|   }
 | |
| 
 | |
|   for (pos=0 ; (j=typelib->type_names[pos]) ; pos++)
 | |
|   {
 | |
|     if (!my_strnncoll(cs, (const uchar*) x, length,
 | |
|                           (const uchar*) j, typelib->type_lengths[pos]))
 | |
|       DBUG_RETURN(pos+1);
 | |
|   }
 | |
|   DBUG_PRINT("exit",("Couldn't find type"));
 | |
|   DBUG_RETURN(0);
 | |
| } /* find_type */
 | |
| 
 | |
| 
 | |
| /*
 | |
|   Un-hex all elements in a typelib
 | |
| 
 | |
|   SYNOPSIS
 | |
|    unhex_type2()
 | |
|    interval       TYPELIB (struct of pointer to values + lengths + count)
 | |
| 
 | |
|   NOTES
 | |
| 
 | |
|   RETURN
 | |
|     N/A
 | |
| */
 | |
| 
 | |
| void unhex_type2(TYPELIB *interval)
 | |
| {
 | |
|   for (uint pos= 0; pos < interval->count; pos++)
 | |
|   {
 | |
|     char *from, *to;
 | |
|     for (from= to= (char*) interval->type_names[pos]; *from; )
 | |
|     {
 | |
|       /*
 | |
|         Note, hexchar_to_int(*from++) doesn't work
 | |
|         one some compilers, e.g. IRIX. Looks like a compiler
 | |
|         bug in inline functions in combination with arguments
 | |
|         that have a side effect. So, let's use from[0] and from[1]
 | |
|         and increment 'from' by two later.
 | |
|       */
 | |
| 
 | |
|       *to++= (char) (hexchar_to_int(from[0]) << 4) +
 | |
|                      hexchar_to_int(from[1]);
 | |
|       from+= 2;
 | |
|     }
 | |
|     interval->type_lengths[pos] /= 2;
 | |
|   }
 | |
| }
 | |
| 
 | |
| 
 | |
| /*
 | |
|   Check if the first word in a string is one of the ones in TYPELIB
 | |
| 
 | |
|   SYNOPSIS
 | |
|     check_word()
 | |
|     lib		TYPELIB
 | |
|     val		String to check
 | |
|     end		End of input
 | |
|     end_of_word	Store value of last used byte here if we found word
 | |
| 
 | |
|   RETURN
 | |
|     0	 No matching value
 | |
|     > 1  lib->type_names[#-1] matched
 | |
| 	 end_of_word will point to separator character/end in 'val'
 | |
| */
 | |
| 
 | |
| uint check_word(TYPELIB *lib, const char *val, const char *end,
 | |
| 		const char **end_of_word)
 | |
| {
 | |
|   int res;
 | |
|   const char *ptr;
 | |
| 
 | |
|   /* Fiend end of word */
 | |
|   for (ptr= val ; ptr < end && my_isalpha(&my_charset_latin1, *ptr) ; ptr++)
 | |
|     ;
 | |
|   if ((res=find_type(lib, val, (uint) (ptr - val), 1)) > 0)
 | |
|     *end_of_word= ptr;
 | |
|   return res;
 | |
| }
 |