summaryrefslogtreecommitdiff
path: root/mysys
diff options
context:
space:
mode:
authorunknown <tim@localhost.polyesthetic.msg>2000-08-22 16:09:27 -0400
committerunknown <tim@localhost.polyesthetic.msg>2000-08-22 16:09:27 -0400
commit06c58585384bc7730e518e93bd8efa306158aa2e (patch)
tree0033103c62fb7ee4a3104232ccd035bc6be1275c /mysys
parent11f402b3108b0c6ef5744bd13164607dd9fba3c0 (diff)
parentdb3b3c1799d111a22c5aaead6426b7f064ea8fd9 (diff)
downloadmariadb-git-06c58585384bc7730e518e93bd8efa306158aa2e.tar.gz
Merge tim@work:/home/bk/mysql
into localhost.polyesthetic.msg:/usr/local/src/my/work configure.in: Auto merged
Diffstat (limited to 'mysys')
-rw-r--r--mysys/charset.c95
1 files changed, 61 insertions, 34 deletions
diff --git a/mysys/charset.c b/mysys/charset.c
index bf51184589c..0cc85058eeb 100644
--- a/mysys/charset.c
+++ b/mysys/charset.c
@@ -21,9 +21,14 @@
#include <m_string.h>
#include <my_dir.h>
+typedef struct cs_id_st {
+ char *name;
+ uint number;
+} CS_ID;
+
const char *charsets_dir = NULL;
static DYNAMIC_ARRAY cs_info_table;
-static TYPELIB available_charsets;
+static CS_ID *available_charsets;
static int charset_initialized=0;
#define MAX_LINE 1024
@@ -46,6 +51,24 @@ uint compiled_charset_number(const char *name);
const char *compiled_charset_name(uint charset_number);
+static uint num_from_csname(CS_ID *cs, const char *name)
+{
+ CS_ID *c;
+ for (c = cs; c; ++c)
+ if (!strcmp(c->name, name))
+ return c->number;
+ return 0; /* this mimics find_type() */
+}
+
+static char *name_from_csnum(CS_ID *cs, uint number)
+{
+ CS_ID *c;
+ for (c = cs; c; ++c)
+ if (c->number == number)
+ return c->name;
+ return "?"; /* this mimics find_type() */
+}
+
static my_bool get_word(struct simpleconfig_buf_st *fb, char *buf)
{
char *endptr=fb->p;
@@ -92,12 +115,12 @@ static char *get_charsets_dir(char *buf)
}
-static my_bool read_charset_index(TYPELIB *charsets, myf myflags)
+static my_bool read_charset_index(CS_ID **charsets, myf myflags)
{
struct simpleconfig_buf_st fb;
- char buf[MAX_LINE];
+ char buf[MAX_LINE], num_buf[MAX_LINE];
DYNAMIC_ARRAY cs;
- my_string s;
+ CS_ID *csid;
strmov(get_charsets_dir(buf), "Index");
@@ -106,36 +129,42 @@ static my_bool read_charset_index(TYPELIB *charsets, myf myflags)
fb.buf[0] = '\0';
fb.p = fb.buf;
- if (init_dynamic_array(&cs, sizeof(my_string), 32, 32))
+ if (init_dynamic_array(&cs, sizeof(CS_ID *), 32, 32))
return TRUE;
- while (!get_word(&fb, buf))
+ while (!get_word(&fb, buf) && !get_word(&fb, num_buf))
{
+ uint csnum;
uint length;
- if (!(s= (char*) my_once_alloc(length= (uint) strlen(buf)+1, myflags)))
+
+ if (!(csnum = atoi(num_buf)))
{
+ /* corrupt Index file */
my_fclose(fb.f,myflags);
return TRUE;
}
- memcpy(s,buf,length);
- insert_dynamic(&cs, (gptr) &s);
+
+ if (!(csid = (CS_ID*) my_once_alloc(sizeof(CS_ID), myflags)) ||
+ !(csid->name=
+ (char*) my_once_alloc(length= (uint) strlen(buf)+1, myflags)))
+ {
+ my_fclose(fb.f,myflags);
+ return TRUE;
+ }
+ memcpy(csid->name,buf,length);
+ csid->number = csnum;
+
+ insert_dynamic(&cs, (gptr) &csid);
}
my_fclose(fb.f,myflags);
- /* I seriously doubt this is the best way to initialize this
- * TYPELIB from the Index file. But it's the best way I could
- * come up with right now. */
- charsets->count = cs.elements;
- charsets->name = "";
- if (!(charsets->type_names =
- (const char **) my_once_alloc((cs.elements + 1) * sizeof(const char *),
- myflags)))
+ if (!(*charsets =
+ (CS_ID *) my_once_alloc((cs.elements + 1) * sizeof(CS_ID *), myflags)))
return TRUE;
/* unwarranted chumminess with dynamic_array implementation? */
- memcpy((char*) charsets->type_names, cs.buffer,
- cs.elements * sizeof(my_string *));
- charsets->type_names[cs.elements] = NullS;
+ memcpy((byte *) *charsets, cs.buffer, cs.elements * sizeof(CS_ID *));
+ (*charsets)[cs.elements] = NULL;
delete_dynamic(&cs);
return FALSE;
@@ -164,7 +193,7 @@ static my_bool init_available_charsets(myf myflags)
charset_initialized=1;
pthread_mutex_unlock(&THR_LOCK_charset);
}
- return error || available_charsets.count == 0;
+ return error || !available_charsets[0];
}
@@ -193,7 +222,7 @@ static my_bool fill_array(uchar *array, int sz, struct simpleconfig_buf_st *fb)
static void get_charset_conf_name(uint cs_number, char *buf)
{
strxmov(get_charsets_dir(buf),
- get_type(&available_charsets, cs_number - 1), ".conf", NullS);
+ name_from_csnum(&available_charsets, cs_number), ".conf", NullS);
}
@@ -237,7 +266,7 @@ uint get_charset_number(const char *charset_name)
if (error)
return compiled_charset_number(charset_name);
else
- return find_type((char*)charset_name, &available_charsets, 1);
+ return num_from_csname((char*)charset_name, &available_charsets, 1);
}
const char *get_charset_name(uint charset_number)
@@ -247,7 +276,7 @@ const char *get_charset_name(uint charset_number)
if (error)
return compiled_charset_name(charset_number);
else
- return get_type(&available_charsets, charset_number - 1);
+ return name_from_csnum(&available_charsets, charset_number);
}
@@ -452,29 +481,27 @@ char * list_charsets(myf want_flags)
if (want_flags & MY_CONFIG_SETS)
{
- uint i;
- const char *cs_name;
+ CS_ID *c;
char buf[FN_REFLEN];
MY_STAT stat;
- for (i = 0; i < available_charsets.count; i++)
+ for (c = available_charsets; *c; ++c)
{
- cs_name = get_type(&available_charsets, i);
- if (charset_in_string(cs_name, &s))
+ if (charset_in_string(c->name, &s))
continue;
- get_charset_conf_name(i + 1, buf);
+ get_charset_conf_name(c->number, buf);
if (!my_stat(buf, &stat, MYF(0)))
continue; /* conf file doesn't exist */
- dynstr_append(&s, cs_name);
+ dynstr_append(&s, c->name);
dynstr_append(&s, " ");
}
}
if (want_flags & MY_INDEX_SETS)
{
- uint i;
- for (i = 0; i < available_charsets.count; i++)
- charset_append(&s, get_type(&available_charsets, i));
+ CS_ID *c;
+ for (c = available_charsets; *c; ++c)
+ charset_append(&s, c->name);
}
if (want_flags & MY_LOADED_SETS)