+ int size;
+ char *decoding_buf;
+
+ repeat_decoding:
+ size = decoding_buffer_size (&process_coding, nread);
+ decoding_buf = (char *) xmalloc (size);
+
+ /* We can't use the macro CODING_REQUIRE_DETECTION
+ because it always returns nonzero if the coding
+ system requires EOL detection. Here, we have to
+ check only whether or not the coding system
+ requires text-encoding detection. */
+ if (process_coding.type == coding_type_undecided)
+ {
+ detect_coding (&process_coding, bufptr, nread);
+ if (process_coding.composing != COMPOSITION_DISABLED)
+ coding_allocate_composition_data (&process_coding, PT);
+ }
+ if (process_coding.cmp_data)
+ process_coding.cmp_data->char_offset = PT;
+
+ decode_coding (&process_coding, bufptr, decoding_buf,
+ nread, size);
+
+ if (display_on_the_fly
+ && saved_coding.type == coding_type_undecided
+ && process_coding.type != coding_type_undecided)
+ {
+ /* We have detected some coding system. But,
+ there's a possibility that the detection was
+ done by insufficient data. So, we give up
+ displaying on the fly. */
+ xfree (decoding_buf);
+ display_on_the_fly = 0;
+ process_coding = saved_coding;
+ carryover = nread;
+ continue;
+ }
+
+ if (process_coding.produced > 0)
+ insert_1_both (decoding_buf, process_coding.produced_char,
+ process_coding.produced, 0, 1, 0);
+ xfree (decoding_buf);
+
+ if (process_coding.result == CODING_FINISH_INCONSISTENT_EOL)
+ {
+ Lisp_Object eol_type, coding;
+
+ if (process_coding.eol_type == CODING_EOL_CR)
+ {
+ /* CRs have been replaced with LFs. Undo
+ that in the text inserted above. */
+ unsigned char *p;
+
+ move_gap_both (PT, PT_BYTE);
+
+ p = BYTE_POS_ADDR (pt_byte_orig);
+ for (; p < GPT_ADDR; ++p)
+ if (*p == '\n')
+ *p = '\r';
+ }
+ else if (process_coding.eol_type == CODING_EOL_CRLF)
+ {
+ /* CR LFs have been replaced with LFs. Undo
+ that by inserting CRs in front of LFs in
+ the text inserted above. */
+ EMACS_INT bytepos, old_pt, old_pt_byte, nCR;
+
+ old_pt = PT;
+ old_pt_byte = PT_BYTE;
+ nCR = 0;
+
+ for (bytepos = PT_BYTE - 1;
+ bytepos >= pt_byte_orig;
+ --bytepos)
+ if (FETCH_BYTE (bytepos) == '\n')
+ {
+ EMACS_INT charpos = BYTE_TO_CHAR (bytepos);
+ TEMP_SET_PT_BOTH (charpos, bytepos);
+ insert_1_both ("\r", 1, 1, 0, 1, 0);
+ ++nCR;
+ }
+
+ TEMP_SET_PT_BOTH (old_pt + nCR, old_pt_byte + nCR);
+ }
+
+ /* Set the coding system symbol to that for
+ Unix-like EOL. */
+ eol_type = Fget (saved_coding.symbol, Qeol_type);
+ if (VECTORP (eol_type)
+ && ASIZE (eol_type) == 3
+ && SYMBOLP (AREF (eol_type, CODING_EOL_LF)))
+ coding = AREF (eol_type, CODING_EOL_LF);
+ else
+ coding = saved_coding.symbol;
+
+ process_coding.symbol = coding;
+ process_coding.eol_type = CODING_EOL_LF;
+ process_coding.mode
+ &= ~CODING_MODE_INHIBIT_INCONSISTENT_EOL;
+ }
+
+ nread -= process_coding.consumed;
+ carryover = nread;
+ if (carryover > 0)
+ /* As CARRYOVER should not be that large, we had
+ better avoid overhead of bcopy. */
+ BCOPY_SHORT (bufptr + process_coding.consumed, bufptr,
+ carryover);
+ if (process_coding.result == CODING_FINISH_INSUFFICIENT_CMP)
+ {
+ /* The decoding ended because of insufficient data
+ area to record information about composition.
+ We must try decoding with additional data area
+ before reading more output for the process. */
+ coding_allocate_composition_data (&process_coding, PT);
+ goto repeat_decoding;
+ }