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

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. /* Functions to handle typelib */
  14. #include "mysys_priv.h"
  15. #include <m_string.h>
  16. #include <m_ctype.h>
  17. /*
  18.   Search after a string in a list of strings. Endspace in x is not compared.
  19.   SYNOPSIS
  20.    find_type()
  21.    x String to find
  22.    lib TYPELIB (struct of pointer to values + count)
  23.    full_name bitmap of what to do
  24. If & 1 accept only whole names
  25. If & 2 don't expand if half field
  26. If & 4 allow #number# as type
  27.   NOTES
  28.     If part, uniq field is found and full_name == 0 then x is expanded
  29.     to full field.
  30.   RETURN
  31.     -1 Too many matching values
  32.     0 No matching value
  33.     >0  Offset+1 in typelib for matched string
  34. */
  35. int find_type(my_string x, TYPELIB *typelib, uint full_name)
  36. {
  37.   int find,pos,findpos;
  38.   reg1 my_string i;
  39.   reg2 const char *j;
  40.   DBUG_ENTER("find_type");
  41.   DBUG_PRINT("enter",("x: '%s'  lib: 0x%lx",x,typelib));
  42.   if (!typelib->count)
  43.   {
  44.     DBUG_PRINT("exit",("no count"));
  45.     DBUG_RETURN(0);
  46.   }
  47.   LINT_INIT(findpos);
  48.   find=0;
  49.   for (pos=0 ; (j=typelib->type_names[pos]) ; pos++)
  50.   {
  51.     for (i=x ; 
  52.      *i && my_toupper(&my_charset_latin1,*i) == 
  53.      my_toupper(&my_charset_latin1,*j) ; i++, j++) ;
  54.     if (! *j)
  55.     {
  56.       while (*i == ' ')
  57. i++; /* skip_end_space */
  58.       if (! *i)
  59. DBUG_RETURN(pos+1);
  60.     }
  61.     if (! *i && (!*j || !(full_name & 1)))
  62.     {
  63.       find++;
  64.       findpos=pos;
  65.     }
  66.   }
  67.   if (find == 0 && (full_name & 4) && x[0] == '#' && strend(x)[-1] == '#' &&
  68.       (findpos=atoi(x+1)-1) >= 0 && (uint) findpos < typelib->count)
  69.     find=1;
  70.   else if (find == 0 || ! x[0])
  71.   {
  72.     DBUG_PRINT("exit",("Couldn't find type"));
  73.     DBUG_RETURN(0);
  74.   }
  75.   else if (find != 1 || (full_name & 1))
  76.   {
  77.     DBUG_PRINT("exit",("Too many possybilities"));
  78.     DBUG_RETURN(-1);
  79.   }
  80.   if (!(full_name & 2))
  81.     (void) strmov(x,typelib->type_names[findpos]);
  82.   DBUG_RETURN(findpos+1);
  83. } /* find_type */
  84. /* Get name of type nr 'nr' */
  85. /* Warning first type is 1, 0 = empty field */
  86. void make_type(register my_string to, register uint nr,
  87.        register TYPELIB *typelib)
  88. {
  89.   DBUG_ENTER("make_type");
  90.   if (!nr)
  91.     to[0]=0;
  92.   else
  93.     (void) strmov(to,get_type(typelib,nr-1));
  94.   DBUG_VOID_RETURN;
  95. } /* make_type */
  96. /* Get type */
  97. /* Warning first type is 0 */
  98. const char *get_type(TYPELIB *typelib, uint nr)
  99. {
  100.   if (nr < (uint) typelib->count && typelib->type_names)
  101.     return(typelib->type_names[nr]);
  102.   return "?";
  103. }