From bc861da92970401d35ccb9c756e705d0b97b451a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Grubbstr=C3=B6m=20=28Grubba=29?= <grubba@grubba.org> Date: Thu, 25 Feb 1999 00:44:17 +0100 Subject: [PATCH] Added support for UCS4. Rev: src/cpp.c:1.43 --- src/cpp.c | 34 +++++++++++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/src/cpp.c b/src/cpp.c index 1de3ae8418..b70ca906db 100644 --- a/src/cpp.c +++ b/src/cpp.c @@ -5,7 +5,7 @@ \*/ /* - * $Id: cpp.c,v 1.42 1999/02/24 23:27:11 grubba Exp $ + * $Id: cpp.c,v 1.43 1999/02/24 23:44:17 grubba Exp $ */ #include "global.h" #include "language.h" @@ -2122,8 +2122,36 @@ static struct pike_string *recode_string(struct pike_string *data) if ((!((unsigned char *)data->str)[0]) && (!((unsigned char *)data->str)[1])) { /* 32bit Unicode (UCS4) */ + struct pike_string *new_str; + int len; + int i; + int j; + p_wchar0 *orig = STR0(data); + p_wchar2 *dest; + + if (data->len & 3) { + /* String len is not a multiple of 4 */ + return data; + } + len = data->len/4; + new_str = begin_wide_shared_string(len, 2); + + dest = STR2(new_str); + + j = 0; + for(i=0; i<len; i++) { + dest[i] = (orig[j]<<24) | (orig[j+1]<<16) | (orig[j+2]<<8) | orig[j+3]; + j += 4; + } + + free_string(data); + return(end_shared_string(new_str)); } else { /* 16bit Unicode (UCS2) */ + if (data->len & 1) { + /* String len is not a multiple of 2 */ + return data; + } if ((!((unsigned char *)data->str)[1]) || (((unsigned char *)data->str)[1] == 0xfe)) { /* Reverse Byte-order */ @@ -2132,15 +2160,15 @@ static struct pike_string *recode_string(struct pike_string *data) for(i=0; i<data->len; i++) { new_str->str[i^1] = data->str[i]; } - new_str = end_shared_string(new_str); free_string(data); - data = new_str; + data = end_shared_string(new_str); } /* Note: We lose the extra reference to data here. */ push_string(data); f_unicode_to_string(1); add_ref(data = sp[-1].u.string); pop_stack(); + return data; } } else if (((unsigned char *)data->str)[0] == 0x7b) { /* EBCDIC */ -- GitLab