From bec1281367e317c39415d750b505da00be6533d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Grubbstr=C3=B6m=20=28Grubba=29?= <grubba@grubba.org> Date: Tue, 9 Mar 1999 00:34:28 +0100 Subject: [PATCH] Fixed a few wide string bugs in PUSH_STRING(). Should now support include-files encoded in EBCDIC, UCS2 and UCS4. Rev: src/preprocessor.h:1.8 --- src/preprocessor.h | 73 +++++++++++++++++++++++++++++++++------------- 1 file changed, 52 insertions(+), 21 deletions(-) diff --git a/src/preprocessor.h b/src/preprocessor.h index 786ac687b9..da49e3874e 100644 --- a/src/preprocessor.h +++ b/src/preprocessor.h @@ -1,5 +1,5 @@ /* - * $Id: preprocessor.h,v 1.7 1999/03/01 21:03:33 grubba Exp $ + * $Id: preprocessor.h,v 1.8 1999/03/08 23:34:28 grubba Exp $ * * Preprocessor template. * Based on cpp.c 1.45 @@ -221,7 +221,9 @@ static void PUSH_STRING(WCHAR *str, string_builder_putchar(buf, '"'); for(p2=0; p2<len; p2++) { - switch(str[p2]) + unsigned int c = str[p2]; + + switch(c) { case '\n': string_builder_putchar(buf, '\\'); @@ -246,35 +248,37 @@ static void PUSH_STRING(WCHAR *str, case '\\': case '"': string_builder_putchar(buf, '\\'); - string_builder_putchar(buf, str[p2]); + string_builder_putchar(buf, c); break; - + default: - if(isprint(EXTRACT_UCHAR(str+p2))) - { - string_builder_putchar(buf, str[p2]); - } - else - { - int c = str[p2]; #if (SHIFT != 0) - if (c < 256) { + if (c < 256) { #endif /* SHIFT != 0 */ + if(isprint(c)) { + string_builder_putchar(buf, c); + } + else + { string_builder_putchar(buf, '\\'); string_builder_putchar(buf, ((c>>6)&7)+'0'); string_builder_putchar(buf, ((c>>3)&7)+'0'); string_builder_putchar(buf, (c&7)+'0'); - if(EXTRACT_UCHAR(str+p2+1)>='0' && EXTRACT_UCHAR(str+p2+1)<='7') + if((str[p2+1] >= '0') && (str[p2+1] <= '7')) { string_builder_putchar(buf, '"'); string_builder_putchar(buf, '"'); } -#if (SHIFT != 0) - } else { - string_builder_putchar(buf, c); } -#endif /* SHIFT != 0 */ +#if (SHIFT != 0) + } else if (c == 0xfeff) { + /* Keep it safe from filter_bom()... */ + string_builder_strcat(buf, "\\xfeff\"\""); + } else { + /* No need to encode these */ + string_builder_putchar(buf, c); } +#endif /* SHIFT != 0 */ break; } } @@ -758,7 +762,9 @@ static int calc(struct cpp *this, WCHAR *data, INT32 len, INT32 tmp) static INT32 lower_cpp(struct cpp *this, WCHAR *data, INT32 len, - int flags) + int flags, + int auto_convert, + struct pike_string *charset) { INT32 pos, tmp, e, tmp2; @@ -1237,7 +1243,8 @@ static INT32 lower_cpp(struct cpp *this, } new_file=sp[-1].u.string; - + + /* Why not just use ref_push_string(new_file)? */ assign_svalue_no_free(sp,sp-1); sp++; @@ -1266,15 +1273,38 @@ static INT32 lower_cpp(struct cpp *this, string_builder_putchar(&this->buf, '\n'); if(tmp2) { + /* #string */ struct pike_string *str = sp[-1].u.string; PUSH_STRING_SHIFT(str->str, str->len, str->size_shift, &this->buf); }else{ + /* #include */ + if (auto_convert) { + struct pike_string *new_str = recode_string(sp[-1].u.string); + free_string(sp[-1].u.string); + sp[-1].u.string = new_str; + } else if (charset) { + ref_push_string(charset); + SAFE_APPLY_MASTER("decode_charset", 2); + if (sp[-1].type != T_STRING) { + cpp_error(this, + "Charset decoding failed for included file."); + pop_n_elems(sp - save_sp); + break; + } + } + if (sp[-1].u.string->size_shift) { + /* Get rid of any byte order marks (0xfeff) */ + struct pike_string *new_str = filter_bom(sp[-1].u.string); + free_string(sp[-1].u.string); + sp[-1].u.string = new_str; + } low_cpp(this, sp[-1].u.string->str, sp[-1].u.string->len, sp[-1].u.string->size_shift, - flags&~(CPP_EXPECT_ENDIF | CPP_EXPECT_ELSE)); + flags&~(CPP_EXPECT_ENDIF | CPP_EXPECT_ELSE), + auto_convert, charset); } free_string(this->current_file); @@ -1840,7 +1870,8 @@ static INT32 lower_cpp(struct cpp *this, } low_cpp(this, sp[-1].u.string->str, sp[-1].u.string->len, - sp[-1].u.string->size_shift, flags); + sp[-1].u.string->size_shift, flags, + auto_convert, charset); pop_stack(); /* FIXME: Is this the correct thing to return? */ -- GitLab