aboutsummaryrefslogtreecommitdiffhomepage
path: root/common.c
diff options
context:
space:
mode:
authorGravatar liljencrantz <liljencrantz@gmail.com>2007-09-24 07:00:07 +1000
committerGravatar liljencrantz <liljencrantz@gmail.com>2007-09-24 07:00:07 +1000
commit449a75756d13450ef0141427f36eaf1a45e93576 (patch)
tree7ca26b42df3ea6947522570b1a75b462e49949ac /common.c
parent5e2e9e2b9bf223ffb0f53e27573856191c664e41 (diff)
Fix narrow/wide encoding issues found through new test suite additions
darcs-hash:20070923210007-75c98-9ffee3b8f1ce24e1d6f178baa1f2ef52d70ee38b.gz
Diffstat (limited to 'common.c')
-rw-r--r--common.c42
1 files changed, 28 insertions, 14 deletions
diff --git a/common.c b/common.c
index 94d02a2a..27fdffed 100644
--- a/common.c
+++ b/common.c
@@ -258,15 +258,27 @@ wchar_t *str2wcs_internal( const char *in, wchar_t *out )
len = strlen(in);
memset( &state, 0, sizeof(state) );
-
+
while( in[in_pos] )
{
res = mbrtowc( &out[out_pos], &in[in_pos], len-in_pos, &state );
- switch( res )
+ if( ( out[out_pos] >= ENCODE_DIRECT_BASE) &&
+ ( out[out_pos] < ENCODE_DIRECT_BASE+256) ||
+ out[out_pos] == INTERNAL_SEPARATOR )
+ {
+ out[out_pos] = ENCODE_DIRECT_BASE + (unsigned char)in[in_pos];
+ in_pos++;
+ memset( &state, 0, sizeof(state) );
+ out_pos++;
+ }
+ else
{
- case (size_t)(-2):
- case (size_t)(-1):
+
+ switch( res )
+ {
+ case (size_t)(-2):
+ case (size_t)(-1):
{
out[out_pos] = ENCODE_DIRECT_BASE + (unsigned char)in[in_pos];
in_pos++;
@@ -274,18 +286,20 @@ wchar_t *str2wcs_internal( const char *in, wchar_t *out )
break;
}
- case 0:
- {
- return out;
- }
+ case 0:
+ {
+ return out;
+ }
- default:
- {
- in_pos += res;
- break;
+ default:
+ {
+ in_pos += res;
+ break;
+ }
}
+ out_pos++;
}
- out_pos++;
+
}
out[out_pos] = 0;
@@ -324,7 +338,7 @@ char *wcs2str_internal( const wchar_t *in, char *out )
{
}
else if( ( in[in_pos] >= ENCODE_DIRECT_BASE) &&
- ( in[in_pos] < ENCODE_DIRECT_BASE+256) )
+ ( in[in_pos] < ENCODE_DIRECT_BASE+256) )
{
out[out_pos++] = in[in_pos]- ENCODE_DIRECT_BASE;
}