From: Ulrich Drepper Date: Mon, 6 Sep 1999 07:59:54 +0000 (+0000) Subject: When translating to ISO-2022-JP* write escape sequences out even if the X-Git-Tag: cvs/glibc_2-1-2~5 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=77b341f865b20204dd6223ff6fc9d84133115e70;p=thirdparty%2Fglibc.git When translating to ISO-2022-JP* write escape sequences out even if the character itself does not fit into the buffer. --- diff --git a/iconvdata/iso-2022-jp.c b/iconvdata/iso-2022-jp.c index bb158491f24..e3b81202f59 100644 --- a/iconvdata/iso-2022-jp.c +++ b/iconvdata/iso-2022-jp.c @@ -470,6 +470,11 @@ gconv_end (struct gconv_step *data) if (var == iso2022jp2 && ch == 0x0a) \ set2 = UNSPECIFIED_set; \ } \ + /* ISO-2022-JP recommends to encode the newline character always in \ + ASCII since this allows a context-free interpretation of the \ + characters at the beginning of the next line. Otherwise it would \ + have to be known whether the last line ended using ASCII or \ + JIS X 0201. */ \ else if (set == JISX0201_Roman_set) \ { \ unsigned char buf[2]; \ @@ -574,16 +579,21 @@ gconv_end (struct gconv_step *data) { \ /* We must encode using ASCII. First write out the \ escape sequence. */ \ - if (NEED_LENGTH_TEST && outptr + 4 > outend) \ + if (NEED_LENGTH_TEST && outptr + 3 > outend) \ { \ result = GCONV_FULL_OUTPUT; \ break; \ } \ - \ *outptr++ = ESC; \ *outptr++ = '('; \ *outptr++ = 'B'; \ set = ASCII_set; \ + \ + if (NEED_LENGTH_TEST && outptr + 1 > outend) \ + { \ + result = GCONV_FULL_OUTPUT; \ + break; \ + } \ *outptr++ = ch; \ \ /* At the beginning of a line, G2 designation is cleared. */ \ @@ -603,16 +613,21 @@ gconv_end (struct gconv_step *data) if (written != UNKNOWN_10646_CHAR && buf[0] < 0x80) \ { \ /* We use JIS X 0201. */ \ - if (NEED_LENGTH_TEST && outptr + 4 > outend) \ + if (NEED_LENGTH_TEST && outptr + 3 > outend) \ { \ result = GCONV_FULL_OUTPUT; \ break; \ } \ - \ *outptr++ = ESC; \ *outptr++ = '('; \ *outptr++ = 'J'; \ set = JISX0201_Roman_set; \ + \ + if (NEED_LENGTH_TEST && outptr + 1 > outend) \ + { \ + result = GCONV_FULL_OUTPUT; \ + break; \ + } \ *outptr++ = buf[0]; \ } \ else \ @@ -621,16 +636,21 @@ gconv_end (struct gconv_step *data) if (written != UNKNOWN_10646_CHAR) \ { \ /* We use JIS X 0208. */ \ - if (NEED_LENGTH_TEST && outptr + 5 > outend) \ + if (NEED_LENGTH_TEST && outptr + 3 > outend) \ { \ result = GCONV_FULL_OUTPUT; \ break; \ } \ - \ *outptr++ = ESC; \ *outptr++ = '$'; \ *outptr++ = 'B'; \ set = JISX0208_1983_set; \ + \ + if (NEED_LENGTH_TEST && outptr + 2 > outend) \ + { \ + result = GCONV_FULL_OUTPUT; \ + break; \ + } \ *outptr++ = buf[0]; \ *outptr++ = buf[1]; \ } \ @@ -646,7 +666,7 @@ gconv_end (struct gconv_step *data) if (written != UNKNOWN_10646_CHAR) \ { \ /* We use JIS X 0212. */ \ - if (NEED_LENGTH_TEST && outptr + 6 > outend) \ + if (NEED_LENGTH_TEST && outptr + 4 > outend) \ { \ result = GCONV_FULL_OUTPUT; \ break; \ @@ -656,6 +676,12 @@ gconv_end (struct gconv_step *data) *outptr++ = '('; \ *outptr++ = 'D'; \ set = JISX0212_set; \ + \ + if (NEED_LENGTH_TEST && outptr + 2 > outend) \ + { \ + result = GCONV_FULL_OUTPUT; \ + break; \ + } \ *outptr++ = buf[0]; \ *outptr++ = buf[1]; \ } \ @@ -665,31 +691,41 @@ gconv_end (struct gconv_step *data) if (written != UNKNOWN_10646_CHAR && buf[0] >= 0x80) \ { \ /* We use JIS X 0201. */ \ - if (NEED_LENGTH_TEST && outptr + 4 > outend) \ + if (NEED_LENGTH_TEST && outptr + 3 > outend) \ { \ result = GCONV_FULL_OUTPUT; \ break; \ } \ - \ *outptr++ = ESC; \ *outptr++ = '('; \ *outptr++ = 'I'; \ set = JISX0201_Kana_set; \ + \ + if (NEED_LENGTH_TEST && outptr + 1 > outend) \ + { \ + result = GCONV_FULL_OUTPUT; \ + break; \ + } \ *outptr++ = buf[0] - 0x80; \ } \ else if (ch != 0xa5 && ch >= 0x80 && ch <= 0xff) \ { \ /* ISO 8859-1 upper half. */ \ - if (NEED_LENGTH_TEST && outptr + 6 > outend) \ + if (NEED_LENGTH_TEST && outptr + 3 > outend) \ { \ result = GCONV_FULL_OUTPUT; \ break; \ } \ - \ *outptr++ = ESC; \ *outptr++ = '.'; \ *outptr++ = 'A'; \ set2 = ISO88591_set; \ + \ + if (NEED_LENGTH_TEST && outptr + 3 > outend) \ + { \ + result = GCONV_FULL_OUTPUT; \ + break; \ + } \ *outptr++ = ESC; \ *outptr++ = 'N'; \ *outptr++ = ch; \ @@ -700,16 +736,21 @@ gconv_end (struct gconv_step *data) if (written != UNKNOWN_10646_CHAR) \ { \ /* We use GB 2312. */ \ - if (NEED_LENGTH_TEST && outptr + 5 > outend) \ + if (NEED_LENGTH_TEST && outptr + 3 > outend) \ { \ result = GCONV_FULL_OUTPUT; \ break; \ } \ - \ *outptr++ = ESC; \ *outptr++ = '$'; \ *outptr++ = 'A'; \ set = GB2312_set; \ + \ + if (NEED_LENGTH_TEST && outptr + 2 > outend) \ + { \ + result = GCONV_FULL_OUTPUT; \ + break; \ + } \ *outptr++ = buf[0]; \ *outptr++ = buf[1]; \ } \ @@ -720,7 +761,7 @@ gconv_end (struct gconv_step *data) { \ /* We use KSC 5601. */ \ if (NEED_LENGTH_TEST \ - && outptr + 6 > outend) \ + && outptr + 4 > outend) \ { \ result = GCONV_FULL_OUTPUT; \ break; \ @@ -730,6 +771,13 @@ gconv_end (struct gconv_step *data) *outptr++ = '('; \ *outptr++ = 'C'; \ set = KSC5601_set; \ + \ + if (NEED_LENGTH_TEST \ + && outptr + 2 > outend) \ + { \ + result = GCONV_FULL_OUTPUT; \ + break; \ + } \ *outptr++ = buf[0]; \ *outptr++ = buf[1]; \ } \ @@ -750,7 +798,7 @@ gconv_end (struct gconv_step *data) { \ /* We use ISO 8859-7 greek. */ \ if (NEED_LENGTH_TEST \ - && outptr + 6 > outend) \ + && outptr + 3 > outend) \ { \ result = GCONV_FULL_OUTPUT; \ break; \ @@ -759,6 +807,13 @@ gconv_end (struct gconv_step *data) *outptr++ = '.'; \ *outptr++ = 'F'; \ set2 = ISO88597_set; \ + \ + if (NEED_LENGTH_TEST \ + && outptr + 3 > outend) \ + { \ + result = GCONV_FULL_OUTPUT; \ + break; \ + } \ *outptr++ = ESC; \ *outptr++ = 'N'; \ *outptr++ = gch; \