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