(Fstring): Use make_multibyte_string.
(Fcompose_string): Likewise.
(Ffind_charset_string): Handle bytes vs chars in string.
Special case for single-byte strings.
(Fchars_in_string): Function deleted.
(Fstring): Renamed from Fconcat_chars.
Handle bytes vs chars in string.
(syms_of_charset): Corresponding changes.
(oblookup): Take args SIZE and SIZE_BYTE. Callers changed.
(init_obarray, read1, make_symbol):
Pass new arg to make_pure_string.
(Fintern, oblookup, Fintern_soft, intern): Handle size_byte.
(dir_warning): Pass new arg to message_dolog.
(read1): PCH is now int *.
Declare ch as int.
(read0): Declare c as int.
(read_list): Declare ch as int.
(read0): Use Fmake_string not make_string.
(read1): When reading a string, maybe use make_unibyte_string.
(Fread_from_string): Convert string indices to/from bytes.
(insert_from_string_1, insert_from_buffer_1): Use it.
(copy_text): New function.
(insert_from_buffer_1): Call copy_text to convert between
single-byte and multibyte text.
(insert_from_string_1): Likewise.
(insert_1_both): New function.
(insert_from_string): New args POS_BYTE, LENGTH.
(insert_from_string_before_markers):
(insert_from_string_1): New arg POS_BYTE. Swap args NCHARS, NBYTES.
Don't fail to use POS_BYTE!
(insert_from_buffer_1): Get both inschars and insbytes from NEW.
(Fsubstring): Use make_multibyte_string.
(concat, Fsubstring, internal_equal, mapcar1):
Distinguish bytes and chars when indexing strings.
(Fstring_equal, Fstring_lessp): Likewise.
(substring_both): New function.
(string_make_multibyte, string_make_unibyte): New functions.
(string_char_to_byte, string_byte_to_char): New functions.
check them for multibyteness, don't check enable-multibyte-characters.
(Fcall_process): Use size_byte for the args.
(Fcall_process_region): Likewise for temp file.
(child_setup, getenv_internal, Fgetenv): Likewise.
(read_process_output): New var `multibyte'.
Set it according to which coding system was used.
(read_process_output): Handle bytes vs chars.
(send_process): Use size_byte of OBJECT.
(Fprocess_send_string): Pass size_byte to send_process.
(print): When multibyte is disabled,
print multibyte string chars using hex escapes.
(printchar): Pass new arg to message_dolog.
(strout): New arg MULTIBYTE. Callers changed.
(strout): Take args SIZE and SIZE_BYTE;
operate on both chars and bytes.
(print_string): Pass new arg to strout.
If not using strout, fetch a whole multibyte char at once.
(write_string): Pass new arg to strout.
(write_string_1): Likewise.
(print) <case Lisp_String>: Scan by chars and bytes.
(print) <case Lisp_Symbol>: Scan name by chars and bytes.
(PRINTPREPARE): Use make_multibyte_string.
Initialize print_buffer_pos_byte. Use insert_1_both.
(printchar): Update print_buffer_pos_byte and print_buffer_pos.
(print_buffer_pos_byte): New variable.
Have two locals len and len_byte.
(fast_c_string_match_ignore_case): Use string_make_unibyte.
(compile_pattern): New arg MULTIBYTE. Callers changed.
(wordify): Use make_uninit_multibyte_string.
Scan by chars and bytes.
(string_match_1): Convert string indices to/from bytes.
(Freplace_match): Convert string indices to/from bytes.
(Fregexp_quote): Convert string indices to/from bytes.
Take account of size used by size_byte; store both sizes.
(Fpurecopy): Call make_pure_string the new way.
(compact_strings): Use size_byte field to compute string's size.
(make_uninit_multibyte_string): New function.
(make_uninit_string): Use make_uninit_multibyte_string.
(make_multibyte_string): New function.
(make_unibyte_string): New function.
(make_string): Compute number of chars from the data.
(Fminibuffer_complete_word): Scan string bytes and chars.
Pass new args to insert_from_string.
(Ftry_completion): Use size_byte while comparing.
(Fall_completions): Use size_byte while comparing.
Update call to CHAR_HEAD_P.
(indented_beyond_p): Take POS in bytes and chars. Callers changed.
(pos_tab_indent): Function moved to xdisp.c.
(Fcurrent_indentation): Use scan_newline and SET_PT_BOTH.
(indented_beyond_p, current_column_1): Likewise.
(vmotion, compute_motion): Set up bytepos value to return it.
(current_column): Handle bytepos and charpos.
(position_indentation): Take bytepos as arg, and scan with it. Calls changed.
(Fmove_to_column): Scan with bytepos and charpos.
(pos_tab_offset): Use bytepos to do FETCH_BYTE.
(skip_invisible): Don't worry about position in middle of character.