~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to mysys/charset.c

  • Committer: Monty Taylor
  • Date: 2008-10-27 23:19:48 UTC
  • mto: (520.4.12 merge-innodb-plugin)
  • mto: This revision was merged to the branch mainline in revision 563.
  • Revision ID: monty@inaugust.com-20081027231948-3kl6ss04plbakqcr
Split some more things out of common_includes.h.

Show diffs side-by-side

added added

removed removed

Lines of Context:
17
17
#include "mysys_err.h"
18
18
#include <mystrings/m_ctype.h>
19
19
#include <mystrings/m_string.h>
20
 
#include <drizzled/configmake.h>
 
20
#include <my_dir.h>
21
21
 
22
22
 
23
23
/*
24
24
  The code below implements this functionality:
25
 
 
 
25
  
26
26
    - Initializing charset related structures
27
27
    - Loading dynamic charsets
28
 
    - Searching for a proper CHARSET_INFO
 
28
    - Searching for a proper CHARSET_INFO 
29
29
      using charset name, collation name or collation ID
30
30
    - Setting server default character set
31
31
*/
44
44
       cs < all_charsets+array_elements(all_charsets)-1 ;
45
45
       cs++)
46
46
  {
47
 
    if ( cs[0] && cs[0]->name &&
 
47
    if ( cs[0] && cs[0]->name && 
48
48
         !my_strcasecmp(&my_charset_utf8_general_ci, cs[0]->name, name))
49
49
      return cs[0]->number;
50
 
  }
 
50
  }  
51
51
  return 0;
52
52
}
53
53
 
58
58
  unsigned char *state_map;
59
59
  unsigned char *ident_map;
60
60
 
61
 
  if (!(cs->state_map= (unsigned char*) malloc(256)))
 
61
  if (!(cs->state_map= (unsigned char*) my_once_alloc(256, MYF(MY_WME))))
62
62
    return 1;
63
63
    
64
 
  if (!(cs->ident_map= (unsigned char*) malloc(256)))
 
64
  if (!(cs->ident_map= (unsigned char*) my_once_alloc(256, MYF(MY_WME))))
65
65
    return 1;
66
66
 
67
67
  state_map= cs->state_map;
68
68
  ident_map= cs->ident_map;
69
 
 
 
69
  
70
70
  /* Fill state_map with states to get a faster parser */
71
71
  for (i=0; i < 256 ; i++)
72
72
  {
124
124
 
125
125
char *get_charsets_dir(char *buf)
126
126
{
 
127
  const char *sharedir= SHAREDIR;
127
128
  char *res;
128
129
 
129
130
  if (charsets_dir != NULL)
130
 
    strncpy(buf, charsets_dir, FN_REFLEN-1);
 
131
    strmake(buf, charsets_dir, FN_REFLEN-1);
131
132
  else
132
133
  {
133
 
    if (test_if_hard_path(PKGDATADIR) ||
134
 
        is_prefix(PKGDATADIR, PREFIX))
135
 
      sprintf(buf,"%s/%s",PKGDATADIR,CHARSET_DIR);
 
134
    if (test_if_hard_path(sharedir) ||
 
135
        is_prefix(sharedir, DEFAULT_CHARSET_HOME))
 
136
      strxmov(buf, sharedir, "/", CHARSET_DIR, NULL);
136
137
    else
137
 
      sprintf(buf,"%s/%s/%s",PREFIX,PKGDATADIR,CHARSET_DIR);
 
138
      strxmov(buf, DEFAULT_CHARSET_HOME, "/", sharedir, "/", CHARSET_DIR,
 
139
              NULL);
138
140
  }
139
141
  res= convert_dirname(buf,buf,NULL);
140
142
  return(res);
149
151
  cs->state|= MY_CS_AVAILABLE;
150
152
}
151
153
 
152
 
void *cs_alloc(size_t size)
 
154
static void *cs_alloc(size_t size)
153
155
{
154
 
  return malloc(size);
 
156
  return my_once_alloc(size, MYF(MY_WME));
155
157
}
156
158
 
157
159
 
175
177
    {
176
178
      memset(&all_charsets, 0, sizeof(all_charsets));
177
179
      init_compiled_charsets(myflags);
178
 
 
 
180
      
179
181
      /* Copy compiled charsets */
180
182
      for (cs=all_charsets;
181
183
           cs < all_charsets+array_elements(all_charsets)-1 ;
188
190
              *cs= NULL;
189
191
        }
190
192
      }
191
 
 
192
 
      strcpy(get_charsets_dir(fname), MY_CHARSET_INDEX);
 
193
      
 
194
      my_stpcpy(get_charsets_dir(fname), MY_CHARSET_INDEX);
193
195
      charset_initialized=1;
194
196
    }
195
197
    pthread_mutex_unlock(&THR_LOCK_charset);
215
217
{
216
218
  CHARSET_INFO **cs;
217
219
  init_available_charsets(MYF(0));
218
 
 
 
220
  
219
221
  for (cs= all_charsets;
220
222
       cs < all_charsets+array_elements(all_charsets)-1 ;
221
223
       cs++)
223
225
    if ( cs[0] && cs[0]->csname && (cs[0]->state & cs_flags) &&
224
226
         !my_strcasecmp(&my_charset_utf8_general_ci, cs[0]->csname, charset_name))
225
227
      return cs[0]->number;
226
 
  }
 
228
  }  
227
229
  return 0;
228
230
}
229
231
 
236
238
  cs=all_charsets[charset_number];
237
239
  if (cs && (cs->number == charset_number) && cs->name )
238
240
    return (char*) cs->name;
239
 
 
 
241
  
240
242
  return (char*) "?";   /* this mimics find_type() */
241
243
}
242
244
 
270
272
}
271
273
 
272
274
 
273
 
const CHARSET_INFO *get_charset(uint32_t cs_number, myf flags)
 
275
const const CHARSET_INFO *get_charset(uint32_t cs_number, myf flags)
274
276
{
275
277
  const CHARSET_INFO *cs;
276
278
  if (cs_number == default_charset_info->number)
277
279
    return default_charset_info;
278
280
 
279
281
  (void) init_available_charsets(MYF(0));       /* If it isn't initialized */
280
 
 
 
282
  
281
283
  if (!cs_number || cs_number >= array_elements(all_charsets)-1)
282
284
    return NULL;
283
 
 
 
285
  
284
286
  cs= get_internal_charset(cs_number);
285
287
 
286
288
  if (!cs && (flags & MY_WME))
287
289
  {
288
290
    char index_file[FN_REFLEN + sizeof(MY_CHARSET_INDEX)], cs_string[23];
289
 
    strcpy(get_charsets_dir(index_file),MY_CHARSET_INDEX);
 
291
    my_stpcpy(get_charsets_dir(index_file),MY_CHARSET_INDEX);
290
292
    cs_string[0]='#';
291
293
    int10_to_str(cs_number, cs_string+1, 10);
292
294
    my_error(EE_UNKNOWN_CHARSET, MYF(ME_BELL), cs_string, index_file);
306
308
  if (!cs && (flags & MY_WME))
307
309
  {
308
310
    char index_file[FN_REFLEN + sizeof(MY_CHARSET_INDEX)];
309
 
    strcpy(get_charsets_dir(index_file),MY_CHARSET_INDEX);
 
311
    my_stpcpy(get_charsets_dir(index_file),MY_CHARSET_INDEX);
310
312
    my_error(EE_UNKNOWN_COLLATION, MYF(ME_BELL), cs_name, index_file);
311
313
  }
312
314
 
329
331
  if (!cs && (flags & MY_WME))
330
332
  {
331
333
    char index_file[FN_REFLEN + sizeof(MY_CHARSET_INDEX)];
332
 
    strcpy(get_charsets_dir(index_file),MY_CHARSET_INDEX);
 
334
    my_stpcpy(get_charsets_dir(index_file),MY_CHARSET_INDEX);
333
335
    my_error(EE_UNKNOWN_CHARSET, MYF(ME_BELL), cs_name, index_file);
334
336
  }
335
337