From: Bruno H. <br...@cl...> - 2005-01-25 09:51:41
|
Pascal Bourguignon wrote: > (with-open-file (test > (make-pathname :case :common > > :name "ARMSCII-8" > :type "DOS") > : > :direction :output > :if-exists :supersede > :if-does-not-exist :create > :external-format (ext:make-encoding :charset > : charset:armscii-8 > : > :line-terminator > : :dos)) > > (format test "~C~%" (code-char 917504))) > --> Segmentation fault This patch fixes it. Thanks for the report. Interestingly, the clisp code was correct at the time when it was written. The bug appeared when support for Unicode 3.2 was added to glibc: then the function iconv() started to have a behaviour that was not imaginable before. Bruno *** src/stream.d.orig 11 Dec 2004 15:30:28 -0000 1.415.2.11 --- src/stream.d 25 Jan 2005 09:45:22 -0000 1.415.2.12 *************** *** 473,478 **** --- 473,484 ---- var chart ch = char_code(TheStream(stream)->strm_rd_ch_last); var uintB buf[4]; # are there characters longer than 4 bytes?! var uintL char_len = cslen(enc,&ch,1); + ASSERT(char_len <= sizeof(buf)); + if (char_len == 0) { # the char corresponds to no bytes at all + TheStream(stream)->strmflags &= ~strmflags_unread_B; + TheStream(stream)->strm_rd_ch_last = NIL; + goto do_read_byte; + } cstombs(enc,&ch,1,buf,char_len); var uint8 code = buf[0]; if (char_len == 1) { # the char was just one byte *************** *** 495,502 **** return sfixnum((sint8)code); else return fixnum((uint8)code); ! } else return rd_by(stream)(stream); } else { # Call the generic function (STREAM-READ-BYTE stream): pushSTACK(stream); funcall(S(stream_read_byte),1); --- 501,510 ---- return sfixnum((sint8)code); else return fixnum((uint8)code); ! } else { ! do_read_byte: return rd_by(stream)(stream); + } } else { # Call the generic function (STREAM-READ-BYTE stream): pushSTACK(stream); funcall(S(stream_read_byte),1); *************** *** 5326,5332 **** Encoding_wcstombs(encoding) (encoding,stream,&cptr,cptr+1,&bptr,&buf[max_bytes_per_chart]); ASSERT(cptr == &c+1); ! UnbufferedStreamLow_write_array(stream)(stream,&buf[0],bptr-&buf[0],false); #else UnbufferedStreamLow_write(stream)(stream,as_cint(c)); #endif --- 5334,5342 ---- Encoding_wcstombs(encoding) (encoding,stream,&cptr,cptr+1,&bptr,&buf[max_bytes_per_chart]); ASSERT(cptr == &c+1); ! var uintL buflen = bptr-&buf[0]; ! if (buflen > 0) ! UnbufferedStreamLow_write_array(stream)(stream,&buf[0],buflen,false); #else UnbufferedStreamLow_write(stream)(stream,as_cint(c)); #endif *************** *** 5348,5355 **** var uintB* bptr = &tmptmpbuf[0]; Encoding_wcstombs(encoding)(encoding,stream,&charptr,endptr,&bptr, &tmptmpbuf[tmpbufsize*max_bytes_per_chart]); ! UnbufferedStreamLow_write_array(stream)(stream,&tmptmpbuf[0], ! bptr-&tmptmpbuf[0],false); } while (charptr != endptr); #undef tmpbufsize #else --- 5358,5367 ---- var uintB* bptr = &tmptmpbuf[0]; Encoding_wcstombs(encoding)(encoding,stream,&charptr,endptr,&bptr, &tmptmpbuf[tmpbufsize*max_bytes_per_chart]); ! var uintL tmptmpbuflen = bptr-&tmptmpbuf[0]; ! if (tmptmpbuflen > 0) ! UnbufferedStreamLow_write_array(stream)(stream,&tmptmpbuf[0], ! tmptmpbuflen,false); } while (charptr != endptr); #undef tmpbufsize #else *************** *** 5373,5379 **** Encoding_wcstombs(encoding)(encoding,stream,&cptr,cptr+1,&bptr, &buf[max_bytes_per_chart]); ASSERT(cptr == &c+1); ! UnbufferedStreamLow_write_array(stream)(stream,&buf[0],bptr-&buf[0],false); #else UnbufferedStreamLow_write(stream)(stream,as_cint(c)); #endif --- 5385,5393 ---- Encoding_wcstombs(encoding)(encoding,stream,&cptr,cptr+1,&bptr, &buf[max_bytes_per_chart]); ASSERT(cptr == &c+1); ! var uintL buflen = bptr-&buf[0]; ! if (buflen > 0) ! UnbufferedStreamLow_write_array(stream)(stream,&buf[0],buflen,false); #else UnbufferedStreamLow_write(stream)(stream,as_cint(c)); #endif *************** *** 5413,5420 **** Encoding_wcstombs(encoding)(encoding,stream,&cptr,tmpptr,&bptr, &tmptmpbuf[tmpbufsize*max_bytes_per_chart]); ASSERT(cptr == tmpptr); ! UnbufferedStreamLow_write_array(stream)(stream,&tmptmpbuf[0], ! bptr-&tmptmpbuf[0],false); #else UnbufferedStreamLow_write_array(stream)(stream,(const uintB*)tmpbuf, n,false); --- 5427,5436 ---- Encoding_wcstombs(encoding)(encoding,stream,&cptr,tmpptr,&bptr, &tmptmpbuf[tmpbufsize*max_bytes_per_chart]); ASSERT(cptr == tmpptr); ! var uintL tmptmpbuflen = bptr-&tmptmpbuf[0]; ! if (tmptmpbuflen > 0) ! UnbufferedStreamLow_write_array(stream)(stream,&tmptmpbuf[0], ! tmptmpbuflen,false); #else UnbufferedStreamLow_write_array(stream)(stream,(const uintB*)tmpbuf, n,false); *************** *** 5447,5453 **** Encoding_wcstombs(encoding)(encoding,stream,&cptr,cp+n,&bptr, &buf[2*max_bytes_per_chart]); ASSERT(cptr == cp+n); ! UnbufferedStreamLow_write_array(stream)(stream,&buf[0],bptr-&buf[0],false); #else if (chareq(c,ascii(NL))) { UnbufferedStreamLow_write_array(stream)(stream,(const uintB*)crlf,2,false); --- 5463,5471 ---- Encoding_wcstombs(encoding)(encoding,stream,&cptr,cp+n,&bptr, &buf[2*max_bytes_per_chart]); ASSERT(cptr == cp+n); ! var uintL buflen = bptr-&buf[0]; ! if (buflen > 0) ! UnbufferedStreamLow_write_array(stream)(stream,&buf[0],buflen,false); #else if (chareq(c,ascii(NL))) { UnbufferedStreamLow_write_array(stream)(stream,(const uintB*)crlf,2,false); *************** *** 5492,5499 **** var uintB* bptr = &tmptmpbuf[0]; Encoding_wcstombs(encoding)(encoding,stream,&cptr,tmpptr,&bptr,&tmptmpbuf[2*tmpbufsize*max_bytes_per_chart]); ASSERT(cptr == tmpptr); ! UnbufferedStreamLow_write_array(stream)(stream,&tmptmpbuf[0], ! bptr-&tmptmpbuf[0],false); #else UnbufferedStreamLow_write_array(stream)(stream,(const uintB*)tmpbuf, tmpptr-&tmpbuf[0],false); --- 5510,5519 ---- var uintB* bptr = &tmptmpbuf[0]; Encoding_wcstombs(encoding)(encoding,stream,&cptr,tmpptr,&bptr,&tmptmpbuf[2*tmpbufsize*max_bytes_per_chart]); ASSERT(cptr == tmpptr); ! var uintL tmptmpbuflen = bptr-&tmptmpbuf[0]; ! if (tmptmpbuflen > 0) ! UnbufferedStreamLow_write_array(stream)(stream,&tmptmpbuf[0], ! tmptmpbuflen,false); #else UnbufferedStreamLow_write_array(stream)(stream,(const uintB*)tmpbuf, tmpptr-&tmpbuf[0],false); *************** *** 6539,6547 **** &buf[max_bytes_per_chart]); ASSERT(cptr == &c+1); var uintL buflen = bptr-&buf[0]; ! write_byte_array_buffered(stream,&buf[0],buflen,false); ! # increment position ! BufferedStream_position(stream) += buflen; #else write_byte_buffered(stream,as_cint(c)); # write unchanged #endif --- 6559,6569 ---- &buf[max_bytes_per_chart]); ASSERT(cptr == &c+1); var uintL buflen = bptr-&buf[0]; ! if (buflen > 0) { ! write_byte_array_buffered(stream,&buf[0],buflen,false); ! # increment position ! BufferedStream_position(stream) += buflen; ! } #else write_byte_buffered(stream,as_cint(c)); # write unchanged #endif *************** *** 6564,6572 **** Encoding_wcstombs(encoding)(encoding,stream,&charptr,endptr,&bptr, &tmptmpbuf[tmpbufsize*max_bytes_per_chart]); var uintL tmptmpbuflen = bptr-&tmptmpbuf[0]; ! write_byte_array_buffered(stream,&tmptmpbuf[0],tmptmpbuflen,false); ! # increment position ! BufferedStream_position(stream) += tmptmpbuflen; } until (charptr == endptr); #undef tmpbufsize #else --- 6586,6596 ---- Encoding_wcstombs(encoding)(encoding,stream,&charptr,endptr,&bptr, &tmptmpbuf[tmpbufsize*max_bytes_per_chart]); var uintL tmptmpbuflen = bptr-&tmptmpbuf[0]; ! if (tmptmpbuflen > 0) { ! write_byte_array_buffered(stream,&tmptmpbuf[0],tmptmpbuflen,false); ! # increment position ! BufferedStream_position(stream) += tmptmpbuflen; ! } } until (charptr == endptr); #undef tmpbufsize #else *************** *** 6592,6600 **** Encoding_wcstombs(encoding)(encoding,stream,&cptr,cptr+1,&bptr,&buf[max_bytes_per_chart]); ASSERT(cptr == &c+1); var uintL buflen = bptr-&buf[0]; ! write_byte_array_buffered(stream,&buf[0],buflen,false); ! # increment position ! BufferedStream_position(stream) += buflen; #else write_byte_buffered(stream,as_cint(c)); #endif --- 6616,6626 ---- Encoding_wcstombs(encoding)(encoding,stream,&cptr,cptr+1,&bptr,&buf[max_bytes_per_chart]); ASSERT(cptr == &c+1); var uintL buflen = bptr-&buf[0]; ! if (buflen > 0) { ! write_byte_array_buffered(stream,&buf[0],buflen,false); ! # increment position ! BufferedStream_position(stream) += buflen; ! } #else write_byte_buffered(stream,as_cint(c)); #endif *************** *** 6633,6641 **** &tmptmpbuf[tmpbufsize*max_bytes_per_chart]); ASSERT(cptr == tmpptr); var uintL tmptmpbuflen = bptr-&tmptmpbuf[0]; ! write_byte_array_buffered(stream,&tmptmpbuf[0],tmptmpbuflen,false); ! # increment position ! BufferedStream_position(stream) += tmptmpbuflen; } remaining -= n; } while (remaining > 0); --- 6659,6669 ---- &tmptmpbuf[tmpbufsize*max_bytes_per_chart]); ASSERT(cptr == tmpptr); var uintL tmptmpbuflen = bptr-&tmptmpbuf[0]; ! if (tmptmpbuflen > 0) { ! write_byte_array_buffered(stream,&tmptmpbuf[0],tmptmpbuflen,false); ! # increment position ! BufferedStream_position(stream) += tmptmpbuflen; ! } } remaining -= n; } while (remaining > 0); *************** *** 6675,6683 **** &buf[2*max_bytes_per_chart]); ASSERT(cptr == cp+n); var uintL buflen = bptr-&buf[0]; ! write_byte_array_buffered(stream,&buf[0],buflen,false); ! # increment position ! BufferedStream_position(stream) += buflen; #else if (chareq(c,ascii(NL))) { write_byte_buffered(stream,CR); write_byte_buffered(stream,LF); --- 6703,6713 ---- &buf[2*max_bytes_per_chart]); ASSERT(cptr == cp+n); var uintL buflen = bptr-&buf[0]; ! if (buflen > 0) { ! write_byte_array_buffered(stream,&buf[0],buflen,false); ! # increment position ! BufferedStream_position(stream) += buflen; ! } #else if (chareq(c,ascii(NL))) { write_byte_buffered(stream,CR); write_byte_buffered(stream,LF); *************** *** 6721,6729 **** Encoding_wcstombs(encoding)(encoding,stream,&cptr,tmpptr,&bptr,&tmptmpbuf[2*tmpbufsize*max_bytes_per_chart]); ASSERT(cptr == tmpptr); var uintL tmptmpbuflen = bptr-&tmptmpbuf[0]; ! write_byte_array_buffered(stream,&tmptmpbuf[0],tmptmpbuflen,false); ! # increment position ! BufferedStream_position(stream) += tmptmpbuflen; } remaining -= n; } while (remaining > 0); --- 6751,6761 ---- Encoding_wcstombs(encoding)(encoding,stream,&cptr,tmpptr,&bptr,&tmptmpbuf[2*tmpbufsize*max_bytes_per_chart]); ASSERT(cptr == tmpptr); var uintL tmptmpbuflen = bptr-&tmptmpbuf[0]; ! if (tmptmpbuflen > 0) { ! write_byte_array_buffered(stream,&tmptmpbuf[0],tmptmpbuflen,false); ! # increment position ! BufferedStream_position(stream) += tmptmpbuflen; ! } } remaining -= n; } while (remaining > 0); |