iconv conversion code

This commit is contained in:
brianb
2004-11-26 05:22:52 +00:00
parent 18b23bbd65
commit 34a9eac4ea
13 changed files with 121 additions and 26 deletions

View File

@@ -638,7 +638,7 @@ static char *mdb_memo_to_string(MdbHandle *mdb, int start, int size)
strncpy(text, buf + row_start, len);
text[len]='\0';
} else {
mdb_unicode2ascii(mdb, buf, row_start, len, text);
mdb_unicode2ascii(mdb, buf, row_start, len, text, MDB_BIND_SIZE);
}
return text;
} else { /* if (memo_flags == 0x0000) { */
@@ -749,7 +749,7 @@ char *mdb_col_to_string(MdbHandle *mdb, unsigned char *buf, int start, int datat
}
fprintf(stdout, "\n");
*/
mdb_unicode2ascii(mdb, mdb->pg_buf, start, size, text);
mdb_unicode2ascii(mdb, mdb->pg_buf, start, size, text, MDB_BIND_SIZE);
} else {
strncpy(text, &buf[start], size);
text[size]='\0';

View File

@@ -153,6 +153,7 @@ MdbHandle *mdb_open(char *filename, MdbFileFlags flags)
mdb_close(mdb);
return NULL;
}
mdb_iconv_init(mdb);
return mdb;
}
@@ -182,6 +183,8 @@ mdb_close(MdbHandle *mdb)
}
}
mdb_iconv_close(mdb);
g_free(mdb);
}
/**
@@ -211,6 +214,8 @@ MdbHandle *mdb_clone_handle(MdbHandle *mdb)
if (mdb->f) {
mdb->f->refs++;
}
mdb_iconv_init(mdb);
return newmdb;
}

View File

@@ -24,14 +24,37 @@
#endif
int
mdb_unicode2ascii(MdbHandle *mdb, unsigned char *buf, int offset, unsigned int len, char *dest)
mdb_unicode2ascii(MdbHandle *mdb, unsigned char *buf, int offset, unsigned int len, char *dest, unsigned int dest_sz)
{
unsigned int i;
unsigned int i, ret;
int len_in, len_out;
char *in_ptr, *out_ptr;
in_ptr = &buf[offset];
out_ptr = dest;
len_in = len;
len_out = dest_sz;
if (buf[offset]==0xff && buf[offset+1]==0xfe) {
strncpy(dest, &buf[offset+2], len-2);
dest[len-2]='\0';
len_in -= 2;
in_ptr = &buf[offset+2];
ret = iconv(mdb->iconv_compress, &in_ptr, &len_in, &out_ptr, &len_out);
dest[dest_sz - len_out]='\0';
return dest_sz - len_out;
//strncpy(dest, &buf[offset+2], len-2);
//dest[len-2]='\0';
} else {
#ifdef HAVE_ICONV
if (mdb->iconv_in) {
//printf("1 len_in %d len_out %d\n",len_in, len_out);
ret = iconv(mdb->iconv_in, &in_ptr, &len_in, &out_ptr, &len_out);
//printf("2 len_in %d len_out %d\n",len_in, len_out);
dest[dest_sz - len_out]='\0';
//printf("dest %s\n",dest);
return dest_sz - len_out;
}
#endif
/* convert unicode to ascii, rather sloppily */
for (i=0;i<len;i+=2)
dest[i/2] = buf[offset + i];
@@ -41,11 +64,29 @@ mdb_unicode2ascii(MdbHandle *mdb, unsigned char *buf, int offset, unsigned int l
}
int
mdb_ascii2unicode(MdbHandle *mdb, unsigned char *buf, int offset, unsigned int len, char *dest)
mdb_ascii2unicode(MdbHandle *mdb, unsigned char *buf, int offset, unsigned int len, char *dest, unsigned int dest_sz)
{
unsigned int i = 0;
unsigned int i = 0, ret;
size_t len_in, len_out, len_orig;
char *in_ptr, *out_ptr;
if (!buf) return 0;
in_ptr = &buf[offset];
out_ptr = dest;
len_orig = strlen(in_ptr);
len_in = len_orig;
len_out = dest_sz;
if (!buf) return 0;
#ifdef HAVE_ICONV
if (mdb->iconv_out) {
ret = iconv(mdb->iconv_out, &in_ptr, &len_in, &out_ptr, &len_out);
//printf("len_in %d len_out %d\n",len_in, len_out);
dest[dest_sz - len_out]='\0';
dest[dest_sz - len_out + 1]='\0';
return dest_sz - len_out;
}
#endif
if (IS_JET3(mdb)) {
strncpy(dest, &buf[offset], len);
@@ -61,3 +102,31 @@ mdb_ascii2unicode(MdbHandle *mdb, unsigned char *buf, int offset, unsigned int l
return (i*2);
}
void mdb_iconv_init(MdbHandle *mdb)
{
char *iconv_code;
/* check environment variable */
if (!(iconv_code=(char *)getenv("MDB_ICONV"))) {
iconv_code="UTF-8";
}
#ifdef HAVE_ICONV
if (IS_JET4(mdb)) {
mdb->iconv_out = iconv_open("UCS-2LE", iconv_code);
mdb->iconv_in = iconv_open(iconv_code, "UCS-2LE");
mdb->iconv_compress = iconv_open(iconv_code, "ISO8859-1");
} else {
/* XXX - need to determine character set from file */
mdb->iconv_out = iconv_open("ISO8859-1", iconv_code);
mdb->iconv_in = iconv_open(iconv_code, "ISO8859-1");
}
#endif
}
void mdb_iconv_close(MdbHandle *mdb)
{
#ifdef HAVE_ICONV
if (mdb->iconv_out != -1) iconv_close(mdb->iconv_out);
if (mdb->iconv_in != -1) iconv_close(mdb->iconv_in);
#endif
}

View File

@@ -107,7 +107,7 @@ mdb_read_indices(MdbTableDef *table)
tmpbuf = g_malloc(name_sz);
read_pg_if_n(mdb, tmpbuf, &cur_pos, name_sz);
cur_pos += name_sz;
mdb_unicode2ascii(mdb, tmpbuf, 0, name_sz, pidx->name);
mdb_unicode2ascii(mdb, tmpbuf, 0, name_sz, pidx->name, name_sz);
g_free(tmpbuf);
} else {
read_pg_if(mdb, &cur_pos, 0);

View File

@@ -61,6 +61,7 @@ load_options()
opt = strtok(s, ":");
do {
if (!strcmp(opt, "use_index")) opts |= MDB_USE_INDEX;
if (!strcmp(opt, "no_memo")) opts |= MDB_NO_MEMO;
if (!strcmp(opt, "debug_like")) opts |= MDB_DEBUG_LIKE;
if (!strcmp(opt, "debug_write")) opts |= MDB_DEBUG_WRITE;
if (!strcmp(opt, "debug_usage")) opts |= MDB_DEBUG_USAGE;

View File

@@ -155,7 +155,7 @@ int lastchar;
break;
case MDB_TEXT:
if (IS_JET4(mdb)) {
mdb_unicode2ascii(mdb, field->value, 0, field->siz, tmpbuf);
mdb_unicode2ascii(mdb, field->value, 0, field->siz, tmpbuf, 256);
} else {
strncpy(tmpbuf, field->value, 255);
lastchar = field->siz > 255 ? 255 : field->siz;

View File

@@ -274,7 +274,7 @@ GPtrArray *mdb_read_columns(MdbTableDef *table)
cur_pos += 2;
tmp_buf = (char *) g_malloc(name_sz);
read_pg_if_n(mdb, tmp_buf, &cur_pos, name_sz);
mdb_unicode2ascii(mdb, tmp_buf, 0, name_sz, pcol->name);
mdb_unicode2ascii(mdb, tmp_buf, 0, name_sz, pcol->name, name_sz);
g_free(tmp_buf);
cur_pos += name_sz;
} else if (IS_JET3(mdb)) {