Dear all,<br><br>I'm a Chinese developer who have used ECL for some time in 2013. Although I don't use it recently, I'd like to report an old issue (and our investigations) that I struggled with.<br><br>Problem: ECL fails to compile under CHINESE windows XP and windows 7, due to ecl_min.exe crash.<br><br>This issue is present in 13.5 (and also 15.3.7-rc1) but not in version 12.12.1. <br><br>I've discussed this with Juan Jose in private emails (thanks, Juanjo!) but we were both quite busy and didn't finish it.<br><br>However, we have some important observations: <br><br>1. Before 2012-12-16, the whole ECL is working on our machines (not only ecl-min) so something that changed after that is causing this problem.<br><br>2. I debugged with windbg, found that ecl_min.exe crashed in cl_boot, here:<br><br>if (cl_fboundp(@'ext::make-encoding') != ECL_NIL) {<br>        maybe_fix_console_stream(cl_core.standard_input);<br>        maybe_fix_console_stream(cl_core.standard_output);<br>        maybe_fix_console_stream(cl_core.error_output);<br>    }<br><br>(BTW: our encoding is CP936 and windbg showed the code successfully detected this, i.e. known_cp[i].name is "WINDOWS-CP936")<br><br>In maybe_fix_console_stream(cl_object stream), there is a call:<br><br>    si_stream_external_format_set(stream, external_format);<br><br>Then I traced into it, and found it got here:<br><br>#ifdef ECL_CLOS_STREAMS<br>        unlikely_if (ECL_INSTANCEP(stream)) {<br>                FEerror("Cannot change external format of stream ~A", 1, stream);  <--- *** it got here. ***<br>        }<br>#endif<br><br>and here:<br><br>                        cl_object elt_type = ecl_stream_element_type(stream);<br>                        unlikely_if (elt_type != @'character' &&<br>                                     elt_type != @'base-char')<br>                                FEerror("Cannot change external format"<br>                                        "of binary stream ~A", 1, stream); <-- *** and here. ***<br>                        set_stream_elt_type(stream, stream->stream.byte_size,<br>                                            stream->stream.flags, format);<br><br>Then in set_stream_elt_type, it got into an INFINITE RECURSION:<br><br>static int<br>parse_external_format(cl_object stream, cl_object format, int flags)<br>{<br>        if (format == @':default') {<br>                format = ecl_symbol_value(@'ext::*default-external-format*');<br>        }<br>    if (CONSP(format)) {  <-- this is always true, so it recurses indefinitely<br>        flags = parse_external_format(stream, ECL_CONS_CDR(format), flags);<br>        format = ECL_CONS_CAR(format);<br>    }<br><br>I don't know why format is such "infinite cons", maybe because of the FEerrors, the format variable is left in an abnormal state?<br><br>3. In ECL12.12.1, the condition below is not satisfied so the 'troublesome' maybe_fix_console_stream is not called at all (that's why ecl_min.exe does NOT crash under 12.12.1).<br><br>if (cl_fboundp(@'ext::make-encoding') != ECL_NIL) {<br>        maybe_fix_console_stream(cl_core.standard_input);<br>        maybe_fix_console_stream(cl_core.standard_output);<br>        maybe_fix_console_stream(cl_core.error_output);<br>    }<br><br>Actually, after I commented out these lines in git repository's master, everything seems to work fine.<br><br>I've tested some programs, outputing chinese characters without any problem. But since I haven't tested a lot of program, I'm not sure whether there is any potential problem.<br><br>Finally, my questions:<br><br>1. Is it possible to skip setting the external format? Actually our program will reset the encoding to utf-8, despite our windows defaults to CP936 so it really doesn't matter whether to set it in cl_boot. It's perfectly ok to set it to LATIN-1 instead. We tested ECL12.12.1, it depends on msvc/encodings directory (when I removed the director it asks for WINDOWS-CP936 file) but it works.<br><br>2. Since this issue affacts a lot of (potential) users, should we add it somewhere in the document or wrap these lines in a compiler directive so that user can choose to skip this part when compiling?<br><br>BTW: I'm very happy to see that ECL has a new maintainer now. That's REALLY great!<br><span id="_editor_bookmark_start_0" style="display: none; line-height: 0px;">‍</span><br>Best regards,<br>Rujia Liu<br><br>