# HG changeset patch # User Stefan Monnier # Date 1005922160 0 # Node ID 02fcac02955b97328a97308ef3de6203901aa953 # Parent 6ce8f906931a0b0fa8ef3f562ade34867ddebaf1 (choose_write_coding_system): New fun, extracted from Fwrite_region. (Fwrite_region): Use it. diff -r 6ce8f906931a -r 02fcac02955b src/fileio.c --- a/src/fileio.c Fri Nov 16 14:32:38 2001 +0000 +++ b/src/fileio.c Fri Nov 16 14:49:20 2001 +0000 @@ -4535,6 +4535,103 @@ return Qnil; } +/* Decide the coding-system to encode the data with. */ + +void +choose_write_coding_system (start, end, filename, + append, visit, lockname, coding) + Lisp_Object start, end, filename, append, visit, lockname; + struct coding_system *coding; +{ + Lisp_Object val; + + if (auto_saving) + val = Qnil; + else if (!NILP (Vcoding_system_for_write)) + val = Vcoding_system_for_write; + else + { + /* If the variable `buffer-file-coding-system' is set locally, + it means that the file was read with some kind of code + conversion or the variable is explicitly set by users. We + had better write it out with the same coding system even if + `enable-multibyte-characters' is nil. + + If it is not set locally, we anyway have to convert EOL + format if the default value of `buffer-file-coding-system' + tells that it is not Unix-like (LF only) format. */ + int using_default_coding = 0; + int force_raw_text = 0; + + val = current_buffer->buffer_file_coding_system; + if (NILP (val) + || NILP (Flocal_variable_p (Qbuffer_file_coding_system, Qnil))) + { + val = Qnil; + if (NILP (current_buffer->enable_multibyte_characters)) + force_raw_text = 1; + } + + if (NILP (val)) + { + /* Check file-coding-system-alist. */ + Lisp_Object args[7], coding_systems; + + args[0] = Qwrite_region; args[1] = start; args[2] = end; + args[3] = filename; args[4] = append; args[5] = visit; + args[6] = lockname; + coding_systems = Ffind_operation_coding_system (7, args); + if (CONSP (coding_systems) && !NILP (XCDR (coding_systems))) + val = XCDR (coding_systems); + } + + if (NILP (val) + && !NILP (current_buffer->buffer_file_coding_system)) + { + /* If we still have not decided a coding system, use the + default value of buffer-file-coding-system. */ + val = current_buffer->buffer_file_coding_system; + using_default_coding = 1; + } + + if (!force_raw_text + && !NILP (Ffboundp (Vselect_safe_coding_system_function))) + /* Confirm that VAL can surely encode the current region. */ + val = call3 (Vselect_safe_coding_system_function, start, end, val); + + setup_coding_system (Fcheck_coding_system (val), coding); + if (coding->eol_type == CODING_EOL_UNDECIDED + && !using_default_coding) + { + if (! EQ (default_buffer_file_coding.symbol, + buffer_defaults.buffer_file_coding_system)) + setup_coding_system (buffer_defaults.buffer_file_coding_system, + &default_buffer_file_coding); + if (default_buffer_file_coding.eol_type != CODING_EOL_UNDECIDED) + { + Lisp_Object subsidiaries; + + coding->eol_type = default_buffer_file_coding.eol_type; + subsidiaries = Fget (coding->symbol, Qeol_type); + if (VECTORP (subsidiaries) + && XVECTOR (subsidiaries)->size == 3) + coding->symbol + = XVECTOR (subsidiaries)->contents[coding->eol_type]; + } + } + + if (force_raw_text) + setup_raw_text_coding_system (coding); + goto done_setup_coding; + } + + setup_coding_system (Fcheck_coding_system (val), coding); + + done_setup_coding: + if (!STRINGP (start) && !NILP (current_buffer->selective_display)) + coding->mode |= CODING_MODE_SELECTIVE_DISPLAY; +} + DEFUN ("write-region", Fwrite_region, Swrite_region, 3, 7, "r\nFWrite region to file: \ni\ni\ni\np", doc: /* Write current region into specified file. @@ -4582,7 +4679,7 @@ #endif /* VMS */ Lisp_Object handler; Lisp_Object visit_file; - Lisp_Object annotations; + Lisp_Object annotations = Qnil; Lisp_Object encoded_filename; int visiting = (EQ (visit, Qt) || STRINGP (visit)); int quietly = !NILP (visit); @@ -4602,96 +4699,8 @@ GCPRO4 (start, filename, visit, lockname); /* Decide the coding-system to encode the data with. */ - { - Lisp_Object val; - - if (auto_saving) - val = Qnil; - else if (!NILP (Vcoding_system_for_write)) - val = Vcoding_system_for_write; - else - { - /* If the variable `buffer-file-coding-system' is set locally, - it means that the file was read with some kind of code - conversion or the variable is explicitly set by users. We - had better write it out with the same coding system even if - `enable-multibyte-characters' is nil. - - If it is not set locally, we anyway have to convert EOL - format if the default value of `buffer-file-coding-system' - tells that it is not Unix-like (LF only) format. */ - int using_default_coding = 0; - int force_raw_text = 0; - - val = current_buffer->buffer_file_coding_system; - if (NILP (val) - || NILP (Flocal_variable_p (Qbuffer_file_coding_system, Qnil))) - { - val = Qnil; - if (NILP (current_buffer->enable_multibyte_characters)) - force_raw_text = 1; - } - - if (NILP (val)) - { - /* Check file-coding-system-alist. */ - Lisp_Object args[7], coding_systems; - - args[0] = Qwrite_region; args[1] = start; args[2] = end; - args[3] = filename; args[4] = append; args[5] = visit; - args[6] = lockname; - coding_systems = Ffind_operation_coding_system (7, args); - if (CONSP (coding_systems) && !NILP (XCDR (coding_systems))) - val = XCDR (coding_systems); - } - - if (NILP (val) - && !NILP (current_buffer->buffer_file_coding_system)) - { - /* If we still have not decided a coding system, use the - default value of buffer-file-coding-system. */ - val = current_buffer->buffer_file_coding_system; - using_default_coding = 1; - } - - if (!force_raw_text - && !NILP (Ffboundp (Vselect_safe_coding_system_function))) - /* Confirm that VAL can surely encode the current region. */ - val = call3 (Vselect_safe_coding_system_function, start, end, val); - - setup_coding_system (Fcheck_coding_system (val), &coding); - if (coding.eol_type == CODING_EOL_UNDECIDED - && !using_default_coding) - { - if (! EQ (default_buffer_file_coding.symbol, - buffer_defaults.buffer_file_coding_system)) - setup_coding_system (buffer_defaults.buffer_file_coding_system, - &default_buffer_file_coding); - if (default_buffer_file_coding.eol_type != CODING_EOL_UNDECIDED) - { - Lisp_Object subsidiaries; - - coding.eol_type = default_buffer_file_coding.eol_type; - subsidiaries = Fget (coding.symbol, Qeol_type); - if (VECTORP (subsidiaries) - && XVECTOR (subsidiaries)->size == 3) - coding.symbol - = XVECTOR (subsidiaries)->contents[coding.eol_type]; - } - } - - if (force_raw_text) - setup_raw_text_coding_system (&coding); - goto done_setup_coding; - } - - setup_coding_system (Fcheck_coding_system (val), &coding); - - done_setup_coding: - if (!STRINGP (start) && !NILP (current_buffer->selective_display)) - coding.mode |= CODING_MODE_SELECTIVE_DISPLAY; - } - + choose_write_coding_system (start, end, filename, + append, visit, lockname, &coding); Vlast_coding_system_used = coding.symbol; filename = Fexpand_file_name (filename, Qnil);