mirror of
https://github.com/mdbtools/mdbtools.git
synced 2026-02-25 21:26:41 +08:00
Fix unused but set variable warning (#221)
Refactor mdb_unicode2ascii to eliminate warnings
This commit is contained in:
@@ -23,57 +23,34 @@
|
|||||||
#define MIN(a,b) (a>b ? b : a)
|
#define MIN(a,b) (a>b ? b : a)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
static size_t decompress_unicode(const char *src, size_t slen, char *dst, size_t dlen) {
|
||||||
* This function is used in reading text data from an MDB table.
|
unsigned int compress=1;
|
||||||
* 'dest' will receive a converted, null-terminated string.
|
|
||||||
* dlen is the available size of the destination buffer.
|
|
||||||
* Returns the length of the converted string, not including the terminator.
|
|
||||||
*/
|
|
||||||
int
|
|
||||||
mdb_unicode2ascii(MdbHandle *mdb, const char *src, size_t slen, char *dest, size_t dlen)
|
|
||||||
{
|
|
||||||
char *tmp = NULL;
|
|
||||||
size_t tlen = 0;
|
size_t tlen = 0;
|
||||||
size_t len_in, len_out;
|
while (slen > 0 && tlen < dlen) {
|
||||||
const char *in_ptr = NULL;
|
if (*src == 0) {
|
||||||
char *out_ptr = NULL;
|
compress = (compress) ? 0 : 1;
|
||||||
|
src++;
|
||||||
if ((!src) || (!dest) || (!dlen))
|
slen--;
|
||||||
return 0;
|
} else if (compress) {
|
||||||
|
dst[tlen++] = *src++;
|
||||||
/* Uncompress 'Unicode Compressed' string into tmp */
|
dst[tlen++] = 0;
|
||||||
if (!IS_JET3(mdb) && (slen>=2)
|
slen--;
|
||||||
&& ((src[0]&0xff)==0xff) && ((src[1]&0xff)==0xfe)) {
|
} else if (slen >= 2){
|
||||||
unsigned int compress=1;
|
dst[tlen++] = *src++;
|
||||||
src += 2;
|
dst[tlen++] = *src++;
|
||||||
slen -= 2;
|
slen-=2;
|
||||||
tmp = (char *)g_malloc(slen*2);
|
} else { // Odd # of bytes
|
||||||
while (slen) {
|
break;
|
||||||
if (*src == 0) {
|
|
||||||
compress = (compress) ? 0 : 1;
|
|
||||||
src++;
|
|
||||||
slen--;
|
|
||||||
} else if (compress) {
|
|
||||||
tmp[tlen++] = *src++;
|
|
||||||
tmp[tlen++] = 0;
|
|
||||||
slen--;
|
|
||||||
} else if (slen >= 2){
|
|
||||||
tmp[tlen++] = *src++;
|
|
||||||
tmp[tlen++] = *src++;
|
|
||||||
slen-=2;
|
|
||||||
} else { // Odd # of bytes
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return tlen;
|
||||||
in_ptr = (tmp) ? tmp : src;
|
}
|
||||||
out_ptr = dest;
|
|
||||||
len_in = (tmp) ? tlen : slen;
|
|
||||||
len_out = dlen - 1;
|
|
||||||
|
|
||||||
#if HAVE_ICONV
|
#if HAVE_ICONV
|
||||||
//printf("1 len_in %d len_out %d\n",len_in, len_out);
|
static size_t decompressed2ascii_with_iconv(MdbHandle *mdb, const char *in_ptr, size_t len_in, char *dest, size_t dlen) {
|
||||||
|
char *out_ptr = dest;
|
||||||
|
size_t len_out = dlen - 1;
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
iconv(mdb->iconv_in, (ICONV_CONST char **)&in_ptr, &len_in, &out_ptr, &len_out);
|
iconv(mdb->iconv_in, (ICONV_CONST char **)&in_ptr, &len_in, &out_ptr, &len_out);
|
||||||
/*
|
/*
|
||||||
@@ -90,27 +67,62 @@ mdb_unicode2ascii(MdbHandle *mdb, const char *src, size_t slen, char *dest, size
|
|||||||
*out_ptr++ = '?';
|
*out_ptr++ = '?';
|
||||||
len_out--;
|
len_out--;
|
||||||
}
|
}
|
||||||
//printf("2 len_in %d len_out %d\n",len_in, len_out);
|
|
||||||
dlen -= len_out + 1;
|
dlen -= len_out + 1;
|
||||||
dest[dlen] = '\0';
|
dest[dlen] = '\0';
|
||||||
|
return dlen;
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
|
static size_t decompressed2ascii_without_iconv(MdbHandle *mdb, const char *in_ptr, size_t len_in, char *dest, size_t dlen) {
|
||||||
if (IS_JET3(mdb)) {
|
if (IS_JET3(mdb)) {
|
||||||
int count = 0;
|
int count = 0;
|
||||||
snprintf(out_ptr, dlen, "%.*s%n", (int)len_in, src, &count);
|
snprintf(dest, dlen, "%.*s%n", (int)len_in, in_ptr, &count);
|
||||||
dlen = count;
|
return count;
|
||||||
} else {
|
|
||||||
/* rough UCS-2LE to ISO-8859-1 conversion */
|
|
||||||
/* wcstombs would be better; see libxls implementation for
|
|
||||||
* a multi-platform solution */
|
|
||||||
unsigned int i;
|
|
||||||
for (i=0; 2*i+1<len_in && i<dlen-1; i++)
|
|
||||||
dest[i] = (in_ptr[2*i+1] == 0) ? in_ptr[2*i] : '?';
|
|
||||||
dest[(dlen=i)] = '\0';
|
|
||||||
}
|
}
|
||||||
|
/* rough UCS-2LE to ISO-8859-1 conversion */
|
||||||
|
/* wcstombs would be better; see libxls implementation for
|
||||||
|
* a multi-platform solution */
|
||||||
|
unsigned int i;
|
||||||
|
for (i=0; 2*i+1<len_in && i<dlen-1; i++)
|
||||||
|
dest[i] = (in_ptr[2*i+1] == 0) ? in_ptr[2*i] : '?';
|
||||||
|
dest[i] = '\0';
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This function is used in reading text data from an MDB table.
|
||||||
|
* 'dest' will receive a converted, null-terminated string.
|
||||||
|
* dlen is the available size of the destination buffer.
|
||||||
|
* Returns the length of the converted string, not including the terminator.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
mdb_unicode2ascii(MdbHandle *mdb, const char *src, size_t slen, char *dest, size_t dlen)
|
||||||
|
{
|
||||||
|
char *tmp = NULL;
|
||||||
|
size_t len_in;
|
||||||
|
const char *in_ptr = NULL;
|
||||||
|
|
||||||
|
if ((!src) || (!dest) || (!dlen))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
/* Uncompress 'Unicode Compressed' string into tmp */
|
||||||
|
if (!IS_JET3(mdb) && (slen>=2)
|
||||||
|
&& ((src[0]&0xff)==0xff) && ((src[1]&0xff)==0xfe)) {
|
||||||
|
tmp = (char *)g_malloc(slen*2);
|
||||||
|
len_in = decompress_unicode(src + 2, slen - 2, tmp, slen * 2);
|
||||||
|
in_ptr = tmp;
|
||||||
|
} else {
|
||||||
|
len_in = slen;
|
||||||
|
in_ptr = src;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if HAVE_ICONV
|
||||||
|
dlen = decompressed2ascii_with_iconv(mdb, in_ptr, len_in, dest, dlen);
|
||||||
|
#else
|
||||||
|
dlen = decompressed2ascii_without_iconv(mdb, in_ptr, len_in, dest, dlen);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (tmp) g_free(tmp);
|
if (tmp) g_free(tmp);
|
||||||
//printf("dest %s\n",dest);
|
|
||||||
return dlen;
|
return dlen;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user