~drizzle-trunk/drizzle/development

1 by brian
clean slate
1
/* Copyright (C) 2000 MySQL AB
2
3
   This program is free software; you can redistribute it and/or modify
4
   it under the terms of the GNU General Public License as published by
5
   the Free Software Foundation; version 2 of the License.
6
7
   This program is distributed in the hope that it will be useful,
8
   but WITHOUT ANY WARRANTY; without even the implied warranty of
9
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10
   GNU General Public License for more details.
11
12
   You should have received a copy of the GNU General Public License
13
   along with this program; if not, write to the Free Software
14
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
15
16
/* Functions to handle typelib */
17
1280.1.10 by Monty Taylor
Put everything in drizzled into drizzled namespace.
18
#include "config.h"
19
20
#include <stdio.h>
21
1241.9.64 by Monty Taylor
Moved remaining non-public portions of mysys and mystrings to drizzled/internal.
22
#include "drizzled/internal/m_string.h"
1241.9.61 by Monty Taylor
No more mystrings in drizzled/
23
#include "drizzled/charset_info.h"
1280.1.10 by Monty Taylor
Put everything in drizzled into drizzled namespace.
24
#include "drizzled/typelib.h"
1 by brian
clean slate
25
1280.1.10 by Monty Taylor
Put everything in drizzled into drizzled namespace.
26
namespace drizzled
27
{
1 by brian
clean slate
28
29
static const char field_separator=',';
30
287.3.11 by Monty Taylor
Rolled back a couple of overly anxious consts.
31
int find_type_or_exit(char *x, TYPELIB *typelib, const char *option)
1 by brian
clean slate
32
{
33
  int res;
34
  const char **ptr;
35
287.3.11 by Monty Taylor
Rolled back a couple of overly anxious consts.
36
  if ((res= find_type(x, typelib, 2)) <= 0)
1 by brian
clean slate
37
  {
38
    ptr= typelib->type_names;
39
    if (!*x)
40
      fprintf(stderr, "No option given to %s\n", option);
41
    else
42
      fprintf(stderr, "Unknown option to %s: %s\n", option, x);
43
    fprintf(stderr, "Alternatives are: '%s'", *ptr);
44
    while (*++ptr)
45
      fprintf(stderr, ",'%s'", *ptr);
46
    fprintf(stderr, "\n");
47
    exit(1);
48
  }
49
  return res;
50
}
51
52
53
/*
54
  Search after a string in a list of strings. Endspace in x is not compared.
55
56
  SYNOPSIS
57
   find_type()
58
   x			String to find
59
   lib			TYPELIB (struct of pointer to values + count)
60
   full_name		bitmap of what to do
61
			If & 1 accept only whole names
62
			If & 2 don't expand if half field
63
			If & 4 allow #number# as type
64
			If & 8 use ',' as string terminator
65
66
  NOTES
67
    If part, uniq field is found and full_name == 0 then x is expanded
68
    to full field.
69
70
  RETURN
71
    -1	Too many matching values
72
    0	No matching value
73
    >0  Offset+1 in typelib for matched string
74
*/
75
76
482 by Brian Aker
Remove uint.
77
int find_type(char *x, const TYPELIB *typelib, uint32_t full_name)
1 by brian
clean slate
78
{
77.1.71 by Monty Taylor
Uninitialized use.
79
  int find,pos,findpos=0;
1 by brian
clean slate
80
  register char * i;
81
  register const char *j;
82
83
  if (!typelib->count)
84
  {
51.3.14 by Jay Pipes
Phase 2 removal of DBUG in mysys
85
    return(0);
1 by brian
clean slate
86
  }
87
  find=0;
88
  for (pos=0 ; (j=typelib->type_names[pos]) ; pos++)
89
  {
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
90
    for (i=x ;
1 by brian
clean slate
91
    	*i && (!(full_name & 8) || *i != field_separator) &&
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
92
        my_toupper(&my_charset_utf8_general_ci,*i) ==
383.1.11 by Brian Aker
Cleanup default character set.
93
    		my_toupper(&my_charset_utf8_general_ci,*j) ; i++, j++) ;
1 by brian
clean slate
94
    if (! *j)
95
    {
96
      while (*i == ' ')
97
	i++;					/* skip_end_space */
98
      if (! *i || ((full_name & 8) && *i == field_separator))
51.3.14 by Jay Pipes
Phase 2 removal of DBUG in mysys
99
	return(pos+1);
1 by brian
clean slate
100
    }
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
101
    if ((!*i && (!(full_name & 8) || *i != field_separator)) &&
1 by brian
clean slate
102
        (!*j || !(full_name & 1)))
103
    {
104
      find++;
105
      findpos=pos;
106
    }
107
  }
376 by Brian Aker
strend remove
108
  if (find == 0 && (full_name & 4) && x[0] == '#' && strchr(x, '\0')[-1] == '#' &&
895 by Brian Aker
Completion (?) of uint conversion.
109
      (findpos=atoi(x+1)-1) >= 0 && (uint32_t) findpos < typelib->count)
1 by brian
clean slate
110
    find=1;
111
  else if (find == 0 || ! x[0])
112
  {
51.3.14 by Jay Pipes
Phase 2 removal of DBUG in mysys
113
    return(0);
1 by brian
clean slate
114
  }
115
  else if (find != 1 || (full_name & 1))
116
  {
51.3.14 by Jay Pipes
Phase 2 removal of DBUG in mysys
117
    return(-1);
1 by brian
clean slate
118
  }
119
  if (!(full_name & 2))
641.4.1 by Toru Maesaka
First pass of replacing MySQL's my_stpcpy() with appropriate libc calls
120
    (void) strcpy(x,typelib->type_names[findpos]);
51.3.14 by Jay Pipes
Phase 2 removal of DBUG in mysys
121
  return(findpos+1);
1 by brian
clean slate
122
} /* find_type */
123
124
125
	/* Get name of type nr 'nr' */
126
	/* Warning first type is 1, 0 = empty field */
127
482 by Brian Aker
Remove uint.
128
void make_type(register char * to, register uint32_t nr,
1 by brian
clean slate
129
	       register TYPELIB *typelib)
130
{
131
  if (!nr)
132
    to[0]=0;
133
  else
641.4.1 by Toru Maesaka
First pass of replacing MySQL's my_stpcpy() with appropriate libc calls
134
    (void) strcpy(to,get_type(typelib,nr-1));
51.3.14 by Jay Pipes
Phase 2 removal of DBUG in mysys
135
  return;
1 by brian
clean slate
136
} /* make_type */
137
138
139
	/* Get type */
140
	/* Warning first type is 0 */
141
482 by Brian Aker
Remove uint.
142
const char *get_type(TYPELIB *typelib, uint32_t nr)
1 by brian
clean slate
143
{
895 by Brian Aker
Completion (?) of uint conversion.
144
  if (nr < (uint32_t) typelib->count && typelib->type_names)
1 by brian
clean slate
145
    return(typelib->type_names[nr]);
146
  return "?";
147
}
148
149
150
/*
151
  Create an integer value to represent the supplied comma-seperated
152
  string where each string in the TYPELIB denotes a bit position.
153
154
  SYNOPSIS
155
    find_typeset()
156
    x		string to decompose
157
    lib		TYPELIB (struct of pointer to values + count)
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
158
    err		index (not char position) of string element which was not
1 by brian
clean slate
159
                found or 0 if there was no error
160
161
  RETURN
162
    a integer representation of the supplied string
163
*/
164
155 by Brian Aker
Removing a few "additional" ways of saying uint64_t
165
uint64_t find_typeset(char *x, TYPELIB *lib, int *err)
1 by brian
clean slate
166
{
155 by Brian Aker
Removing a few "additional" ways of saying uint64_t
167
  uint64_t result;
1 by brian
clean slate
168
  int find;
169
  char *i;
170
171
  if (!lib->count)
172
  {
51.3.14 by Jay Pipes
Phase 2 removal of DBUG in mysys
173
    return(0);
1 by brian
clean slate
174
  }
175
  result= 0;
176
  *err= 0;
177
  while (*x)
178
  {
179
    (*err)++;
180
    i= x;
181
    while (*x && *x != field_separator) x++;
182
    if ((find= find_type(i, lib, 2 | 8) - 1) < 0)
51.3.14 by Jay Pipes
Phase 2 removal of DBUG in mysys
183
      return(0);
80.1.1 by Brian Aker
LL() cleanup
184
    result|= (1ULL << find);
1 by brian
clean slate
185
  }
186
  *err= 0;
51.3.14 by Jay Pipes
Phase 2 removal of DBUG in mysys
187
  return(result);
1 by brian
clean slate
188
} /* find_set */
189
190
191
/*
192
  Create a copy of a specified TYPELIB structure.
193
194
  SYNOPSIS
195
    copy_typelib()
1253.1.3 by Monty Taylor
MEM_ROOT == memory::Root
196
    root	pointer to a memory::Root object for allocations
1 by brian
clean slate
197
    from	pointer to a source TYPELIB structure
198
199
  RETURN
200
    pointer to the new TYPELIB structure on successful copy, or
201
    NULL otherwise
202
*/
203
1253.1.3 by Monty Taylor
MEM_ROOT == memory::Root
204
TYPELIB *copy_typelib(memory::Root *root, TYPELIB *from)
1 by brian
clean slate
205
{
206
  TYPELIB *to;
482 by Brian Aker
Remove uint.
207
  uint32_t i;
1 by brian
clean slate
208
209
  if (!from)
210
    return NULL;
211
1485 by Brian Aker
Updates to confine memroot
212
  if (!(to= (TYPELIB*) root->alloc_root(sizeof(TYPELIB))))
1 by brian
clean slate
213
    return NULL;
214
215
  if (!(to->type_names= (const char **)
1485 by Brian Aker
Updates to confine memroot
216
        root->alloc_root((sizeof(char *) + sizeof(int)) * (from->count + 1))))
1 by brian
clean slate
217
    return NULL;
218
  to->type_lengths= (unsigned int *)(to->type_names + from->count + 1);
219
  to->count= from->count;
220
  if (from->name)
221
  {
1487 by Brian Aker
More updates for memory::Root
222
    if (!(to->name= root->strdup_root(from->name)))
1 by brian
clean slate
223
      return NULL;
224
  }
225
  else
226
    to->name= NULL;
227
228
  for (i= 0; i < from->count; i++)
229
  {
1487 by Brian Aker
More updates for memory::Root
230
    if (!(to->type_names[i]= root->strmake_root(from->type_names[i], from->type_lengths[i])))
1 by brian
clean slate
231
      return NULL;
232
    to->type_lengths[i]= from->type_lengths[i];
233
  }
234
  to->type_names[to->count]= NULL;
235
  to->type_lengths[to->count]= 0;
236
237
  return to;
238
}
1280.1.10 by Monty Taylor
Put everything in drizzled into drizzled namespace.
239
240
} /* namespace drizzled */